#include#include #define uchar unsigned char//宏定义 #define uint unsigned int #define ulong unsigned long sbit sound=P2^3; //蜂鸣器 sbit IR=P1^2; //IR_DATA uchar dm,i,j,k; //IR_解码用的变量 uchar aa[2]; //定义1个数组,用来存储代码,8位的数据码和8位的数据反码 ulong bb; //定义bb用来存放用户识别码,这里采用的是26位的用户识别 uchar newdata; //IR收到新的数据提示主函数去处理 //0.9ms void delay0_9ms(void) { unsigned char j,k; for(j=18;j>0;j--) for(k=20;k>0;k--) ; } //1ms void delay1ms(void) { unsigned char i,j; for(i=2;i>0;i--) for(j=230;j>0;j--) ; } //4.5ms void delay4_5ms(void) { unsigned char i,j; for(i=10;i>0;i--) for(j=225;j>0;j--) ; } //100ms void delay100ms(void) { unsigned char i,j,k; for(i=200;i>0;i--) for(j=20;j>0;j--) for(k=10;k>0;k--) ; } IR_JM(unsigned char date) { switch(date) { case 0x01: {P0=0X00; break; } case 0x10: { break; } default: { break; } } } void main() { IT0=1; //外部中断0触发方式控制位,下降沿触发 EX0=1; //外部中断0(INT0)中断允许位 EA=1; //总中断 dm=0; while(newdata) { newdata=0; IR_JM(aa[0]); } } void t0(void) interrupt 0//外部中断0的函数 { EA=0; //暂时关闭CPU的所有中断请求 for(k=0;k<10;k++) //重复10次,目的是检测在9毫秒内如果出现高电平就退出解码程序 { //aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa delay0_9ms(); //延时0.9毫秒 if (IR==1) { k=10;break; } //延时0.9毫秒后判断P3.2脚是否出现高电平如果有就退出解码程序 else if(k==9) //重复10次? { //bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb while(IR==0); //等待高电平避开9毫秒低电平引导脉冲 delay4_5ms(); //延时4.5毫秒避开4.5毫秒的结果码 /******************************************** //26位的用户码,前13位数据码,后13位数据反码 *********************************************/ for(j=1;j<=26;j++)//每组数据为26位 { while(IR==0); // delay0_9ms(); if(IR==1) { delay1ms(); dm=dm|0x2000000;
//因为是26位,一个"1",后面25个"0",转化二进制即为"1000000" if(j<26) dm=dm>>1;
//数据"1",右移一个"1",一共25次 } else if(j<26) dm=dm>>1;
//数据"0",一共25次 } bb=dm; dm=0; /*************************************************** //16位的用户码,前8位数据码,后8位数据反码 ****************************************************/ for(i=0;i<2;i++) { for(j=1;j<=8;j++)//每组数据为8位 { while(IR==0); // delay0_9ms(); if(IR==1) { delay1ms(); dm=dm|0x80; if(j<8) dm=dm>>1; //数据"1",右移一个"1",一共7次 } else if(j<8) dm=dm>>1; //数据"0",一共7次 } aa[i]=dm; dm=0; } /*************************************************** //显示部分 ****************************************************/ if(aa[0]==~aa[1]) //验证成功 { sound=0; delay100ms(); sound=1; newdata=1; } } //bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb } //aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa EA=1; }
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』