久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2238|回復: 3
打印 上一主題 下一主題
收起左側

關于51單片機NEC紅外解碼錯誤的問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:548100 發表于 2019-5-27 22:59 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
各位大佬,最近在做一個NEC格式的紅外遙控器的接收項目,但是始終沒能正確解析,請大佬們指正代碼的問題,萬分感謝。我的晶振是18.432MHz,定時器是200us,目前的結果是每次獲取都是一堆7F,不知道問題出在哪里。
另外,想再問下各位大佬,紅外遙控器有去抖的說法嘛?

1、單片機頭文件的相關定義
  1. #define FOSC 18432000L
  2. #define T0US (65536 - (FOSC / 12 / 1000000 * 200))   //200us timer calculation method in 12T mode

  3. // 紅外的時間
  4. extern BYTE Ir_Time;
  5. // 收到紅外信號
  6. extern BYTE Ir_Start;
  7. // 收到紅外信號頭
  8. extern BYTE Ir_Header;
  9. // 紅外數據
  10. extern BYTE Ir_Data[33];
  11. // 紅外碼
  12. extern BYTE Ir_Code[4];
  13. // 數據索引
  14. extern BYTE Data_Index;
  15. // 有新編碼
  16. extern BYTE New_Code;

  17. // 紅外初始化
  18. extern void IrInit(void);
  19. // 紅外編碼解析
  20. extern void IrDecode(void);
復制代碼

2、紅外初始化
  1. void IrInit(void) //100微秒@18.432MHz
  2. {
  3.         // 打開紅外接收中斷
  4.     IT1 = 1; // 外部中斷1下降沿觸發
  5.     EX1 = 1; // 打開外部中斷1
  6.         
  7.         //200us @18.432MHz
  8.     TMOD |= 0x01;                    //set timer0 as mode1 (16-bit)
  9.     TL0 = T0US;                     //initial timer0 low byte
  10.     TH0 = T0US >> 8;                //initial timer0 high byte
  11.     ET0 = 1;                        //enable timer0 interrupt
  12. }
復制代碼

3、紅外編碼解析
  1. // 紅外編碼的解析
  2. void IrDecode(void)
  3. {
  4.     BYTE i = 0, j = 0, time = 0, ir_tmp_code = 0;
  5.     for(i = 0; i < 4; i++) // 處理開頭的兩個字節
  6.     {
  7.         for(j = 0; j < 8; j++)
  8.         {
  9.             time = Ir_Data[i * 8 + j + 1];
  10.             if(time > 5) // 大于1.125ms表示1,否則就為0
  11.             {
  12.                 ir_tmp_code |= 0x80;
  13.             }
  14.             ir_tmp_code = ir_tmp_code >> 1;
  15.         }
  16.         
  17.         Ir_Code[i] = ir_tmp_code;
  18.                 ir_tmp_code = 0;
  19.     }
  20. }
復制代碼

4、中斷處理
  1. // 遙控器接收中斷,外部中斷1
  2. void Ir_Isr(void) interrupt 2 using 2
  3. {
  4.     TR0 = 1; // 啟動定時器0
  5.         
  6.         if(Ir_Start) // 判斷是否遙控器接收已經啟動
  7.         {
  8.                 if(Ir_Time >= 40 && Ir_Time < 75) // 引導碼大于4.5ms小于90
  9.                 {
  10.             Ir_Data[Data_Index++] = Ir_Time; // 保存時間
  11.             Ir_Time = 0; // 重置時間
  12.                         Ir_Header = 1;
  13.                 }
  14.                 else
  15.                 {
  16.                         if(Ir_Header)
  17.                         {
  18.                                 Ir_Data[Data_Index++] = Ir_Time;
  19.                                 if(Data_Index == 34) // 保存了4個字節的信息
  20.                                 {
  21.                                         New_Code = 1; // 數據填滿
  22.                                         TR0 = 0; // 暫停定時器0
  23.                                         Ir_Start = 0; // 重置遙控器接收啟動位
  24.                                         Data_Index = 0; // 重置數據索引
  25.                                         Ir_Header = 0;
  26.                                 }
  27.                                 Ir_Time = 0; // 重置脈寬時間
  28.                         }
  29.                 }
  30.         }
  31.         else
  32.         {
  33.                 // 接收遙控器發送啟動
  34.                 Ir_Start = 1;
  35.                 // 定時器歸位
  36.                 Ir_Time = 0;
  37.         }
  38. }
復制代碼

5、定時器處理
  1. // 遙控器接收定時器
  2. void Ir_Timer_Isr(void) interrupt 1 using 1
  3. {
  4.     TL0 = T0US;                     //initial timer0 low byte
  5.     TH0 = T0US >> 8;                //initial timer0 high byte
  6.         
  7.         if(count >= 5000)
  8.         {
  9.                 LED = !LED;
  10.                 count = 0;
  11.         }
  12.         count++;
  13.    
  14.     Ir_Time++; // 紅外時間以200us累加
  15. }
復制代碼




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:497670 發表于 2019-5-28 09:50 | 只看該作者
你好!你使用的單片機具體型號是什么?

做過幾款紅外解碼學習型遙控器(帶發射)和記錄脈寬的全能學習型遙控器(帶發射);
都是用的STC單片機,分別是 89C52RC、15F2K60S2 和 12C5A60S2 這三款,使用
效果不錯,解碼型的NEC編碼的都可解碼和發射;記錄脈寬的全能型的,基本通吃
所有遙控器(空調測試通過:美的、奧克斯、格力),實現比較完美的脈寬記錄和
紅外發射控制。
回復

使用道具 舉報

板凳
ID:370644 發表于 2019-8-30 20:36 | 只看該作者
小貓要吃魚 發表于 2019-5-28 09:50
你好!你使用的單片機具體型號是什么?

做過幾款紅外解碼學習型遙控器(帶發射)和記錄脈寬的全能學習型遙 ...

可以幫忙一下紅外發射程序嗎?
回復

使用道具 舉報

地板
ID:155507 發表于 2019-8-31 14:23 | 只看該作者
紅外發射程序


  1. /*-----------------------------------------------
  2.   名稱:紅外發射原理
  3.   內容:通過紅外發射接收閃爍LED,同普通LED顯示程序相同。
  4.   間歇發送38K調制波形。發射J34(IR2)端子接P3.3,J27(任意端子)接P3.2,
  5.   P1.3接任意LED,正常情況LED閃爍,拔掉發射或者接收信號線,led熄滅。
  6. ------------------------------------------------*/
  7. #include<reg52.h>     //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
  8. #include<INTRINS.H>


  9. sbit LED=P3^3;        //紅外發射
  10. sbit LED1=P1^3;
  11. sbit IR=P3^2;         //紅外一體化接收

  12. bit Flag;

  13. void Init_Timer0(void)
  14. {
  15. TMOD |= 0x01;                             
  16. TH0=0xf0;                              //定時器值初始化
  17. TL0=0x00;
  18. EA=1;                      //打開中斷
  19. ET0=1;                     
  20. TR0=1;  
  21. }


  22. /*-----------------------------------------------
  23.                                 定時器初始化
  24. ------------------------------------------------*/
  25. void Timer0_isr(void) interrupt 1 using 1
  26. {
  27. TH0=0x0f;                //重新賦值
  28. TL0=0x00;
  29. Flag=!Flag;
  30. }

  31. /*-----------------------------------------------
  32.                                 主函數
  33. ------------------------------------------------*/
  34. main()
  35. {

  36. //unsigned int j;
  37. Init_Timer0();    //定時器初始化

  38. while(1)
  39. {

  40.     LED1=IR;       //讀取一體化接收頭數值
  41.         while(Flag)           //循環取反頻率大約38K
  42.            {
  43.                    _nop_();
  44.                    _nop_();
  45.                    _nop_();
  46.                    _nop_();
  47.                    _nop_();
  48.                    _nop_();
  49.                    _nop_();
  50.                    _nop_();
  51.                    _nop_();
  52.                    LED=!LED;    //發射管輸出            
  53.             }
  54.    }
  55. }
復制代碼
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99久久日韩精品免费热麻豆美女 | 久久一区二区视频 | 国产成人精品一区二区 | 日韩色综合 | 精品久久久久久久 | 久久国产成人精品国产成人亚洲 | 日韩精品一区二区三区在线观看 | 伊人青青久久 | 久久成人高清视频 | 欧美在线视频二区 | 成人妇女免费播放久久久 | 中文字幕在线观看视频网站 | 亚洲 精品 综合 精品 自拍 | 国产av毛片 | 欧美成年视频 | 黄色网络在线观看 | 国产不卡一区 | 亚洲国产精品久久久久 | 午夜免费视频 | 国产精品久久久久久久久久免费看 | 99色综合 | 亚洲精品视频在线观看视频 | 91精品国产综合久久婷婷香蕉 | 岛国av在线免费观看 | 日韩免费视频一区二区 | 特级毛片www | 在线免费观看成人 | 91免费观看视频 | 自拍视频网站 | 日本午夜免费福利视频 | 91精品国产色综合久久不卡蜜臀 | 国产精品亚洲欧美日韩一区在线 | 久久这里只有精品首页 | 中文字幕欧美在线观看 | 欧美视频一区二区三区 | 亚洲欧美日韩一区二区 | 18gay男同69亚洲网站 | 欧美一区二区另类 | 激情av在线| www.一级毛片| 成人激情视频在线播放 |