基于51单片机的红外解码.docx
- 文档编号:7133503
- 上传时间:2023-01-21
- 格式:DOCX
- 页数:13
- 大小:2.60MB
基于51单片机的红外解码.docx
《基于51单片机的红外解码.docx》由会员分享,可在线阅读,更多相关《基于51单片机的红外解码.docx(13页珍藏版)》请在冰豆网上搜索。
基于51单片机的红外解码
基于51单片机的红外遥控解码报告
一、红外遥控技术简介
经网上查询相关资料得知红外遥控技术分为发射与接收两部分,发射部分包括键盘,编码调制,红外发送器,而接收部分包含光电转换放大器,解调,解码电路。
在本次任务中,主要是基于红外发射的相关规律以及51单片机的特点编写解码程序与显示程序。
按编码分类红外遥控技术则分为两种,一种为NEG码,一种为RC5码,这里着重介绍NEG码。
1、NEG码的相关特点
NEG码格式特征如下:
1、使用38KHZ载波频率
2、引导码间隔9ms+4.5ms
3、使用16位客户码
4、使用8位数据码以及8位数据反码
下面为相关特征波形:
NEG码的数据帧构成:
二进制0与1的表示方法:
注:
解码时接收码与发射码反相。
2、RC5码的相关特点
二进制0与1的表示方法:
RC5码编码字举例:
第一位是起始位S通常是逻辑1。
第二位是场位F通常为逻辑1,在RC5扩展模式下它将最后6位命令代码扩充到7位代码(高位MSB),这样可以从64个键值扩充到128个键值。
第三位是控制位C它在每按下了一个键后翻转,这样就可以区分一个键到底是一直按着没松手还是松手后重复按。
(如图所示是同一按键重复按两次所得波形,只有第三位是相反的逻辑,其它的位逻辑都一样)
其后是五个系统地址位,最后是六个命令位。
二、红外遥控的解码及设计思路
这里采用基于NEG码的解码,使用VS_1838b红外一体化接收头,其结构图如下:
●
3个引脚,Out、GND、Vcc
●工作电压Vcc2.7~5.5V
●接收距离L1820M
●载波频率f=38kHz
●低电平输出VOLVin=0VVcc=5V0.20.4V
●高电平输出VOHVcc=5V4.5V
以下为发送码与接收码的对比:
(上文提及的反相)
收编码‘1001’实例图:
接收到的(VS_1838b输出的)数据帧格式:
注:
数据输出低位(bit0)在前,高位(bit7)在后。
遥控信号的解码算法及编程思路:
解码的关键是如何识别“0”和“1”,从位的定义可以发现“0”、“1”均以0.56ms的低电平开始,不同的是高电平的宽度不同,“0”为0.56ms,“1”为1.68ms,所以必须根据高电平的宽度区别“0”和“1”。
解码过程具体如下:
(1)初始化外部中断0(或者1)为下降沿中断。
(2)进入外部中断服务程序,关闭外部中断。
(3)对引导码进行判断。
如果引导码正确,准备接收下面的一帧遥控数据,以查询方式判断遥控的数据是0还是1。
如果非引导码,则退出外部中断。
(4)先后依次接收地址码、地址反码、数据码、数据反码。
(5)当接收到32位数据时,说明一帧数据接收完毕。
比较数据码和数据反码,若数据码取反后与数据反码不同,则表示为无效数据,应放弃本次接收数据。
(6)开启外部中断,准备下一次遥控接收。
查询方式与上述过程中的
(2)~(5)一致,这里不再重复。
三、基于51单片机的红外解码编程实现
本次解码主要应用了开发板的单片机P0,P1输出,P3.2中断,红外接收管,
74HC138译码以及数码管显示电路。
程序实现的具体的流程如下:
1、由红外接收数据帧,并将其按高低电平传至中断感应P3.2,由P3.2的接收信号用NEG码的特征延时进行判断,首先,看是否满足引导帧,若满足,则进行地址码与数据码的储存,其中0与1的判断按上文中的延时进行判别。
若不满足引导帧,则跳出判断,继续主循环。
2、在满足的情况下,数据存储完毕后进行数据的比较,即8位数据与8位反码的数据的比较,若满足互为反码,则数据正确,若不满足则数据无效,跳出判断,继续主循环。
3、在数据有效的情况下进行数据的显示输出,这里采用十六进制的七段数码管显示,末位恒显示为H,由于十六进制与二进制的换算是四位一组,故而将8位数据分为两组,由于所用开发板共有八个数码管,故而仅用末三个,由138译码分别将其选出并显示。
单片机开发板实物图如下:
注:
由于本次作业并未对红外遥控地址码有鉴别要求,故此编程不做相关讨论,若有需要可根据保存的地址数据进行比较判别继而选择数据是否有效即可。
首先,对程序进行变量定义与中断初始化:
继而进入主循环,在主循环里编写了相关转换与显示:
至此主程序结束。
在主程序中所涉及到的变量为全局变量,于程序头有定义:
延时函数于中断程序中有应用,中断程序如下:
以上为中断NEG引导码的识别,继而为16位地址码与8位数据码,8位数据反码的存储。
数据存储完毕后对数据码以及数据反码进行校验,若互为反码,则数据有效,若不是,则数据无效舍弃。
由于程序中涉及到的时间有9ms,4.5ms,0.56ms,1.685ms,为程序中调用延时程序计算与比较方便,此延时程序基础延时为0.14ms。
以下附有调试成功的解码效果图:
其中第一张为未收到信号解码图,由于默认的存储字符组为0,故显示为00H,下面两张为接收相应按键信号的解码图。
四、感想与体会
附录:
源代码
#include
#definePOUTP0//定义输出端
sbitLSA=P1^0;
sbitLSB=P1^1;
sbitLSC=P1^2;//定义输出至138入口的输出端
sbitIR=P3^2;//定义中断口表示
unsignedcharyima[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F显示字符
unsignedcharSTORE[4];//用来存放读取到的红外值
voidDelayMs(unsignedint);//延时函数声明
voidmain()//主程序
{
intm,n;
unsignedcharDIS[2];//用以中间换算显示
IT0=1;//下降沿触发
EX0=1;//打开中断0允许
EA=1;//打开总中断
IR=1;//初始化端口
while
(1)//主循环
{
DIS[0]=STORE[2]>>4;//高四位
DIS[1]=STORE[2]&0x0f;//低四位
for(m=0;m<3;m++)
{
switch(m)
{
case(0):
LSA=1;LSB=1;LSC=1;
POUT=0x76;
break;//末尾显示H
case
(1):
LSA=0;LSB=1;LSC=1;
POUT=yima[DIS[1]];
break;//第七位显示第四位换算数值
case
(2):
LSA=1;LSB=0;LSC=1;
POUT=yima[DIS[0]];
break;//第六位显示高四位换算数值
}
n=10;
while(n--);//延时以清晰显示
POUT=0;//清零
}
}
}
voidDelayMs(unsignedintx)//延时程序0.14ms
{
unsignedchari;
while(x--)
{
for(i=0;i<13;i++)
{}
}
}
voidRead()interrupt0//中断程序
{
unsignedinti,j,c,T;
T=0;
DelayMs(64);//延时一段时间确认是否还为低电平
if(IR==0)//确认收到正确信号
{
c=20;
while((IR==0)&&(c>0))//等待9ms的低电平过去
{
DelayMs
(1);
c--;
}
if(IR==1)//如果正确等到9ms低电平
{
c=40;
while((IR==1)&&(c>0))//等待4.5ms的高电平过去
{
DelayMs
(1);
c--;
}
for(i=0;i<4;i++)//共有4组数据
{
for(j=0;j<8;j++)//接收一组数据
{
c=6;
while((IR==0)&&(c>0))//等待信号前面的560us低电平过去
{
DelayMs
(1);
c--;
}
c=40;
while((IR==1)&&(c>0))//计算高电平的时间长度。
{
DelayMs
(1);//0.14ms
T++;
c--;
if(T>30)
{
EX0=1;
return;
}
}
STORE[i]>>=1;//数据右移一位
if(T>=8)
STORE[i]|=0x80;//如果高电平出现大于565us,那么是1
T=0;//用完时间要重新赋值
}
}
}
if(STORE[2]!
=~STORE[3])
return;
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 单片机 红外 解码