最近在学习红外线遥控继电器,手头有一个闲置遥控器,但不知道按键码值,在网上搜索相关资源后获到一个程序,经测试好用,在这里分享发给大家。
原程序来源于“知乎”,原文网址:https://zhuanlan.zhihu.com/p/662116293,在这里对原创作者“玄宇鹰魂”表示感谢。
因本论坛下载附件需要“黑币”,为了避免原作者有可能误判利用他的原作盈利,在这里只贴出程序内容,不上传附件。
请有需求的坛友复制后自行生成工程文件和hex文件。
- /*********************************************************************************************
- 使用51单片机和一体化红外线接收管检测遥控器发射的红外线信号,并将按键码值显示在P0口数码管上
- 程序在STC89C52RC单片机配合共阳数码管运行正常
- 原始程序来源于知乎,网址:https://zhuanlan.zhihu.com/p/662116293
- 在这里对原文章作者“玄宇鹰魂”表示感谢!
- *********************************************************************************************/
- #include <reg51.h>
- sbit smg1=P2^0;//数码管第1位驱动
- sbit smg2=P2^1;//数码管第2位驱动
- unsigned char Time0;
- unsigned char IrValue[6];
- unsigned char shijian;
- sbit IRIN=P3^2;//一体化红红外线接收引脚
- unsigned char shu[]={'0','0','0','0'};
- //unsigned char code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7C,0x39,0x5E,0x79,0x71};//共阴数码管编码
- unsigned char code smgduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳数码管编码
- unsigned char num=0;
- void IrInit();
- void delay(unsigned int x);
- void DelayMs(unsigned int i)
- {
- while(i--)
- delay(100);
- }
- //主函数: main
- void main()
- {
- IrInit();
- while(1)
- {
- //显示
- P0=smgduan[num>>4];
- smg1=0;
- delay(100);
- smg1=1;
- P0=smgduan[num & 0x0f];
- smg2=0;
- delay(100);
- smg2=1;
- }
- }
- //红外线接收初始化函数IrInit()
- void IrInit()
- {
- IT0=1;//下降沿出发
- EX0=1;//打开中断0允许
- EA=1; //打开总中断
- IRIN=1;//初始化端口
- }
- //延时函数DelayMs()
- void delay(unsigned int x) //0.14ms误差0us
- {
- while(x--) ;
- }
- //红外线接收程序
- void ReadIr() interrupt 0
- {
- unsigned char j,k;
- unsigned int err;
- Time0=0;
- delay(700); //7ms
- if(IRIN==0) //确认是否真的接收到真正的信号
- {
- err=1000; //1000*10us=10ms,超过说明接收到错误的信号
- //当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时候程序死在这里
- while((IRIN==0)&&(err>0)) //等待前面9ms的低电平过去
- {
- delay(1);
- err--;
- }
- if(IRIN==1) //如果正确等到9ms低电平
- {
- err=500;
- while((IRIN==1)&&(err>0)) //等待4.5ms的起始高电平过去
- {
- delay(1);
- err--;
- }
- for(k=0;k<4;k++) //共有4组数据
- {
- for(j=0;j<8;j++) //接收一组数据
- {
- err=60;
- while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
- {
- delay(1);
- err--;
- }
- err=500;
- while((IRIN==1)&&(err>0)) //计算高电平的时间长度
- {
- delay(10); //0.1ms
- Time0++;
- err--;
- if(Time0>30)
- {
- return;
- }
- }
- IrValue[k]>>=1; //k表示第几组数据
- if(Time0>=8) //如果高电平出现大于565us,那么是1
- {
- IrValue[k]|=0x80;
- }
- Time0=0; //用完时间要重新赋值
- }
- }
- }
- if(IrValue[2]!=~IrValue[3])
- {
- return;
- }
- else
- num=IrValue[2];
- }
- }
复制代码
|