单片机红外遥控程序详解配21键码表
- 格式:docx
- 大小:25.54 KB
- 文档页数:5
红外遥控系统原理及单片机红外线遥控是目前使用最广泛的一种通信和遥控手段。
由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。
工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。
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种不同组 合的编码。
程序可以用来查看每个遥控按键的编码,以便于开发利用遥控每一个按键。
#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit en=P3^4;sbit rs=P3^5; //用于控制1602sbit rw=P3^6;sbit dula=P2^6;sbit wela=P2^7; //用于控制晶体管sbit IRIN=P3^2; //红外接收器数据线IO 口uchar IRCOM[4]=0;//定义数组IRCOM,分别装解码后得到的数据//IRCOM[0] 低8位地址码//IRCOM[1] 高8位地址码//IRCOM[2] 8位数据码//IRCOM[3] 8位数据码的反码uchar code table[]="MAKE BY HEIQISHI"; uchar code table1[]="The code is 0x";uchar code table2[]="0123456789abcdef";//////////////显示程序///////////////////void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=112;y>0;y--); //大约是1ms,因为单片机的时钟周期为11.0592mhz。
}void Write_com(uchar com){rs=0; //指令P0=com; //写指令函数delay(5);en=1;delay(5);en=0;}void Write_data(uchar dat){rs=1; //数据P0=dat; //写指令函数delay(5);en=1;delay(5);en=0;}void _1602Init(){wela=0;dula=0; //用于关闭晶体管,因为都是用P0en=0; //初始时使能为0rw=0;Write_com(0x38); //显示屏模式设置为1602方案Write_com(0x0c); //显示开关/光标设置Write_com(0x06);Write_com(0x01); //清屏Write_com(0x80); //指针置零}//////////////////////////////////////////////////////////////////////解码程序///////////////////void delay014ms(uchar x) //x*0.14MS STC10F04延时约0.15MS{uchar i;while(x--){for(i=0;i<15;i++) //13;}}//////////////初始化////////////void IR_init(void){EA=1;EX0=1; //允许总中断中断,使能INT0 外部中断IT0=1; //触发方式为脉冲负边沿触发IRIN=1; //I/O口初始化}////////////解码过程//////////////void IR_CODE(void) interrupt 0 //在外部中断子程序中解码{uchar j,k,N=0,shi,ge;EX0=0; //防止干扰delay014ms(15); //延时2.1msif (IRIN) //2.1ms能够检测出各种错误信号{EX0 =1;return;} //确认IR信号出现while(!IRIN); //等IR变为高电平,跳过9ms的前导低电平信号。
用电器、视听产品的普及,红外线遥控器已被广泛使用在各种类型的家电产品上(如遥控开关、智能开关等)。
其具有体积小、抗干扰能力强、功耗低、功能强、成本低等特点,在工业设备中也得到广泛应用。
一般而言,一个通用的红外遥控系统由发射和接收两大部分组成,如图1 所示:其中发射部分主要包括键盘矩阵、编码调制、红外发射管;接收部分包括光、电信号的转换以及放大、解调、解码电路。
举例来说,通常我们家电遥控器信号的发射,就是将相应按键所对应的控制指令和系统码( 由0 和1 组成的序列),调制在32~56kHz 范围内的载波上,然后经放大、驱动红外发射管将信号发射出去。
此外,现在流行的控制方法是应用编/ 解码专用集成电路芯片来实现。
不同公司的遥控芯片,采用的遥控码格式也不一样。
在此介绍目前广泛使用较普遍的两种,一种是NEC Protocol 的PWM( 脉冲宽度调制) 标准,一种是Philips RC-5 Protocol 的PPM( 脉冲位置调制) 标准。
NEC 标准(代表芯片WD6122):遥控载波的频率为38kHz( 占空比为1:3) ;当某个按键按下时,系统首先发射一个完整的全码,然后经延时再发射一系列简码,直到按键松开即停止发射。
简码重复为延时108ms,即两个引导脉冲上升沿之间的间隔都是108ms。
如图2所示即为完整的NTC编码。
对于NTC编码,由引导码、用户编码低位,用户编码高位、键数据编码、键数据编码五部分组成,引导码由一个9ms的载波波形和4.5ms的关断时间构成,它作为随后发射的码的引导,这样当接收系统是由微处理器构成的时候,能更有效地处理码的接收与检测及其它各项控制之间的时序关系。
编码采用脉冲位置调制方式(PPM)。
利用脉冲之间的时间间隔来区分“0”和“1”。
每次8位的码被传送之后,它们的反码也被传送,减少了系统的误码率。
数据0 可用“高电平0.56ms +低电平0.56ms”表示,数据1 可用“高电平0.56ms +低电平1.68ms”表示。
/*************************基于51单片机的红外遥控计算器程序****************/ /****本程序用基于TC9012遥控器可直接操作,电路图,遥控器编码图在最后****/ #include<reg52.h>#include<stdio.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned char#define lint unsigned long intsbit IR=P3^2; //红外接口标志bit irpro_ok,irok;uchar irtime,X,mir,fir; //红外用全局变量uchar IRcord[4], irdata[33];uchar DA TA1[8]={0,0,0,0,0,0,0,0}; //第一个数uchar DA TA2[8]={0,0,0,0,0,0,0,0}; //第二个数uchar RESUIT[8]={0,0,0,0,0,0,0,0}; //结果uchar px1=0,px2=0,px3=0,flag=0,flag1=0,flag2=0,flag3=0,f1=0,f2=0,f3=0,f4=0; //各全局变量uchar temp,key,fang1,fang2;lint x1=0,x2=0,y=0; //输入的数及其结果void delay(msx); //ms延时函数void Init(); //系统初始化void INTInit(); //中断初始化void Ircordpro(); //红外码值处理函数void keyscan(); //键值检测void delay(uint); //延时void DataOper(); //数据运算void DataHandle(); //数据接收void DisplayHandle(); //显示处理void display(uchar,uchar); //数码管显示函数void main(){INTInit();P0=0x00;while(1){keyscan();DataHandle();DisplayHandle();}}void INTInit(){TMOD=0x02; //定时器0工作方式2,TH0是重装值,TL0是初值TH0=0x00; //reload valueTL0=0x00; //initial valueET0=1; //开中断TR0=1;IT0 = 1; // Configure interrupt 0 for falling edge on /INT0 (P3.2)EX0 = 1; // Enable EX0 InterruptEA = 1;}void Init() //初始化,所有数据归零{uchar i;px1=0;px2=0;px3=0;flag=0;flag1=0;flag2=0;flag3=0;f1=0;f2=0;f3=0;f4=0;x1=0;x2=0;y=0;for(i=0;i<8;i++){DA TA1[i]=0;DATA2[i]=0;RESUIT[i]=0;}}void delay(msx) //msx为延时毫秒数{uint i,j;for(i=0;i<=msx;i++)for(j=0;j<=110;j++);}void display(uchar n,uchar m) //n是第几只数码管,m是显示的数字是多少{P0=P0&0x80;P0=P0|(n<<4);P0=P0|m;}void tim0_isr (void) interrupt 1 using 1//定时器0中断服务函数{irtime++;}void ex0_isr (void) interrupt 0 using 0//外部中断0服务函数{if(fir){if(irtime<49&&irtime>=31)mir=0; //4.5ms+4.5msirdata[mir]=irtime;irtime=0;mir++;if(mir==33){irok=1;mir=0;fir=0;}}else{irtime=0;fir=1;}}void Ircordpro(void) //红外码值处理函数{unsigned char i, j, k;unsigned char cord,value;k=1;for(i=0;i<4;i++) //处理4个字节{for(j=1;j<=8;j++) //处理1个字节8位{cord=irdata[k];if(cord>7) value=value|0x80;else value=value;if(j<8)value=value>>1;k++;}IRcord[i]=value;value=0;}if((IRcord[0]=~IRcord[1])&&(IRcord[2]=~IRcord[3])) {X=IRcord[2];fang2=1;}}void keyscan() //矩阵键值扫描子函数{if(irok){Ircordpro();irok=0;fang1=1;}if((fang1==1)&&(fang2==1)){fang1=0;fang2=0;switch(X){case 0x08: key=0;flag=1;break;case 0x01: key=1;flag=1;break;case 0x02: key=2;flag=1;break;case 0x03: key=3;flag=1;break;case 0x05: key=4;flag=1;break;case 0x06: key=5;flag=1;break;case 0x07: key=6;flag=1;break;case 0x09: key=7;flag=1;break;case 0x0A: key=8; flag=1;break;case 0x0B: key=9; flag=1;break;case 0x10: key=10;flag1=1;display(7,0);break;case 0x1A: key=11;flag1=1;display(7,0);break;case 0x16: key=12;flag2=1;Init();break;case 0x11: key=13;flag2=1;DataOper();break;case 0x15: key=14;flag1=1;display(7,0);break;case 0x19: key=15;flag1=1;display(7,0);break;}}}void DataOper(){uchar i,j,m=0;lint k=0;for(i=0;i<(px1-1);i++) //把第一个数组中的数处理成十进制数{k=DATA1[i];for(j=0;j<(px1-i-1);j++){k=k*10;}x1=x1+k;}x1=x1+DATA1[px1-1];for(i=0;i<(px2-1);i++) //把第二个数组中的数处理成十进制数{k=DATA2[i];for(j=0;j<(px2-i-1);j++){k=k*10;}x2=x2+k;}x2=x2+DATA2[px2-1];if(f1==1) y=x1+x2; //根据标志位进行运算else if(f2==1) y=x1-x2;else if(f3==1) y=x1*x2;else if(f4==1) y=x1/x2;RESUIT[0]=y/10000000; //把各位分离出来存入结果数组中RESUIT[1]=(y%10000000)/1000000;RESUIT[2]=(y%1000000)/100000;RESUIT[3]=(y%100000)/10000;RESUIT[4]=(y%10000)/1000;RESUIT[5]=(y%1000)/100;RESUIT[6]=(y%100)/10;RESUIT[7]=y%10;while(!RESUIT[m]) m++;px3=m;}void DataHandle() //把每次按键的结果记录下来,并存到适当的位置{if((key<10)&&(flag==1)&&(flag1==0)){DATA1[px1]=key;px1++;flag=0;}else if((key<10)&&(flag==1)&&(flag1==1)){DATA2[px2]=key;px2++;flag=0;}else if(flag1==1){switch(key){case 10 : f1=1;f2=0;f3=0;f4=0;break; // "+"case 11 : f1=0;f2=1;f3=0;f4=0;break; // "-"case 14 : f1=0;f2=0;f3=1;f4=0;break; // "*"case 15 : f1=0;f2=0;f3=0;f4=1;break; // "/"}}}void DisplayHandle() //将数据显示在数码管上{uchar i,x;if((flag1==0)&&(flag2==0)){x=px1;if(px1==0) display(7,0);else{for(i=0;i<px1;i++){display(8-x,DA TA1[i]);x--;delay(5);}}}else if((flag1==1)&&(flag2==0)){x=px2;if(px2==0) display(7,0);else{for(i=0;i<px2;i++){display(8-x,DA TA2[i]);x--;delay(3);}}}else if ((flag1==1)&&(flag2==1)){for(i=7;i>=px3;i--){display(i,RESUIT[i]);delay(3);}}}。
1单片机红外接收与解码原理1.1PT2262-I R编码原理PT2262-IR的编码格式如图1-1所示,其中,OSC为系统的时钟频率。
0,1,f和Sync 对应的分别是低电平,高电平,悬空和同步码的波形,图1-1 PT2262-IR编码格式由于使用的一体化红外接收头的接收频率为38KHz,所以系统的时钟频率应该设置为76KHz。
根据编码格式,通过计算可以得到各类编码中高低电平的宽度,也可以利用示波器测量各类编码中高低电平的宽度。
1.2 解码原理要进行软件解码最重要的是得到各个电平的宽度,因此我们在进行软件解码时要利用计时器去获得电平的宽度,然后对得到的数据进行处理,就可以得到每个相应的脉冲是宽脉冲还是窄脉冲。
通过对PT2262-IR的编码格式分析发现,根据每个周期中间时刻的电平状态就是判断相应周期中高电平是宽脉冲还是窄脉冲,为了减少数据的运算量,我们也可以在每个周期的中间时刻对输入端进行电平检测,得到相应时刻的电平状态,然后根据每个周期中间时刻的电平状态去判断该周期的脉冲是宽脉冲还是窄脉冲进而解码出发送的实际数据,每个周期中间时刻的电平状态和实际数据的对应关系如表1所示。
表1 编码与数据对应表利用判断周期中间时刻的电平状态进行软件解码时,我们可以通过计算得到周期的大概值,进而计算出半个周期的大概值,就可以在输入端有高电平跳变到低电平时给定时器一个初始值,然后启动定时器,使定时器可以在该周期的中间时刻产生中断,在中断处理程序中根据标记位判断是否需要读取信号输入端的电平状态,如果需要读取输入端的电平状态就开始读取输入端的电平状态,然后将其保存,同时计数值增加1,并清除标记位,对定时器设定初始值后重新启动定时器,以便判断该周期是否过长。
如果不需要读取电平状态说明此次定时是为了判断周期长度的,一旦进入该中断说明该周期过长,可能是同步位或者是误码,因此就需要将计数值清零,重新获取数据,一直到获取25个数据为止。
STM32单片机红外遥控红外遥控接口电路STM32单片机红外遥控程序源代码#include "sys.h"#define LED_RED PBout(12) //红色发光二极管控制管脚初始化PB12 #define LED_GREEN PBout(13) //绿色发光二极管控制管脚初始化PB13 #define LED_YELLOW PBout(14) //黄色发光二极管控制管脚初始化PB14 #define LED_BLUE PBout(15) //蓝色发光二极管控制管脚初始化PB15 #define BEEP PBout(5) //蜂鸣器端口定义PB5#define RDATA PAin(1) //红外数据输入脚//红外遥控识别码(ID),每款遥控器的该值基本都不一样,但也有一样的//我们选用的遥控器识别码为0#define REMOTE_ID 0static u8 fac_us=0; //us延时倍乘数static u16 fac_ms=0; //ms延时倍乘数void delay_init(u8 SYSCLK);void delay_ms(u16 nms);void delay_us(u32 nus);void Led_Init(void); //发光二极管控制管脚初始化void Red_Led_Light(void); //点亮红色发光二极管void Green_Led_Light(void); //点亮绿色发光二极管void Yellow_Led_Light(void); //点亮黄色发光二极管void Blue_Led_Light(void); //点亮蓝色发光二极管void Red_Led_Goout(void); //熄灭红色发光二极管void Green_Led_Goout(void); //熄灭绿色发光二极管void Yellow_Led_Goout(void); //熄灭黄色发光二极管void Blue_Led_Goout(void); //熄灭蓝色发光二极管void Beep_Init(void);void Beep_Tweet(void);void Beep_Silent(void);extern u8 Remote_Cnt; //按键次数,此次按下键的次数extern u8 Remote_Rdy; //红外接收到数据extern u32 Remote_Odr; //命令暂存处u32 Remote_Odr=0; //命令暂存处u8 Remote_Cnt=0; //按键次数,此次按下键的次数u8 Remote_Rdy=0; //红外接收到数据void Remote_Init(void); //红外传感器接收头引脚初始化u8 Remote_Process(void); //红外接收到数据处理u8 Pulse_Width_Check(void); //检查脉宽extern u8 USART_RX_BUF[64]; //接收缓冲,最大63个字节.末字节为换行符extern u8 USART_RX_STA; //接收状态标记//如果想串口中断接收,请不要注释以下宏定义//#define EN_USART1_RX //使能串口1接收void uart_init(u32 pclk2,u32 bound);/*************************************************************开发板上电后,用红外遥控器对着开发板上的红外接收头。
51单片机红外遥控解码程序类别:单片机/DSP 阅读:2975编者按:以下是网友编写的遥控解码程序!一种用延时等待的解码方法,比较容易理解,但缺点是占用CPU运行时间,第二种方法用定时器和外中断的解码方法,初学不易理解,但优点也很明显,第二种方法如果能解决连发解码就比较完美,更完善的红外遥控解码程序,请参考本站TOPA V-2008,TOP51-2005所配程序。
解码方法一;//单片机接收红外解读程序\\;硬件结构:8951,P0口数码管段码,P2.0-P2.3为位,P1为8个LED;P3.2为红外接收头,P2.7蜂鸣器,晶振12M;适用UPD6121 6122芯片接收;---------------------------------------------------------ORG 0000HAJMP MAIN ;转入主程序ORG 0003H ;外部中断P3.2脚INT0入口地址AJMP INT ;转入外部中断服务子程序(解码程序);以下为主程序进行CPU中断方式设置MAIN: SETB EA ;打开CPU总中断请求SETB IT0 ;设定INT0的触发方式为脉冲下降沿触发SETB EX0 ;打开INT0中断请求AJMP $;以下为进入P3.2脚外部中断子程序,也就是解码程序INT: CLR EA ;暂时关闭CPU的所有中断请求MOV R6,#10SB: ACALL YS1 ;调用882微秒延时子程序JB P3.2,EXIT ;延时882微秒后判断P3.2脚是否出现高; 电平如果有就退出解码程序DJNZ R6, SB ;重复10次,目的是检测在8820微秒内;如果出现高电平就退出解码程序;以上完成对遥控信号的9000微秒的初始低电平信号的识别。
JNB P3.2, $ ;等待高电平避开9毫秒低电平引导脉冲ACALL YS2 ;延时4.74毫秒避开4.5毫秒的结果码MOV R1,#1AH ;设定1AH为起始RAM区MOV R2,#4;PP: MOV R3,#8JJJJ: JNB P3.2,$ ;等待地址码第一位的高电平信号LCALL YS1 ;高电平开始后用882微秒的时间尺去判断信;号此时的高低电平状态MOV C,P3.2 ;将P3.2引脚此时的电平状态0或1存入C中JNC UUU ;如果为0就跳转到UUULCALL YS3;UUU: MOV A,@R1 ;将R1中地址的给ARRC A ;将C中的值0或1移入A中的最低位MOV @R1,A ;将A中的数暂时存放在R1中DJNZ R3,JJJJ ;接收地址码的高8位INC R1 ;对R1中的值加1,换下一个RAMDJNZ R2,PP ;接收完16位地址码和8位数据码和8位数据反; 码,存放在1AH/1BH/1CH/1DH的RAM中MOV A,1CH ;比较数据码和数据反码是否正确?CPL AXRL A,1DH ;将1CH的值取反后和1DH比较不同则无效丢弃,核对数据是否准确JNZ EXITMOV DPTR,#TAB ;表头地址送指针MOV A,1DHANL A,#0FH ;相与,得到低四位码MOVC A,@A+DPTRMOV 1EH,A ;查表得表码存入1EHMOV A,1DHSWAP AANL A,#0FHMOVC A,@A+DPTRMOV 1FH,A ;查表得高四位码存入1FMOV R7,#20HDISP:MOV P0,1FH ;送数码管显示CLR P2.1ACALL YS2SETB P2.1MOV P0,1EHCLR P2.2ACALL YS2SETB P2.2MOV P1,1DH ;将按键的键值通过P1口的8个LED显示出来!CLR P2.7 ;蜂鸣器鸣响-嘀嘀嘀-的声音,表示解码成功LCALL YS2SETB P2.7 ;蜂鸣器停止DJNZ R7,DISPEXIT: SETB EA ;允许中断RETI ;退出解码子程序YS1: MOV R4,#20 ;延时子程序1,精确延时882微秒D1: MOV R5,#20DJNZ R5,$DJNZ R4,D1RETYS2: MOV R4,#10 ;延时子程序2,精确延时4740微秒D2: MOV R5,#235DJNZ R5,$DJNZ R4,D2RETYS3: MOV R4,#2 ;延时程序3,精确延时1000微秒D3:MOV R5,#248DJNZ R5,$DJNZ R4,D3RETTAB: DB 0C0H,0DEH,0A2H,8AH,9CH,89H,81H,0DAH,80H,88H,90H,85H,0E1H,86H,0A1H,0B1H;数据表,0-9-A-FEND解码方法二你的解码程序和我现在用的解码程序大体是一样的,我自己实际做了一下,发现按下遥控器,接收到红外信号后,数码管闪的厉害。
//51单片机做的红外遥控实验(C语言)#include<reg51.h>#define u8 unsigned char#define u16 unsigned int#define ID 0x00 //本遥控器的ID号sbit ir=P3^3;code u8 seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0-9的段码code u8 s[]={1,0x40,0x48,0x04,0x02,0x05,0x54,0x0A,0x1E,0x0E}; u8 buf[4];bit ir_f=0;u8 nu;void delay(u16 x){while(x--);}void show(u16 x){u8 i=0,k=0;u8 s[4];kk:s[i]=x%10;if((x/10)>=1){x=x/10;i++;goto kk;}k=i+1;for(i=0;i<k;i++){P0=seg[s[i]];P2=~(8>>i);delay(300);P0=0XFF;P2=0XFF;}}void timer0_init(){TH0=0;TL0=0;TMOD|=0x01;TR0=0;}u16 low_test(){u16 t;TR0=1;while((ir==0)&&((TH0&0X80)!=0X80));TR0=0;t=TH0;t<<=8;t|=TL0;TH0=0;TL0=0; //t=(TH*256+TL0);//机器周期数return t;}u16 high_test(){u16 t;TR0=1;while((ir==1)&&((TH0&0X80)!=0X80));TR0=0;t=TH0;t<<=8;t|=TL0;TH0=0;TL0=0;return t;}/*u16 time_test(bit x){}*/u8 receive_8bit(){u8 d,i;u16 t;for(i=0;i<8;i++){t=low_test();t=high_test();d>>=1;if((t>=2750)&&(t<=3100)){d|=0x80;}}return d;}void ir_decode(){u16 t;u8 i;if(ir==0)//有遥控信号{t=low_test();//8295-9000us,倍频的是16590-18000if((t>=14500)&&(t<=18000))//检查引导码低电平时间{t=high_test();if((t>=8000)&&(t<=9000))//检查高电平{for(i=0;i<4;i++){buf[i]=receive_8bit();}if(buf[0]==(~buf[1]))//检查系统码是否正确{if(buf[0]==ID){if(buf[2]==(~buf[3])){//具体按键处理ir_f=1; //遥控有效}}}}}}}/*void key(){if(buf[2]==0x40){P1^=(1<<0);}if(buf[2]==0x48){P1^=(1<<1);}}*/void ir_execuse(){if(ir_f==1){switch(buf[2]){case 0x40:P1^=(1<<0);break;case 0x48:P1^=(1<<1);break;case 0x04:P1^=(1<<2);break;case 0x02:P1^=(1<<3);break;case 0x05:P1^=(1<<4);break;case 0x54:P1^=(1<<5);break;case 0x0A:P1^=(1<<6);break;case 0x1E:P1^=(1<<7);break;}ir_f=0;}}void show_d(){u8 j;for(j=0;j<10;j++){if(s[j]==buf[2]){nu=j;break;}}show(nu);}void isr_init(){EA=1;EX1=1;//外部中断,一直看3.3有没有下降沿。
本科生毕业设计(论文)论文题目:基于单片机的红外遥控系统设计毕业设计(论文)原创性声明和使用授权说明原创性声明本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。
尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。
对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。
作者签名:日期:指导教师签名:日期:使用授权说明本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。
作者签名:日期:本设计是基于单片机的红外遥控系统设计,设计内容包括了红外接收,红外解码和步进电机控制三大块。
如今红外遥控技术已经得到了广泛的应用;其利用红外线来传输数据,这种情况下不需要实体连线,体积小,成本低,功能强。
我们日常生活中的电视机,洗衣机,空调,航天飞机,工业现场设备等都运用了红外遥控的技术。
本设计中发射端采用专用的发射芯片来实现红外遥控码的发射,且遥控码格式是NEC标准。
接收端采用市面上流行的1838一体化红外接收头,接收到的红外信号经由1838接收头完成光/电转化和解调的工作,然后把33位的完整码发送到解码芯片中去完成解码工作。
本设计中的主芯片是STC89C52单片机,主芯片和解码芯片之间进行串行通讯。
系统启动后,解码芯片将解码后得到的8位数据码串行发送到主芯片中,然后通过主芯片来控制步进电机的正转,反转,加速,减速。
本设计中的被控对象是步进电机,步进电机最适合做数字控制。
步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。
单片机的红外遥控器编码原理与实现红外遥控器是我们日常生活中常见的一种设备,用于控制电器设备的开关、音量调节等操作。
而单片机作为一种重要的电子元器件,可以通过编程来实现红外遥控器的功能。
本文将介绍单片机的红外遥控器编码原理和实现过程。
一、红外编码原理红外遥控器通过发送红外信号来控制电器设备的开关。
而红外编码原理是指在红外遥控器中,将按键的信息编码成红外信号发送出去。
在遥控器中,每个按键对应一个特定的红外编码。
当按下某个按键时,遥控器会将该按键的特定编码发送出去。
接收器设备会解码接收到的红外信号,并根据解码结果来执行相应的操作。
二、红外编码实现步骤1. 硬件准备实现红外遥控器编码,首先需要准备以下硬件设备:- 单片机模块- 红外发射模块- 按键模块- 电源供应模块2. 硬件连接将单片机模块、红外发射模块、按键模块和电源供应模块按照电路图进行连接。
确保连接正确并固定好各个模块。
3. 软件编程使用单片机的编程语言(如C语言)进行编程,实现红外遥控器的功能。
具体的编程步骤如下:- 初始化相关的引脚和中断,包括红外发射引脚和按键引脚。
- 设置红外编码的格式和协议,如NEC编码、SONY编码等。
- 通过按键模块检测按键是否被按下,如果按键被按下,则执行相应的红外编码发送操作。
- 根据按键的不同,发送不同的红外编码信号。
4. 红外编码发送编写代码实现红外编码信号的发送。
根据选择的编码协议和格式,在编程中设置相应的红外编码参数,并通过红外发射模块将编码信号发送出去。
5. 测试和调试完成编程后,进行测试和调试。
将红外编码器面对接收器设备,按下遥控器的按键,观察接收器设备是否成功接收到信号并执行相应的操作。
通过以上步骤,就可以实现单片机的红外遥控器编码功能。
三、红外编码的应用红外遥控器的编码原理可以应用于各种控制场景,例如家电控制、智能家居系统、工业自动化等。
通过编程,可以实现不同按键对应不同设备的控制,提高生活和工作的便利性。
用单片机解码红外遥控器遥控器使用方便,功能多.目前已广泛应用在电视机、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种状态,代表实际所按下的键。
数据反码是数据码的各位求反,通过比较数据码与数据反码.可判断接收到的数据是否正确。
USB通讯主机红外学习方法IR Manager是一个红外代码管理的工具软件,可以嵌入Control System编程软件使用,也可以单独使用。
IR Manager提供红外代码的相关管理功能,包括红外文件的获取(学习),保存和管理,以文件形式保存。
红外代码文件可以被Control System编程软件调用,通过编程软件终工具栏里“Rebuilt User IR Database”导入红外文件。
IR Manager见图1。
图 1软件快捷功能键说明:红外代码学习步骤:一、运行红外学习软件IR Manager。
二、新建红外文件点击创建一个新的红外文件文件。
见下图:图 2 Manufaturer:设备的厂商,比如SONY;Device name:设备的名称,比如DVDMode:设备的型号,比如DVD-DNP_NS50P。
注意设备型号命名包含了两个部分内容,实际需要由“设备名称”+“设备型号”来构成。
这样红外文件导入到主机程序以后,在主机程序/User IR Module里面才能看见完整的设备厂家、名称及型号。
因为主机程序/User IR Module部分命名规则是由“设备厂商”+“设备型号”两部分组成。
三、添加功能按键。
新建的红外文件默认只有一个功能按键,而我们要控制的设备往往会有多个功能按键需要控制。
我们需要添加功能按键。
点击添加红外控制功能按键,并在IR Function那一栏中对其命名,例如填写”Power on”等按键的名称。
把所有要的按键都创建好了后就要开始学习红外码了。
见图3。
注意:新建的红外文件默认的Function:“None”是不能被删除的,删除以后可能导致导入红外文件到工程时出错。
一般可以保留不使用或者双击点开以后修改成我们需要的功能键使用。
图 3四.确认电脑和PGM II能正常通讯。
电脑通过USB线与PGM II主机连接,当USB线驱动安装正常以后,在“我的电脑”/“属性”/“设备管理”/“通用串行总线控制器”是可以看见PGM II主机的(如下图所示)。
用AT89S51单片机制作红外电视遥控器一般红外电视遥控器的输出都是用编码后串行数据对38~40kHz的方波进行脉冲幅度调制而产生的。
当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。
这种遥控码具有以下特征:采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms 的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms 的组合表示二进制的“1”。
上述“0”和“1”组成的32位二进制码经38kHz的载频进行二次调制,然后再通过红外发射二极管产生红外线向空间发射。
一般电视遥控器的遥控编码是连续的32位二进制码组,其中前16位为用户识别码,能区别不同的红外遥控设备,防止不同机种遥控码互相干扰。
后16位为8位的操作码和8位的操作反码,用于核对数据是否接收准确。
根据红外编码的格式,发送数据前需要先发送9ms的起始码和4.5ms的结果码。
遥控串行数据编码波形如下图所示:接收方一般使用TL0038一体化红外线接收器进行接收解码,当TL0038接收到38kHz红外信号时,输出端输出低电平,否则为高电平。
所以红外遥控器发送红外信号时,参考上面遥控串行数据编码波形图,在低电平处发送38kHz 红外信号,高电平处则不发送红外信号。
单片机红外电视遥控器电路图如下:C51程序代码:#include <AT89X51.h>static bit OP;//红外发射管的亮灭static unsigned int count;//延时计数器static unsigned int endcount; //终止延时计数static unsigned char flag;//红外发送标志char iraddr1;//十六位地址的第一个字节char iraddr2;//十六位地址的第二个字节void SendIRdata(char p_irdata);void delay();void main(void){count = 0;flag = 0;OP = 0;P3_4 = 0;EA = 1; //允许CPU中断TMOD = 0x11; //设定时器0和1为16位模式1ET0 = 1; //定时器0中断允许TH0 = 0xFF;TL0 = 0xE6; //设定时值0为38K 也就是每隔26us中断一次TR0 = 1;//开始计数iraddr1=3;iraddr2=252;do{delay();SendIRdata(12);}while(1);}//定时器0中断处理void timeint(void) interrupt 1{TH0=0xFF;TL0=0xE6; //设定时值为38K 也就是每隔26us中断一次count++;if (flag==1){OP=~OP;}else{OP = 0;}P3_4 = OP;}void SendIRdata(char p_irdata){int i;char irdata=p_irdata;//发送9ms的起始码endcount=223;flag=1;count=0;do{}while(count<endcount);//发送4.5ms的结果码endcount=117flag=0;count=0;do{}while(count<endcount);//发送十六位地址的前八位irdata=iraddr1;for(i=0;i<8;i++){//先发送0.56ms的38KHZ红外波(即编码中0.56ms的低电平)endcount=10;flag=1;count=0;do{}while(count<endcount);//停止发送红外信号(即编码中的高电平)if(irdata-(irdata/2)*2)//判断二进制数个位为1还是0{endcount=41;//1为宽的高电平}else{endcount=15;//0为窄的高电平}flag=0;count=0;do{}while(count<endcount);irdata=irdata>>1;}//发送十六位地址的后八位irdata=iraddr2;for(i=0;i<8;i++){flag=1;count=0;do{}while(count<endcount);if(irdata-(irdata/2)*2){endcount=41;}else{endcount=15;}flag=0;count=0;do{}while(count<endcount);irdata=irdata>>1;}//发送八位数据irdata=p_irdata;for(i=0;i<8;i++){flag=1;count=0;do{}while(count<endcount);if(irdata-(irdata/2)*2){endcount=41;}else{endcount=15;}flag=0;count=0;do{}while(count<endcount);irdata=irdata>>1;}//发送八位数据的反码irdata=~p_irdata;for(i=0;i<8;i++){flag=1;count=0;do{}while(count<endcount);if(irdata-(irdata/2)*2){endcount=41;}else{endcount=15;}flag=0;count=0;do{}while(count<endcount);irdata=irdata>>1;}endcount=10;flag=1;count=0;do{}while(count<endcount);flag=0;}void delay(){int i,j;for(i=0;i<400;i++){for(j=0;j<100;j++){}}}制作的实物如下图所示:1、引言红外通信是目前比较常用的一种无线数据传输手段,其具有无污染、信息传输稳定、信息安全性高以及安装使用方便等优点,并且可以在很多场合应用,如家电产品,工业控制、娱乐设施等领域。
基于51单片机的红外遥控本讲内容:介绍红外遥控的知识,通过例程展示红外遥控程序的编写方法。
红外线简介:在光谱中波长自760nm至400um的电磁波称为红外线,它是一种不可见光。
目前几乎所有的视频和音频设备都可以通过红外遥控的方式进行遥控,比如电视机、空调、影碟机等,都可以见到红外遥控的影子。
这种技术应用广泛,相应的应用器件都十分廉价,因此红外遥控是我们日常设备控制的理想方式。
接收头输出的波形正好和遥控芯片输出的相反。
在这里红外通信采用NEC协议,它的特征如下:信号调制红外遥控信号接收管接口电路:红外信号发射电路 红外信号接收电路例程:红外遥控信号发射:/*****************红外通信——发射*******************单片机型号:STC89C52RC*开发环境:KEIL*名称:红外通信发射*功能:按下按键S4,S5,S6,S8,S9,S10,S11,S13,S14发射对应键值,可以与红外通信——接收程序配套使用***************************************************/#include <REG51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define SBM 0x80 //识别码#define m9 (65536-8294) //约9mS#define m4_5 (65536-4147) //约4.5mS#define m1_6 (65536-1521) //约1.65mS#define m_65 (65536-599) //约0.65mS#define m_56 (65536-516) //约0.56mS#define m40 (65536-36864) //约40mS#define m56 (65536-51610) //56mS#define m2_25 (65536-2074) //约2.25mSconst uchar TabHL1[9]={0x0c,0x18,0x5e,0x08,0x1c,0x5a,0x42,0x52,0x4a};sbit IR=P1^5; //定义发射引脚sbit BEEP=P2^3;void keyscan();void ZZ(uchar x);void Z0(uchar temp);void TT0(bit BT,uint x);void delay(int In,int Out);/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数功能:主函数┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈/ void main(void){TMOD=0x01; //T0 16位工作方式IR=1; //发射端口常态为高电平while(1){keyscan();}}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数功能:发送主程序┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈/ void ZZ(uchar x){TT0(1,m9); //高电平9mSTT0(0,m4_5); //低电平4.5mS/*┈发送4帧数据┈*/Z0(SBM);Z0(~SBM);Z0(x);Z0(~x);/*┈┈结束码┈┈*/TT0(1,m_65);TT0(0,m40);}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数功能:单帧发送程序入口参数:1帧数据┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈/ void Z0(uchar temp){uchar v;for (v=0;v<8;v++) //循环8次移位{TT0(1,m_65); //高电平0.65mSif(temp&0x01) TT0(0,m1_6); //发送最低位else TT0(0,m_56);temp >>= 1; //右移一位}}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数功能:38KHz脉冲发射 + 延时程序入口参数:(是否发射脉冲,延时约 x (uS))┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈/void TT0(bit BT,uint x){TH0=x>>8; //输入T0初始值TL0=x;TF0=0; //清0TR0=1; //启动定时器0if(BT==0)while(!TF0);//BT=0时不发射38KHz脉冲只延时;BT=1发射38KHz脉冲且延时;else while(1) //38KHz脉冲,占空比5:26{IR = 0;if(TF0)break;if(TF0)break;IR=1;if(TF0)break;if(TF0)break;if(TF0)break;if(TF0)break;if(TF0)break;if(TF0)break;if(TF0)break;if(TF0)break;if(TF0)break;if(TF0)break;}TR0=0; //关闭定时器0TF0=0; //标志位溢出则清0IR =1; //脉冲停止后,发射端口常态为高电平}void keyscan() //按键扫描函数{uchar buffer;/***************************************************/P3=0xfe; //扫描S3,S4,S5,S6;buffer=P3;buffer=buffer & 0xf0;if(buffer!=0xf0){delay(5,10);if(buffer!=0xf0){buffer=P3;switch(buffer){case 0xee:{;}break;case 0xde:{ZZ(TabHL1[0]);}break;case 0xbe:{ZZ(TabHL1[1]);}break;case 0x7e:{ZZ(TabHL1[2]);}break;}while(buffer != 0xf0){buffer=P3;buffer=buffer&0xf0;BEEP=0;}BEEP=1;}}/****************************************************/ P3=0xfd; //扫描S8,S9,S10,S11buffer=P3;buffer=buffer & 0xf0;if(buffer!=0xf0){delay(5,10);if(buffer!=0xf0){buffer=P3;switch(buffer){case 0xed:{ZZ(TabHL1[3]);}break;case 0xdd:{ZZ(TabHL1[4]);}break;case 0xbd:{ZZ(TabHL1[5]);}break;case 0x7d:{ZZ(TabHL1[6]);}break;}while(buffer!=0xf0){buffer=P3;buffer=buffer&0xf0;BEEP=0;}BEEP=1;}}/****************************************************/ P3=0xfb; //扫描S13,S14,S15,S16buffer=P3;buffer=buffer&0xf0;if(buffer!=0xf0){delay(5,10);if(buffer!=0xf0){buffer=P3;switch(buffer){case 0xeb:{ZZ(TabHL1[7]);}break;case 0xdb:{ZZ(TabHL1[8]);}break;}while(buffer!=0xf0){buffer=P3;buffer=buffer&0xf0;BEEP=0;}BEEP=1;}}}void delay(int In,int Out) //定义延时函数{int i,j;for(i=0;i<In;i++){for(j=0;j<Out;j++){;}}}红外遥控信号接收:/*****************红外通信--接收*******************单片机型号:STC89C52RC*开发环境:KEIL*功能:在液晶LCD1602上显示接收到的数值*************************************************/#include<reg52.h>#define LCD_Data P0#define Busy 0x80sbit IR=P3^2;sbit LCD_RS=P1^0;sbit LCD_RW=P1^1;sbit LCD_E=P2^5;void TIM0init(void);void EX0init(void);void SYSinit(void);void delay(int In,int Out);void Delay5Ms(void);void Ir_work(void);void Ircordpro(void);void WriteDataLCD(unsigned char WDLCD);void WriteCommandLCD(unsigned char WCLCD,BuysC);unsigned char ReadDataLCD(void);unsigned char ReadStatusLCD(void);void LCDInit(void);void DisplayOneChar(unsigned char X,unsigned char Y,unsigned char DData);void DisplayListChar(unsigned char X,unsigned char Y,unsigned char code *DData); void Info_display(void);bit IRpro_ok;bit IR_ok;unsigned char IRcord[4];unsigned char IRdata[33];unsigned char codedofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsigned char irtime;unsigned char speed_num=0;unsigned char codemb_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};unsigned char code welcome[]={"YOU ARE WELCOME"};unsigned char code ir_reve[]={"IR_RECEIVE: "};/*******************5ms延时函数*********************/void Delay5Ms(void){unsigned int TempCyc=3552;while(TempCyc--);}void delay(int In,int Out){int i,j;for(i=0;i<In;i++){for(j=0;j<Out;j++){;}}}/***********************写数据函数***********************/ void WriteDataLCD(unsigned char WDLCD){ReadStatusLCD();LCD_Data=WDLCD;LCD_RS=1;LCD_RW=0;LCD_E=0;LCD_E=0;LCD_E=1;}/**********************写指令函数************************/ void WriteCommandLCD(unsigned char WCLCD,BuysC){if(BuysC)ReadStatusLCD();LCD_Data=WCLCD;LCD_RS=0;LCD_RW=0;LCD_E=0;LCD_E=0;LCD_E=1;}/***********************读状态函数************************/ unsigned char ReadStatusLCD(void){LCD_Data=0xFF;LCD_RS=0;LCD_RW=1;LCD_E=0;LCD_E=0;LCD_E=1;while(LCD_Data & Busy);return(LCD_Data);}/************************LCD初始化************************/ void LCDInit(void){LCD_Data=0;WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,1);WriteCommandLCD(0x08,1);WriteCommandLCD(0x01,1);WriteCommandLCD(0x06,1);WriteCommandLCD(0x0C,1);}/*******************按指定位置显示一个字符******************/void DisplayOneChar(unsigned char X,unsigned char Y,unsigned char DData){Y&=0x1;X&=0xF;if(Y)X|=0x40;X|=0x80;WriteCommandLCD(X,0);WriteDataLCD(DData);}/*******************按指定位置显示一串字符******************/void DisplayListChar(unsigned char X,unsigned char Y,unsigned char code *DData) {unsigned char ListLength;ListLength=0;Y&=0x1;X&=0xF;while(DData[ListLength]>=0x20){if(X<=0xF){DisplayOneChar(X,Y,DData[ListLength]);ListLength++;X++;}}}/***********************定时器0初始化***********************/void TIM0init(void){TMOD=0x02;TH0=0x00;TL0=0x00;ET0=1;TR0=1;}/**********************外部中断0初始化**********************/void EX0init(void){IT0=1;EX0=1;EA=1;}/*************************系统初始化*************************/void SYSinit(void){TIM0init();EX0init();LCDInit();}/********************红外信号接收相关函数********************/void Ir_work(void){switch(IRcord[2]){case 0x0C:{DisplayOneChar(12,1,0x31);}break;case 0x18:{DisplayOneChar(12,1,0x32);}break;case 0x5e:{DisplayOneChar(12,1,0x33);}break;case 0x08:{DisplayOneChar(12,1,0x34);}break;case 0x1c:{DisplayOneChar(12,1,0x35);}break;case 0x5a:{DisplayOneChar(12,1,0x36);}break;case 0x42:{DisplayOneChar(12,1,0x37);}break;case 0x52:{DisplayOneChar(12,1,0x38);}break;case 0x4a:{DisplayOneChar(12,1,0x39);}break;default:break;}}void Ircordpro(void){unsigned char i,j,k;unsigned char cord,value;k=1;for(i=0;i<4;i++){for(j=1;j<=8;j++){cord=IRdata[k];if(cord>7)value|=0x80;if(j<8){value>>=1;}k++;}IRcord[i]=value;value=0;}IRpro_ok=1;}/********************红外信号接收相关函数********************/ void main(void){SYSinit();delay(5,100);DisplayListChar(0,0,welcome);DisplayListChar(0,1,ir_reve);while(1){if(IR_ok){Ircordpro();IR_ok=0;}if(IRpro_ok){Ir_work();}}}/********************定时器0中断处理函数********************/ void tim0_isr (void) interrupt 1 using 1{irtime++;}/*******************外部中断0中断处理函数*******************/ void EX0_ISR (void) interrupt 0{static unsigned char i;static bit startflag;if(startflag){if(irtime<63&&irtime>=33)i=0;IRdata[i]=irtime;irtime=0;i++;if(i==33){IR_ok=1;i=0;}}else{irtime=0;startflag=1;}}。
21键红外遥控原理
红外遥控原理是利用红外线进行信息传递和控制的一种方式。
红外线波长在~μm之间,比红光波长还长,位于可见光红光之外。
人眼无法察觉红外光的存在。
红外遥控具有抗干扰、电路简单、易于编码和解码、功耗小和成本低等优点。
在红外遥控系统中,主要部分包括调制、发射和接收。
调制是指将数据与一定频率的载波进行“与”操作,这样既可以提高发射效率又可以降低电源功耗。
调制载波频率一般在30~60kHz之间,大多数使用的是38kHz,这是由发射端所使用的455kHz晶振决定的。
发射系统有很多种芯片可以实现红外发射,可以根据需求发出不同种类的编码。
红外遥控器利用一个红外发光二极管,以红外光为载体来将按键信息传递给接收端的设备。
以上内容仅供参考,如需更多信息,建议查阅相关文献或咨询电子工程专家。