- //紅外接收
- 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;
- }
- 這是搬大佬的紅外接收代碼使用
復制代碼 |