手把手教你红外遥控解码实验
红外遥控解码实验报告(3篇)

第1篇一、实验目的本次实验旨在通过搭建红外遥控系统,了解红外遥控的基本原理,掌握红外遥控信号的编码和解码方法,并利用单片机实现对红外遥控信号的解码,实现对红外遥控器的控制。
二、实验原理红外遥控技术是一种无线通信技术,通过发射端发送特定编码的红外信号,接收端接收该信号并进行解码,从而实现对电器的控制。
红外遥控系统主要由发射端和接收端两部分组成。
1. 发射端:由按键矩阵、编码调制电路和红外发射器组成。
按键矩阵根据按键的不同产生不同的编码信号,编码调制电路将这些信号调制在38kHz的载波上,红外发射器将调制后的信号发射出去。
2. 接收端:由红外接收器、前置放大电路、解调电路和指令信号检出电路组成。
红外接收器接收发射端发射的红外信号,前置放大电路对信号进行放大,解调电路将38kHz的载波信号去除,指令信号检出电路从解调后的信号中提取出指令信号。
三、实验设备1. 红外遥控发射器2. 红外接收模块3. 单片机开发板4. 连接线5. 电源6. 红外遥控解码程序四、实验步骤1. 搭建红外遥控系统:将红外接收模块连接到单片机开发板的相应引脚上,确保连接正确无误。
2. 编写红外遥控解码程序:根据红外遥控协议,编写解码程序,实现对红外信号的解码。
3. 程序烧录与调试:将解码程序烧录到单片机中,连接电源,进行程序调试。
4. 测试与验证:使用红外遥控器对单片机进行控制,观察单片机是否能够正确解码红外信号,并实现相应的控制功能。
五、实验结果与分析1. 红外遥控系统搭建成功:通过连接红外接收模块和单片机开发板,成功搭建了红外遥控系统。
2. 解码程序编写与调试:根据红外遥控协议,编写解码程序,实现对红外信号的解码。
在调试过程中,通过观察单片机的输出,验证了程序的正确性。
3. 测试与验证:使用红外遥控器对单片机进行控制,观察单片机是否能够正确解码红外信号,并实现相应的控制功能。
实验结果表明,单片机能够成功解码红外信号,并实现红外遥控器的控制功能。
任务5.4红外遥控解码.

* 函数名称: InfraredInit()
* 功能 :定时器测量脉宽功能初始化 * 入口参数:无
* 出口参数:无
* 说明 : ***************************************************************************/
void InfraredInit()
{
uint PulseWidth=0;
//
uchar OriginalCode=0;
//
脉宽 操作码原码
6
5.4 红外遥控器解码
uchar AntiCode=0;
//
按键码反码
static bit FlagStart=0;
//
捕获结果码标志位
static uchar IntrNum=0;
//
中断次数
IntrNum++;
}
if(IntrNum>=32)
//
{
IntrNum=0;
AntiCode=InfraredDecode&0xff; // OriginalCode=(InfraredDecode>>8)&0xff;//
if(AntiCode+ OriginalCode==0xff) //
{
FlagInfraredGet=1;
5.4.3 任务实施
图 5.4.8 是本程序的工程结构图:
图 5.4.8 工程结构框图
4
5.4 红外遥控器解码
( 1)主函数 main.c:
#include<reg52.h>
#include"Infrered.h"
红外遥控解码数码管显示实验

}
else
IRCOM[6]=IRCOM[6]+0x30;
q= (((IRCOM[6]&0x0f)<<4) + (IRCOM[5]&0x0f));
switch(q) //判断按键键码值
{
case 0x16:m=0;break; //串口发送0
/*预处理命令*/
#include<reg52.h> //包含单片机寄存器的头文件
#include<intrins.h> //包含_nop_()函数定义的头文件
#define uchar unsigned char
#define uint unsigned int
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
{delay(1);}
while (!IRIN) //等 IR 变为高电平
delay(1);
while (IRIN) //计算IR高电平时长
{
delay(1);
N++;
if (N>=30)
while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
delay(1);
for (j=0;j<4;j++) //收集四组数据
{
for (k=0;k<8;k++) //每组数据有8位
{
while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
一文教会你红外线遥控器软件解码程序

一文教会你红外线遥控器软件解码程序
红外线一开始发送一段13.5ms的引导码,引导码由9ms的高电平和4.5ms的低电平组成,跟着引导码是系统码,系统反码,按键码,按键反码,如果按着键不放,则遥控器则发送一段重复码,重复码由9ms的高电平,2.25ms的低电平,跟着是一个短脉冲。
#includeat89x52.h
#defineNULL0x00//数据无效
#defineRESET0X01//程序复位
#defineREQUEST0X02//请求信号
#defineACK0x03//应答信号,在接收数据后发送ACK信号表示数据接收正确,
也位请求信号的应答信号
#defineNACK0x04//应答信号,表示接收数据错误
#defineBUSY0x05//忙信号,表示正在忙
#defineFREE0x06//空闲信号,表示处于空闲状态
#defineREAD_IR0x0b//读取红外
#defineSTORE_IR0x0c//保存数据
#defineREAD_KEY0x0d//读取键值
#defineRECEIVE0Xf400//接收缓冲开始地址
#defineSEND0xfa00//发送缓冲开始地址
#defineIR0x50//红外接收缓冲开始地址
#defineHEAD0xaa//数据帧头
#defineTAIL0x55//数据帧尾
#defineSDAP1_7
#defineSCLP1_6
unsigned char xdata *buf1;//接受数据缓冲。
红外解码原来如此简单

红外解码原来如此简单硬件连接红外解码只需连下图中TSOP382的 3 根线(2 根电源 + 1 根数据)即可。
NEC 协议解码本文所述的红外编解码采用 NEC 协议。
通信的数据帧里使用高电平时间来区分 0 和 1。
对于按一下然后按住不动的情况,NEC 协议下是这么处理的:上图中Sugar 写的“固定重复指令”也叫作“重复引导码”。
对于红外通信协议,搜关键词“IR 引导码”会比较容易搜出结果。
NEC 的编码规则非常简单,如下图:Sugar 实际用逻辑分析仪抓取的波形如下,可以与上面的规则相互印证:Arduino 红外解码把上图中的代码复制到下面:•••••••••••••••••••••••••#include <IRremote.h>const int irReceiverPin = 2;IRrecv irrecv(irReceiverPin);decode_results results;decode_results res_last;void setup() { Serial.begin(9600); irrecv.enableIRIn();}void loop() { if(irrecv.decode(&results)){ if(res_last.value != results.value){ res_last.value = results.value; Serial.print('irCode: '); Serial.print(results.value, HEX); Serial.print(', bits: '); Serial.println(results.bits); } irrecv.resume(); }}STM32 红外解码一、外部中断方式参考《江涛带你玩STM32-CubeMX红外NEC解码实战(上)—外部中断方式》外部中断方式的优点在于:用哪个引脚都可以。
红外遥控解码完全资料LCD1602

红外遥控解码完全资料(LCD1602显示)本帖被一线工人执行置顶操作(2009-06-18)红外遥控解码实验一.实验目的1. 了解红外遥控编码并用单片机捕捉信号及解码2. 熟悉LCD1602的驱动二.红外遥控器编码遥控器编码分好几种,常见的32位编码码和42位编码码,目前我手中遥控器就是42位编码,如图1所示,当有按键时就会产一个9.12ms低电平和4.5ms高电平的起始码,紧接着是26位系统码,此系统码能区别不同的电器设备,防止不同机种遥控码互相干扰,接下来是8位数据码和8位数据反码,间隔23ms的高电平后,再发一个与启始码完全一样的结束码以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”,其波形如图2所示。
图2再回头看图1,大家不难看出,图1是遥控器按键1的一串编码三.硬件连接接收电咱我们使用一化红外接红外接收管1838,不需要任何外接无件,就能完成从红外线接收到输出与TTL电平信号兼容的所有工作,实物如图所示电路图如下:四.解码以上我们了解了红外遥控的编码及硬件连接,现在就对其进行解码,所谓解码就是能用单片机把以不同宽度的脉冲区别开来,一种比较好思路就是计算两次下降沿间隔时间,当单片机外部中断1口有下降沿时中断一次,并启动定时器,定时器定50us,当下次下降沿到来时我们计算定时器中断的次数,这样我们就能很好的区分不同宽度的脉冲了。
大家可能已经迫不急待的要开始解码了,别急,我们先把注意事项先讲一下,实际上,我们红外接收头收到的信号的是有毛刺的,放大后就如下图,所以在下降沿中断触发后,要做延时去抖处理*************************************以下是完整解码程序********************************/***********************************************项目:红外遥控解码(EE01学习板演示程序)**作者:一线工人**网站:电子工程师之家**本程序适合42位码遥控器,即26位系统码,16位数据码,如:57L5,55K2,54B4,KD-29,55K8,5Z26A,等型号的遥控器,转贴请保持代码的完整性*********************************************/#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit ir=P3^3;//红外端口sbit dm=P1^4;//数码管段码控制位sbit wm=P1^5;//数码管位码控制位sbit led_cs=P1^6;//LED控制位sbit rs=P3^5;//1602数据命令选择端sbit en=P3^4;//1602使能信号uchar num;uchar key_code=0;//遥控键值uchar new_code=0;//有无新按键uint buf_key_code=0;//键值暂存uchar key_bit_count=0;//键编码脉冲计数uint count=0;//定时中断次数计数uint buf_count=0;//定时中断计数暂存uchar common_code_count=0;//前导码脉冲计数uchar ir_status=0;//脉冲接收器所处的状态,0:无信号,1:系统码接收区,2:数据编码接收区uchar code table[]="EE01 DEMO:IR";uchar code table1[]="code:";uchar code table2[]={'0','1','2','3','4','5','6','7','8','9',};void delay_10us(unsigned char y)///延时子程序10us{unsigned char x;for(x=y;x>0;x--);}void delay_ms(uint z)//延时子程序1ms{uint x,y;for(x=z;x>0;x--)for(y=113;y>0;y--);}void init(void)/////初始化{ir=1; //红外端口写1led_cs=0; //关闭LEDEA=1; //开总中断TMOD=0x02; //定时器0,模式2,8位自动装载模式TH0=0Xd1; //定时50usTL0=0Xd1;IT1=1; //INT1下降沿触发ET0=1; //允许定时器中断EX1=1; //允许外部中断}/***********************************************定时器中断***********************************************/void time0() interrupt 1///定时器中断{count++;//定时器中断次数累加}/**********************************************外部中断,红外解码程序**********************************************/void int1() interrupt 2///外部中断{TR0=1;//开定时器中断if(count>12&&count<270)//如果信号合法,则放入buf_count,count清0,对下一个脉冲信号计时{buf_count=count;count=0;}delay_10us(10);//延时100us以消除下降沿跳变抖动if(ir==0)//INT1引脚稳定为低电平,则表法确实是信号,count重新计时,因上面延时了50us,故要补偿1次TO中断{count=2;}if(buf_count>12&&buf_count<270)//若收到的信号合法,则再进行信号分析{if(ir_status==0)//如果之前未收到引导码{if(buf_count>210&&buf_count<270)//判断是否引导码13.5ms{ir_status=1;//系统标记buf_count=0;//}}else if(ir_status==1)///收到引导码{if(common_code_count>=25)//若收完26个脉冲{ir_status=2;//数据解码标记common_code_count=0;//系统码计算清零buf_count=0;//中断计数暂存清0}else if((buf_count>40&&buf_count<70)||(buf_count>12&&buf_count<32)){buf_count=0;common_code_count++;//每收到一个信号自加1}}else if(ir_status==2)//进入数据编码接收{if(key_bit_count<8)//收到数据少于8位,则将收到的数据写入buf_key_code {if(buf_count>40&&buf_count<70){buf_count=0;buf_key_code>>=1;buf_key_code|=0x80;//收到1key_bit_count++;//数据脉冲累加}else if(buf_count>12&&buf_count<32)//收到0{buf_count=0;buf_key_code>>=1;//收到0key_bit_count++;}}else //若收完8位数据则做以下处理{ir_status=0;//接收状态返回到空闲key_code=buf_key_code;key_bit_count=0;buf_key_code=0;buf_count=0;TR0=0;new_code=1;}}}}/**********************************************1062驱动程序**********************************************/void wirte_cmd(uchar cmd)//写命令{rs=0;P0=cmd;en=1;delay_ms(5);en=0;}void wirte_data(uchar dat)//写数据{rs=1;P0=dat;en=1;delay_ms(5);en=0;}void wirte_string(const unsigned char *s)//在第二行第5个字开始写字符串{wirte_cmd(0x80+0x40+0x05);while(*s){wirte_data(*s);s++;}}void init_1602()///1602初始化{dm=0;wm=0;led_cs=0;wirte_cmd(0x38);delay_ms(5);wirte_cmd(0x0c);delay_ms(5);wirte_cmd(0x06);}/*************************************主程序*************************************/void main(){init(); ///初始化init_1602(); //1602初始化while(!new_code);//判断是否有新按键,如果有则执行下面程序,没有则一直循环wirte_cmd(0x01);//1602清屏delay_ms(5);wirte_cmd(0x80);//在第一行写入EE01 DEMO:IRfor(num=0;num<12;num++){wirte_data(table[num]);delay_ms(1);}wirte_cmd(0x80+0x40);//在第二行写入code:for(num=0;num<5;num++){wirte_data(table1[num]);delay_ms(1);}if(key_code<10)//如果按鍵小于10则写入相应的数字{wirte_data(table2[key_code]);delay_ms(2);}else if(key_code<50)//大于10则写入字符,与遥控器对应{switch(key_code){case 21:wirte_string("mute");break;case 28:wirte_string("power");break;case 10:wirte_string("-/--");break;case 14:wirte_cmd(0x80+0x40+0x05);wirte_data(0x7f);wirte_data(0x7e);break;//先写字符位置,然后写字符,case 25:wirte_string("SLEEP");break;case 19:wirte_string("P.P");break;case 15:wirte_string("TV/A V");break;case 30:wirte_string("VOL-");break;case 31:wirte_string("VOL+");break;case 27:wirte_string("P+");break;case 26:wirte_string("P-");break;case 16:wirte_string("MENU");break;case 24:wirte_string("A-MODE");break;case 13:wirte_string("SYS");break;case 12:wirte_string("GAME");break;case 20:wirte_string("DISP");break;delay_ms(2);}new_code=0;}}。
所有红外遥控器的解码方法

所有红外遥控器的解码方法已经完成了DS1302,18B20,RS232通讯,24C02存储,红外遥控等.现只将红外遥控的解码方法贴出,希望能与大家交流,起到抛砖引玉的作用.我的开发环境是IAR FOR AVR 5.11, CPU为M8,晶振 11.0592.红外遥控解码原理是通过AVR的输入捕获功能,捕获信号后进行宽度判断,并通过串口在电脑中显示出来.下面是捕获的程序,数据未经处理,只是捕获后进行编码的解码.通过这个捕获程序,原则上能解所有线外遥控编码,我已经解了格力和中星九B的遥控编码,代码未优化,只是测试.#include <iom8.h>#include "MyDelay.h" //在此未提供我的延时程序,如果有需要的我再贴出#include "MyUSART.h"//在此未提供我的串口配置程序,如果有需要的我再贴出#ifndef uchar#define uchar unsigned char#endif#ifndef uint#define uint unsigned int#endifvoid ini(void){//配置输入捕获TCCR1A = 0x00;//普通端口模式,OC1A/B未连接TCCR1B = 0x81;//位7与位6是输入捕获允许和触发方式,BIT2-0,分频选择TCNT1H = 0x00;//计数器起始值高8位TCNT1L = 0x00;//计数器起始值低8位ICR1 = 0x0000;//输入捕获发生时,将该值写入TCNTTIMSK |= 0x20;//输入捕捉中断使能 BIT5 =1TIFR &= 0xdf;//输入捕捉标志,外部引脚 ICP1 出现捕捉事件时 ICF1置位}#pragma vector = TIMER1_CAPT_vect //定时器0溢出中断入口__interrupt void TimeINT0(void){uint r;uchar h,l;r = ICR1;//接收时序if(TCCR1B &= 0x40) //更改触发方式TCCR1B = 0x81; //下降沿触发elseTCCR1B = 0xc1;//上升沿触发TCNT1H = 0x00;//计数器起始值高8位TCNT1L = 0x00;//计数器起始值低8位TIFR |= 0x20;//输入捕捉标志,外部引脚 ICP1 出现捕捉事件时 ICF1置位h = (uchar)(r>>8);l = (uchar)r;USART_Send(h); //串口显示高八位USART_Send(l);//串口显示低八位}void main(void){ini();}以下是由串口调试助手显示的数据.说明:1.时间未用,我的程序也通过串口显示了,2.前两个字节无意义,是因为捕获到低电平后,16位计数器一直在计数,所以,前面的计数值无用.3.编码原理不管是曼彻斯特_码/日立的通用红外编码/PT2272码等,差不多都由(异步) 码头+引导+编码+停止位组成,大同小异,所以根据这个原理,解出了上述数据的码头,引导和键编码.再根据解出的码画出频率图.4.计算时要将显示的数据转换成10进制再计算.5.未知部分估计是停止位,不过只要能检测到码头,引导和编码就可以了.6.解码后,可以将该数据进行处理, 这时,这个遥控器就可以赋与功能,和开发板互动了.呵呵,7.为什么选中九B,因为中9B的遥控器不用花钱,中9老是升级,好多客户都不用了,所以又省了10元钱,一块敷铜板的钱,哈哈哈.8.题外话,中9想升级的可以和我交流,我已经升了很多了.9.好,希望该方法可以帮助需要的朋友.。
【精品】用单片机解码红外遥控器

用单片机解码红外遥控器用单片机解码红外遥控器遥控器使用方便,功能多.目前已广泛应用在电视机、VCD、DVD、空调等各种家用电器中,且价格便宜,市场上非常容易买到。
如果能将遥控器上许多的按键解码出来.用作单片机系统的输入.则解决了常规矩阵键盘线路板过大、布线复杂、占用I/O口过多的弊病。
而且通过使用遥控器,操作时可实现人与设备的分离,从而更加方便使用.下面以TC9012编码芯片的遥控器为例.谈谈如何用常用的51系统单片机进行遥控的解码。
一、编码格式1、0和1的编码遥控器发射的信号由一串O和1的二进制代码组成.不同的芯片对0和1的编码有所不同.通常有曼彻斯特编码和脉冲宽度编码.TC9012的O和1采用PWM方法编码,即脉冲宽度调制,其O码和1码如图1所示(以遥控接收输出的波形为例)。
O码由O.56ms低电平和0.56ms高电平组合而成.脉冲宽度为1.12ms.1码由0.56ms低电平和1.69ms高电平组合而成.脉冲宽度为2.25ms。
在编写解码程序时.通过判断脉冲的宽度,即可得到0或1。
2、按键的编码当我们按下遥控器的按键时,遥控器将发出如图2的一串二进制代码,我们称它为一帧数据。
根据各部分的功能。
可将它们分为5部分,分别为引导码、地址码、地址码、数据码、数据反码。
遥控器发射代码时.均是低位在前。
高位在后。
由图2分析可以得到.引导码高电平为4.5ms,低电平为4.5ms.当接收到此码时.表示一帧数据的开始.单片机可以准备接收下面的数据。
地址码由8位二进制组成,共256种.图中地址码重发了一次.主要是加强遥控器的可靠性.如果两次地址码不相同.则说明本帧数据有错.应丢弃。
不同的设备可以拥有不同的地址码.因此。
同种编码的遥控器只要设置地址码不同,也不会相互干扰。
图中的地址码为十六进制的0EH(注意低位在前)。
在同一个遥控器中.所有按键发出的地址码都是相同的。
数据码为8位,可编码256种状态,代表实际所按下的键。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
手把手教你红外遥控解码实验单片机轻松入门教学 ------- 『电子驿站』原创,转载请注明出处!---------------------------------------------------------------------------------------------------------------红外线遥控是目前使用最广泛的一种通信和遥控手段。
由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。
工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。
【红外遥控系统】通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯片来进行控制操作,如图1所示。
发射部分包括键盘矩阵、编码调制、LED红外发送器;接收部分包括光、电转换放大器、解调、解码电路。
图1a图1b【遥控发射器及其编码】遥控发射器专用芯片很多,根据编码格式可以分成两大类,这里我们以运用比较广泛,解码比较容易的一类来加以说明,现以日本NEC的uPD6121G组成发射电路为例说明编码原理。
当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。
这种遥控码具有以下特征:采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”,其波形如图2所示。
上述“0”和“1”组成的32位二进制码经38kHz的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。
然后再通过红外发射二极管产生红外线向空间发射,如图3所示,连发波形如图4所示。
UPD6121G产生的遥控编码是连续的32位二进制码组,其中前16位为用户识别码,能区别不同的电器设备,防止不同机种遥控码互相干扰。
该芯片的用户识别码固定为十六进制01H;后16位为8位操作码(功能码)及其反码。
UPD6121G最多额128种不同组合的编码。
当遥控器在按键按下后,周期性地发出同一种32位二进制码,周期约为108ms。
一组码本身的持续时间随它包含的二进制“0”和“1”的个数不同而不同,大约在45~63ms之间,图4为发射波形图。
当一个键按下超过36ms,振荡器使芯片激活,将发射一组108ms的编码脉冲,这108ms发射代码由一个起始码(9ms),一个结果码(4.5ms),低8位地址码(9ms~18ms),高8位地址码(9ms~18ms),8位数据码(9ms~18ms)和这8位数据的反码(9ms~18ms)组成。
如果键按下超过108ms仍未松开,接下来发射的代码(连发代码)将仅由起始码(9ms)和结束码(2.5ms)组成。
代码格式(以接收代码为准,接收代码与发射代码反向)① 位定义② 单发代码格式③ 连发代码格式注:代码宽度算法:16位地址码的最短宽度:1.12×16=18ms 16位地址码的最长宽度:2.24ms×16=36ms已知8位数据代码及其8位反代码的宽度和不变:(1.12ms+2.24ms)×8=27ms∴ 32位代码的宽度为(18ms+27ms)~(36ms+27ms)1.解码的关键是如何识别“0”和“1”,从位的定义我们可以发现“0”、“1”均以0.56ms的低电平开始,不同的是高电平的宽度不同,“0”为0.56ms,“1”为1.68ms,所以必须根据高电平的宽度区别“0”和“1”。
如果从0.56ms低电平过后,开始延时,0.56ms以后,若读到的电平为低,说明该位为“0”,反之则为“1”,为了可靠起见,延时必须比0.56ms长些,但又不能超过1.12ms,否则如果该位为“0”,读到的已是下一位的高电平,因此取(1.12ms+0.56ms)/2=0.84ms最为可靠,一般取0.84ms左右均可。
2.根据码的格式,应该等待9ms的起始码和4.5ms的结果码完成后才能读码。
【红外遥控解码实验硬件】一体化红外线接收器是一种集红外线接收和放大整形于一体,不需要任何外接元件,就能完成从红外线接收到输出与TTL电平信号兼容的所有工作,而体积又很小巧,它适合于各种红外线遥控和红外线数据传输,广泛用于电视机、卫星接收机、VCD、DVD、音响、空调等家用电器中接收红外信号,图5是一体化接收头的引脚排列图,图6是本站产品配套的采用屏蔽线焊接的一体化红外接收头,采用屏蔽线焊接,抗干扰能力强,接收更可靠。
没有购买实验板配套的一体化红外接收头的网友可以根据图2所示接收头引脚排列图自己焊接一个。
图5:一体化红外接收头(引脚排列图)图6:本站产品配套一体化红外接收头(已经用屏蔽线焊接好,抗干扰能力强,插入实验板即可使用)下面就是我们将要进行红外遥控解码实验所要用到的硬件设备:S51增强型实验板、ISP编程器、AT89S51实验芯片、豪华型多功能红外线遥控器。
图7:S51增强型单片机实验板及防插反红外遥控接口图8:豪华型多功能红外遥控器+高灵敏度一体化红外接收头(23元)图9:32键豪华型红外遥控器原理图图10:ISP编程器烧写实验单片机芯片AT89S51【红外遥控解码实验】我们经过对前面的遥控编解码知识的学习,对红外遥控有了基本的了解,下面我们马上进行解码实验。
本红外遥控解码实验的的功能是:程序对遥控器发射的遥控码进行解码,解码成功时蜂鸣器发出"嘀嘀"的解码成功提示音,如果按压的是数字键"0~9"就将按键值在实验板上的5位数码管上显示出按键值,同时将按键的十六进制值用P1口的8位发光二极管指示出来;如果按压的不是数字键"0~9",就直接从P1口输出键值;下面是遥控解码汇编源程序。
实验时将先连接好硬件设备,将配套的一体化红外遥控接收头插入实验板上的"红外遥控"接口内,在Keil单片机集成开发环境中新建工程,通过Keil将源程序编译得到HEX格式目标文件yk.hex,最后使用ISP编程器将目标文件烧写到AT89S51单片机中,插到S51增强型实验板上运行,拿出配套的红外遥控器进行解码测试,看看实验结果是否和程序相同。
>>> 点此下载HEX格式目标文件 yk.hex >>>>>> 点此下载遥控解码源程序和Keil工程文件 >>>ORG 0000HMAIN: MOV SP,#60HMOV P0,#0FFHMOV P1,#0FFHMOV P2,#0FFHMOV P3,#0FFHJNB P3.2,$ ;等待遥控信号出现MOV R6,#10SB: ACALL YS1 ;调用882微秒延时子程序JB P3.2,MAIN ;延时882微秒后判断P3.2脚是否出现高电平如果有就退出解码程序DJNZ R6, SB ;重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序;以上完成对遥控信号的9000微秒的初始低电平信号的识别。
JNB P3.2, $ ;等待高电平避开9毫秒低电平引导脉冲ACALL YS2 ;延时4.74毫秒避开4.5毫秒的结果码MOV R1,#1AH ;设定1AH为起始RAM区MOV R2,#4PP: MOV R3,#8JJJJ: JNB P3.2,$ ;等待地址码第一位的高电平信号LCALL YS1 ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态MOV C,P3.2 ;将P3.2引脚此时的电平状态0或1存入C中JNC UUU ;如果为0就跳转到UUUJB P3.2,$ ;如果为1就等待高电平信号结束UUU: MOV A,@R1 ;将R1中地址的给ARRC A ;将C中的值0或1移入A中的最低位MOV @R1,A ;将A中的数暂时存放在R1中DJNZ R3,JJJJ ;接收地址码的高8位INC R1 ;对R1中的值加1,换成下一个RAMDJNZ R2,PP ;接收完16位地址码和8位数据码和8位数据反码,存放在1AH/1BH/1CH/1DH的RAM中;以下对代码是否正确和定义进行识别MOV A,1AH ;比较高8位地址码XRL A,#00000000B ;判断1AH的值是否等于00000000,相等的话A为0JNZ MAIN ;如果不相等说明解码失败退出解码程序MOV A,1BH ;比较低8位地址XRL A,#11111111B ;再判断高8位地址是否正确JNZ MAIN ;如果不相等说明解码失败退出解码程序MOV A,1CH ;比较数据码和数据反码是否正确?CPL AXRL A,1DH ;将1CH的值取反后和1DH比较不同则无效丢弃,核对数据是否准确JNZ MAIN ;如果不相等说明解码失败退出解码程序LCALL SOUND ;解码成功,声音提示MOV A,1AHCPL AMOV P1,A ;遥控码十六进制值通过P1口LED显示出来;-------- 下面为0~9键码判断并在实验板的5位数码管中显示键值 -------- JZPD: MOV A,1AHIRD0: CJNE A,#00H,IRD1 ;按键"0"判断显示MOV P0,#0C0HMOV P2,#11100000BAJMP MAINIRD1: CJNE A,#01H,IRD2 ;按键"1"判断显示MOV P0,#0F9HMOV P2,#11100000BAJMP MAINIRD2: CJNE A,#02H,IRD3 ;按键"2"判断显示MOV P0,#0A4HMOV P2,#11100000BAJMP MAINIRD3: CJNE A,#03H,IRD4 ;按键"3"判断显示MOV P0,#0B0HMOV P2,#11100000BAJMP MAINIRD4: CJNE A,#04H,IRD5 ;按键"4"判断显示MOV P0,#99HMOV P2,#11100000BAJMP MAINIRD5: CJNE A,#05H,IRD6 ;按键"5"判断显示MOV P0,#92HMOV P2,#11100000BAJMP MAINIRD6: CJNE A,#06H,IRD7 ;按键"6"判断显示MOV P0,#82HMOV P2,#11100000BAJMP MAINIRD7: CJNE A,#07H,IRD8 ;按键"7"判断显示MOV P0,#0F8HMOV P2,#11100000BAJMP MAINIRD8: CJNE A,#08H,IRD9 ;按键"8"判断显示MOV P0,#80HMOV P2,#11100000BAJMP MAINIRD9: CJNE A,#09H,IRDOR ;按键"9"判断显示MOV P0,#90HMOV P2,#11100000BAJMP MAINIRDOR: MOV P2,#0FFH ;关闭数码管使能。