- //红外接收
- void IRC_read(void)
- {
- unsigned char t,i,j;
- WDTFLG = 0x5A;
- //EINT0 = 0; //关闭中断
- t = 10; // 0.793ms延时,运行10次,处理无效红外信号,防止干扰
- while(--t)
- {
- // 定时0.793*10ms 处理无效红外信号
- TH0 = 0xfb;
- TL0 = 0xdf;
- TR0 = 1;
- while(!TF0);
- TF0 = 0;
- TR0 = 0;
-
- //P32变高电平,无效红外信号,跳出函数
- if(P32)
- {
- EINT0 = 1; //中断开启
- return ;
- }
- }
-
- while(!P32); // 等待9ms低电平过去
-
- //刷新最后2ms左右的低电平 处理长按的
- TH0 = 0xf3; //3072/FFFF-C00 (16m@hz)
- TL0 = 0xff; //
- TR0 = 1;
- while(!TF0);
- TF0 = 0;
- TR0 = 0; //延时2.305ms 即3072/FFFF-C00 (16m@hz)
-
- //处理长按
- if(!P32)
- {
- EINT0=1; //中断0打开
- return;
- }
- //等待4.5ms高电平的过去
- while(P32);
-
- //开始接收用户码
- for(i=0; i<4; i++)
- {
- for(j=0; j<8; j++)
- {
- while(!P32); //等待低电平过去 低电平相同不用计时
- Data[i] >>= 1; //把上次的数据位右移一位
-
-
- //延时0.793ms (>0.56ms)
- TH0 = 0xfb;
- TL0 = 0xdf;
- TR0 = 1;
- while(!TF0);
- TR0=0;
- TF0=0;
-
- // 若为数据"1",则延时后P32为高电平
- if(P32)
- {
- Data[i] |= 0x80; // 所有数据位1放最高位
- while(P32); // 等待高电平过去
- }
- }
- }
- return;
- }
- 这是搬大佬的红外接收代码使用
复制代码 |