找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1469|回复: 2
打印 上一主题 下一主题
收起左侧

单片机红外遥控连发时出现错误

[复制链接]
回帖奖励 20 黑币 回复本帖可获得 2 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
ID:703051 发表于 2020-4-24 14:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面的程序是我把买的板子里面带的稍微修改了一下,把之前的delay函数延时改成了定时器0方式二工作。单发的时候没问题,连发的时候会变成FFH。
使用的收发协议就是那个NEC协议,9ms低+4.5ms高引导码那个。红外接收器输出脚连的是外部中断0,P3^2引脚..........

单片机源程序如下:
  1. #include<reg52.h>
  2. typedef unsigned int u16;
  3. typedef unsigned char u8;
  4. //#define u16 unsigned int
  5. //#define u8 unsigned char
  6. sbit LSA=P2^2;//数码管位选
  7. sbit LSB=P2^3;
  8. sbit LSC=P2^4;
  9. sbit IRIN=P3^2;//外部中断入口
  10. sbit LED1=P2^0;
  11. sbit LED2=P2^1;
  12. sbit LED3=P2^5;
  13. u8 irvalue[6];
  14. u8 count;
  15. u8 displaydata[8];
  16. u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X76};//0~f+h 显示码
  17. void digdisplay()
  18. {
  19. u8 i,j;
  20. for(i=0;i<3;i++)
  21. {
  22. switch(i)
  23. {
  24. case(0):LSA=1;LSB=1;LSC=1;break;
  25. case(1):LSA=0;LSB=1;LSC=1;break;
  26. case(2):LSA=1;LSB=0;LSC=1;break;
  27. }
  28. P0=displaydata[i];//发数据,displaydata是定义好要存数据的数组
  29. j=100;
  30. while(j--);
  31. P0=0x00;//消隐
  32. }
  33. }
  34. void judge()
  35. {
  36. if(irvalue[2]==69)
  37.    LED1=~LED1;
  38. else if(irvalue[2]==94)
  39.    LED2=~LED2;
  40. }
  41. void irinit()
  42. {
  43. IT0=1;//下降沿触发
  44. EX0=1;//打开中断0允许
  45. EA=1;//开总中断
  46. IRIN=1;//初始化端口
  47. TMOD=0x02;//定时器0工作方式2
  48. TH0=0x06;        //设置初值计时0.25ms
  49. TL0=0x06;
  50. ET0=1;                //开定时器0中断
  51. TR0=1;                //启动定时器0
  52. PT0=1;                //定时器0
  53. }
  54. void main()
  55. {
  56. irinit();
  57. while(1)
  58. {
  59. displaydata[0]=smgduan[irvalue[2]/16];
  60. displaydata[1]=smgduan[irvalue[2]%16];
  61. displaydata[2]=smgduan[16];
  62. digdisplay();
  63. }
  64. }
  65. /*NEC码位定义:一个脉冲560微秒连续载波,一个逻辑1传输需要560微秒脉冲+1680微秒低电平
  66. 一个逻辑0传输需要560微秒脉冲+560微秒低电平
  67. 在接收端对应的是 逻辑1:560微秒低电平+1680微秒高电平
  68.                                  逻辑0:560微秒低电平+560微秒高电平
  69.                                  通过时间判断0或1
  70. NEC数据格式:9ms+4.5ms的引导码
  71.                           8位地址码+8位地址反码
  72.                           8位控制码+8位控制反码*/
  73. void T0_TIMER() interrupt 1
  74. {
  75. count++;
  76. }
  77. void readir() interrupt 0
  78. {
  79. u8 j,k,l;
  80. count=0;
  81. //TR0=1;
  82. while(count<30);
  83. //TR0=0;
  84. if(IRIN==0)
  85. {
  86.         count=0;
  87.         while((IRIN==0)&&(count<40));//等9ms?
  88.         if(IRIN==1)
  89.         {
  90.                 count=0;
  91.                 while((IRIN==1)&&(count<20));
  92.                                   //4.5ms?   引导码
  93.         for(l=0;l<4;l++)
  94.                         irvalue[l]=0;
  95.                 for(k=0;k<4;k++)//4组数据
  96.                 {
  97.                  for(j=0;j<8;j++)//接收一组数据
  98.                         {
  99.                          count=0;
  100.                          while((IRIN==0)&&(count<4));//等待信号前的560微秒
  101.                          LED3=0;
  102.                          count=0;
  103.                          while((IRIN==1)&&(count<8));//计算高电平
  104.                          irvalue[k]>>=1;//k表示第几组数据,右移一位
  105.                          if(count>4)  //高电平大于565微秒? 800微秒
  106.                          {
  107.                          irvalue[k]|=0x80;
  108.                          }
  109.                          count=0;
  110.                         }        
  111.                 }
  112.         }
  113.         if(irvalue[2]!=~irvalue[3])
  114.                 return;
  115.         judge();
  116. }
  117. }
复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:600952 发表于 2020-4-26 00:22 | 只看该作者
连发时中断时长不对了吧,可能是。
回复

使用道具 举报

板凳
ID:282850 发表于 2020-4-26 10:37 | 只看该作者
再确认一下引导码,在连续发时,是否还是独立地打包在数据前,有可能连发时后边的只有数据。
两个中断的处理时间是否来得及,特别关注的延时的地方。NEC没搞过,另外的红外搞过。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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