红外解码数码管显示红外线解码数码管显示对应值/*-----------------------------------------------名称:遥控器红外解码数码管显示内容:按配套遥控器上1-9会在数码管上对应显示------------------------------------------------*/#includereg52.h//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbitIR=P3^2;#defineDataPortP0第1页共9页sbitLATCH1=P2^6;sbitLATCH2=P2^7;//红外接口标志//定义数据端口程序中遇到DataPort则用P0替换//定义锁存使能端口段锁存//位锁存unsignedcharcodedofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示段码值0~9unsignedcharirtime;//红外用全局变量bitirpro_ok,irok;unsignedcharIRcord[4];unsignedcharirdata[33];第2页共9页voidIr_work(void);voidIrcordpro(void);voidtim0_isr(void)interrupt1using1{irtime++;//用于计数2个下降沿之间的时间}voidEX0_ISR(void)interrupt0//外部中断0服务函数{staticunsignedchari;//接收红外信号处理staticbitstartflag;//是否开始处理标志位第3页共9页if(startflag){if(irtime63irtime=33)//引导码TC9012的头码,9ms+4.5msi=0;irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1irtime=0;i++;if(i==33){irok=1;红外线解码数码管显示对应值}}}else{}irtime=0;startflag=1;第4页共9页voidTIM0init(void)//定时器0初始化{TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值TH0=0x00;//重载值TL0=0x00;//初始化值ET0=1;//开中断TR0=1;}voidEX0init(void){IT0=1;//指定外部中断0下降沿触发,INT0(P3.2)EX0=1;//使能外部中断EA=1;//开总中断第5页共9页}voidIr_work(void)//红外键值散转程序{switch(IRcord[2])//判断第三个数码值{case0x0c:DataPort=dofly_DuanMa[1];break;//1显示相应的按键值case0x18:DataPort=dofly_DuanMa[2];break;//2case0x5e:DataPort=dofly_DuanMa[3];break;//3case0x08:DataPort=dofly_DuanMa[4];break;//4case0x1c:DataPort=dofly_DuanMa[5];break;//5case0x5a:DataPort=dofly_DuanMa[6];break;//6case0x42:DataPort=dofly_DuanMa[7];break;//7case0x52:DataPort=dofly_DuanMa[8];break;//8case第6页共9页0x4a:DataPort=dofly_DuanMa[9];break;//9default:break;}irpro_ok=0;//处理完成标志}voidIrcordpro(void)//红外码值处理函数红外线解码数码管显示对应值unsignedchari,j,k,cord,value;k=1;for(i=0;i4;i++)//处理4个字节{for(j=1;j=8;j++)//处理1个字节8位{cord=irdata[k];if(cord7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值第7页共9页value=value|0x80;if(j8){value=1;可以有一定误差}k++;}IRcord[i]=value;value=0;}irpro_ok=1;//处理完毕标志位置1}voidmain(void){EX0init();//初始化外部中断TIM0init();//初始化定时器LATCH1=0;//位锁存DataPort=0xfe;//取位码第一位数码管选通,即二进制11111110LATCH2=1;//位锁存LATCH2=0;DataPort=0x3f;//取位码第一位数码管选通,即二进制11111110LATCH1=1;//位锁存while(1)//主循环{第8页共9页if(irok)//如果接收好了进行红外处理{Ircordpro();irok=0;}if(irpro_ok)//如果处理好后进行工作处理,如按对应的按键后显示对应的数字等{红外线解码数码管显示对应值}Ir_work();}}第9页共9页