欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2579|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

關(guān)于51單片機(jī)NEC紅外解碼錯(cuò)誤的問(wèn)題

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

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

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

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

2、紅外初始化
  1. void IrInit(void) //100微秒@18.432MHz
  2. {
  3.         // 打開(kāi)紅外接收中斷
  4.     IT1 = 1; // 外部中斷1下降沿觸發(fā)
  5.     EX1 = 1; // 打開(kāi)外部中斷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. }
復(fù)制代碼

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++) // 處理開(kāi)頭的兩個(gè)字節(jié)
  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. }
復(fù)制代碼

4、中斷處理
  1. // 遙控器接收中斷,外部中斷1
  2. void Ir_Isr(void) interrupt 2 using 2
  3. {
  4.     TR0 = 1; // 啟動(dòng)定時(shí)器0
  5.         
  6.         if(Ir_Start) // 判斷是否遙控器接收已經(jīng)啟動(dòng)
  7.         {
  8.                 if(Ir_Time >= 40 && Ir_Time < 75) // 引導(dǎo)碼大于4.5ms小于90
  9.                 {
  10.             Ir_Data[Data_Index++] = Ir_Time; // 保存時(shí)間
  11.             Ir_Time = 0; // 重置時(shí)間
  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個(gè)字節(jié)的信息
  20.                                 {
  21.                                         New_Code = 1; // 數(shù)據(jù)填滿(mǎn)
  22.                                         TR0 = 0; // 暫停定時(shí)器0
  23.                                         Ir_Start = 0; // 重置遙控器接收啟動(dòng)位
  24.                                         Data_Index = 0; // 重置數(shù)據(jù)索引
  25.                                         Ir_Header = 0;
  26.                                 }
  27.                                 Ir_Time = 0; // 重置脈寬時(shí)間
  28.                         }
  29.                 }
  30.         }
  31.         else
  32.         {
  33.                 // 接收遙控器發(fā)送啟動(dòng)
  34.                 Ir_Start = 1;
  35.                 // 定時(shí)器歸位
  36.                 Ir_Time = 0;
  37.         }
  38. }
復(fù)制代碼

5、定時(shí)器處理
  1. // 遙控器接收定時(shí)器
  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++; // 紅外時(shí)間以200us累加
  15. }
復(fù)制代碼




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

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

做過(guò)幾款紅外解碼學(xué)習(xí)型遙控器(帶發(fā)射)和記錄脈寬的全能學(xué)習(xí)型遙 ...

可以幫忙一下紅外發(fā)射程序嗎?
回復(fù)

使用道具 舉報(bào)

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


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


  9. sbit LED=P3^3;        //紅外發(fā)射
  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;                              //定時(shí)器值初始化
  17. TL0=0x00;
  18. EA=1;                      //打開(kāi)中斷
  19. ET0=1;                     
  20. TR0=1;  
  21. }


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

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

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

  38. while(1)
  39. {

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

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表