找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2344|回复: 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 单片机教程网

快速回复 返回顶部 返回列表