单片机学习型遥控器程序详解(完整版)

合集下载

51单片机无线遥控应用教程

51单片机无线遥控应用教程

编码输出端(正常时为低电平)
表 1:编码电路 PT2262 管脚功能表
名称 管脚
说明
A0-A11 1-8、10-13
地址管脚,用于进行地址编码,可置为“0”,“1”,“f” (悬空),必须与 2262 一致,否则不解码
地址或数据管脚,当做为数据管脚时,只有在地址码与
D0-D5
7-8、10-13
2262 一致,数据管脚才能输出与 2262 数据端对应的高 电平,否则输出为低电平,锁存型只有在接收到下一数
PT2262 和接收端 PT2272 的地址编码完全相同,才能配对使用,遥控模块的生产
厂家为了便于生产管理,出厂时遥控模块的 PT2262 和 PT2272 的八位地址编码端
全部悬空,这样用户可以很方便选择各种编码状态,用户如果想改变地址编码,
只要将 PT2262 和 PT2272 的 1~8 脚设置相同即可,例如将发射机的 PT2262 的第
遥控发射器工作电压为 DC 12V(电池供电) ,尺寸(mm): 58*39*14 ,工作频率:315MHz , 工作电流(mA):13 编码类型: 固定码(板上焊盘跳接设置) 应用说明:与各类型带解码功能的 接收模块联合使用,解码输出后进行相应控制,如采用单片机进行读取接收并解码数据然后控制 相应的灯或电源开关。
编码芯片 PT2262 发出的编码信号由地址码、数据码、同步码组成一个完整 的码字。解码芯片 PT2272 接收到信号后,其地址码经过两次比较核对后,VT 脚 才输出高电平,与此同时相应的数据脚也输出高电平。PT2262 每次发射时至少 发射 4 组字码,因为无线发射的特点,第一组字码非常容易受零电平干扰,往往 会产生误码,所以 2272 只有在连续两次检测到相同的地址码加数据码才会把数 据码中的“1”驱动相应的数据输出端为高电平和驱动 VT 端同步为高电平。当发 射机没有按键按下时,PT2262 不接通电源,其 17 脚为低电平,所以 315MHz 的 高频发射电路不工作,当有按键按下时,PT2262 得电工作,其第 17 脚输出经调 制的串行数据信号,当 17 脚为高电平期间 315MHz 的高频发射电路起振并发射等 幅高频信号,当 17 脚为低平期间 315MHz 的高频发射电路停止振荡,所以高频发 射电路完全收控于 PT2262 的 17 脚输出的数字信号,从而对高频电路完成幅度键 控(ASK 调制)相当于调制度为 100%的调幅。

基于单片机的学习型遥控器设计

基于单片机的学习型遥控器设计

基于单片机的学习型遥控器设计红外遥控器是日常家庭生活中十分容易见到的遥控器。

红外遥控器性能良好,不仅体积小,而且耗电量低,价格也十分便宜,很符合大众的需求。

本文设计的红外遥控器是基于市场上万用遥控设计的学习型红外遥控装置。

Smart home--智能家居的普及,各种各样的家电的遥控器大量涌现,所以从许多遥控器选择具体的遥控器是非常的浪费时间,所以学习红外线遥控出现了。

它的特点是:遥控器里面有许多套编码,不再局限于仅仅一套编码,因此学习型红外遥控器可以成为很多家用电器的控制器,让人们的生活更加快捷更加的懒人化。

学习型遥控器可以复制其他遥控器的编码,并且还可以储存这些遥控器的编码。

当学习新遥控器复制那些遥控器的编码的时候,它会接收到那些遥控器的信号,然后复制这些信号,并且通过这些信号的编码来控制那些家用电器。

使用学习型遥控器时不需要用户输入编码,因为学习型遥控器已经复制好了原遥控器的编码,并将编码存储到学习型遥控器的存储器中,当需要遥控器控制家电的时候,学习型遥控器就会通过这些编码将信号发送出来,实现原来遥控器的功能。

本文主要采用RAM256位速率的ATC89 C51微控制器,使用红外发射,红外接收设备等简单易用的装置发送和接收信号,是基于各种远程编码复制,学习,然后播放原有的遥控功能。

电路比较简单,但是系统安全可靠,抗干扰能力强,也可以作为人们家电的控制器。

本文从多个方面将学习型红外遥控器拆分,将学习型遥控器分为键盘电路、红外发射电路、红外接收电路、存储电路等,以及将系统硬件完美接合的软件程序。

键盘电路作为用户端,发送信号到红外发射电路,发射电路将信号发射出去,然后信号就会被传输到红外接收电路。

但是在这之后要放大跟解调电路,为什么呢?因为红外二极管的功率基本都很小,所以发出的信号都比较微弱,所以需要放大跟解调。

然后对电平信号进行微处理,处理然后将其存储到外部存储器中。

关键词:AT89C51;学习遥控;红外遥控;编码方式AbstractInfrared remote control is a very easy to see remote control in daily family life. Infrared re mote control device has good performance, not only small size, but also low power consumption,the price is also very cheap, very in line with the needs of the public. The infrared remote cont roller designed in this paper is a learning infrared remote control device based on the market ten s of thousands of remote control design.The popularity of Smart home-- smart home, a large number of remote control of househol d appliances, so the choice of specific remote from many remote control is a waste of time, so t he study of infrared remote control. It is characterized by: there are many sets of coding in the r emote controller, no longer limited to only a set of coding, Learning infrared remote controller ca n become the controller of many household appliances, and make people's life more quick and more lazy.The learning remote controller can copy the coding of other remote controls, and can also store the coding of these remote controls. When learning the new remote control to copy the co ding of those remote controls, it receives signals from the remote controls, then copies them and controls the appliances by coding them. The use of learning remote control does not require us er input encoding, because learning remote controller has good copy the original remote control encoding, and the encoding is stored into a memory learning remote controller, when the remote control of home appliances, learning remote control will send the signal through the encoding, re alization the original remote control function.This paper mainly uses the RAM256 bit rate ATC89 C51 micro controller, using infrared tra nsmitting, sending and receiving signals of infrared receiving equipment is simple and easy to us e the device, is a variety of remote encoding replication, based on learning, and then play the or iginal remote control function. The circuit is relatively simple, but the system is safe and reliable, anti-interference ability, but also as a controller for people's home appliances.The learning infrared remote control split from many aspects, the learning remote controller consists of a keyboard circuit, an infrared emission circuit, an infrared receiving circuit, memory ci rcuit, and the system hardware and software program perfect bonding. The keyboard circuit as the user terminal sends a signal to the infrared transmitting circuit, the transmitting circuit transmits the signal out, sent to the infrared receiving circuit, The signal is then transmitted to the infrared receiving circuit. But after that, we need to amplify and demodulate the circuit. Why? Because t he infrared diode power is very small, so the signal is relatively weak, so we need to enlarge an d demodulate. The level signal is then processed, processed, and stored in an external memory.Key Words:AT89C51;Learning remote control; infrared remote control; coding mode目录摘要 (I)Abstract (II)引言 (1)第一章课题研究 (2)1.1 课题研究的背景 (2)1.2 课题的国内外发展动态31.3 学习型遥控器的介绍41.4 论文内容及各章节安排5第二章学习型遥控器的工作原理72.1 工作原理72.2 本章小结9第三章系统硬件电路设计103.1 AT89C52单片机103.2键盘电路的设计113.3红外接收电路123.4红外发射电路123.5存储电路133.6 硬件总原理图143.7 本章小结15第四章系统软件设计164.1键盘扫描程序164.2 红外解码程序164.3 AT2402存储程序174.3.1 I2C总线技术原理及其工作特点174.3.2 AT2402存储程序204.4 红外编码程序224.4.1读取EEPROM数据到单片机RAM中224.4.2红外编码发射程序234.4.338KHz方波程序244.5 学习与发射的切换程序254.6 本章小结26第五章结果分析7第六章结论与展望27参考文献28致谢46引言什么是学习型红外遥控器?普通的遥控器只能控制单一的家用电器,而学习型红外遥控器因此遥控器内不止一套编码,而是许多套编码,因此可以对多种家用电器进行控制。

基于51单片机的红外遥控计算器程序(附电路图,注释详细)

基于51单片机的红外遥控计算器程序(附电路图,注释详细)

/*************************基于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)2 方案论证与对比 (2)2.1 方案一简易红外遥控电路 (2)2.2 方案二利用STC68C52单片机控制电路 (2)2.3 方案对比与选择 (3)3 遥控器硬件与程序设计 (3)3.1 遥控器硬件结构组成 (3)3.2 系统硬件电路设计 (4)3.3 初始化程序 (4)3.4遥控器读入程序处理 (5)3.5 遥控码发送处理程序 (6)3.6主程序 (6)3.7 程序延时 (6)4 系统功能调试及整体指标分析 (6)4.1 程序调试 (6)4.2 整体指标分析 (7)5 详细仪器清单 (9)6总结、思考与致谢 (9)附录1:单键学习型红外遥控器原理图(proteus仿真): (10)附录2:单片机C源程序: (11)学习型红外遥控器设计1 设计要求及原理利用单片机作为控制核心,要求可以学习不同遥控器的某个按件功能。

使用时先用原遥控器对着学习器按一下某操作键,学习器就可实现原遥控器中该键的遥控功能。

具体要求如下:基本部分:(1)最大学习码长:206位。

(2) 学习码识别范围:起始位为15us~983ms,编码位为15us~3.825ms。

(3) 读码误差:±15us。

扩展部分:学习型红外遥控器在按下K键待绿色指示灯亮后,用遥控器对着红外接收头按下某个功能键,当绿灯灭说明学习完毕,再按发射键就可以进行遥控操作。

当红外遥控器的某个按键按下时,发射出一组串行二进制遥控编码脉冲。

该脉冲由引导码、系统码、功能码和反码组成,通过设置这些编码以及码长便可区分不同的红外遥控器。

红外接收器负责红外信号的接收和放大并解调出TTL电平信号送至微处理器进行处理,微处理器通过比较和识别接收来的红外遥控编码便可执行相应的遥控功能[1]。

本系统的设计思想是不考虑红外编码方式,仅利用单片机AT89C52对多个红外遥控编码的脉冲宽度进行测量,并原封不动地把发射信号中高、低电平的时间宽度记忆至扩展存储区的指定地址。

51单片机红外遥控解码程序

51单片机红外遥控解码程序

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单片机红外遥控格力空调程序

51单片机红外遥控格力空调程序

51单片机红外遥控格力空调程序51单片机红外遥控格力空调程序#include#define uchar unsigned char#define uint unsigned intsbit key1=P3^4;//按键控制开机sbit key2=P3^5;//按键控制关机sbit key3=P3^6;//按键控制温度+sbit key4=P3^7;//按键控制温度-sbit out=P1^5;//发送IO口uchar wd1[15]={0x00,0x08,0x04,0x0c,0x02,0x0a,0x06,0x0e,0x01,0x09,0x05,0x0d,0x03,0x0b,0x07};uchar wd2[15]={0x0a,0x06,0x0e,0x01,0x09,0x05,0x0d,0x03,0x0b,0x07,0x0f,0x00,0x08,0x04,0x0c};uchar x=12;//开机28度/************晶振11.0592MHz**************/ void delay(uint xms){uint i,j;for(i=xms;i>0;i--) //i=xms即延时约xms毫秒for(j=112;j>0;j--);}void delay560us(void) //560us延迟函数{uint j;for(j=63;j>0;j--);}void delay4500us(void) //4.5ms延迟函数{uint j;for(j=516;j>0;j--);}void khz_2(uint num) //38KHZ脉冲占空比1:2 {for(;num>0;num--){out=~out;}}void send0_a(void) //发送0{khz_2(42) ;//khz_3(21) ;out=1;delay560us();}void send1_a(void) //发送1 {khz_2(42) ;out=1;delay560us();delay560us();delay560us();}void leadcode_a(void) //发送引导码{khz_2(690) ;out=1;delay4500us();}/***************************关机****************************/ void close( uchar a,uchar b,uchar c,uchar d) {uint i;leadcode_a();send1_a();for(i=0;i<7;i++)send0_a();if(a)send1_a();elsesend0_a();if(b)send1_a();elsesend0_a();if(c)send1_a();elsesend0_a();if(d)send1_a();elsesend0_a();send0_a();send0_a();send0_a();for(i=0;i<5;i++)send0_a();send1_a();for(i=0;i<6;i++)send0_a();send1_a();send0_a();send1_a();send0_a();send0_a();send1_a();send0_a();khz_2(42) ;out=1;delay(20);}void close1(uchar e,uchar f,uchar g,uchar h ) { uchar i;for(i=0;i<13;i++)send1_a();send0_a();send0_a();for(i=0;i<12;i++)send0_a();if(e)send1_a();elsesend0_a();if(f)send1_a();elsesend0_a();send1_a();elsesend0_a();if(h)send0_a();elsesend1_a();khz_2(42) ;out=1;delay(1000);/*******************************************/ /****************开机************************/ }void open(uchar a,uchar b,uchar c,uchar d ) {uint i;leadcode_a();send1_a();send0_a();send0_a();send1_a();for(i=0;i<4;i++)send0_a();if(a)send1_a();elsesend0_a();if(b)send1_a();send0_a();if(c)send1_a(); elsesend0_a();if(d)send1_a(); elsesend0_a(); send0_a(); send0_a(); send0_a(); send0_a();for(i=0;i<5;i++) send0_a(); send1_a();for(i=0;i<6;i++) send0_a(); send1_a(); send0_a(); send1_a(); send0_a(); send0_a(); send1_a(); send0_a();khz_2(42) ;out=1;delay(20);}void open1(uchar e,uchar f,uchar g,uchar h) { uchar i;for(i=0;i<13;i++)send0_a();send1_a();send0_a();send0_a();for(i=0;i<12;i++)send0_a();if(e)send1_a();elsesend0_a();if(f)send1_a();elsesend0_a();if(g)send1_a();elsesend0_a();if(h)send1_a();elsesend0_a();khz_2(42) ;out=1;delay(1000);}void keyscan(){uchar a,b,c,d,e,f,g,h; if(key1==0){delay(10);if(key1==0){while(!key1);if(wd1[x] & 0x08)a=1;elsea=0;if(wd1[x] & 0x04)b=1;elseb=0;if(wd1[x] & 0x02)c=1;elsec=0;if(wd1[x] & 0x01)d=1;elsed=0;if(wd2[x] & 0x08) e=1; elsee=0;if(wd2[x] & 0x04)f=1;elsef=0;if(wd2[x] & 0x02)g=1;elseg=0;if(wd2[x] & 0x01)h=1;elseh=0;open(a,b,c,d);open1(e,f,g,h);}}if(key2==0){delay(10);if(key2==0){while(!key2);if((wd1[x] & 0x08)) a=1; elsea=0;if((wd1[x] & 0x04))b=1;elseb=0;if((wd1[x] & 0x02))c=1;elsec=0;if((wd1[x] & 0x01)) d=1;elsed=0;if((wd2[x] & 0x08)) e=1;elsee=0;if((wd2[x] & 0x04)) elsef=0;if((wd2[x] & 0x02)) g=1;elseg=0;if((wd2[x] & 0x01)) h=1;elseh=0;close(a,b,c,d); close1(e,f,g,h);}}if(key3==0){delay(10);if(key3==0){while(!key1);x++;if((wd1[x] & 0x08)) a=1; elseif((wd1[x] & 0x04))b=1;elseb=0;if((wd1[x] & 0x02))c=1;elsec=0;if((wd1[x] & 0x01))d=1;elsed=0;if((wd2[x] & 0x08)) e=1; elsee=0;if((wd2[x] & 0x04))f=1;elsef=0;if((wd2[x] & 0x02))g=1;elseg=0;if((wd2[x] & 0x01))h=1;elseh=0;open(a,b,c,d);open1(e,f,g,h);}}if(key4==0){delay(10);if(key4==0){while(!key1);x--;if((wd1[x] & 0x08))a=1;elsea=0;if((wd1[x] & 0x04))b=1;elseb=0;if((wd1[x] & 0x02))c=1;elsec=0;if((wd1[x] & 0x01))d=1;elsed=0;if((wd2[x] & 0x08)) e=1; elsee=0;if((wd2[x] & 0x04))f=1;elsef=0;if((wd2[x] & 0x02)) g=1;elseg=0;if((wd2[x] & 0x01)) h=1;elseh=0;open(a,b,c,d); open1(e,f,g,h);}}}void init(){key1=1;key2=1;key3=1;key4=1;out=1;}void main(){init();while(1){keyscan();} }。

51单片机格力空调遥控器

51单片机格力空调遥控器

1.1151单片机格力空调遥控器2.2.#include <reg52.h>3.#include <intrins.h>4.#define uchar unsigned char5.#define uint unsigned int6.#define enTransmitt flag=17.#define disTransmitt flag=O8.sfr T2M0D = 0XC9;9.bit flag=0;10.sbit IR38k =P2A3; // 红外发射管11.sbit key1=P1A1;12.sbit key2=P1A3;13.sbit key3=P1A5;14.sbit key4=PM7;15.sbit key5=P1A0;16.sbit key6=P1A4;17.uchar KeyScan();18.uint count=0,set_count=0;19.uchar fengliang_value=0;20.uchar key_value=0;21.uchar wendu_value=0;22.uchar mode_value=0;23.uchar switch_value=0;24.uchar zhuanye_value=0;25.uchar codeZhuanye[][5]={{0x39,0x04,0x00,0x50,0x02},{0x79,0x04,0x00,0x50,0x02}};//手动,自动转页(20度,冷气)26.ucharcode fengliang[][5]={{0x28,0x08,0x00,0x50,0x02},{0x19,0x08,0x00,0x50,0 x02},uchar code mode[][5]={ {0x58,0x00,0x00,0x50,0x02},{0x59,0x04,0x00,0x50,0x02},{0x5a,0x04,0x00,0x50,0x02},{0x5b,0x04,0x00,0x50,0x02}}; //自动,冷气,除湿,送风/*ucharcode on_or_off[][5]={ {0x40,0x00,0x00,0x50,0x02},{0x48,0x00,0x00,0x50, 0x02} }; */ uchar code on_or_off[][5]={ {0x39,0x08,0x00,0x50,0x02},{0x31,0x08,0x00,0x50,0x02}, {0x59,0x08,0x00,0x50,0x02},{0x51,0x08,0x00,0x50,0x02},{0x79,0x08,0x00,0x50,0x02},{0x71,0x08,0x00,0x50,0x02},}; // 开机,关机 uchar code wendu[][5]={ {0x59,0x00,0x00,0x50,0x02},{0x59,0x01,0x00,0x50,0x02},{0x59,0x02,0x00,0x50,0x02},{0x59,0x03,0x00,0x50,0x02}, {0x59,0x04,0x00,0x50,0x02},{0x59,0x05,0x00,0x50,0x02}, {0x59,0x06,0x00,0x50,0x02},{0x59,0x07,0x00,0x50,0x02}, {0x59,0x08,0x00,0x50,0x02},{0x59,0x09,0x00,0x50,0x02}, {0x59,0x0a,0x00,0x50,0x02},{0x59,0x0b,0x00,0x50,0x02}, {0x59,0x0c,0x00,0x50,0x02},{0x59,0x0d,0x00,0x50,0x02}, {0x59,0x0e,0x00,0x50,0x02} }; // 温度值 void send_precode(unsigned int s_cnt_1,unsigned int s_cnt_2); void send_8bit_code(uchar value); void send_4bit_code(uchar value); void send_final_code();29.30.31. 32. 33. 34. 35.36.37. 38. 39.40.41. 42.43.44.45.46.47.48.49.50.51.52.53.54.55.void ir_out1() // 启动和关闭57.send_precode(180,90);58.send_8bit_code(on_or_off[switch_value][0]);59.send_8bit_code(on_or_off[switch_value][1]);60.send_8bit_code(on_or_off[switch_value][2]);61.send_8bit_code(on_or_off[switch_value][3]);62.send_4bit_code(on_or_off[switch_value][4]);63.〃send_final_code();64.// key_value=0;65.switch_value++;66.if(switch_value==6){ switch_value=0; }67.67.}68.void ir_out2() //wendu--69.{71.70.send_precode(180,90);71.send_8bit_code(wendu[wendu_value][0]);72.send_8bit_code(wendu[wendu_value][1]);73.send_8bit_code(wendu[wendu_value][2]);74.send_8bit_code(wendu[wendu_value][3]);75.send_4bit_code(wendu[wendu_value][4]);76.send_final_code();77.wendu_value--;78.if(wendu_value==0) {wendu_value=15;}81.79.}80.void ir_out3() 〃wendu++81.{82.send_precode(180,90);83.send_8bit_code(wendu[wendu_value][0]);84.send_8bit_code(wendu[wendu_value][1]);85.send_8bit_code(wendu[wendu_value][2]);86.send_8bit_code(wendu[wendu_value][3]);87.send_4bit_code(wendu[wendu_value][4]);88.send_final_code();89.wendu_value++;90.if(wendu_value==15) { wendu_value=O;}91.}92.void ir_out4()//mode choose93.{94.send_precode(180,90);95.send_8bit_code(mode[mode_value][0]);96.send_8bit_code(mode[mode_value][1]);97.send_8bit_code(mode[mode_value][2]);98.send_8bit_code(mode[mode_value][3]);99.send_4bit_code(mode[mode_value][4]);100.send_final_code();101.mode_value++;102.if(mode_value==4)103.{ mode_value=0;}107.104.}105.void ir_out5() // 转叶106.{107.send_precode(180,90);108.send_8bit_code(zhuanye[zhuanye_value][0]); 109.send_8bit_code(zhuanye[zhuanye_value][1]); 110.send_8bit_code(zhuanye[zhuanye_value][2]); 111.send_8bit_code(zhuanye[zhuanye_value][3]); 112.send_4bit_code(zhuanye[zhuanye_value][4]); 113.send_final_code();114.zhuanye_value++;115.if(zhuanye_value==2) {zhuanye_value=0;}}void ir_out6() // 风量{send_precode(180,90);send_8bit_code(fengliang[fengliang_value][0]); send_8bit_code(fengliang[fengliang_value][1]); send_8bit_code(fengliang[fengliang_value][2]); send_8bit_code(fengliang[fengliang_value][3]); send_4bit_code(fengliang[fengliang_value][4]); send_final_code();fengliang_value++;if(fengliang_value==3) {fengliang_value=0;}}//============================================void delayms(unsigned char ms){unsigned char i;while(ms--){for(i=0;i<120;i++){};}}void Timerlnit(){EA=1;ET0=1;TMOD=0X01;TH0=0XfF;TL0=221; //50UST2C0N=0x00; 120.121.122.123.124.125.126.127.128.129.130.131.132.133.134.135.136.137.138.139.140.141.142.143.144.145.146.147.148.149.150.151.152.T2MOD=0x02; //enable T2's wave output through T2 pin(P10) 153.RCAP2H=(65536-11059/38/4)>>8; //output frequency is 38KHz 154.RCAP2L=(65536-11059/38/4)&0 xff;155.}156.void TransmittPulse()157.{158.enTransmitt;159.// ir=0;160.TR0=1;161.TR2=1;162.}163.void TransmittLow()164.{165.//ir=1;166.TR0=1;167.disTransmitt;168.TR2=0;169.IR38k=1;170.}171.void endTransmitt()172.{173.//ir=0;174.TR0=0;175.TR2=0;176.IR38k=1; //JIEZHI177.}178.void send_logic0(unsigned int s_cnt_1,unsigned int s_cnt_2) 179.{180.set_count=s_cnt_1;//181.TransmittPulse();182.count =0;184.while(count<set_count)185.;186.endTransmitt();187.〃ir=1;188.set_count=s_cnt_2;//11;〃189.//ir=1;190.count =0;191.TransmittLow();192.192.while(count<set_count)193.;194.endTransmitt();195.}196.void send_logic1(unsigned int s_cnt_1,unsigned int s_cnt_2) 197.{198.set_count=s_cnt_1;//199.TransmittPulse();201.200.count =0;203.201.while(count<set_count)202.;203.endTransmitt();204.//ir=1;205.//=========================206.set_count=s_cnt_2;//32;〃207.//ir=1;208.count =0;212.209.TransmittLow();214.210.while(count<set_count)endTransmitt();}void send_precode(unsigned int s_cnt_1,unsigned int s_cnt_2) {set_count =s_cnt_1;//180;〃 9MSTransmittPulse(); //start send pulsecount =0;while(count<set_count) {;} endTransmitt(); set_count =s_cnt_2;//90;//4.5MS count =0;TransmittLow();while(count<set_count){;}endTransmitt();}void send_final_code(){set_count=28;//count =0;TransmittPulse(); while(count<set_count) endTransmitt();}void send_8bit_code(uchar value)216. 217. 218. 219. 220. 221. 222. 223.224.225.226.227.228.229.230.231.232.233.234.235.236.237.238.239.240.241.242.243. 244. 245.uchar i,temp;temp=value;for(i=0;i<8;i++){if(temp&0x01) sendl_logic1(11,32); //1.68ms else send_logic0(11,11); //600UStemp=temp>>1;}}void send_4bit_code(uchar value){uchar i,temp;temp=value;for(i=0;i<4;i++){if(temp&0x01) sendd_logic1(11,32); //1.68mselse send_logic0(11,11); //600UStemp=temp>>1;}}//============================主函数======================== void main(){TimerInit();while(1){key_value=KeyScan();switch(key_value){case 1:ir_out1();delayms(200);break; //248. 249. 250. 251. 252. 253. 254. 255.256.257.258.259.260.261.262.263.264.265.266.267.268.269.270.271.272.273.274. 275. 276. 277. 开和关case 2:ir_out2();delayms(200);break; // 温度- case 3:ir_out3();delayms(200);break; // 温度 +. case 4:ir_out4();delayms(200);break; // 模式选择 case 5:ir_out5();delayms(200);break; // 转叶设置 case 6:ir_out6();delayms(200);break; 〃default:ir=1;break; }}}void timer0(void) interrupt 1 {TH0=0XfF; TL0=221; 〃50us count++; if(flag) TR2=1; 〃IR38k=0; else TR2=0;//IR38k=1; }unsigned char KeyScan() {/* -------- 第一列扫描 ------------------ */ if(key1==0) {delayms(20); if(key1==0) {return 1;280.281.282.283.284.285.286. 287. 288. 289. 290. 291. 292. 293. 294. 295. 296. 297.298. 299.300.301.302.303.304.305.306.307.308.309.312. while(!key1); 313. }314. if(key2==0) 315. {316. delayms(20); 317. if(key2==0) 318. {319. return 2; 320. }321. while(!key2); 322. }323.324. if(key3==0) 325. {326. delayms(20); 327. if(key3==0) 328. {329. return 3; 330. }331. while(!key3); 332. }333. if(key4==0) 334. {335. delayms(20); 336. if(key4==0) 337. {338. return 4; 339. }340. while(!key4); 341. }342. if(key5==0)344. delayms(20); 345. if(key5==0) 346. {347. return 5; 348. }349. while(!key5); 350. }351. if(key6==0) 352. {353. delayms(20); 354. if(key6==0) 355. {356. return 6; 357. }358. while(!key6); 359. }360. return 0 ; 361. }。

单片机红外线遥控器解码程序

单片机红外线遥控器解码程序

单片机红外线遥控器解码程序
红外线遥控是目前使用最广泛的一种通信和遥控手段。

由于红外线遥控装
置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外
线遥控。

现在工业设备中,也已经广泛在使用。

1 红外遥控系统
通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯
片来进行控制操作,如图1 所示。

发射部分包括键盘矩阵、编码调制、LED 红
外发送器;接收部分包括光、电转换放大器、解调、解码电路。

2 遥控发射器及其编码
遥控发射器专用芯片很多,根据编码格式可以分成脉冲宽度调制和脉冲相位
调制两大类,这里我们以运用比较广泛,解码比较容易的脉冲宽度调制来加以
说明,现以3310 组成发射电路为例说明编码原理。

当发射器按键按下后,即
有遥控码发出,所按的键不同遥控编码也不同。

这种遥控码具有以下特征:
采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms 的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms 的组合表示二进制的“1”
上述“0”和“1”组成的42 位二进制码经38kHz 的载频进行二次调制以提高发
射效率,达到降低电源功耗的目的。

然后再通过红外发射二极管产生红外线向
空间发射,
3310 产生的遥控编码是连续的42 位二进制码组,其中前26 位为用户识别码,能区别不同的红外遥控设备,防止不同机种遥控码互相干扰。

后16 位为8 位
的操作码和8 位的操作反码用于核对数据是否接收准确。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
KEY7_TX:LJMP TX_START
KEY7_RX:LJMP RX_START
KEY_8:MOV ADDRH,#2CH
MOV ADDRL,#00H
JB RXTX_SIGN,KEY8_RX
KEY8_TX:LJMP TX_START
KEY8_RX:LJMP RX_START
KEY_9:MOV ADDRH,#2EH
ISP_DATA DATA 0E2H ;ISP功能寄存器定义
ISP_ADDRH DATA 0E3H
ISP_ADDRL DATA 0E4H
ISP_CMD DATA 0E5H
ISP_TRIG DATA 0E6H
ISP_CONTR DATA 0E7H
ISP_CMD_NO EQU 0 ;操作数
ISP_CMD_READ EQU 1
MOVபைடு நூலகம்ADDRL,#00H
JB RXTX_SIGN,KEY9_RX
KEY9_TX:LJMP TX_START
KEY9_RX:LJMP RX_START
KEY_10:MOV ADDRH,#2EH
MOV ADDRL,#00H
JB RXTX_SIGN,KEY10_RX
KEY10_TX:LJMP TX_START
KEY2_RX:LJMP RX_START
KEY_3:MOV ADDRH,#22H
MOV ADDRL,#00H
JB RXTX_SIGN,KEY3_RX
KEY3_TX:LJMP TX_START
KEY3_RX:LJMP RX_START
KEY_4:MOV ADDRH,#24H
MOV ADDRL,#00H
JB RXTX_SIGN,KEY4_RX
KEY4_TX:LJMP TX_START
KEY4_RX:LJMP RX_START
KEY_5:MOV ADDRH,#26H
MOV ADDRL,#00H
JB RXTX_SIGN,KEY5_RX
KEY5_TX:LJMP TX_START
KEY5_RX:LJMP RX_START
MOV A,KEY_WORD
CJNE A,#00H,NEXT1
LJMP KEY_MAIN
NEXT1:JNB KEY_SIGN,KEY_MAIN
MOV KEY_VALUE,A
LCALL RE_DELAY ;消抖时间20ms
LCALL SCAN_KEY ;是否依然是按下的
MOV A,KEY_WORD
CJNE A,#00H,NEXT2
LJMP KEY_MAIN
NEXT2:JNB KEY_SIGN,KEY_MAIN
CJNE A,KEY_VALUE,KEY_MAIN
RELEASE:LCALL SCAN_KEY ;查看是否放开按键了
MOV A,KEY_WORD
CJNE A,#00H,RELEASE
MOV DPTR,#TAB ;执行相应的程式
单片机学习型遥控器程序详解(完整版)
STC89C52学习型遥控器,可存八个红外遥控信息,只要再把按键用定时器中断2完成就可以用于商业生产。
RXIN BIT P2.0
TXZAI BIT P2.2
TXOUT BIT P2.1
KEY_SIGN BIT 20H ;为0按键错误,为1按键正确
RXTX_SIGN BIT 21H ;为0是为发射状态,为1是为接收状态
KEY10_RX:LJMP RX_START
KEY_11:MOV ADDRH,#2EH
MOV ADDRL,#00H
JB RXTX_SIGN,KEY11_RX
KEY11_TX:LJMP TX_START
KEY11_RX:LJMP RX_START
KEY_12:MOV ADDRH,#2EH
MOV ADDRL,#00H
ISP_CMD_PROGRAM EQU 2
ISP_CMD_ERASE EQU 3
WAIT_TIME EQU 1 ;等待时间
ZHIL EQU 30H
ZHIH EQU 31H
GESHU EQU 32H
JISHU EQU 33H
KEY_WORD EQU 34H
KEY_VALUE EQU 35H
ADDRH EQU 36H
KEY_6:MOV ADDRH,#28H
MOV ADDRL,#00H
JB RXTX_SIGN,KEY6_RX
KEY6_TX:LJMP TX_START
KEY6_RX:LJMP RX_START
KEY_7:MOV ADDRH,#2AH
MOV ADDRL,#00H
JB RXTX_SIGN,KEY7_RX
CLR C
MOV A,KEY_VALUE
ADD A,KEY_VALUE
JMP @A+DPTR
TAB:AJMP KEY_0
AJMP KEY_1
AJMP KEY_2
AJMP KEY_3
AJMP KEY_4
AJMP KEY_5
AJMP KEY_6
AJMP KEY_7
AJMP KEY_8
AJMP KEY_9
T1TX:CLR RXTX_SIGN
MOV P1,#0FFH
LJMP KEY_MAIN
T1RX:SETB RXTX_SIGN
MOV P1,#00H
LJMP KEY_MAIN
KEY_2:MOV ADDRH,#20H
MOV ADDRL,#00H
JB RXTX_SIGN,KEY2_RX
KEY2_TX:LJMP TX_START
JB RXTX_SIGN,KEY12_RX
KEY12_TX:LJMP TX_START
KEY12_RX:LJMP RX_START
KEY_13:MOV ADDRH,#2EH
MOV ADDRL,#00H
JB RXTX_SIGN,KEY13_RX
AJMP KEY_10
AJMP KEY_11
AJMP KEY_12
AJMP KEY_13
AJMP KEY_14
AJMP KEY_15
AJMP KEY_16
KEY_0:LJMP KEY_MAIN ;无效的按健值
KEY_1:JNB RXTX_SIGN,T1RX ;接收发送键设定键,P1灯亮为接收存储状态,灯灭是为发射状态
ADDRL EQU 37H
TX_GESHU EQU 38H
ORG 0000H
LJMP START
ORG 000BH
LJMP T0IN
ORG 001BH
LJMP T1IN
ORG 0100H
START:MOV SP,#10H
CLR RXTX_SIGN
LJMP KEY_MAIN
KEY_MAIN:LCALL SCAN_KEY ;检测有没有单个按键按下
相关文档
最新文档