单片机实现红外接收解码
51单片机红外解码资料+源代码

位地 8FH 8EH 8DH 8CH 8BH 8AH 89H 88H 址
源代码如下: #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit dula=P2^6; sbit wela=P2^7;
uchar irtime; //红外时间 uchar startflag; //启动接收 uchar irdata[33]; uchar bitnum; uchar irreceiveok; //红外接收完毕 uchar ircode[4]; uchar irprosok; uchar disp[8]; uchar code smg_du[]={
发射器发射的的信号为
接收器接收到的信号为
即 9ms 低电平后 4.5ms 高电平作为起始码,之后接受到两次 8 位客户码,一次八位数据码,和一次八位数据反码。
遥控器在按键按下之后周期性的发出同一种 32 位二进制编 码周期约为 108ms,一组码持续时间随本身的“0”“1”个数不同
而不同。大约在 45~63ms 之间,当一个键按下 36ms,振荡器使芯 片激活,将发射一组 108ms 的编码脉冲这 108ms 编码脉冲由一个 起始码(9ms),一个结束码(4.5ms),低八位地址码(9~18ms), 高八位地址码(9~18ms),八位数据码(9~18ms),和这八位数据 码反码(9~18ms),如果按下超过 108ms 仍未松开,接下来发射 的代码(连发代码)将仅有起始码(9ms)和结束码(2.5ms)组 成。
解码的关键是如何识别零和一: “0”和“1”都是以 0.56ms 低电平开始的,不同的是高电平 宽度不同,“0”为 0.56ms“1”为 1.168ms,所以必须根据高电平 宽度来区别“0”和“1”。 如果从 0.56ms 低电平过后,开始延时,0.56ms 后,若读到的 电平为低,说明该位为零,反之则为一,可靠其间,延时必须比 0.56ms'长一些,又不能超过 1.12ms,否则如果该位为零,读到的 已是下一位高电平,因此取(1.12+0.56)/2=0.84ms 最为可靠,一 般取 0.84ms 左右均可。根据码的格式,应该等待 9ms 起始码和 4.5ms 结束码完成后才能读码。 备注:定时器/计数器控制寄存器 TCON 位序 D7 D6 D5 D4 D3 D2 D1 D0 号 位符 TF1 TR1 TF0 IR0 IE1 IT1 IE0 IT0 号
c51、c52单片机红外线遥控接收解码c程序(可直接使用)

/ 亲,此程序以经过测试,可直接使用!!!/#include <reg51.h>#define uchar unsigned char#define uint unsigned intvoid delay(uchar x);sbit IRIN = P3^2;uchar IRCOM[4];void main(){ IE = 0x81;TCON = 0x01;IRIN=1;/* 此处可以根据按键码自由编写程序/以下为3*7遥控按键码//(也可以应用与其他类型遥控,本程序只以3*7遥控为例)/ / 0x45 0x46 0x47 // 0x44 0x40 0x43 // 0x07 0x15 0x09 // 0x16 0x19 0x0d // 0x0c 0x18 0x5e // 0x08 0x1c 0x5a // 0x42 0x52 0x4a /例如:while(1){switch(IRCOM[2]){case 0x45: P2=0x7f; break;case 0x44: P2=0xbf; break;case 0x07: P2=0xdf; break;case 0x16: P2=0xef; break;case 0x0c: P2=0xf7; break;case 0x08: P2=0xfb; break;case 0x42: P2=0xfd; break;case 0x52: P2=0xfe; break;case 0x4a: P2=0xff; break;case 0x5a: P2=0x00; break;}} */while(1);} //end main/**********************************************************/ void IR_IN(void) interrupt 0 //外部中断服务程序{unsigned char j,k,N=0;EX0 = 0;delay(15);if (IRIN==1){ EX0 =1;return;}//确认IR信号出现while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
单片机如何通过捕获来实现对红外遥控器解码

单片机如何通过捕获来实现对红外遥控器解码一、内容提要上讲介绍并应用了单片机动态扫描驱动数码管,并给出了实例。
这一讲将重点介绍单片机如何通过捕获来实现对红外遥控器解码。
通过该讲,读者可以掌握红外遥控器的编码原理以及如何通过单片机对遥控器进行解码。
二、原理简介随着家用电器、视听产品的普及,红外线遥控器已被广泛使用在各种类型的家电产品上(如遥控开关、智能开关等)。
其具有体积小、抗干扰能力强、功耗低、功能强、成本低等特点,在工业设备中也得到广泛应用。
一般而言,一个通用的红外遥控系统由发射和接收两大部分组成,如图1 所示:图1 红外遥控系统框图其中发射部分主要包括键盘矩阵、编码调制、红外发射管;接收部分包括光、电信号的转换以及放大、解调、解码电路。
举例来说,通常我们家电遥控器信号的发射,就是将相应按键所对应的控制指令和系统码(由0 和1 组成的序列),调制在32~56kHz 范围内的载波上,然后经放大、驱动红外发射管将信号发射出去。
此外,现在流行的控制方法是应用编/ 解码专用集成电路芯片来实现(如下文提到的SAA3010 红外编码芯片和HS0038 红外接收头)。
不同公司的遥控芯片,采用的遥控码格式也不一样。
在此介绍目前广泛使用较普遍的两种,一种是NEC Protocol 的PWM(脉冲宽度调制)标准,一种是Philips RC-5 Protocol 的PPM(脉冲位置调制)标准。
NEC 标准:遥控载波的频率为38kHz(占空比为1:3);当某个按键按下时,系统首先发射一个完整的全码,然后经延时再发射一系列简码,直到按键松开即停止发射。
简码重复为延时108ms,即两个引导脉冲上升沿之间的间隔都是108ms。
一个完整的全码如图2所示。
单片机STM32F103C8T6的红外遥控器解码系统设计

单片机STM32F103C8T6的红外遥控器解码系统设计一、本文概述本文旨在详细阐述基于STM32F103C8T6单片机的红外遥控器解码系统的设计和实现过程。
随着科技的不断进步和智能化设备的普及,红外遥控器作为一种常见的遥控设备,已经广泛应用于家电、安防、玩具等多个领域。
然而,红外遥控器发出的红外信号往往需要通过解码器才能被设备正确识别和执行,因此,设计一款高效、稳定、可靠的红外遥控器解码系统具有重要意义。
本文将首先介绍红外遥控器的基本原理和信号特点,然后详细阐述STM32F103C8T6单片机的性能特点和在红外遥控器解码系统中的应用优势。
接着,将详细介绍红外遥控器解码系统的硬件设计,包括红外接收头的选择、电路设计和PCB制作等。
在软件设计部分,将详细阐述如何通过STM32F103C8T6单片机的编程实现红外信号的接收、解码和处理,以及如何将解码后的数据通过串口或其他通信方式发送给主控制器。
本文还将对红外遥控器解码系统的性能进行测试和分析,包括信号接收距离、解码速度和稳定性等方面的测试。
将总结本文的主要工作和创新点,并对未来的研究方向进行展望。
通过本文的研究和实现,旨在为红外遥控器解码系统的设计提供一种新的思路和方法,同时也为相关领域的研究人员提供有益的参考和借鉴。
二、红外遥控器基础知识红外遥控器是一种常见的无线遥控设备,它利用红外光作为信息载体,通过发射和接收红外光信号实现对设备的远程控制。
这种遥控方式因其简单、低成本和无需视线连接等优点,在各类消费电子产品中得到了广泛应用,如电视机、空调、音响等。
红外遥控器的工作原理主要基于红外辐射和光电器件的检测。
遥控器内部通常包含一个或多个红外发射管,当按下按键时,发射管会发射出特定频率和编码的红外光信号。
接收端则配备有红外接收头,该接收头内部有一个光敏元件(如硅光敏三极管或光敏二极管),用于检测红外光信号并将其转换为电信号。
为了区分不同的按键操作,红外遥控器通常采用特定的编码方式对按键信号进行编码。
单片机做红外遥控解码器

单片机做红外遥控解码器你家里是否有一个电视机遥控器或者空调机遥控器呢?你是否也想让它遥控其他的电器甚至让它遥控您的电脑呢?那好,跟我一起做这个“遥控”。
该小制作所需要的元件很少:TA89C2051一只,RS232接口电平与TTL 电平转换心片MAX232CPE一只,红外接收管一只,晶振11.0592MHz,电解10uF4只,10uF一只,1K1个,300欧姆左右1个,瓷片电容30P2个。
发光8个。
价钱不足20元。
原理介绍:主控制单元是单片机AT89C2051,中断口INT0跟红外接受管U1相连,接收红外信号的脉冲,8个作为显示解码输出(也可以用来扩展接其他控制电路),U3是跟电脑串行口RS232相连时的电平转换心片,9、10脚分离与单片机的1、2脚相连,(1脚为串行接收,2脚为串行发送),MAX232CPE的7、8脚分离接电脑串行口的2(接收)脚、3(发送脚)。
晶振采纳11.0592MHz,这样才干使得通讯的波特率达到9600b/s,电脑普通默认值是9600b/s、8位数据位、1位停止位、无校验位。
电路就这么容易了,现在分析详细的编程过程吧。
开头位是以3.6ms低电平然后是3.6ms高电平,然后数据表示形式是0.9ms低电平0.9ms高电平周期为1.8ms表示“0”,0.9ms低电平2.4ms 高电平周期为3.3ms表示“1”,编写程序时,以大于3.4ms小于3.8ms 高电平为起始位,以大于2.2ms小于2.7ms高电平表示“1”,大于0.84ms小于1.11ms高电平表示“0”。
因此,我们主要用单片机测量高电平的长短来确定是“1”还是“0”即可。
定时器0的工作方式设置为方式1:movtmod,09h,这样设置定时器0即是把GATE置1,16位计数器,最大计数值为2的16次方个机器周期,此方式由外中断INT0控制,即INT0为高时才允许计数器计数。
比如:jnbp3.2,$jbp3.2,$clrtr0这3条命令就可以测量一个高电平,接下来读取计数值TH0,TL0就可以辨别是起始位还是“1”或“0”。
单片机的红外线解码程序

switch(inf_shuju)
{
case inf_code_0: inf_array[1]=30;
break;
case inf_code_1: inf_array[1]=1;
break;
case inf_code_2: infe inf_code_3: inf_array[1]=3;
TR1 = 1; //定时器1开始计数,由于晶振是24M
inf_shunxu++;
}
//#############################################################################
//函数名称:void inf_gongcuowu()
//功能:红外线错误子程序
break;
case inf_code_12: inf_array[1]=12;
break;
case inf_code_13: inf_array[1]=13;
break;
case inf_code_14: inf_array[1]=14;
break;
case inf_code_15: inf_array[1]=15;
//入口参数:无
//出口参数:无
//#############################################################################
void inf_gongcuowu(void)
{
inf_mode_cuowu = 1; //红外线接收出现错误
void T_1(void) interrupt 3 //参与红外线接收
{
TR1 = 0;
用单片机解码红外遥控器

用单片机解码红外遥控器遥控器使用方便,功能多.目前已广泛应用在电视机、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、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) //判断是不是引导码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用户码1:第2到第9个脉冲波形
用户码2:第10到第17个脉冲波形
键码:第18到第25个脉冲波形
键码反码:第26到第33个脉冲波形
连续按键脉冲:第34和第35个脉冲为结束脉冲(也即连续按键脉冲),在每次按键结束后会有两个结束脉冲,如果一直按键不放的话,会一直发送连续按键脉冲,并可以认为在收到10个连续按键脉冲后是下一个按键。
uchar value;
k=1;
for(j=0;j<4;j++)
{
for(i=0;i<8;i++)
{
value=value>>1;
if(irdata[k]>6) //接收的数据为0或1,0为1.125ms<5,1为2.25约8~9,曲中间
value=value|0x80;
k++;
}
ircode[j]=value;//编码值给ircode,
4.3
判断所收到的用户码是否正确、键码及键码反码是否正确,如果都正确则认为此次收码为正确收码,否则丢弃。
收码完后,还会有结束脉冲波形,如果用户一直按住某个键不放,遥控器会一直发送连续按键脉冲波形,如果多次收到连续按键,可以认为再次收到键码,这个可以根据实际需要定。
5.
#include <reg51.h>
uchar irreceok=0; //判断是否接收到一帧数据,33位
uchar ircode[4]; //存放4个码值
uchar irprosok;
uchar disp[8];
sbit LS138A=P2^2; //138译码器的A端由P2.2口控制
sbit LS138B=P2^3; //138译码器的B端由P2.3口控制
LS138C=1;LS138B=1;LS138A=1; P0=table[disp[7]]; delay(10);
}
void main()
{
init();
while(1)
{
if(irreceok) //若接收到数据
{
irpros();//解码
irreceok=0;
}
if(irprosok) //数据解码完毕,拆开显示
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39, 0x5e, 0x79, 0x71};
红外遥控器作为设备的输入控制具有操作简便、价格便宜等诸多好处。您可以根据您公司产品需要和遥控器提供商协商定制遥控器,包括遥控器键盘布局、每个按键的键码等。
遥控器键盘上每个按键的键码是一个小于256的一个数值,按键后通过遥控器红外管产生脉冲发送出去,红外接收器接收到脉冲后,对脉冲流进行分析,提取键码值,并按照键码值实现其遥控目的。
LS138C=1;LS138B=0;LS138A=0; P0=table[disp[4]]; delay(10);
LS138C=1;LS138B=0;LS138A=1; P0=table[disp[5]]; delay(10);
LS138C=1;LS138B=1;LS138A=0; P0=table[disp[6]]; delay(10);
单片机实现红外接收解码
摘要:接收到红外遥控器的脉冲波形,并通过解析其波形得到红外遥控器的相应解码,实习对相应设备的控制。本文详细接受红外遥控技术原理并如何通过C51单片机实现红外遥控。
关键字:单片机,红外遥控,解码
1.
遥控器相信大家不会陌生,日常生活中会使用到各种各样的遥控器,比如电视机、DVD机、空调、机顶盒甚至音响、热水器等都用到遥控器,其实红外技术已经走进与人们的生活并且与人们的生活息息相关了。
value=0;
}
irprosok=1; //红外数据提取完毕
}
//显示,要将接收到的码拆开8位显示
void irwork(void)//将接收到的码拆开显示
{
disp[0]=ircode[0]/16; //按16进制显示
disp[1]=ircode[0]%16;
disp[2]=ircode[1]/16;
disp[3]=ircode[1]%16;
disp[4]=ircode[2]/16; //按16进制显示
disp[5]=ircode[2]%16;
disp[6]=ircode[3]/16;
disp[7]=ircode[3]%16;
}
void display(void)//送到数码管显示
{
LS138C=0;LS138B=0;LS138A=0; P0=table[disp[0]]; delay(10);//第一个数码管显示1
uchar code weitable[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar irnum; //定时器0定时时间计数
uchar bitnum; //存放接收到的位数
uchar startflag; //开始标志
uchar irdata[33];
注意:不同的遥控器产生的用户码值可能不一样,笔者碰到两种不同的用户码:0x00,0xFF及0x04,0x7F。
脉冲流中有四种不同的脉冲波形宽度:
其中前导码脉宽为:40(4ms) <脉冲宽度< 50(5ms)
连续按键脉宽为:21(2.1ms) <脉冲宽度< 25(2.5ms)
bit "0"脉宽为:3(0.3ms) <脉冲宽度< 7(0.7ms)
IE0=1;//外部中断0允许
EX0=1;//开中断
//定时计数器0中断
TMOD=0x02; //工作方式1,16位
TH0=0x00;//定时0.256ms
TL0=0x00;
ET0=1; //开中断
EA=1;
TR0=1; //定时计数器启动中断
}
void irpros(void) //解码
{
uchar i,j,k;
LS138C=0;LS138B=0;LS138A=1; P0=table[disp[1]]; delay(10);//第一个数码管显示2
LS138C=0;LS138B=1;LS138A=0; P0=table[disp[2]]; delay(10);
LS138C=0;LS138B=1;LS138A=1; P0=table[disp[3]]; delay(10);
2.
红外遥控信号接收:
红外接收电路可以使用集成接收器,接收器包括红外接收管及信号处理IC,接收器对外只有三个引脚,一个接电源的Vcc脚、一个接地的GND脚、一个脉冲信号输出脚,当然脉冲信号输出脚直接接单片机的某个可以使用的IO脚就可以了。
3.脉冲波形分析:
每次按键,红外接收器这边会收到一串脉冲宽度不等的脉冲波形流,其脉冲流由35个脉冲波形构成:
irnum=0;
bitnum++;
if(bitnum==33)
{
irreceok=1;//接收到一帧数据
startflag=0;
}
}
}
void timer0() interrupt 1
{
irnum++;//定时时间irnum*0.256ms
}
键值为1字节;
键值反码为1字节,键值反码为键值取反值。
先判断所收到用户码是否正确,如果不正确则丢弃此次所收键码,如果正确则利用键值反码取反与键值比较,判断收码是否正确,如果不正确则丢弃所收键码。
如下图所示:
从上图可以看出其用户码为:0b00100000-0b11111110,由于其低位在前,故转换后得到用户码为:0b00000100-0b01111111,即0x04,0x7F;
其键码及键码反码为:0b00010010-0b11101101,同样也是低位在前,转换后得到键码及键码反码为:0b01001000-0b10110111,即0x48,0xB7。
4.实现:
4.1
初始化时当然要先初始化单片机红外接收管脚为高阻输入状态,其次要初始化定时器,因为检测分析脉冲波形时需要用到定时器,根据上面对脉冲流波形分析可以知道最窄的脉宽为bit“0”,为0.3ms左右,所以定时器最好定时为每0.1ms中断一次比较好,但是定时器的值怎么设置呢,这样根据单片机的振荡器决定。
4.2
首先当然是检测前导码,单片机红外接收管脚在初始化时已经设置为高阻输入状态(即高电平状态),当有红外输入时,状态变为低电平状态,一旦检测到有低电平过来,则开始准备检测前导码。得到每个脉冲波形序号,并根据定时器统计出每个脉冲波形在高电平状态维持的时间,通过其时间值检测第一个脉冲是否是前导码,如果不是则重新检测前导码,如果是前导码则分析其后每个脉冲波形是bit“0”,还是bit“1”,并按顺序每八个波形为一个字节方式保存到用户码1字节变量、用户码2字节变量、键码字节变量、键码反码字节变量,直到收满32个bits。
bit "1"脉宽为:14(1.4ms) <脉冲宽度< 19(1.9ms)
在收到一串脉冲流后,就要对其进行分析,先要检测第一个脉冲波形是不是前导码,如果不是,则继续检测前导码,如果是则检测如下32个脉冲波形:
用户码1为1字节,由8个脉冲波形组成(其中一个脉冲波形表示字节中1 bit);
用户码2为1字节;
{
irwork();
irprosok=0;
}
display();
}
}