红外接收程序讲解

合集下载

红外通信1(收发单个字节)程序设计说明

红外通信1(收发单个字节)程序设计说明

“红外通信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引脚持续输出低电平,红外发光二极管不发光。

红外接收解码原理和源程序

红外接收解码原理和源程序

上述“0”和“1”构成旳32位二进制码经38kHz旳载频进行二次调制以提升发射效率,到达降低电源功耗旳目旳。然后再经过红外发射二极管产生红外线向空间发射,如图。
UPD6121G产生旳遥控编码是连续旳32位二进制码组,其中前16位为顾客辨认码,能区别不同旳电器设备,预防不同机种遥控码相互干扰。芯片厂商把顾客辨认码固定为十六进制旳一组数;后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)构成。
注:P3.2接旳是外部中断
红外接受头将38K载波信号过虑,得到与发射代码反向接受代码
发射端旳“0”和“1”
红外解码旳关键就是辨认 0和1
Hale Waihona Puke 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左右均可。

红外遥控发射接收系统课件

红外遥控发射接收系统课件

发射器的编码与调制方式
编码方式
红外遥控发射器采用多种编码方式,如PWM(脉宽调制)编 码、PPM(脉冲位置调制)编码等,以实现不同按键信号的 编码与发送。
调制方式
红外遥控发射器通常采用FSK(频移键控)或PSK(相移键控 )等调制方式,将低频控制信号调制到高频载波上,以提高 信号的抗干扰能力和传输距离。
04
红外接收管电路设计
接收管选择:选用高灵敏度的红外接收管 。
05
06
信号处理电路设计:设计信号放大、滤波 、比较等电路,提高接收信号的信噪比。
软件程序设计
要点一
初始化
初始化硬件设备,如红外发射管、接收管、单片机等。
要点二
循环检测
不断检测是否有红外信号输入,若有则执行相应操作。
软件程序设计
01
02
发射器的优化与改进
提高发射距离
通过提高发射功率、选用高效率 的红外发光二极管等措施,可以 增加红外遥控发射器的发射距离

降低功耗
采用低功耗设计、选用合适的电源 管理系统等技术手段,可以降低红 外遥控发射器的功耗,延长使用寿 命。
兼容性与互操作性
针对不同品牌和型号的红外遥控接 收器,红外遥控发射器应具备兼容 性和互操作性,以实现广泛的适用 范围。
接收器的优化与改进
抗干扰能力
降低功耗
为了提高红外遥控接收器的抗干扰能 力,可以采用多种抗干扰技术,如扩 频技术、跳频技术、频移键控等。
为了降低红外遥控接收器的功耗,可 以采用低功耗设计,如采用CMOS工 艺、采用休眠模式等。
灵敏度提升
通过优化接收管和信号处理电路的设 计,可以提高红外遥控接收器的灵敏 度,使其能够更好地接收微弱信号。

红外遥控发射接收系统课件

红外遥控发射接收系统课件

发射器的电路设计
电源电路
为发射器提供稳定的直流电源,确保发 射器正常工作。
调制电路
将编码后的控制信号调制到红外载波上 ,形成红外遥控信号。
控制电路
负责编码和控制信号的生成,将按键输 入转化为红外信号。
发射电路
将调制后的红外信号发送出去,实现遥 控功能。
发射器的编码方式
01
脉冲位置编码
通过控制脉冲信号在不同位置 出现与否进行编码。
抗同频干扰
当多个同频的红外遥控信号同时存在时,可能会对接收器造成干扰。为了提高 抗干扰能力,可以采用编码和解码技术,使接收器只对特定编码的红外遥控信 号敏感。
04
红外遥控发射接收系统的 调试与优化
调试步骤与方法
电源检查
检查电源是否稳定,避免因电 源问题导致系统工作异常。
距离与角度测试
测试红外遥控在不同距离和角 度下的信号接收效果,确保正 常工作范围。
高效能
随着技术的进步,红外遥控发射接收 系统的处理速度和传输效率将得到大 幅提升,以满足实时性和可靠性的需 求。
应用领域拓展
智能家居
红外遥控发射接收系统将广泛应 用于智能家居领域,实现家电设
备的远程控制和自动化管理。
智能安防
红外遥控发射接收系统在智能安防 领域具有广泛的应用前景,如监控 、报警等。
红外遥控发射接收系统的应用场景
家用电器控制
用于电视、空调、音响等家用电器的开 关、音量调节等功能。
工业控制
用于控制自动化设备、机器人等,实现 远程操控。
智能家居系统
作为智能家居系统中的一种无线通信方 式,实现家庭内部各种设备的互联互通 。
办公设备
用于投影仪、打印机等办公设备的无线 控制。

红外发射接收程序

红外发射接收程序

红外发送调用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)对于红外线遥控对于很多电子爱好者来讲,都感觉到非常神奇,看不到,摸不着,但能实现无线遥控,其实控制的关键就是我们要用单片机芯片来识别红外线遥控器发出红外光信号,即我们通常所说的解码。

红外遥控器程序及原理、程序

红外遥控器程序及原理、程序
Data=1;//收到数据 1 } else if(Tim>=10 && Tim<50) {
Data=0;//收到数据 0 }
if(Ok==1) {
hw_jsm<<=1; hw_jsm+=Data;
if(Num>=32)
{ hw_jsbz=1; break }
EXTI_ClearITPendingBit(EXTI_Line15); }
printf_init(); //printf 初始化
while(1)
{
if(hw_jsbz==1) //如果红外接收到
{
hw_jsbz=0;
//清零
printf("红外接收码 %0.8X\r\n",hw_jsm); //打印
hw_jsm=0;
//接收码清零
}
}
}
1.1 红外遥控简介简介 红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低, 成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用 到计算机系统中。 由于红外线遥控不具有像无线电遥控那样穿过障碍物去控制被控对象的能力,所以,在 设计红外线遥控器时,不必要像无线电遥控器那样,每套(发射器和接收器)要有不同的遥控 频率或编码(否则,就会隔墙控制或干扰邻居的家用电器),所以同类产品的红外线遥控器, 可以有相同的遥控频率或编码,而不会出现遥控信号“串门”的情况。这对于大批量生产以 及在家用电器上普及红外线遥控提供了极大的方面。由于红外线为不可见光,因此对环境影 响很小,再由红外光波动波长远小于无线电波的波长,所以红外线遥控不会影响其他家用电 器,也不会影响临近的无线电设备。 红外遥控的编码目前广泛使用的是: NEC Protocol 的 PWM(脉冲宽度调制)和 Philips RC-5 Protocol 的 PPM(脉冲位置调制)。 普中科技 STM32 开发板配套的遥控器使用的是 NEC 协议,其特征如下: 1、 8 位地址和 8 位指令长度; 2、地址和命令 2 次传输(确保可靠性) 3、 PWM 脉冲位置调制,以发射红外载波的占空比代表“ 0”和“ 1”; 4、载波频率为 38Khz; 5、位时间为 1.125ms 或 2.25ms; NEC 码的位定义:一个脉冲对应 560us 的连续载波,一个逻辑 1 传输需要 2.25ms ( 560us 脉冲+1680us 低电平),一个逻辑 0 的传输需要 1.125ms( 560us 脉冲+560us 低 电平) 。而遥控接收头在收到脉冲的时候为低电平,在没有脉冲的时候为高电平,这样, 我们在接收头端收到的信号为:逻辑 1 应该是 560us 低+1680us 高,逻辑 0 应该是 560us 低+560us 高。 NEC 遥控指令的数据格式为:同步码头、地址码、地址反码、控制码、控制反码。同步 码由一个 9ms 的低电平和一个 4.5ms 的高电平组成,地址码、地址反码、控制码、控制 反 码均是 8 位数据格式。按照低位在前,高位在后的顺序发送。采用反码是为了增加传输的 可靠性(可 用于校验)。 2.数据码格式 数据格式包括了引导码、用户码、数据码和数据码反码,编码总占 32 位。数据反码是数据 码反相后的编码,编码时可用于对数据的纠错。注意:第二段的用户码也可以在遥控应用电 路中被设置成第一段用户码的反码。

第13课《红外通讯(发送与接收)》

第13课《红外通讯(发送与接收)》

【新梦想】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红外接收程序

5104红外接收程序

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时,自动清除按键标志。

电视机红外遥控和接收的制作(完整的电路、程序、照片)

电视机红外遥控和接收的制作(完整的电路、程序、照片)
红外遥控器的原理到处是,这里就不多废话了,直接上图:
程序:
#include<reg52.h> #include<intrins.h> #include<stdio.h>
#define uint unsigned int #define uchar unsigned char
sbit ir=P3^2 ; //红外端口 sbit P2_0=P2^0 ; //LED1 端口
} }
红外发射原理图:
晶振用的是 22.1184M
三级管驱动红外发射电路: 红外发射程序如下:(参考网上程序)
R16 另一边接 P1.0
#include <reg52.h> #define uint unsigned int #define uchar unsigned char bit irout;//红外管状态 sbit ir=P1^7;//红外发射管控制脚 uint count, set_count;//中断计数,设定中断次数 bit flag,keyflag;//红外发送标志,按键标志位 uchar irsys[4]={0x1a,0xa1,0xdc,0x03};//26 位系统码,最后一个字节只用 2 位 uchar ircode,irdata; /********************************************** 延时 1ms ***********************************************/
} } } }
/************************************* 主程序
*************************************/ void main() {

单片机红外接受解码程序成功版

单片机红外接受解码程序成功版

单片机红外接受解码程序成功版1、效果图2、发射码格式3、38KH载波发射(完整的发射图)4、 0 与 1的区别5、载波6、小结7、代码发射码格式38KH载波发射(完整的发射)0与1的区别载波小结1、发射端发射出来的是高电平。

但是接收到的是低电平。

(接收到的数据与发射的相反)2、我这里用的外部下降沿触发的中断3、使用12M的晶振完4、整源码下载地址:代码#include <reg51.h>sbit IR=P3^2; //红外接口标志sbit dm = P2^2; //段码sbit wm = P2^3; //位码unsigned char hc[8]; //数码管显示缓存unsigned char DM[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0 x7c,0x39,0x5e,0x79,0x71};// 显示段码值0~Funsigned char WM[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位码。

显示的位置unsigned char sj[33]; //接收脉冲时间数组char w=0; //数码管显示缓存指针(0~7)unsigned char i; //脉冲个数记录unsigned char mcsj; //脉冲时间(大于0.56ms小于1.125ms为0,大于1.125ms小于2.25ms)bit MC=0; //接收红外脉冲开始标志(0:脉冲已经结束,1:脉冲刚开始)bit JS=0; //脉冲接收结束标志位(1标志接收结束)bit JM=0; //解码完成标志位(1:解码完成)void Delay(unsigned char f);void dsq_0() interrupt 1 using 1 //定时器T0中断服务函数{mcsj++; //256}void wbzd_0() interrupt 0 //外部中断服务函数{if(MC){if(mcsj>32) //判断是不是引导码。

红外发射接收程序

红外发射接收程序

/*-----------------------------------------------名称:红外发射接收修改:无内容:*红外测试程序,用单片机通过发射管发射38K的调制频率码,由一体化接收并解码由发光管显示。

*正常情况下,由于反射和高灵敏度接收,LED4(P1.7)一直闪烁,可以用黑色纸片完全遮挡接收头使*之不能接收到发射管的信号,这是LED4熄灭。

说明功能性正常------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit LED=P2^3; //红外发射sbit LED1=P0^1;bit Flag;void Init_Timer0(void){TMOD |= 0x01;TH0=0xf0; /* Init value */TL0=0x00;EA=1; /* interupt enable */ET0=1; /* enable timer0 interrupt */TR0=1;}/******************************************************************/ /* 定时器0初始化 *//******************************************************************/ void Timer0_isr(void) interrupt 1 using 1{TH0=0x0f; /* Init value */TL0=0x00;Flag=!Flag;}/******************************************************************/ /* 主函数 *//******************************************************************/ main(){unsigned int j;Init_Timer0(); //定时器初始化LED1=0;while(1){ //读取一体化接收头数值if(Flag){for(j=0;j<27;j++)//大约38KHz{LED=!LED; //发射管输出}}}}#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit LED=P0^1;sbit IR=P2^3; //红外一体化接收sbit LED1=P0^2;sbit BUZZER=P2^5;void delayus(unsigned us){ unsigned int i,j;for(i=0;i<us;i++)for(j=0;j<101;j++);}main(){LED1=0;BUZZER=0;while(1){unsigned int a,b;b=0;for(a=0;a<22;a++){ if(IR==0)b=b+1;delayus(6);//对脉冲采样}if(b>5){LED=0;BUZZER=0;}else{LED=1;BUZZER=1;}//有障碍物灯灭、蜂鸣器响}}。

带连码红外接收程序

带连码红外接收程序
REG.receive_finish=1; } _delay_ms(1);//等待最后额外的 560us 的低电平时间 return; }
} start_T1;//在已经开始接收 32 码后,重新开启定时器 }ewvalue>120)//位周期大于某某数,表示位值为 1 {
point|=0x80000000; }//否则为 0
bit_amount++; if(bit_amount>=33)//32 位码接收完毕 {
REG.receive_start=0;//重置各标志位 bit_amount=0; REG.receive_32bits=0; if(p[0]==(uchar)(~p[1])&&p[2]==(uchar)(~p[3])) {
typedef struct FLG flag;
volatile flag REG;
void PORT_init(void) {
DDRB|=(1<<2); PORTA|=(1<<7);//上拉输入捕捉引脚,以提高稳定性 } //下面初始化中包含输出比较中断用于防止定时器计数过长而死机, //省去输出比较中断也无妨,可以测试一下 void Timer1_capture_init(void) { TCCR1B|=(1<<7); OCR1A=2000;
说起红外遥控,大家最熟悉的不过是 NEC 的红外协议了,现在重温一下这个协议。在红外遥控发射端, NEC 协议逻辑“1”是 560us 的 38K 载波(占空比 1/4 到 1/3,这个占空比值是基于发射端的电源节能考虑 的,好比一个周期不变的电源开关,闭合的时间越短就越省电,但刚好能满足接收端的识别要求)和 1690us 的低电平组成;逻辑“0”则是由 560us 的 38K 载波和 560us 低电平组成。所以两者的周期各为:2.25ms 和 1.12ms,具体如图 1 所示。

红外收发程序

红外收发程序

发射发射电路图VCC=5V#include <reg52.h>#define uchar unsigned char#define uint unsigned intstatic bit OP; //红外发射管的亮灭控制位static unsigned int count; //延时计数器static unsigned int endcount; //终止延时计数static unsigned char flag;//红外发送标志sbit P3_4=P1^7; 图中的P3.3改为P1.7,或改程序也行。

sbit open=P0^0;int a=0,num;char iraddr1; //十六位地址的第一个字节char iraddr2; //十六位地址的第二个字节void SendIRdata(char p_irdata);//发送子函数void initialaze(); //初始化函数void Send(int IR_data); //发射代码集合(包括一些初始化,定义和定时器设定) int keyscan(); //键扫描函数void main(void){while(1){P1=0x00;a=keyscan();if(a!=0){iraddr1=1;//自定义的一个地址iraddr2=~iraddr1;//地址反码Send(a);a=0;}}}void Send(int IR_data){count = 0;flag = 0; //无载波OP = 0; //不亮P3_4 = 0; //在后面会发现用OP赋值的EA = 1; //允许CPU中断TMOD = 0x11; //设定时器0和1为16位模式1ET0 = 1; //定时器0中断允许TH0 = 0xFF;TL0 = 0xE6; //设定时值0为38K 也就是每隔26us中断一次TR0 = 1;//开始计数SendIRdata(IR_data);}//延时void delay(uint i){while(--i);}//键扫描int keyscan( void ){uchar temp,s; //ox=16进制键码s=10进制键码P2 = 0xf0;delay( 200 );if(P2!=0xf0);{temp = P2;P2 = 0x0f;temp = temp | P2;switch( temp ){case 0xe7: s=1; break;case 0xeb: s=2; break;case 0xed: s=3; break;case 0xee: s=4; break;case 0xd7: s=5; break;case 0xdb: s=6; break;case 0xdd: s=7; break;case 0xde: s=8; break;case 0xb7: s=9; break;case 0xbb: s=10; break;case 0xbd: s=11; break;case 0xbe: s=12; break;case 0x77: s=13; break;case 0x7b: s=14; break;case 0x7d: s=15; break;case 0x7e: s=16; break;default: s=0;break;}return s; //返回键码}}//定时器0中断处理void timeint(void) interrupt 1{TH0=0xFF;TL0=0xE6; //设定时值为38K 也就是每隔26us中断一次count++;if (flag==1){OP=~OP; }//如果是待发送的有效数据flag=1,就在此产生载波(亮灭交变)else{OP = 0; }P3_4 = OP;}//定时器1中断处理void TI_time(void) interrupt 3{TH0=0x3c;TL0=0xaf;num++;if(num==100&&a==0){Send(1);num=0;}}//发送数据子函数void SendIRdata(char p_irdata){int i;char irdata=p_irdata;/***************************************************************///发送9ms的起始码,并是载波模式有效endcount=223;count=0;while(count<endcount);//等待中断,控制亮灭交变的总时间为9ms//发送4.5ms的结果码,并是载波模式无效endcount=117;flag=0;count=0;do{}while(count<endcount);/***************************************************************///发送十六位地址的前八位irdata=iraddr1;for(i=0;i<8;i++){//一个周期里规定先以高电平开始,在以低电平结束。

红外遥控器接收_LCD_DS18B20结合程序

红外遥控器接收_LCD_DS18B20结合程序

#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};sbit IRIN = P3^2; //红外接收器数据线sbit BEEP = P1^0; //蜂鸣器控制线sbit DQ=P2^4;sbit LCD_RS = P2^5;sbit LCD_RW = P2^6;sbit LCD_EN = P2^7;uchar IRCOM[7];uint temp;uchar temp1;uchar num[4];uchar aa;uint a,bb=0;uchar code cdis1[ ] = {"Present:"};uchar code cdis2[ ] = {"High: Low:"};void delay(uchar x); //x*0.14MSvoid delay1(int ms);void beep(void);void delay2(uint x)//延时函数{uchar i;while (x--)for(i=0;i<120;i++);}void delay3 (uint a)//小延时函数{while (a--);}/*******************************************************************//* *//*检查LCD忙状态*//*lcd_busy为1时,忙,等待。

lcd-busy为0时,闲,可写指令与数据。

*//* *//*******************************************************************/bit lcd_busy(){bit result;LCD_RS = 0;LCD_RW = 1;LCD_EN = 1;delayNOP();result = (bit)(P0&0x80);LCD_EN = 0;return(result);}/*******************************************************************//* *//*写指令数据到LCD *//*RS=L,RW=L,E=高脉冲,D0-D7=指令码。

stm32f070红外线接收程序

stm32f070红外线接收程序

stm32f070红外线接收程序stm32f070红外线接收程序:/* * Ir input pin * mode:floating input * pin: PA1 * GPIO_AF: TIM2_CH2 */ void Ir_Pin_Init() { GPIO_InitTypeDefGPIO_InitStructure;GPIO_PinAFConfig(GPIOA,GPIO_PinSource1,GPIO_AF_2); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_SetBits(GPIOA,GPIO_Pin_1); //output 1 } //PA1TIM2_CH2 //使用GPIO输入捕获实现红外接收void Remote_Init() { NVIC_InitTypeDef NVIC_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_ICInitTypeDef TIM_ICInitStructure; /*使能TIM1时钟,默认时钟源为PCLK1(PCLK1未分频时不倍频,否则由PCLK1倍频输出),可选其它时钟源*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); Ir_Pin_Init();TIM_ClearITPendingBit(TIM2,TIM_IT_Update|TIM_IT_CC2); //清除中断和捕获标志位TIM_TimeBaseStructure.TIM_Period =1000; //设定计数器自动重装值最大10ms溢出TIM_TimeBaseStructure.TIM_Prescaler = 480-1; //预分频器,0.1M的计数频率,10us加1.TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up; //TIM向上计数模式TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx TIM_ICInitStructure.TIM_Channel =TIM_Channel_2; // 选择输入端IC2映射到TI2上TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获TIM_ICInitStructure.TIM_ICSelection =TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频TIM_ICInitStructure.TIM_ICFilter = 0x03;//IC4F=0011 配置输入滤波器8个定时器时钟周期滤波TIM_ICInit(TIM2,&TIM_ICInitStructure);//初始化定时器输入捕获通道NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //TIM2中断NVIC_InitStructure.NVIC_IRQChannelPriority = 2; //优先级0级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道被使能NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_CC2,ENABLE);//允许更新中断,允许CC2IE捕获中断TIM_Cmd(TIM2,ENABLE); //使能定时器2 }。

单片机红外接收程序

单片机红外接收程序

/*************************************************************红外接收程序,数码管,蜂鸣器,led动作************************************************************/#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit dula=P2^6; //数码管段选锁存sbit wela=P2^7; //数码管位选锁存sbit re=P2^4; //红外接收管输入引脚,可随意定义IO口sbit fmq=P2^3; //蜂鸣器uchar code tabledu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};uchar code tablewe[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};uchar data3,data4,str[32]; //定义全局变量,data3是接收的第三个数据也就是用户码,data4是data3的反码,str[32]存放着32位的数据void delay(uint z){uchar x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void delay600us(void) //延时600us{uchar a,b;for(b=61;b>0;b--)for(a=3;a>0;a--);}void delay1500us(void) //延时1500us{uchar a,b;for(b=197;b>0;b--)for(a=2;a>0;a--);}void delay3500us(void) //延时3500us{uchar a,b;for(b=18;b>0;b--)for(a=88;a>0;a--);}void delay8000us(void) //延时8000us{uchar a,b,c;for(c=1;c>0;c--)for(b=254;b>0;b--)for(a=13;a>0;a--);}start(void) //处理引导码{bit sflag=0; //引导码接收成功标志1S:while(re); //高电平等待while(~re) //引导码出现了进入循环{delay8000us();if(re==0)delay1500us(); else goto S; //不是引导码,重新等待if(re==1)delay3500us(); else goto S; //不是引导码,重新等待if(re==1){sflag=1; return sflag;break; //引导码接收成功,退出循环}else goto S; //不是引导码,重新等待}while(re); //跳过剩余的高电平while(~re); //跳过低电平delay600us(); //延时600us,准备判断高低电平,以确定是数据0还是1,因为0和1仅仅是高电平的时间不一样}receive_bit(void) //接收一位{if(re==1){while(re);while(~re);delay600us();return 1; //是数据1}else{while(~re);delay600us();return 0; //是数据0}}receive_string(void) //接收4个字节{uchar i;for(i=0;i<32;i++){str[i]=receive_bit();}return str[32];}conversion_data3(void) //提取出第三个字节{uchar i,n=7;data3=0;for(i=16;i<24;i++){data3=str[i]<<n|data3;n--;}return data3;}conversion_data4(void) //提取出第四个字节{uchar i,n=7;data4=0;for(i=24;i<32;i++){data4=str[i]<<n|data4;n--;}return data4;}judge(void) //判断第四字节是否是第三字节的反码{bit jflag;uchar a,b;a=conversion_data3();b=conversion_data4();if(a==~b)jflag=1; //是反码标志1else jflag=0;return jflag;}void smg_init(void) //数码管初始化{dula=1;P0=0x71;dula=0;wela=1;P0=tablewe[0];wela=0;}void smg_display(void) //判断第三个数码值,显示相应的按键值{switch(conversion_data3()){case 0xb4:P0=tabledu[0];break;//0case 0x98:P0=tabledu[1];break;//1case 0x8c:P0=tabledu[2];break;//2case 0xbd:P0=tabledu[3];break;//3case 0x88:P0=tabledu[4];break;//4case 0x9c:P0=tabledu[5];break;//5case 0xad:P0=tabledu[6];break;//6case 0xa1:P0=tabledu[7];break;//7case 0xa5:P0=tabledu[8];break;//8case 0xa9:P0=tabledu[9];break;//9default:break;}}void main(){smg_init();while(1){if(start()){receive_string();if(judge()==1){fmq=0;P1=conversion_data4();dula=1;smg_display();dula=0;fmq=1;}}delay(6000);delay(6000);delay(6000);}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

红外接收程序讲解
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位数据码中,后两个字节是键数据码和健数据反码;可以通过这两个字节数来实行校验;即,把前一个字节去反判读是否等于后一字节;。

相关文档
最新文档