串行通讯与红外解码
- 格式:ppt
- 大小:5.25 MB
- 文档页数:43
红外解码方法简述1 引言低速的红外无线传输是一种廉价的无线通讯/控制方案,在家电领域已经广泛使用。
在嵌入式领域,只要工作环境比较优良,数据量小,传输距离较近(5米以内),同样可以采用红外无线传输。
本站的A Tmega16学习板上设计了红外发射管与接收管,配合站长家中闲置的“HITACHI VM101”型电视遥控器,详细分析一下此遥控器的红外编解码原理与单片机解码方法。
2 红外数据序列采集“HITACHI VM101”型电视遥控器结构非常简单,主芯片是M50560-123FP ,外围配有455kHZ 晶体做为主时钟源,一个红外发射管,一个发射管的驱动三极管以及若干阻容器件。
考虑到此芯片为专用芯片,就算找到芯片资料去啃E 文也对以后没有多大帮助,所以站长采用了最直接的方法——软件采集输出电平变化时间间隔。
按照学习板的红外接收管连接方法,当接收到红外数据时,在A Tmega16的INT0脚上电平为高,电平的上升沿变化可以做为数据接收的开始。
普通使用的红外管载波频率为38kHz-40kHz 之间,这样可以先设计一个n 倍于载波频率的定时器计时,在中断触发以后对INT0脚上的高低电平计时,就可以得到一个完整的红外数据序列。
站长首先采用了110kHz 的定时器来采集数据,计时用了一个16位的变量,得到的一个数据序列如下:922 1384 1440 1498 1555 1613 1669 1727 1784 1842 1899 2072 2129 2187 2243 2416 2473 2531 2588 2761 2818 2991 3047 3221 3277 3451 3507 3565 3622 3795 3852 3910 3966 4140 4196 4369 4426 4484 4541 4714 4771 4944 5000 5058 5115 5173 5230 5288 5344 5402 5459 5517 5573 5747 5803 5861 5918 5976 6033 6206 6262 6436 6492 6666 6722 6895 6952 序列一 110kHz 定时采集序列其中相邻两个数的差值即为电平维持时间。
串口通信+红外通信通过串口发送红外遥控器的解码值到PC/***************************************************************** *********** @file main.c* @author xr* @date 2014年3月31日22:30:08* @version V1.2.3* @brief 串口通信+红外通信通过串口发送红外遥控器的解码值到PC* @note 单片机STC89C52RC MCU 晶振 11.0592MHZ*************************************************************** ***********/#include <reg52.h>void ConfigUart();void UartSend(unsigned char dat);void delayms(unsigned int xms);extern bit irflag;extern unsigned char ircode[4];extern void ConfigInfrared();void main(){ConfigUart();ConfigInfrared();while (1){if (irflag) //接收到红外数据{irflag = 0;UartSend(ircode[0]); //发送用户码delayms(100);//延时100msUartSend(ircode[2]); //发送键码}}}/*** @brief 延时xms* @param xms* @retval 无*/void delayms(unsigned int xms){unsigned int x, y;for (x = 0; x < xms; x++)for (y = 0; y < 110; y++);}/*** @brief 配置串口通信* @param 无* @retval 无*/void ConfigUart(){TMOD &= 0x0F;//清零T1控制位TMOD |= 0x20;//T1方式2,八位自动重装模式TH1 = 0xFD; //波特率 = 256-1/2^SMOD*T1溢出率 X=256-11059200/12/32/波特率TL1 = TH1;//波特率9600bpsTR1 = 1;ET1 = 0;//只用T1的计数SCON |= 0x50;//串口方式1 SM0 SM1 SM2 REN TB8 RB8 TI RI 0101 0000/*SM0 = 0;SM1 = 1;//方式1 SM2多机通信位REN = 1;//允许接收数据TI = 0;//发送完成中断标志RI = 0;//接收完成中断标志*/ES = 1;//开串口中断EA = 1;//开总中断}/*** @brief 串口发送一个字节数据到PC* @param 待发送数据* @retval 无*/void UartSend(unsigned char dat){SBUF = dat;//while (!TI);//等待发送完成,在中断模式下不需要等待,否则进不了中断}/*** @brief 串口中断* @param 无* @retval 无*/void Uart_ISP() interrupt 4 //串口中断标号是4{if (TI) //等待发送完成{ //发送完成TI = 0;//清零}}/**************************************************************** * @file infrared.c* @author xr* @date 2014年3月31日20:51:23* @version V1.2.3* @brief 红外通信--红外遥控器NEC协议解码* @note 单片机STC89C52RC MCU 晶振 11.0592MHZ************************************************************** */#include <reg52.h>sbit IRD = P3^3;//红外接收检测端口bit irflag = 0;//接收到数据的标志unsigned char ircode[4];//存放红外遥控器发送的用户码,用户码反码键码键码反码/*** @brief 红外配置* @param 无* @retval 无*/void ConfigInfrared()TH0 = 0;TL0 = 0;//清零T0计数TMOD &= 0xF0;TMOD |= 0x01;//T0方式1TR0 = 0;//在没有红外信号之前先关闭T0ET0 = 0;//只用T0的计数//外部中断1IT1 = 1;//设置外部中断触发方式为下降沿触发EX1 = 1;//开启外部中断1}/*** @brief 获得IRD红外检测引脚的高电平时间(空闲时间)* @param 无* @retval 高电平持续的计数值*/unsigned int getHeighTime(){//在检测外部信号前,必须先将IRDIO口拉高IRD = 1;TH0 = 0;TL0 = 0;//清零T0计数TR0 = 1;//开启T0计数while (IRD) //持续高电平{//超时判断if (TH0 > 0x40) //当IRD持续高电平时间17.7ms,远远大于引导码的9ms,是误码{break;//退出}TR0 = 0;//停止计数return (TH0*256 + TL0);//返回高电平计数值}/*** @brief 获得IRD红外检测引脚的低电平时间(载波时间) * @param 无* @retval 低电平持续的计数值*/unsigned int getLowTime(){IRD = 1;//释放IRD,检测外部信号TH0 = 0;TL0 = 0;//清零T0计数TR0 = 1;//开始计数while (!IRD) //持续低电平{if (TH0 > 0x40) //超过18ms就是误码,错误信号{break;}}TR0 = 0;//停止计数return (TH0*256 + TL0);//返回低电平计数值}/*** @brief 外部中断1服务程序,检测红外信号* @param 无* @retval 无void EXINT_ISP() interrupt 2 //外部中断标号2{unsigned char byte;//接收数据unsigned char i, j;unsigned int time;//时间time = getLowTime();//获得载波时间if (time < 7833 || time > 8755) //引导码载波是9ms,这里规定在8.5ms-9.5ms之间是9ms的载波{//范围之外,误码IE1 = 0;//清零外部中断1中断标志,为下一次再进入中断return;//退出中断}//否则是9ms的载波time = getHeighTime();//空闲时间if (time < 3686 || time > 4608) //引导码的空闲时间4.5ms 这里规定4ms-5ms是4.5ms的空闲{IE1 = 0;//清零中断标志return;//退出中断}//否则是4.5ms的空闲//开始接收用户码和键码等for (i = 0; i < 4; i++){for (j = 0; j < 8; j++){time = getLowTime();//载波if (time < 423 || time > 608) //560us的载波和560us的空闲是0 范围460us-660us{IE1 = 0;return;}//560us载波time = getHeighTime();if (time > 423 && time < 608) //560us空闲{//bit '0'byte >>= 1;//低位在前,移入一位0}else if (time > 1198 && time < 1658) //1.68ms的空闲是1 范围 1300us-1800us{//bit '1'byte >>= 1;//移入一位byte |= 0x80;//移入的一位置1}else{//误码IE1 = 0;return;//退出中断}}ircode = byte;}//接收完成irflag = 1;//退出中断时清零中断标志IE1 = 0;}。
STC89C58RD+ 红外遥控解码与串口程序//以下程序适用于STC89C58RD+ ,使用22.1184MHz晶振,用1838来对红外遥控器解码,1838的1脚接外中断0脚,即单片机P3.2脚//红外遥控器发出的红外信号经过1838处理后输出的是9.5ms低电平(也可能是4.5ms低电平)加4.5ms高电平的前导码,后面8位的地址码,8位的地址反码(也可能是地址码),8位的数据码,8位的数据反码,总共32位码//其中0码由O.56ms低电平和0.56ms高电平组合而成.脉冲宽度为1.12ms;1码由0.56ms低电平和1.69ms高电平组合而成,脉冲宽度为2.25ms#include<reg52.h>#include<stdio.h>#include<string.h>unsigned char count;unsigned int Address_Part,Data_Part;unsigned char date;bit Rev_flag;bit Over_flag;//unsigned int time_data[35];//unsigned char time_count;void init_config()//初始化函数{TMOD=0x21;//设置定时器0为工作方式1,定时器1为方式2--8位自动重装PCON |=0x80;//SMOD=1,要产生115200波特率必须置位REN=1;//启动串行接收数据SM0=0;SM1=1;//SM0,SM1设置串行口为工作方式1,10位异步收发器-->1位起始位,8位数据,1位停止位TI=1;//要使用printf()函数,就需要置位,后期不能置0TL1=0xff;//256-(2*fosc/(384*baud));TH1=0xff;//定时器1的初值,22.1184M晶振TR1=1;//启动T1定时器TH0=0x00;TL0=0x00;//设置定时器0初值IT0=1;//设置外中断0为下降沿触发ET0=1;//开定时器0允许中断//ET1=1;//开定时器1允许中断EX0=1;//开外中断0//TR0=1;ES=1;//开串口中断EA=1;//开总中断Rev_flag=0;Over_flag=0;}void main(){init_config();while(1){if(Over_flag){Over_flag=0;printf("Address_Part:%x,Data_Part:%x\n\r",Address_Part,Data_Part);}if(Rev_flag)//判断串口接受到数据,只是把从串口调试助手发过来的数据发回去,测试收发用而已{ES=0;Rev_flag=0;SBUF=date;//发送数据while(!TI);//发送数据完毕才跳出死循环ES=1;// TI=0;}/* if(time_count==40)//把收到的时间th值传给串口打印出来{time_count=0;printf("time:\n\r");for(;time_count<35;time_count++){printf("%d \n\r",time_data[time_count]);}memset(time_data,0,sizeof(time_data));EX0=1;//开外中断0}*/}}void exter() interrupt 0{unsigned int th;unsigned char tl;bit ds;TR0=0;//关定时器0th=TH0;//提取出高8位tl=TL0;//提取出低8位th<<=8;//左移8位th=th|tl;//算出定时器总共的计数值TH0=0x00;//初始值TL0=0x00;/* time_data[time_count]=th;//这段代码的作用是在不知道th的数值是多少为前导码,为0,为1时,把收到的时间th给提取出来,方便传给串口打印出来time_count++;if(time_count==35){time_count=40;EX0=0;}TR0=1;*//*这段判断前导码和0、1的值是12M晶振下的if(th>950&&th<1225)ds=0;//判断0和1else if(th>2050&&th<2345)ds=1;else if(th>13325&&th<13600)//判断前导码*///这段判断前导码和0、1的值是22.1184M晶振下的if(th>1900&&th<2260)ds=0;//判断0和1else if(th>4000&&th<4300)ds=1;else if(th>24900&&th<25350)//判断前导码{Address_Part=0;Data_Part=0;count=0;Over_flag=0;TR0=1;return;}else{TR0=1;return;}//去除干扰,当接收的是准备进前导码时的下降沿和截止码时,该语句起作用,没有该语句,则只能接收一次count++;if(count<16){Address_Part=Address_Part|ds;Address_Part=Address_Part<<1;TR0=1;}else if(count==16){Address_Part=Address_Part|ds;TR0=1;}else if(count<32){Data_Part=Data_Part|ds;Data_Part=Data_Part<<1;TR0=1;}else if(count==32){Data_Part=Data_Part|ds;Over_flag=1;}//接收完32位,后面应该有连续码,但不需要,所以不作处理}void time0() interrupt 1//要是没有该函数,可能会因为溢出而导致解码不正确{TR0=0;}void ser() interrupt 4{if(RI)//一定要加该判断句,不然串口调试助手那里会一直收到数据{RI=0;date=SBUF;//提取数据Rev_flag=1;}}。
红外解码说明文档作者:ruihuan_vb@时间:2013-12-71、红外遥控的基本原理红外遥控器发出的红外光信号,所以只能产生1 0 信号。
但是,为防止自然光的干扰,同时为了增大红外管的发射功率,正真发出的“1”信号是:38K的载波信号。
(而0 1 信号的区分就在于对发射管的关闭时间)。
红外一体化接收头接收到信号后会对信号进行滤波,所以一体化接收头输出的信号是经过滤波放大后的电平信号,并且对对电平信号进行了反相输出。
2、一般电平编码的结构红外遥控的数据编码是多种多样的,但是一般都会一这这种情况出现:引导码加数据。
引导码由9ms(可能有时候要设置到9.1ms)的低电平和4.5ms的高电平构成。
“0”信号由0.6ms的低电平和0.6ms的高电平组成;“1”信号由0.6的低低电平和1.2ms的高电平组成。
(注:这里说的电平是说的是红外一体化接收头的输出电平)。
红外一体化接收头的输出波形,示波器保存的图片3、红外遥控的电路设计1)发射电路红外遥控的发射电路比较简单,但是要想做的比较好还是有要注意的地方的。
NPN 三极管直接拉红外发射头就可以构成一个红外发射电路了。
但是,要注意的是:驱动红外发射管要加隔离电阻,并且这个隔离电阻不能太大,因这个隔离电阻决定了红外发射的功率。
发射电路的关键就在这里了,这个发射管的隔离电阻的阻值不要超过10欧姆,否则发射距离会非常近的,并且还有注意发射信号的载波的占空比不要设为1/2 最好是1/3 (这个好像是跟一体化接收头的原理有关的,而且将占空白降低方便增大发射功率)。
2)红外接收电路红外接收电路比较简单,一般用一个一体化接收头接到单片机的引脚就可以了。
我们这用过的型号是:HS0038B。
4、如何利用单片机的外设来实现对应的功能红外解码功能:因为红外解码的第一步骤是对电平长度的检测,因而最好是利用单片机的捕获功能来检测电平的长度,然后再根据电平长度来判断其意义(建议:不要检测双边沿,最好是检测一个周期的电平,例如下降沿的时间间隔)。
串口通信发送红外遥控器解码值本程序所用的原理图下载: 点这里,单片机芯片使用的stc89c52;找到数码管的原理图即可.这是一整个单片机开发板的电路图其他的忽略./*************************************************** ********************************************** * @filemain.c* @authorxr* @date2014年3月31日10:26:47* @versionV1.2.3* @brief红外通信 NEC协议进行红外遥控器解码显示用户码和键码到数码管上* @note单片机STC89C52RC MCU 晶振 11.0592MHZ************************************************* ********************************************** */#include ;//红外输出数据口sbit IRD = P3^3;//外部中断引脚bit irflag = 0;unsigned char ircode[4];//接收解码得到的数据unsigned char code LedTable[] = {0xC0, //"0"0xF9, //"1"0xA4, //"2"0xB0, //"3"0x99, //"4" 0x92, //"5" 0x82, //"6" 0xF8, //"7" 0x80, //"8" 0x90, //"9" 0x88, //"A" 0x83, //"B" 0xC6, //"C" 0xA1, //"D" 0x86, //"E"0x8E//"F"};unsigned char LedBuff[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};//数码管显示缓冲区unsigned char thr0, tlr0;void ConfigTimer0(unsigned int xms);void ConfigTimer1();void main(){ConfigTimer0(1); //定时1msConfigTimer1();while (1){if (irflag)//接收到红外数据,则刷新显示{LedBuff[5] = LedTable[ircode[0] >;>; 4];//取用户码的高4位字节LedBuff[4] = LedTable[ircode[0] & 0x0F];//取用户码的低四位字节LedBuff[1] = LedTable[ircode[2] >;>; 4];//取键码的高四位LedBuff[0] = LedTable[ircode[2] & 0x0F];//取键码的低四位}}}/*** @brief定时器T0配置* @param定时时间xms* @retval无*/void ConfigTimer0(unsigned int xms){unsigned int tmp;tmp = 65536-xms*11059200/12/1000;thr0 = (unsigned char)(tmp >;>; 8);tlr0 = (unsigned char)(tmp & 0x00FF);TMOD &= 0xF0;TMOD |= 0x01;//T0方式1TH0 = thr0;TL0 = tlr0;TR0 = 1;EA = 1;ET0 = 1;//设置定时器T0的中断优先级高于外部中断的优先级//IP中断优先级寄存器 PT2 PS PT1 PX1 PT0 PX0PT0 = 1;//提高T0的优先级,优先进行数码管刷新,消除数码管显示抖动}/*** @brief数码管刷新* @param无* @retval无*/void refresh(){static unsigned char j = 0;P0 = 0xFF;//消隐P1 = (0x08 | j);//000 0 1 ADDR2 ADDR1 ADDR0P0 = LedBuff[j++];if (j >;= 6)j = 0;}/*** @briefT0中断服务* @param无* @retval无*/void Timer0_ISP() interrupt 1{TH0 = thr0;TL0 = tlr0;refresh();//数码管刷新}/**********************红外解码*************************************/ /*** @brief配置定时器T1,开启外部中断,T1用来计数* @param无* @retval无*/void ConfigTimer1(){TMOD &= 0x0F;//清零T1控制位TMOD |= 0x10;//T1方式1TH1 = 0;TL1 = 0;//初始化计数值为0TR1 = 0;//在没有进入外部中断前,先关闭定时器T1 ET1 = 0;//关闭T1中断,只用来计数IT1 = 1;//设置外部中断为下降沿触发中断EX1 = 1;//开启外部中断}/*** @brief获得高电平时间(空闲时间)* @param无* @retval无*/unsigned int getHeighTime(){//在检测外部电平之前,先将红外检测引脚拉高释放IRD = 1;TH1 = 0;TL1 = 0;//重新清零TR1 = 1;//打开定时器T1开始计数while (IRD){//进行超时判断,若高电平时间大于9ms,即引导码时间,则直接退出if (TH1 >; 0x40) //(0x40*256) * (12/11059200) s = 17.7ms{break;//退出}}TR1 = 0;//关闭计数return (TH1*256 + TL1);//返回IRD引脚持续的高电平时T1计数值}/*** @brief获取低电平时间(载波)* @param无* @retval无*/unsigned int getLowTime(){//释放IRD检测引脚IRD = 1;TH1 = 0;TL1 = 0;//清零T1计数值TR1 = 1;//启动T1计数while (!IRD){if (TH1 >; 0x40) //TL1计数满则进位TH1,时间:TH1*256*12/11059200 s = 17.7ms{ //时间大于了NEC协议的引导码载波时间9ms,进行强制退出,避免假等待break;}}TR1 = 0;//关闭计数return (TH1*256 + TL1);//返回低电平持续的计数值每计数一次是一个机器周期的时间即1.08us}/*** @brief外部中断服务,检测红外信号* @param无* @retval无*/void ExINT_ISP() interrupt 2 //外部中断1中断标号为2{unsigned int time;//时间unsigned char i, j;unsigned char byte = 0;time = getLowTime();//获取低电平T1计数值,即引导码的9ms载波if ((time ; 8755)) //范围8.5-9.5msX=0.0085/(12/11059200){//错误引导码IE1 = 0;//清零外部中断标志return;//退出中断}//符合引导码的9mstime = getHeighTime();//获取高电平时间if ((time ; 4608)) //范围4ms-5ms{//不是4.5ms的空闲IE1 = 0;//清零外部中断return;//退出中断}//是正确的引导码for (i = 0; i ; 645)) //范围350us-700us{IE1 = 0;//清零外部中断标志return;//退出中断time = getHeighTime();//空闲时间if ((time >; 322) && (time ;>;= 1;//地位在前,先接收低位}else if ((time >; 1198) && (time ;>;= 1;byte |= 0x80;//高位置1}else{//无效码IE1 = 0;return;}}ircode = byte;//接收数据}//全部接收完毕irflag = 1;IE1 = 0;//清零外部中断标志位}。
AVR单片机捕获中断实现红外线解码摘要:AVR单片机是Atmel公司推出的一个单片机系列。
由于该系列单片机的集成度高,因此,其软/硬件设计都变得更加简洁。
文中介绍通过AVR单片机的捕获中断来实现红外线通讯解码的一种方法。
关键词:AVR;红外线解码;输入捕获中断1 红外线编码红外线编码是数据传输和家用电器遥控常用的一种通讯方法,其实质是一种脉宽调制的串行通讯。
家电遥控中常用的红外线编码电路有μPD6121G型HT622型和7461型等。
本文就以这些电路的编码格式来讨论怎样使用AVR单片机的捕获中断功能来实现其解码。
红外线通讯的发送部分主要是把待发送的数据转换成一定格式的脉冲,然后驱动红外发光管向外发送数据。
接收部分则是完成红外线的接收、放大、解调,还原成同步发射格式相同(但高、低电位刚好相反的脉冲信号。
这些工作通常由一体化的接收头来完成,主要输出TTL兼容电平。
最后通过解码把脉冲信号转换成数据,从而实现数据的传输。
图1是一个红外线遥控制系统的原理框图。
图2示出该红外遥控系统的编码格式。
图中,μPD6121G遥控器的二进制“0”由0.56ms的间隔加0.565ms的脉冲表示;二进制“1”由0.56ms的间隔加1.685ms的脉冲表示。
每次发送的32二进制码可分成两部分,其中前16位是遥控器辨识码,主要用于区别不同遥控器,后16位是操作码。
这两个部分的后8位都是前8位的反码,用作数据校验。
每帧数据以9ms的间隔加4.5ms的脉冲作为数据头。
2 AVR单片机AVR系列单片机是Atmel公司于1997年推出的一款全新配置的、采用精简指令(RISC-Redued Instruction Set CPU)结构的新型8位单片机。
由于AVR 单片机采用单指令操作,所以,在相同时钟的情况下,AVR的指令周期只有8051型机的1/2,而且AVR采用两极指令流水线,可以在执行当前指令的同时获取下一条指令,所以具备1MI/s/MHz的调整处理能力。
智能红外遥控开关原理及设计发布时间:2010-10-17 发布人:21世纪电子网0 引言红外遥控是当前使用最为广泛的通信和控制手段之一,由于其结构简单、体积小、功耗低、抗干扰能力强、可靠性高及成本低等优点而广泛应用于家电产品、工业控制和智能仪器系统中。
然而市场上的绝大部分遥控器都是针对各自特定的遥控对象设计的,不能直接应用于通用的智能仪器研发及其更一般的控制场合。
通常情况下,一般家庭所使用的电视机、空调、VCD/DVD等家用电器都使用了红外遥控器,而这些红外遥控器都是针对各自产品所设计的,从而导致了一般家庭中拥有数个遥控器,那么,能否将这些遥控器的功能进行复用,进而减少遥控器的数量,使遥控器的功能更加强大,就显得十分必要了。
电源开关广泛应用于家庭、工厂、仓库、以及办公室等场所。
传统的机械式电源开关存在接触电阻大、易磨损、可靠性低以及寿命短等缺点,特别是当家用电器的遥控器繁多的情况下,如果能借助这些遥控器设计开关用于代替传统的机械式电源开关,不仅节约了成本,而且操作方便。
使用电视机等家用电器的遥控器实现开关操作,安装和代换都很方便,可以用它代换家居中非常普及的墙壁开关,从而提高遥控器在家电领域的实用价值。
1 工作原理智能红外遥控开关主要由红外接收、放大整形、微控制器、开关控制以及降压电源等模块组成,其原理框图如图1所示。
智能红外遥控开关的功能是将常见家用电器的遥控器,如电视机、VCD/DVD等,由用户任意指定一个按键作为这个红外遥控开关的控制键。
使用时,用户按下智能红外遥控开关的“学习”按键,然后再对准遥控开关的红外接收头按下遥控器上指定的这个开关控制按键,遥控器发出的红外编码信号经过红外接收头接收后,再经过放大整形,输入到微控制器,微控制器通过内置的E2PROM记住遥控器这个指定按键的编码。
那么,用户下次使用时,当按下遥控器这个指定按键后,其发出的红外编码信号同样经过红外接收头,放大整形后输入到微控制器,由微控制器发出控制信号控制开关控制模块里面继电器的导通与断开,进而控制输出电压的通断。
红外遥控系统原理及单片机红外线遥控是目前使用最广泛的一种通信和遥控手段。
由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。
工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。
1 红外遥控系统通用红外遥控系统由发射和接收两大部分组成。
应用编/解码专用集成电路芯片来进行控制操作,如图1所示。
发射部分包括键盘矩阵、编码调制、LED红外发送器;接收部分包括光、电转换放大器、解调、解码电路。
图1 红外线遥控系统框图2 遥控发射器及其编码遥控发射器专用芯片很多,根据编码格式可以分成两大类,这里我们以运用比较广泛,解码比较容易的一类来加以说明,现以日本NEC的uPD6121G组成发射电路为例说明编码原理(一般家庭用的DVD、VCD、音响都使用这种编码方式)。
当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。
这种遥控码具有以下特征:采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”,其波形如图2所示。
图2 遥控码的“0”和“1” (注:所有波形为接收端的与发射相反)上述“0”和“1”组成的32位二进制码经38kHz的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。
然后再通过红外发射二极管产生红外线向空间发射,如图3示。
图3 遥控信号编码波形图UPD6121G产生的遥控编码是连续的32位二进制码组,其中前16位为用户识别码,能区别不同的电器设备,防止不同机种遥控码互相干扰。
该芯片的用户识别码固定为十六进制01H;后16位为8位操作码(功能码)及其反码。
UPD6121G最多额128种不同组合的编码。