《单片机红外遥控程序详解配21键码表》由会员分享,可在线阅读,更多相关《单片机红外遥控程序详解配21键码表(6页珍藏版)》请在金锄头文库上搜索。
1、用户码2OOFF键位码如下#include包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义/sbitIR=P3A2;红外接口标志/*全局变量声明unsignedcharcodetable10=0x3f/0x06/0x5b/0x4f,0x66/0x6d/0x7d/0x07/0x7f/0x6f;/显示段码值09unsignedcharirtime;/红外用全局变量bitirpro_ok,irok;/处理OK,接收OKunsignedcharIRcord4;unsignedcharirdata33;定时器0中断处理voidtimOJsr(void)interrupt1using1irt
2、ime+;用于计数2个下降沿之间的时间/*/外部中断0中断处理/voidEXO_ISR(void)interrupt0/外部中断0服务函数staticunsignedchari;接收红外信号处理staticbitstartflag;是否开始处理标志位if(startflag)if(irtime=33)引导码TC9012的头码,9ms+4.5ms头码的持续时间的范I韦I,33(8.448ms)63(16.128ms),i=0;irdatai=irtime;/存储每个电平的持续时间,用于以后判断是0还是1irtime=0;i+;if(i=33)/33是33位的意思,包括32位的数据和一位的头码。i
3、rok=l;i=0;elseirtime=0;startflag=l;/*/定时器0初始化voidTIMOinit(void)/定时器0初始化TMOD=0x02;/定时器0工作方式2,TH0是重装值,TLO是初值TH0=0x00;/装初值TL0=0x00;ETO=1;开中断TRO=1;外部中断0初始化voidEXOinit(void)ITO=1;指定外部中断0下降沿触发,INTO(P3.2)EXO=1;打开外部中断EA=1;开总中断键值处理voidlr_work(void)/红外键值散转程序switch(IRcord2)/判断第三个数码前两个是用户码,最后一个是反码,第三个才是真正的数据码。c
4、ase0xl6:P0=table0;break;/0按下遥控器上面0-9的按键,数码管显示相应的按键值caseOxOc:PO=tablel;break;/lcase0x18:P0=table2;break;/2caseOx5e:PO=table3;break;/3case0x0&P0=table4;break;/4caseOxlc:PO=table5;break;/5case0x5a:P0=table6;break;/6case0x42:PO=table7;break;/7case0x52:P0=table8;break;/8default:break;irpro_ok=0;/处理完成标志/*
5、红外码值处理*/voidIrpro(void)/红外码值处理函数分析出那些是1那些是0unsignedchari,k;unsignedcharcord,value;k=l;前导码没数据,从第二个开始,就是用户码开始。for(i=0;i4;i+)处理4个字节for(j=l;j7)低电平下降沿到下一个下降沿的宽度是0.56+0.565=1.125ms,高电平则是0.56+1.69=2.25ms,同样我们也给出一个范围用于区分它们,可以这样识别(1.125ms+2.25ms)/2=1.68ms,大于1.68为高,小于1.68为低。假设使用12M晶振定时器的单位数值时lus,使用8位定时器自动重装,将
6、得到每个定时周期0.256ms的时长,1.68/0.256=6.59,约等于7.也就是定时器0计数次数。value|=0x80;/最高位就给1if(j8)value=l;k+;IRcordi=value;value=0;irpro_ok=l;处理完毕标志位置1主函数voidmain(void)EXOinit();/初始化外部中断TIM0init();/初始化定时器Pl=OxOO;/取位码第一位数码管选通,即二进制11111110while(l)/主循坏if(irok)如果接收好了进行红外处理lrpro();irok=0;if(irpro_ok)如果处理好后进行工作处理,如按对应的按键后显示对应的数字等lr_work();