产品选型

单片机红外编码 单片机实现遥控器-红外数据传输——红外编解码原理

小编 2024-10-12 产品选型 23 0

单片机实现遥控器-红外数据传输——红外编解码原理

一、红外通信原理

红外遥控有发送和接收两个组成部分。发送端采用单片机将待发送的二进制信号编码调制为一系列的脉冲串信号,通过红外发射管发射红外信号。红外接收完成对红外信号的接收、放大、检波、整形,并解调出遥控编码脉冲。为了减少干扰,采用的是价格便宜性能可靠的一体化红外接收头(HS0038, 它接收红外信号频率为38kHz,周期约26μs) 接收红外信号,它同时对信号进行放大、检波、整形得到TTL 电平的编码信号,再送给单片机,经单片机解码并执行去控制相关对象。如图1 所示:

红外发送部分由51单片机、键盘、红外发光二极管和7段数码管组成。键盘用于输入指令, 51单片机检测键盘上按键的状态,并对红外信号进行调制,发光二极管产生红外线,数码管用来显示发送的键值。图2红外发射电路

红外接收部分由51单片机、一体化红外接收头HS0038和7段数码管组成。51单片机检测HS0038,并对HS0038接收到的数据解码,通过数码管显示接收到的键值。图 3红外接收电路

二、编码、解码

(1) 二进制信号的调制

二进制信号的调制由单片机来完成,它把编码后的二进制信号调制成频率为38kHz 的间断脉冲串,相当于用二进制信号的编码乘以频率为38kHz 的脉冲信号得到的间断脉冲串,即是调制后用于红外发射二极管发送的信号如图4 二进制码的调制所示

(2) 红外接收需先进行解调,解调的过程是通过红外接收管进行接收的。其基本工作过程为:当接收到调制信号时,输出高电平,否则输出为低电平,是调制的逆过程(图5 解调)。HS0038是一体化集成的红外接收器件,直接就可以输出解调后的高低电平信号;红外接收器HS0038的应用电路(图6)。

(3)红外遥控发射芯片采用 PPM 编码方式,当发射器按键按下后 ,将发射一组 108ms 的编码脉冲。遥控编码脉冲由前导码、16位地址码(8 位地址码、 8 位地址码的反码)和16位操作码(8 位操作码、 8 位操作码的反码)组成。通过对用户码的检验,每个遥控器只能控制一个设备动作,这样可以有效地防止多个设备之间的干扰。编码后面还要有编码的反码,用来检验编码接收的正确性,防止误操作,增强系统的可靠性。前导码是一个遥控码的起始部分,由一个 9ms 的高电平 ( 起始码 ) 和一个 4. 5ms 的低电平 ( 结果码 ) 组成,作为接受数据的准备脉冲。以脉宽为 0. 56ms 、周期为 1. 12ms 的组合表示二进制的 “0” ;以脉宽为 1. 68ms 、周期为 2. 24ms 的组合表示二进制的 “1” 。

(4)单片机采用外部中断 INT0 管脚和红外接收头的信号线相连,中断方式为边沿触发方式。计算中断的间隔时间,来区分前导码、二进制的 “1” 、 “0” 码。并将 8 位操作码提取出来在数码管上显示。

红外接收头输出的原始遥控数据信号,正好和发射端倒向.也就是以前发射端原始信号是高电平,那接收头输出的就是低电平,反之.

软件原理:

开始时发射一个特定的同步码头,对于接收端而言就是一个9ms的低电平,和一个4.5ms的高电平,这个同步码头可以使程序知道从这个同步码头以后可以开始接收数据。

采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉

宽为0.565ms、间隔1.685ms、周期为2.25ms 的组合表示二进制的“1”。

解码的关键是如何识别“0”和“1”,从位的定义我们可以发现“0”、“1”均以0.56ms的高电平开始,不同的是低电平的宽度不同,“0”为0.56ms,“1”为1.685ms,所以必须根据高电平的宽度区别“0”和“1”。如果从0.56ms低电平过后,开始延时,0.56ms以后,若读到的电平为低,说明该位为“0”,反之则为“1”,为了可靠起见,延时必须比0.56ms长些,但又不能超过1.12ms,否则如果该位为“0”,读到的已是下一位的高电平,因此取(1.12ms+0.56ms)/2=0.84ms最为可靠,一般取0.84ms 左右即可。根据红外编码的格式,程序应该等待9ms的起始码和4.5ms的结果码完成后才能读码。

HS0038红外接收器,接收红外遥控器发射的信号,输出DATA口和单片机的外部中断0P3.2口相连。当有红外信号时,触发中断查询中断时间,并和红外起始码,“0”、“1”、终止码的时间进行比较。从而检测红外的操作码。

51可参考的程序

(1)发送程序

#include

static bit OP; //红外发射管的亮灭

static unsigned int count; //延时计数器

static unsigned int endcount; //终止延时计数

static unsigned int temp; //按键

static unsigned char flag; //红外发送标志

static unsigned char num;

sbit ir_in=P3^4;

char iraddr1; //十六位地址的第一个字节

char iraddr2; //十六位地址的第二个字节

unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,

0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共阳数码管 0~~f

void SendIRdata(char p_irdata);

void delay(unsigned int);

void keyscan();

void main(void)

{

num=0;

P2=0x3f;

count = 0;

flag = 0;

OP = 0;

ir_in= 0;

EA = 1; //允许CPU中断

TMOD = 0x11; //设定时器0和1为16位模式1

ET0 = 1; //定时器0中断允许

TH0 = 0xFF;

TL0 = 0xE6; //设定时值0为38K 也就是每隔26us中断一次

TR0 = 1;//开始计数

iraddr1=3;//00000011

iraddr2=252;//11111100

do{keyscan();

}while(1);

}

void timeint(void) interrupt 1

{

TH0=0xFF;

TL0=0xE6; //设定时值为38K 也就是每隔26us中断一次

count++;

if (flag==1)

{

OP=~OP;

}

else

{

OP = 0;

}

ir_in= OP;

}

void SendIRdata(char p_irdata)

{

int i;

char irdata=p_irdata;

//发送9ms的起始码

endcount=223;

flag=1;

count=0;

do{}while(count

endcount=117;

flag=0;

count=0;

do{}while(count

irdata=iraddr1;

for(i=0;i<8;i++)

{

endcount=10;

flag=1;

count=0;

do{}while(count

if(irdata-(irdata/2)*2) //判断二进制数个位为1还是0

{

endcount=41; //1为宽的高电平

}

else

{

endcount=15; //0为窄的高电平

}

flag=0;

count=0;

do{}while(count

irdata=irdata>>1;

}

irdata=iraddr2;

for(i=0;i<8;i++)

{

endcount=10;

flag=1;

count=0;

do{}while(count

if(irdata-(irdata/2)*2)

{

endcount=41;

}

else

{endcount=15;

}

flag=0;

count=0;

do{}while(count

irdata=irdata>>1;

}

irdata=p_irdata;

for(i=0;i<8;i++)

{

endcount=10;

flag=1;

count=0;

do{}while(count

if(irdata-(irdata/2)*2)

{

endcount=41;

}

else

{

endcount=15;

}

flag=0;

count=0;

do{}while(count

irdata=irdata>>1;

}

irdata=~p_irdata;

for(i=0;i<8;i++)

{

endcount=10;

flag=1;

count=0;

do{}while(count

if(irdata-(irdata/2)*2)

{

endcount=41;

}

else

{

endcount=15;

}

flag=0;

count=0;

do{}while(count

irdata=irdata>>1;

}

endcount=10;

flag=1;

count=0;

do{}while(count

flag=0;

}

void delay(unsigned int z)

{

unsigned char x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

(2)接收程序

#include"reg52.h"

#define uchar unsigned char

#define uint unsigned int

uchar dis_num,num,num1,num2,num3;

sbit led=P1^0;

unsigned char code table[]={

0xc0,0xf9,0xa4,0xb0,

0x99,0x92,0x82,0xf8,

0x80,0x90,0x88,0x83,

0xc6,0xa1,0x86,0x8e}; //共阳数码管 0~~f

sbit prem =P3^2; //定义遥控头的接收脚

uchar ram[4]={0,0,0,0};//存放接受到的4个数据 地址码16位+按键码8位+按键码取反的8位

void delaytime(uint time) //延迟90uS

{

uchar a,b;

for(a=time;a>0;a--)

{

for(b=40;b>0;b--);

}

}

void rem()interrupt 0 //中断函数

{

uchar ramc=0; //定义接收了4个字节的变量

uchar count=0; //定义现在接收第几位变量

uint i=0; //此处变量用来在下面配合连续监测9MS 内是否有高电平

prem=1;

for(i=0;i<1100;i++) //以下FOR语句执行时间为8MS左右

{

if(prem) //进入遥控接收程序首先进入引导码的前半部判断,即:是否有9MS左右的低电平

return; //引导码错误则退出

}

while(prem!=1); //等待引导码的后半部 4.5 MS 高电平开始的到来。

delaytime(50); //延时大于4.5MS时间,跨过引导码的后半部分,来到真正遥控数据32位中

//第一位数据的0.56MS开始脉冲

for(ramc=0;ramc<4;ramc++)//循环4次接收4个字节

{ for(count=0;count<8;count++) //循环8次接收8位(一个字节)

{

while(prem!=1); //开始判断现在接收到的数据是0或者1 ,首先在这行本句话时,

//保已经进入数据的0.56MS 低电平阶段

//等待本次接受数据的高电平的到来。

delaytime(9);//高电平到来后,数据0 高电平最多延续0.56MS,而数据1,高电平可

//延续1.66MS大于0.8MS 后我们可以再判断遥控接收脚的电平,

if(prem) //如果这时高电平仍然在继续那么接收到的数据是1的编码

{

ram[ramc]=(ram[ramc]<<1)+1;//将目前接收到的数据位1放到对应的字节中

delaytime(11); //如果本次接受到的数据是1,那么要继续延迟1MS,这样才能跨入//下个位编码的低电平中(即是开始的0.56MS中)

}

else //否则目前接收到的是数据0的编码

ram[ramc]=ram[ramc]<<1; //将目前接收到的数据位0放到对应的字节中

} //本次接收结束,进行下次位接收,此接收动作进行32次,正好完成4个字节的接收

}

if(ram[2]!=(~(ram[3]&0x7f))) //本次接收码的判断

{

for(i=0;i<4;i++) //没有此对应关系则表明接收失败,清除接受到的数据

ram[i]=0;

return ;

}

dis_num=ram[2]; //将接收到的按键数据赋给显示变量

}

用单片机解码红外遥控器

遥控器使用方便,功能多.目前已广泛应用在电视机、VCD、DVD、空调等各种家用电器中,且价格便宜,市场上非常容易买到。如果能将遥控器上许多的按键解码出来.用作单片机系统的输入.则解决了常规矩阵键盘线路板过大、布线复杂、占用I/O口过多的弊病。而且通过使用遥控器,操作时可实现人与设备的分离,从而更加方便使用。下面以TC9012编码芯片的遥控器为例。谈谈如何用常用的51系统单片机进行遥控的解码。

通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯片来进行控制操作,如图所示。发射部分包括键盘矩阵、编码调制、LED红外发送器;接收部分包括光、电转换放大器、解调、解码电路。

一、编码格式

1、0和1的编码

当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。这种遥控码具有以下特征:采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”,其波形如图所示。

遥控器发射的信号由一串0和1的二进制代码组成.不同的芯片对0和1的编码有所不同。通常有曼彻斯特编码和脉冲宽度编码。TC9012的0和1采用PWM方法编码,即脉冲宽度调制,其0码和1码如图所示(以遥控接收输出的波形为例)。0码由0.56ms低电平和0。56ms高电平组合而成,脉冲宽度为1.12ms.1码由0.56ms低电平和1.69ms高电平组合而成,脉冲宽度为2.25ms。在编写解码程序时.通过判断脉冲的宽度,即可得到0或1。

UPD6121G产生的遥控编码是连续的32位二进制码组,其中前16位为用户识别码,能区别不同的电器设备,防止不同机种遥控码互相干扰,如我们可以同时使用电视机、机顶盒、功放等遥控器,但它们不会产生误触发。该芯片的用户识别码固定为十六进制01H;后16位为8位操作码(功能码)及其反码。UPD6121G最多额128种不同组合的编码。遥控器在按键按下后,周期性地发出同一种32位二进制码,周期约为108ms。一组码本身的持续时间随它包含的二进制“0”和“1”的个数不同而不同,大约在45~63ms之间。

2、按键的编码

当我们按下遥控器的按键时,遥控器将发出如图2的一串二进制代码,我们称它为一帧数据。根据各部分的功能。可将它们分为5部分,分别为引导码、用户识别码、用户识别码反码、数据码、数据反码。遥控器发射代码时.均是低位在前,高位在后。由图3分析可以得到.引导码高电平为4.5ms,低电平为4.5ms,当接收到此码时,表示一帧数据的开始。单片机可以准备接收下面的数据。用户识别码由8位二进制组成,共256种.图中地址码重发了一次,主要是加强遥控器的可靠性.如果两次地址码不相同,则说明本帧数据有错,应丢弃。不同的设备可以拥有不同的用户识别码.因此。同种编码的遥控器只要设置地址码不同,也不会相互干扰。图中的地址码为十六进制的0EH(注意低位在前)。在同一个遥控器中,所有按键发出的地址码都是相同的,数据码为8位,可编码256种状态,代表实际所按下的键。数据反码是数据码的各位求反,通过比较数据码与数据反码,可判断接收到的数据是否正确。如果数据码与数据反码之间的关系不满足相反的关系.则本次遥控接收有误,数据应丢弃。在同一个遥控器上.所有按键的数据码均不相同。在图3中,数据码为十六进制的0CH,数据反码为十六进制的0F3H(注意低位在前),两者之和应为0FFH。

二、单片机遥控接收电路

红外遥控接收可采用较早的红外接收二极管加专用的红外处理电路的方法。如CXA20106,此种方法电路复杂,现在一般不采用。较好的接收方法是用一体化红外接收头,它将红外接收二极管、放大、解调、整形等电路做在一起,只有三个引脚。分别是+5V电源、地、信号输出。常用的一体化接收头的外形及引脚见红外接收头的信号输出接单片机的INTO或INTl脚。典型电路如图5所示。图中增加了一只PNP型三极管对输出信号进行放大。

三、遥控信号的解码算法及程序编制

平时,遥控器无键按下。红外发射二极管不发出信号,遥控接收头输出信号1,有键按下时,0和1编码的高电平经遥控头倒相后会输出信号0.由于与单片机的中断脚相连,将会引起单片机中断(单片机预先设定为下降沿产生中断)。单片机在中断时使用定时器0或定时器1开始计时.到下一个脉冲到来时,即再次产生中断时,先将计时值取出。清零计时值后再开始计时.通过判断每次中断与上一次中断之间的时间间隔。便可知接收到的是引导码还是0和1。如果计时值为9ms。接收到的是引导码,如果计时值等于1.12ms,接收到的是编码0。如果计时值等于2.25ms.接收到的是编码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左右均可。根据码的格式,应该等待9ms的起始码和4.5ms的结果码完成后才能读码。

以接收TC9012遥控器编码为例,解码方法如下:

(1)设外部中断0(或者1)为下降沿中断,定时器0(或者1)为16位计时器,初始值均为O。

(2)第一次进入遥控中断后,开始计时。

(3)从第二次进入遥控中断起,先停止计时,并将计时值保存后,再重新计时。如果计时值等于前导码的时间,设立前导码标志。准备接收下面的一帧遥控数据,如果计时值不等于前导码的时间,但前面已接收到前导码,则判断是遥控数据的0还是1。

(4)继续接收下面的地址码、数据码、数据反码。

(5)当接收到32位数据时,说明一帧数据接收完毕。此时可停止定时器的计时,并判断本次接收是否有效.如果两次地址码相同且等于本系统的地址,数据码与数据反码之和等于0FFH,则接收的本帧数据码有效。否则丢弃本次接收到的数据。

(6)接收完毕,初始化本次接收的数据,准备下一次遥控接收。

相关问答

单片机红外 遥控器解码程中,所有按键的地址码都相同吗?

单片机红外遥控器编码一般由引导码+地址码(16位)+命令码(16位)组成,在普通的遥控器上所有的按键只是命令码不同,地址码是不变的单片机红外遥控器编码一般由引...

单片机 ,硬件, 红外 遥控 编码 问题。38KHz是干嘛用的?

学习型遥控常用的载波频率为38kHz,这是由发射端编码芯片所使用的455kHz晶振来决定的。在信号传输的过程中,并不是将信号直接进行传输,而是将信号负载到一个固...

51 单片机红外 遥控怎么调试?

51单片机红外遥控的调试可以按照以下步骤进行。首先,连接红外接收器模块到51单片机的IO口,确保电源连接正常。接着,编写相应的程序代码,初始化IO口为输入模...

最简单51 单片机红外编码 获取问题?

对于最简单的51单片机红外编码获取问题,答案是可以的。原因是,在使用51单片机进行红外编码获取时,可以利用红外接收头将红外信号接收到单片机的IO口上,然后通...

那么遥控器上的按键 编码 如何知道?接收部分的程序又怎样写呢?

我觉得首先要知道你的红外遥控器用的是什么发射器芯片(一般都是UPD6121G型号的),然后你要用51单片机做一个红外接收系统,要加上1602显示器来显示解出来的编码...

能否用 单片机 控制发射 红外 信号来控制空调?

空调遥控器本来就是用单片机控制发射红外信号来遥控控制空调的!控制原理如下:本文介绍一种利用红外线发射装置作为工业控制计算机输入键盘的接口原理和实现...

51 单片机红外 报警器怎么报警?

1.通过红外传感器检测到目标物体后,51单片机会触发报警器进行报警。2.红外传感器可以检测到目标物体的红外辐射,当目标物体进入传感器的检测范围内时,传感器...

常用的 红外 遥控 编码 芯片有哪些?, 红外 芯片质量好吗??

[回答]编制加密算法是不是需要什么额外的芯片来编码?我的单片机上的红外电路没有怎么办?10.有一种气叫运气,它能让你遇难呈祥;有一种气叫福气,它能让你一...

常用的 红外 遥控 编码 芯片有哪些?, 红外 芯片使用率高吗??

[回答]江苏盖姆专业程度高,值得信赖。没有的,你可以买个诺基亚就有了。都是早期手机有红外,已经被蓝牙淘汰了充电管理芯片、放电保护电量指示按键控制管...

红外 发射能不能不用按键,改为 单片机 控制按键信号?

《按下按键就发出信号,持续按按键持续发光,松开按键就停止发光》按照你所说的这些,并不需要单片机,直接用按键,来控制发光管,即可。《这组信号用红外接收头...

猜你喜欢