找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC89C52单片机红外线遥控器按键码值解码显示程序

[复制链接]
跳转到指定楼层
楼主

最近在学习红外线遥控继电器,手头有一个闲置遥控器,但不知道按键码值,在网上搜索相关资源后获到一个程序,经测试好用,在这里分享发给大家。
原程序来源于“知乎”,原文网址:https://zhuanlan.zhihu.com/p/662116293,在这里对原创作者“玄宇鹰魂”表示感谢。
因本论坛下载附件需要“黑币”,为了避免原作者有可能误判利用他的原作盈利,在这里只贴出程序内容,不上传附件。
请有需求的坛友复制后自行生成工程文件和hex文件。
  1. /*********************************************************************************************
  2. 使用51单片机和一体化红外线接收管检测遥控器发射的红外线信号,并将按键码值显示在P0口数码管上
  3. 程序在STC89C52RC单片机配合共阳数码管运行正常
  4. 原始程序来源于知乎,网址:https://zhuanlan.zhihu.com/p/662116293
  5. 在这里对原文章作者“玄宇鹰魂”表示感谢!
  6. *********************************************************************************************/
  7. #include <reg51.h>

  8. sbit smg1=P2^0;//数码管第1位驱动
  9. sbit smg2=P2^1;//数码管第2位驱动

  10. unsigned char Time0;
  11. unsigned char IrValue[6];
  12. unsigned char shijian;

  13. sbit IRIN=P3^2;//一体化红红外线接收引脚
  14. unsigned char shu[]={'0','0','0','0'};
  15. //unsigned char code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7C,0x39,0x5E,0x79,0x71};//共阴数码管编码
  16.   unsigned char code smgduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳数码管编码

  17. unsigned char num=0;
  18. void IrInit();
  19. void delay(unsigned int x);
  20. void DelayMs(unsigned int i)
  21. {
  22. while(i--)
  23. delay(100);
  24. }

  25. //主函数: main
  26. void main()
  27. {
  28. IrInit();
  29. while(1)
  30.      {
  31. //显示
  32.      P0=smgduan[num>>4];
  33.      smg1=0;
  34.      delay(100);
  35.      smg1=1;
  36.      P0=smgduan[num & 0x0f];
  37.      smg2=0;
  38.      delay(100);
  39.      smg2=1;
  40.     }
  41. }

  42. //红外线接收初始化函数IrInit()
  43. void IrInit()
  44. {
  45. IT0=1;//下降沿出发
  46. EX0=1;//打开中断0允许
  47. EA=1; //打开总中断

  48. IRIN=1;//初始化端口
  49. }

  50. //延时函数DelayMs()
  51. void delay(unsigned int x) //0.14ms误差0us
  52. {
  53. while(x--) ;
  54. }

  55. //红外线接收程序
  56. void ReadIr() interrupt 0
  57. {
  58. unsigned char j,k;
  59. unsigned int err;
  60. Time0=0;
  61. delay(700);  //7ms
  62. if(IRIN==0)  //确认是否真的接收到真正的信号
  63.       {
  64.       err=1000; //1000*10us=10ms,超过说明接收到错误的信号
  65. //当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时候程序死在这里
  66.       while((IRIN==0)&&(err>0)) //等待前面9ms的低电平过去
  67.           {
  68.           delay(1);
  69.           err--;
  70.           }
  71.       if(IRIN==1) //如果正确等到9ms低电平
  72.           {
  73.               err=500;
  74.               while((IRIN==1)&&(err>0)) //等待4.5ms的起始高电平过去
  75.                     {
  76.                     delay(1);
  77.                     err--;
  78.                     }
  79.       for(k=0;k<4;k++) //共有4组数据
  80.                     {
  81.                         for(j=0;j<8;j++) //接收一组数据
  82.                             {  
  83.                             err=60;
  84.                             while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
  85.                                 {
  86.                                     delay(1);
  87.                                     err--;
  88.                                 }
  89.                             err=500;
  90.                             while((IRIN==1)&&(err>0)) //计算高电平的时间长度
  91.                                 {
  92.                                 delay(10); //0.1ms
  93.                                 Time0++;
  94.                                 err--;
  95.                                 if(Time0>30)
  96.                                     {
  97.                                     return;
  98.                                     }
  99.                                 }
  100. IrValue[k]>>=1; //k表示第几组数据
  101. if(Time0>=8) //如果高电平出现大于565us,那么是1
  102.                                 {
  103.                                 IrValue[k]|=0x80;
  104.                                 }
  105.                                 Time0=0; //用完时间要重新赋值
  106.                             }
  107.                    }
  108.         }
  109. if(IrValue[2]!=~IrValue[3])
  110.           {
  111.           return;
  112.           }
  113.           else
  114. num=IrValue[2];
  115.       }

  116. }
复制代码







评分

参与人数 1黑币 +50 收起 理由
admin + 50

查看全部评分

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

使用道具 举报

沙发
ID:163139 发表于 2024-12-23 20:32 | 只看该作者
学习下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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