各位大佬,最近在做一個NEC格式的紅外遙控器的接收項目,但是始終沒能正確解析,請大佬們指正代碼的問題,萬分感謝。我的晶振是18.432MHz,定時器是200us,目前的結果是每次獲取都是一堆7F,不知道問題出在哪里。
另外,想再問下各位大佬,紅外遙控器有去抖的說法嘛?
1、單片機頭文件的相關定義
- #define FOSC 18432000L
- #define T0US (65536 - (FOSC / 12 / 1000000 * 200)) //200us timer calculation method in 12T mode
- // 紅外的時間
- extern BYTE Ir_Time;
- // 收到紅外信號
- extern BYTE Ir_Start;
- // 收到紅外信號頭
- extern BYTE Ir_Header;
- // 紅外數據
- extern BYTE Ir_Data[33];
- // 紅外碼
- extern BYTE Ir_Code[4];
- // 數據索引
- extern BYTE Data_Index;
- // 有新編碼
- extern BYTE New_Code;
- // 紅外初始化
- extern void IrInit(void);
- // 紅外編碼解析
- extern void IrDecode(void);
復制代碼
2、紅外初始化
- void IrInit(void) //100微秒@18.432MHz
- {
- // 打開紅外接收中斷
- IT1 = 1; // 外部中斷1下降沿觸發
- EX1 = 1; // 打開外部中斷1
-
- //200us @18.432MHz
- TMOD |= 0x01; //set timer0 as mode1 (16-bit)
- TL0 = T0US; //initial timer0 low byte
- TH0 = T0US >> 8; //initial timer0 high byte
- ET0 = 1; //enable timer0 interrupt
- }
復制代碼
3、紅外編碼解析
- // 紅外編碼的解析
- void IrDecode(void)
- {
- BYTE i = 0, j = 0, time = 0, ir_tmp_code = 0;
- for(i = 0; i < 4; i++) // 處理開頭的兩個字節
- {
- for(j = 0; j < 8; j++)
- {
- time = Ir_Data[i * 8 + j + 1];
- if(time > 5) // 大于1.125ms表示1,否則就為0
- {
- ir_tmp_code |= 0x80;
- }
- ir_tmp_code = ir_tmp_code >> 1;
- }
-
- Ir_Code[i] = ir_tmp_code;
- ir_tmp_code = 0;
- }
- }
復制代碼
4、中斷處理
- // 遙控器接收中斷,外部中斷1
- void Ir_Isr(void) interrupt 2 using 2
- {
- TR0 = 1; // 啟動定時器0
-
- if(Ir_Start) // 判斷是否遙控器接收已經啟動
- {
- if(Ir_Time >= 40 && Ir_Time < 75) // 引導碼大于4.5ms小于90
- {
- Ir_Data[Data_Index++] = Ir_Time; // 保存時間
- Ir_Time = 0; // 重置時間
- Ir_Header = 1;
- }
- else
- {
- if(Ir_Header)
- {
- Ir_Data[Data_Index++] = Ir_Time;
- if(Data_Index == 34) // 保存了4個字節的信息
- {
- New_Code = 1; // 數據填滿
- TR0 = 0; // 暫停定時器0
- Ir_Start = 0; // 重置遙控器接收啟動位
- Data_Index = 0; // 重置數據索引
- Ir_Header = 0;
- }
- Ir_Time = 0; // 重置脈寬時間
- }
- }
- }
- else
- {
- // 接收遙控器發送啟動
- Ir_Start = 1;
- // 定時器歸位
- Ir_Time = 0;
- }
- }
復制代碼
5、定時器處理
- // 遙控器接收定時器
- void Ir_Timer_Isr(void) interrupt 1 using 1
- {
- TL0 = T0US; //initial timer0 low byte
- TH0 = T0US >> 8; //initial timer0 high byte
-
- if(count >= 5000)
- {
- LED = !LED;
- count = 0;
- }
- count++;
-
- Ir_Time++; // 紅外時間以200us累加
- }
復制代碼
|