红外接收程序讲解
- 格式:docx
- 大小:39.85 KB
- 文档页数:3
“红外通信1(收发单个字节)”程序设计说明1程序设计思路各种通信采用不同的通信协议,如串口通信、485通信、有线网络通信、无线通信等等,通信的协议不同通信的媒介也不一样,红外通信以红外光为通信媒介,将信号加载在红外光上进行传输。
图1 红外发送接收电路连接示意图1.1程序设计关键点(1)发送数据时,红外发光二极管在什么时候需要发光,如何发光?当串口发送0时,红外发光二极管需要发出38kHz的光;当串口发送端发送1时,红外发光二极管不发光。
(2)串口的波特率如何进行设置?由于红外接收头在接收到38kHz的红外脉冲信号一段时间后,才能把信号进行有效转换,故波特率时尽量设低,否则红外接收头接收红外脉冲的时间太短,无法对信号进行转化。
1.2程序工作过程(不包括按键工作过程)1.2.1发送收到发送的命令,在P3.7发出串行信号。
此时定时器T0已被设置为每13us(38kHz)触发一次中断,检测串口发送引脚P3.7的电平高低,若P3.7为低电平, P3.5(红外发送端)电平翻转,否则 P3.5置零(即通过P3.7来控制P3.5是否发出脉冲)。
1.2.2接收(1)红外线接收头接把接收到的红外信号转换成电平输入到接收引脚P3.6,串口1接收到数据;(2)串口8位数据接收完毕,接收方程序从接收缓冲寄存器SBUF中读出接到的数据;(3)把接收内容显示在数码管中。
1.3定时器的使用本程序使用了三个定时器: T0、T1和T2。
(1)T0:设置为13us中断一次,每次检测P3.7的电平高低,决定P3.5是否需要进行电平翻转,从而产生38kHz的红外脉冲。
(2)T1:作为串口1的波特率发生器,不产生中断。
(3)T2:用于控制按键消抖检测和数码管扫描的频率。
注明:因为红接收发容易接收到外界信号,所以在发送前应发出一个收发确认信号,让接收方接收数据。
程序中,发送数据前先发送数据0xca作为发送确认标志。
数据发送完毕后,根据串口1的特点,P3.7引脚会持续输出高电平,此时P3.5引脚持续输出低电平,红外发光二极管不发光。
红外发送调用SendIRdata();while(over==0);地址储存在addr(可根据需要改成发送16位地址,此程序发送的是八位地址,第二地址是第一个的反码)中,hwdata,c,d,over,dat是全局unsigned char ,在等待红外发送完成while(over==0)语句,等待时间为几十ms,可在前面或while中可执行其他程序。
(等待期间不需要执行其他程序也可把while语句放入SendIRdata()末尾)void SendIRdata(unsigned char x){TH1=0xdc;//发送9ms的起始码TL1=0xd8;TR2=1;TR1=1;hwdata=x;over=0;//红外发送结束标志,为1完成}/**************定时器1中断处理***************/void timeint(void) interrupt 3{switch(c){case 0: //起始码4.5msTH1=0xee;TL1=0x6c;TR2=0;c=1;dat=addr;//发送十六位地址的前八位break;case 1:TH1=0xfd; //560us高电平TL1=0xd0;TR2=1;c=2;break;case 2:if(dat&0x01){ TH1=0xf9;TL1=0x5c;}//1.7ms低电平else{ TH1=0xfd;TL1=0xd0;}//560us低电平TR2=0;dat>>=1;d++;c=1;if(d==8)dat=~addr;//发送十六位地址的后八位if(d==16)dat=hwdata;//发送八位数据if(d==24)dat=~hwdata;//发送八位数据的反码if(d==33){over=1;TR1=0;TR2=0;d=0;c=0;}break;}}外中断0 接收,储存在dat[3]全局变量中,hu,time1,time2,h,b,是unsigned char型全局变量,time是unsigned intvoid extern0() interrupt 0 //中断程序{if(hu==0){TL1=0;TH1=0;TR1=1;hu=1;}else{TR1=0;time1=TH1;time2=TL1;TL1=0;TH1=0;TR1=1;time=time1*256+time2;if(start==0){if((14000>time)&&(time>13000))start=1;}else{//if((time>2100)&&(2400>time))//{dat[h]>>=1; dat[h]=dat[h]|0x80;}//else//if((time>1000)&&(1250>time))//dat[h]>>=1;dat[h]>>=1;if((time>2100)&&(2400>time))dat[h]=dat[h]|0x80;b++;if(b>7){ b=0;h++;if(h>3){h=0;start=0;hu=0;if(dat[0]!=~dat[1]|| dat[2]!=~dat[3])dat[2]=0;}}}}}。
红外接收程序讲解 TYYGROUP system office room 【TYYUA16H-TYY-TYYYUA8Q8-红外接收程序讲解1、红外遥控系统通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯片来进行控制操作,如图1所示。
发射部分包括键盘矩阵、编码调制、LED红外发送器;接收部分包括光、电转换放大器、解调、解码电路。
下面,我们将使用下面两种设备:另外,使用51单片机进行解码。
2、原理图从原理图看出,IR的data脚与51的PD2相连。
2、红外发射原理要对红外遥控器所发的信号进行解码,必须先理解这些信号。
a) 波形首先来看看,当我们按下遥控器时,红外发射器是发送了一个什么样的信号波形,如下图:由上图所示,当一个键按下超过22ms,振荡器使芯片激活,将发射一组108ms的编码脉冲(由位置1所示)。
如果键按下超过108ms仍未松开,接下来发射的代码(连发代码由位置3所示)将仅由起始码(9ms)和结束码()组成。
下面把位置1的波形放大:由位置1的波形得知,这108ms发射代码由一个起始码(9ms),一个结果码(),低8位地址码(用户编码)(9ms~18ms),高8位地址码(用户编码)(9ms~18ms),8位数据码(键值数据码)(9ms~18ms)和这8位数据的反码(键值数据码反码)(9ms~18ms)组成。
b) 编码格式遥控器发射的信号由一串0和1的二进制代码组成.不同的芯片对0和1的编码有所不同。
通常有曼彻斯特编码和脉冲宽度编码。
XS-091遥控板的0和1采用PWM方法编码,即脉冲宽度调制。
下图为一个发射波形对应的编码方法:放大0和1的波形如下图:这种编码具有以下特征:以脉宽为、间隔、周期为的组合表示二进制的“0”;以脉宽为、间隔、周期为的组合表示二进制的“1”。
3、红外接收原理a) 波形红外接收头将38K载波信号过虑,接收到的波形刚好与发射波形相反:放大,位定义0和位定义1波形如下:4、解码原理及算法注:代码宽度算法:16位地址码的最短宽度:×16=18ms 16位地址码的最长宽度:×16=36ms可以得知8位数据代码及其8位反代码的宽度和不变:(+)×8=27ms所有32位代码的宽度为(18ms+27ms)~(36ms+27ms)对于红外线遥控对于很多电子爱好者来讲,都感觉到非常神奇,看不到,摸不着,但能实现无线遥控,其实控制的关键就是我们要用单片机芯片来识别红外线遥控器发出红外光信号,即我们通常所说的解码。
【新梦想】mbot24课教学建议——第十三课第十三课《红外通讯(发送与接收)》教学建议一、教学目标:软件目标:1. 了解判断语句的使用方法。
2. 掌握根据需求,调整语句的先后顺序。
3. 了解红外通讯中判断信号语句,与运算积木的区别。
硬件目标:1. 掌握主板发送与接收的方法。
2. 了解调出通讯积木的方法。
3. 了解红外通讯中的字符要求。
二、教学重难点:重点:掌握主板发送与接收的方法。
难点:了解红外通讯中的字符要求。
三、教学准备:mBot/mCore控制板(2块)四、示例程序:当按下mBot1/mCore1的板载按钮后,mBot1/mCore1发出通讯信号并发声,mBot2/mCore2接收到信号后发声发光。
完成本示例需准备2个上传到mBot1/mCore1上传到mBot2/mCore2五、脚本说明本示例利用mCore的板载红外接收器和红外发射器实现。
准备两个mBot/mCore,将程序1上传到mBot1/mCore1,将程序2上传到mBot2/mCore2。
程序1——发送消息,只要按下板载按钮,mBot1/mCore1发声并发送一条消息,消息由板载红外线发射器发出,消息内容可以自由设置,本例将发送的消息设为“S”。
程序2——接收消息,只要接收到消息“S”,mBot2/mCore2控制板发出红光,蜂鸣器发声(模仿“被击中”的效果)。
若有其他mBot,只要发送/接收的消息相同,就可使用本示例程序在多个mBot/mCore之间进行通讯与互动。
六、知识要点要点一:红外通讯中的字符积木中定义的消息是作为信号使用的,尽量填入占用空间小的英文字符或字符串,避免程序较为复杂时出错。
要点二:积木的使用积木用于红外通讯中判断信号是否匹配,此处不能替换为运算积木。
要点三:实现程序2需要调出通讯积木使用积木,需要在mBlock菜单栏里选择“扩展”-“Communication”,才能在机器人模块区中,调出“通讯”积木。
七、扩展任务改变脚本实现:当控制板mCore1感受到较强的光线时,发送另一条消息,控制板mCore2接收到消息后表现出“满血复活”的声光效果。
5104红外接收程序//cmd_state 起始码、用户码、指令码所处的状态标志//cmd_data 指令码7位数据存储器//cmd_start 起始码接收完毕标志//cmd_admin 用户码接收完毕标志//cmd_bit 端口中断或定时器溢出中断接收到的一位数据,该数据有三种状态:1、0、错误static volatile uchar cmd_state,cmd_data;static volatile bit cmd_start,cmd_admin;void IntCmd(){if(!cmd_start) //若起始码未接收到,则先持续处理起始码{if(cmd_bit==1){switch (cmd_state){case 1:cmd_state=2;break; //1 1case 2:cmd_state=2;break; //1 1 1时,舍弃第一个接收到的1 default:cmd_state=1;break; //1 否则,认为是起始码的第一个bit }}else if(cmd_bit==0){switch (cmd_state){case 2:cmd_state=3;break; //1 1 0 正确的起始码default:cmd_state=0;break; //?? ?? ?? ??(全部字节不对,)}}else cmd_state=0; //若接收到的是错误位,则清除起始码的侦测记录if(cmd_state==3) //得到完整的起始码{cmd_state=0;cmd_admin=0;cmd_start=1;}}else{if(!cmd_admin){if(cmd_bit==1){if(cmd_state==1){cmd_state=0;cmd_data=0;cmd_admin=1;}else cmd_state=1;}else //若用户码出现0或者错误位,则重置起始码{cmd_state=0;cmd_start=0;}}else{if(cmd_bit==1||cmd_bit==0){cmd_data=(cmd_data<<1)|cmd_bit;cmd_state++;if(cmd_state==7){cmd_state=0;cmd_start=0;cmd_admin=0;switch (cmd_data){case 0X01:Key1=1;break; //第1个键按下每个按键可以用按键时间来替换,当倒计时为0时,自动清除按键标志。
红外接收程序讲解
1、红外遥控系统
通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯片来进行控制操作,如图1所示;发射部分包括键盘矩阵、编码调制、LED红外发送器;接收部分包括光、电转换放大器、解调、解码电路;
下面,我们将使用下面两种设备:
另外,使用51单片机进行解码;
2、原理图
从原理图看出,IR的data脚与51的PD2相连;
2、红外发射原理
要对红外遥控器所发的信号进行解码,必须先理解这些信号;
a 波形
首先来看看,当我们按下遥控器时,红外发射器是发送了一个什么样的信号波形,如下图:
由上图所示,当一个键按下超过22ms,振荡器使芯片激活,将发射一组108ms的编码脉冲由位置1所示;如果键按下超过108ms仍未松开,接下来发射的代码连发代码由位置3所示将仅由起始码9ms和结束码组成;下面把位置1的波形放大:
由位置1的波形得知,这108ms发射代码由一个起始码9ms,一个结果码,低8位地址码用户编码9ms~18ms,高8位地址码用户编码9ms~18ms,8位数据码键值数据码
9ms~18ms和这8位数据的反码键值数据码反码9ms~18ms组成;
b 编码格式
遥控器发射的信号由一串0和1的二进制代码组成.不同的芯片对0和1的编码有所不同;通常有曼彻斯特编码和脉冲宽度编码;XS-091遥控板的0和1采用PWM方法编码,即脉冲宽度调制;下图为一个发射波形对应的编码方法:
放大0和1的波形如下图:
这种编码具有以下特征:以脉宽为、间隔、周期为的组合表示二进制的“0”;以脉宽为、间隔、周期为的组合表示二进制的“1”;
3、红外接收原理
a 波形
红外接收头将38K载波信号过虑,接收到的波形刚好与发射波形相反:
放大,位定义0和位定义1波形如下:
4、解码原理及算法
注:代码宽度算法:
16位地址码的最短宽度:×16=18ms 16位地址码的最长宽度:×16=36ms
可以得知8位数据代码及其8位反代码的宽度和不变:+×8=27ms
所有32位代码的宽度为18ms+27ms~36ms+27ms
对于红外线遥控对于很多电子爱好者来讲,都感觉到非常神奇,看不到,摸不着,但能实现无线遥控,其实控制的关键就是我们要用单片机芯片来识别红外线遥控器发出红外光信号,即我们通常所说的解码;单片机得知发过来的是什么信号,然后再做出相应的判断与控制,如我们按电视机遥控器的频道按钮,则单片机会控制更换电视频道,如按的是遥控器音量键,则单片机会控制增减音量;
解码的关键是如何识别“0”和“1”
从位的定义我们可以发现“0”、“1”均以的低电平开始,不同的是高电平的宽度不同,“0”为,“1”为,所以必须根据高电平的宽度区别“0”和“1”;
如果从低电平过后,开始延时,以后,若读到的电平为低,说明该位为“0”,反之则为“1”,为了可靠起见,延时必须比长些,但又不能超过,否则如果该位为“0”,读到的已是下一位的高电平,因此取+/2=最为可靠,一般取左右均可;根据码的格式,应该等待9ms的起始码和的结果码完成后才能读码;
5、实例代码:
注意一下几点:
1. 从上面“红外接收头与单片机连接原理图”来看,红外接收头的型号脚是与51的int0相连,所以需要使用INT0外部中断0.
2. 由于解码过程中涉及到延时,为精确起见,我们选择使用定期时1来计时;
实例代码:
C++
1.include
2.include
系统初始化SystemInit
系统初始化时,我们设置IRIN为高电平,同时把IT0设置成1,即下降沿负跳变触发中断;这是用于接收波形的引导码是从低电平开始的如上面接收波形所示;这样,当按下按键时,红外接收到信号,IRIN则发生从预先设置的高电平跳为低电平,从而产生中断;
2. 解码--中断程序interr_irvoid
首先,第一步把EX0关中断,这步至关重要,因为一个接收波形许多的下降沿,这样会产生干扰中断;
接下来,使用定期时0延时9ms,跳过开始码;注意,延时后,需要检测一下干扰信号;
下一步,whileIRIN; 等待高电平的到来,再延时,跳过结果;
引导码过后, 开始读码,执行GetCode:
32位数据码,分4次读取,所以执行4次GetCode,读取一个字节数据过程如下:
C++
1.unsigned char GetCode
2.{
3.unsigned char n;
4.static temp=0;
5.for n = 0; n < 8; n++
6.{
while IRIN; 从上述位定义看,位0和位1都是的低电平过后,高电平开始延时;所以,读码的第一步whileIRIN;是等待这个的低电平之后的高电平;
2. 从高定平到后开始延时
3. 判断的波形高电平还是低电平;若仍然是高电平证明,该位为“1”,否则为“0”;到这里读码结束;
3. 校验
由于32位数据码中,后两个字节是键数据码和健数据反码;可以通过这两个字节数来实行校验;即,把前一个字节去反判读是否等于后一字节;。