1、 #include /包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义/sbit IR=P32; /红外接口标志 /*-全局变量声明-*/unsigned char code table10=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/ 显示段码值 09unsigned char irtime;/红外用全局变量bit irpro_ok,irok; /处理 OK,接收 OKunsigned char IRcord4;unsigned char irdata33;/*-定时器 0 中断处理-*/void tim0_isr (v
2、oid) interrupt 1 using 1irtime+; /用于计数 2 个下降沿之间的时间/*-外部中断 0 中断处理-*/void EX0_ISR(void) interrupt 0 /外部中断 0 服务函数static unsigned char i; /接收红外信号处理static bit startflag; /是否开始处理标志位if(startflag) if(irtime=33)/引导码 TC9012 的头码,9ms+4.5ms 头码的持续时间的范围,33(8.448ms)7) /低电平下降沿到下一个下降沿的宽度是 0.56+0.565=1.125ms,高电平则是 0.5
3、6+1.69=2.25ms,同样我们也给出一个范围用于区分它们,可以这样识别 (1.125ms + 2.25ms )/ 2=1.68ms, /大于 1.68 为高,小于 1.68 为低。/假设使用 12M 晶振 定时器的单位数值时 1us,使用 8 位定时器自动重装,将得到每个定时周期 0.256ms 的时长, 1.68/0.256=6.59,约等于 7.也就是 定时器 0 计数次数。value|=0x80;/最高位就给 1,if(j=1;k+;IRcordi=value;value=0; irpro_ok=1;/处理完毕标志位置 1/*-主函数-*/void main(void)EX0init(); /初始化外部中断TIM0init();/初始化定时器P1=0x00; /取位码 第一位数码管选通,即二进制 1111 1110while(1)/主循环if(irok) /如果接收好了进行红外处理 Irpro();irok=0;if(irpro_ok) /如果处理好后进行工作处理,如按对应的按键后显示对应的数字等Ir_work();