红外接收解码汇编
- 格式:doc
- 大小:53.50 KB
- 文档页数:7
红外编码解码程序,我写的是:发送模块通过按键,发送出相应键值的编码,接收模块接收到信号后解码该键值,并点亮相应的状态灯(新手,高手勿喷)//************************* 单片机红外发射******************************* #include<reg52.h> sbit ir=P 1人3;sbit k1= P2A5;sbit k2=P2M;sbit k3=P2A3;sbit k4=P2A2;sbit k5=Pil;unsigned int count, set_count; bit irflag,keyflag; unsigned char irsys[]={0x00,0xff}; unsigned char irdata,ircode;void delay(unsigned int a){unsigned char i;while(--a!=0) for(i=300;i>0;i--);}void keyscan(){/*if(k1==0){delay(10);if(k1==0){keyflag=1;while(!k1);irdata=0x01;}*/ if(k2==0) {delay(10); if(k2==0) {keyflag=1;while(!k2); irdata=0x02;}{delay(10); if(k3==0) {keyflag=1;while(!k3); irdata=0x03;} if(k4==0){delay(10); if(k4==0) {keyflag=1;while(!k4); irdata=0x04;} if(k5==0){delay(10); if(k5==0) {keyflag=1;while(!k5); irdata=0x05;void ir_sendbyte() // 红外发送一个字节数据{ unsigned char i; for(i=0;i<8;i++) //发送8 位数据{set_count=43; //发送编码中的0.56ms 高电平irflag=1;count=0;TR0=1; while(count<set_count);TR0=0;if(ircode&0x01) set_count=130; // 判断红外编码最低位,若为 1 则 1.69ms 的低电平else set_count=43; // 为0 则0.565ms 的低电平irflag=0;count=0;TR0=1; while(count<set_count);TR0=0; ircode=ircode>>1;}}void ir_send(){set_count=346; //发送编码中的引导码(4.5ms高电平+4.5ms低电平)irflag=1;count=0;TR0=1;while(count<set_count);set_cou nt=346; //发送编码中的 4.5ms低电平irflag=0;count=0;TR0=1;while(count<set_count);TR0=0; ircode=irsys[0];ir_sendbyte();ircode=irsys[1];ir_sendbyte();ircode=irdata; //发送8 位数据码ir_sendbyte();ircode=~irdata; // 发送8 位数据反码ir_sendbyte();set_count=43; //发送编码中的0.56ms高电平irflag=1;count=0;TR0=1;while(count<set_count);TR0=0;irflag=0;/*delay(23); //延时23ms (编码中的23ms低电平)set_count=346; //发送编码中的引导码(4.5ms高电平+4.5ms低电平) irflag=1;count=0;TR0=1; while(count<set_count);TR0=0; set_count=346; irflag=0;count=0;TR0=1;while(count<set_count);TR0=0;*/ set_count=43;irflag=1;count=0;TR0=1;while(count<set_count);TR0=0;irflag=0;delay(23);}void timer0_init(){EA=1;TMOD=0x02;//定时0 8 位自动重装模式ET0=1;TH0=0xe6; //定时13us,38K 红外矩形波,晶振24M TL0=0xe6; }void main(){timer0_init();count=0;ir=0;irflag=0;while(1){keyscan(); if(keyflag) {delay(10); ir_send(); delay(500); keyflag=0;delay(100);}}}void timer0() interrupt 1 {count++;if(irflag==1)ir=~ir; // 有发射标志,则发射38khz 的矩形波elseir=0;红外接收**************************** //*************************#include<reg52.h>#define uchar unsigned char #define uint unsigned intsbit led仁P2A1;sbit led2=卩2人2;sbit led3=卩2人3;uchar irtime;uchar startflag;uchar irdata[33];uchar bitnum;uchar irreceok;uchar ircode[4]; uchar irprosok;void display();void timer0init(){TMOD=0x02;TH0=0x00;TL0=0x00;ET0=1;EA=1;TR0=1;void int0init(){IT0=1;EX0=1; EA=1;}}void irpros(){uchar k,i,j;uchar value;k=1;for(j=0;j<4;j++){for(i=0;i<8;i++){ value=value>>1; if(irdata[k]>6){value=value | 0x80;}k++;if(k>33)k=1;}ircode[j]=value;}irprosok=1;}void main(){ timer0init(); int0init(); while(1) { if(irreceok) { irpros(); irreceok=0;} display();}void display()switch(ircode[2]){case 0x05:led1=1; led2=1; led3=1; break;case 0x02:led1=0;led2=1; led3=1; break;case 0x03:led2=0; led1=1; led3=1; break;case 0x04:led3=0;led1=1;led2=1; break;//case 0x01: 备用}void timer0 () interrupt 1 { irtime++;}void int0 () interrupt 0 {if(startflag){if(irtime>32) // 检测引导码{bitnum=0;}irdata[bitnum]=irtime;irtime=0;bitnum++;if(bitnum==33){bitnum=0;irreceok=1;startflag=0;}else{startflag=1; irtime=0;}}。
/ 亲,此程序以经过测试,可直接使用!!!/#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的前导低电平信号。
纯软件解码---汇编版利用程序判电平和时间进行解码,缺点是浪费系统软件资源;优点是对系统硬件要求稍低ORG0000HT0ZDBIT20H.2XHBITP3.3;红外接收头数据接口RSBITP2.3RWBITP2.4EBITP2.5BBBITP3.6ORG0000H;AJMPMAINORG000BH;T0中断入口LJMPT0ZDCXORG0100H;主程序首地址MAIN:LCALLCSHMOVDPTR,#TAB;总查表SETBEA;T0中断设定SETBET0MOVTMOD,#01HDDXH:;信号接收前准备SETBP2.0;关信号指示灯MOVP0,#0FFHCLRTR0;关T0中断CLRT0ZD;接收信号时间判断MOVR5,#4;延时计数MOVTH0,#00HMOVTL0,#00H;================解码主要过程===========关键============================================================ JBXH,$;等待电平变低,解码从这开始CLRP2.0;开信号指示灯,表示正在接收信号MOVP0,#8EHSETBTR0;开T0中断LCALLYS3MSJBXH,DDXH;干扰检测LCALLYS3MSJBXH,DDXH;干扰检测DD1:JBT0ZD,DDXH;是否超出接收允许时间JNBXH,DD1;等待电平变高LCALLYS3MSJNBXH,DDXH;干扰检测DD2:JBT0ZD,DDXH;是否超出接收允许时间JBXH,DD2;等待电平变低JSSJ:;信号确认,开始接收数据MOVR0,#30HZJ:;接收一个字节数据MOVR2,#8WEI:;位数据,分辩0和1JBT0ZD,DDXH;是否超出接收允许时间JNBXH,WEI;等待电平变高LCALLYS845MOVC,XH;取位数据RRCADD3:JBT0ZD,DDXH;是否超出接收允许时间JBXH,DD3;等待电平变低,为1的高电平提供过度DJNZR2,WEI;8位数据是否接收完MOV@R0,AINCR0CJNER0,#34H,ZJ;四字节数据是否接收完MOVA,33HCPLACJNEA,32H,DDXH;键值确认,解码MOVR4,A;==========这里已经取出键值,存在R4中================================================== MOVR7,#100;TSY:MOVR6,#255DJNZR6,$CPLBBDJNZR7,TSYMOVA,#0CDH;键值高位输出LCALLYJP_XZLMOVA,R4MOVB,#10HDIVABMOVCA,@A+DPTR LCALLYJP_XSJMOVA,#0CEH;键值低位输出LCALLYJP_XZLMOVA,BMOVCA,@A+DPTR LCALLYJP_XSJ; LCALLDYBF;调用灯控制子程序LJMPDDXH;返还等待下一次信号YS845:;延时845微秒MOVR7,#255DJNZR7,$MOVR7,#165DJNZR7,$RETYS3MS:;延时3msMOVR7,#8DDD:MOVR6,#255DJNZR6,$DJNZR7,DDDRETT0ZDCX:;T0中断程序MOVTL0,#00HMOVTH0,#00HDJNZR5,T0FHSETBT0ZDT0FH:RETI;===============以下是多余部分=========================================================================== DYBF:MOVA,#0C0H;用号码前高位输出LCALLYJP_XZLMOVA,30HMOVB,#10HDIVABMOVCA,@A+DPTRLCALLYJP_XSJMOVA,#0C1H;用户码前低位输出LCALLYJP_XZLMOVA,BMOVCA,@A+DPTRLCALLYJP_XSJMOVA,#0C4H;用户码后高位输出LCALLYJP_XZLMOVA,31HMOVB,#10HDIVABMOVCA,@A+DPTRLCALLYJP_XSJMOVA,#0C5H;用户码后低位输出LCALLYJP_XZLMOVA,BMOVCA,@A+DPTRLCALLYJP_XSJ;============此处专门针对我的开发板和遥控,不是解码的关键,只是一种应用举例MOVA,R4CJNEA,#0CH,BA1;是否1号键按下CPLP1.0;点亮1号灯BA1:CJNEA,#18H,BA2;是否2号键按下CPLP1.1;点亮1号灯BA2:CJNEA,#5EH,BA3;是否3号键按下CPLP1.2;点亮1号灯BA3:CJNEA,#08H,BA4;是否4号键按下CPLP1.3;点亮1号灯BA4:CJNEA,#1CH,BA5;是否5号键按下CPLP1.4;点亮1号灯BA5:CJNEA,#5AH,BA6;是否6号键按下CPLP1.5;点亮1号灯BA6:CJNEA,#42H,BA7;是否7号键按下CPLP1.6;点亮1号灯BA7:CJNEA,#52H,BAB;是否8号键按下CPLP1.7;点亮1号灯BAB:RETCSH:;=============液晶初始化===============MOVA,#00111000B;8位数据,双行显示,5-7字型LCALLYJP_XZL;调用写液晶指令MOVA,#00001100B;显示屏开启,光标出现在地址计数器位置,光标不闪烁LCALLYJP_XZL;调用写液晶指令MOVA,#00000110B;光标右移一格,AC值加一,字符全部不动LCALLYJP_XZL;调用写液晶指令MOVA,#81H;LCALLYJP_XZLMOVA,#4CH;L的ASCII码LCALLYJP_XSJMOVA,#83H;LCALLYJP_XZLMOVA,#47H;G的ASCII码LCALLYJP_XSJMOVA,#85H;LCALLYJP_XZLMOVA,#58H;X的ASCII码LCALLYJP_XSJMOVA,#88H;LCALLYJP_XZLMOVA,#5AH;Z的ASCII码LCALLYJP_XSJMOVA,#89H;LCALLYJP_XZLLCALLYJP_XSJMOVA,#8AH; LCALLYJP_XZLMOVA,#69H;i的ASCII码LCALLYJP_XSJMOVA,#8CH; LCALLYJP_XZLMOVA,#5AH;Z的ASCII码LCALLYJP_XSJMOVA,#8DH; LCALLYJP_XZLMOVA,#61H;a的ASCII码LCALLYJP_XSJMOVA,#8EH; LCALLYJP_XZLMOVA,#6FH;o的ASCII码LCALLYJP_XSJMOVA,#0C2H; LCALLYJP_XZLMOVA,#48H;H的ASCII码LCALLYJP_XSJMOVA,#0C6H; LCALLYJP_XZLMOVA,#48H;H的ASCII码LCALLYJP_XSJMOVA,#0CAH; LCALLYJP_XZLLCALLYJP_XSJMOVA,#0CBH;LCALLYJP_XZLMOVA,#5AH;Z的ASCII码LCALLYJP_XSJMOVA,#0CCH;LCALLYJP_XZLMOVA,#3AH;:的ASCII码LCALLYJP_XSJMOVA,#0CFH;LCALLYJP_XZLMOVA,#48H;H的ASCII码LCALLYJP_XSJRET;=========写指令到液晶============= YJP_XZL:LCALLCHECK_BUSY;查询忙碌状态CLRECLRRSCLRRWSETBEMOVP0,A;写指令CLRERET;==========写数据到液晶============== YJP_XSJ:LCALLCHECK_BUSY;查询忙碌状态CLRESETBRSCLRRWSETBEMOVP0,A;写数据CLRERET;=========查询忙碌标志============CHECK_BUSY:PUSHACCBUSY_LOOP:CLRESETBRWCLRRSSETBEMOVA,P0;读取状态JBp0.7,BUSY_LOOPPOPACCLCALLDELRETDEL:MOVR6,#5L1:MOVR7,#248DJNZR7,$DJNZR6,L1RETTAB:DB30H,31H,32H,33H,34H,35H,36H,37H,38H,39H DB41H,42H,43H,44H,45H,46HEND中断加定时器---C语言版优点:完全是状态解码,极少的占用系统软件资源(CPU),随时都可以解码,而不管系统此时运行到何处。
红外遥控软件编解码简析摘要:介绍如何用SONIX单片机实现红外编解码,并讨论SONIX系列芯片在实现红外遥控中的优势所在。
文中给出红外发射和接收硬件原理图,并给出相应程序。
关键词:Buzzer输出,外部电平变化中断引言:红外线遥控是目前应用最广泛的一种通信和遥控手段。
由于红外线遥控器具有体积小、功耗低、功能强、成本低等特点。
因此在家电产品中有着广泛的应用。
相比与专用的控制芯片,微控制器具有开发灵活的特点,用户可以随意制定编解码格式。
SONIX 8bit MCU中的1、1K的ROM,48bit的RAM完全可以用来开发普通的红外遥控产品,4K的ROM,128bit的RAM可用做高端复杂的红外遥控产品。
2、Buzzer输出功能可以方便的实现38K载波,1/2个计时计数器,上升下降沿可选的外部中断便于灵活接收和解码。
3、5V/4MHz条件下,正常工作电流2~3mA,睡眠电流小于1uA,便于电池供电系统。
一、红外编码格式说明用户采用红外模块时,编码格式非常灵活。
目前市场上的红外编码格式非常多,每家公司都可以自己定义一种编解码格式。
下面以一种比较常用的格式来做分析说明(示意图中高电平代表38K载波输出):上面的波形格式包括前导码(Load Code)、身份码和身份反码(ID Code)、数据码和数据反码(Data Code)。
导航码(Load Code):导航码用来通知接受器其后为遥控数据,解码部分在接受到这个信号后就可以开始解码。
系统码(ID Code):系统码用来区分是哪一机型的数据,接收端依此来判断后续的数据是否为须执行的指令。
数据码(Data code):数据码用来区分是哪一个键被按下,接收端根据数据码做出应该执行什么动作的判断。
数据帧间的空闲时间:有用信号中两帧数据间的空闲时间。
红外遥控数据传输系统中的关键是数据传输的可靠性。
因此有些公司也会在系统码和数据码后面分别再传送一个同样的码或反码,供误码校验用。
红外遥控解码程序红外接收头的型号有很多HS0038 VS838等功能⼤致相同,只是引脚封装不同。
红外接收有⼏种统⼀的编码⽅式,采样哪种编码⽅式取决于遥控器使⽤的芯⽚,接收头收到的都是⼀样的。
电视遥控器使⽤的是专⽤集成发射芯⽚来实现遥控码的发射,如东芝TC9012,飞利浦AA3010T等,通常彩电遥控信号的发射,就是将某个按键所对应的控制指令和系统码(由0和1组成的序列),调制在38KHz的载波上,然后经放⼤、驱动红外发射管将信号发射出去。
不同公司的遥控芯⽚,采样的遥控码格式也不⼀样,较普遍的有两种,⼀种NEC标准,⼀种是PHILIPS标准。
NEC标准:遥控载波的频率为38KHz(占空⽐1:3)当某个键按下时,系统⾸先发射⼀个完整的全码,如果按键超过108ms仍未松开,接下来发射的代码(连发代码)将由起始码(9ms)和结束码(2.5ms)组成。
⼀个完整的全码 = 引导码 +⽤户码 +⽤户码 + 数据码 + 数据码 + 数据反码。
其中,引导码⾼电平9ms,低电平4.5ms;系统码8位,数据码8位,共32位;其中前16位为⽤户识别码,能区别不同的红外遥控设备,以防⽌不同的机种遥控码互相⼲扰。
后16位为8位的操作码和8位的操作反码,⽤于核对数据是否接收准确。
收端根据数据码做出应该执⾏上⾯动作的判断。
连发代码是在持续按键时发送的码。
它告知接收端。
某键是在被连续的按着。
NEC标准下的发射码表⽰发射数据0时⽤”0.56ms⾼电平 + 0.565ms低电平 = 1.125ms”表⽰;数据1⽤”⾼电平0.56ms + 1.69ms = 2.25ms”表⽰。
遥控器发射信号:需要注意的是:当⼀体化接收头收到38kHz红外信号时,输出端输出低电平,否则为⾼电平。
所以⼀体化接收头输出的波形和发射波形是反向的PHILIPS标准:载波频率38KHz:没有筒,点按键时,控制码1和0之间切换,若持续按键,则控制码不变。
⼀个全码 = 起始码’11’ +控制码 + ⽤户码 + ⽤户码数据0⽤“低电平1.778ms + ⾼电平1.778ms”表⽰;数据1⽤“⾼电平1.778ms + 低电平1.778ms”表⽰。
精心整理纯软件解码---汇编版利用程序判电平和时间进行解码,缺点是浪费系统软件资源;优点是对系统硬件要求稍低ORG0000HT0ZDBIT20H.2XHBITP3.3;红外接收头数据接口RSBITP2.3RWBITP2.4============================================================JBXH,$;等待电平变低,解码从这开始CLRP2.0;开信号指示灯,表示正在接收信号MOVP0,#8EHSETBTR0;开T0中断LCALLYS3MSJBXH,DDXH;干扰检测LCALLYS3MSJBXH,DDXH;干扰检测DD1:JBT0ZD,DDXH;是否超出接收允许时间JNBXH,DD1;等待电平变高LCALLYS3MSJNBXH,DDXH;干扰检测DD2:JBT0ZD,DDXH;是否超出接收允许时间JBXH,DD2;等待电平变低JSSJ:;信号确认,开始接收数据ZJ:;MOVR7,#100;TSY:MOVR6,#255DJNZR6,$CPLBBDJNZR7,TSYMOVA,#0CDH;键值高位输出LCALLYJP_XZLMOVA,R4MOVB,#10HDIVABMOVCA,@A+DPTRLCALLYJP_XSJMOVA,#0CEH;键值低位输出LCALLYJP_XZLMOVA,BMOVCA,@A+DPTR LCALLYJP_XSJ; LCALLDYBF;调用灯控制子程序LJMPDDXH;返还等待下一次信号YS845:;延时845微秒MOVR7,#255RETRETDIVABMOVCA,@A+DPTR LCALLYJP_XSJMOVA,#0C1H;用户码前低位输出LCALLYJP_XZLMOVA,BMOVCA,@A+DPTR LCALLYJP_XSJMOVA,#0C4H;用户码后高位输出LCALLYJP_XZLMOVA,31HMOVB,#10HDIVABMOVCA,@A+DPTRLCALLYJP_XSJMOVA,#0C5H;用户码后低位输出LCALLYJP_XZLMOVA,BMOVCA,@A+DPTRLCALLYJP_XSJ;============此处专门针对我的开发板和遥控,不是解码的关键,只是一种应用举例BA7:CJNEA,#52H,BAB;是否8号键按下CPLP1.7;点亮1号灯BAB:RETCSH:;=============液晶初始化===============MOVA,#00111000B;8位数据,双行显示,5-7字型LCALLYJP_XZL;调用写液晶指令MOVA,#00001100B;显示屏开启,光标出现在地址计数器位置,光标不闪烁LCALLYJP_XZL;调用写液晶指令MOVA,#00000110B;光标右移一格,AC值加一,字符全部不动LCALLYJP_XZL;调用写液晶指令MOVA,#81H;LCALLYJP_XZLMOVA,#4CH;L的ASCII码LCALLYJP_XSJMOVA,#83H;LCALLYJP_XZLLCALLYJP_XZLMOVA,#61H;a的ASCII码LCALLYJP_XSJMOVA,#8EH;LCALLYJP_XZLMOVA,#6FH;o的ASCII码LCALLYJP_XSJMOVA,#0C2H;LCALLYJP_XZLMOVA,#48H;H的ASCII码LCALLYJP_XSJMOVA,#0C6H;LCALLYJP_XZLMOVA,#48H;H的ASCII码LCALLYJP_XSJMOVA,#0CAH;LCALLYJP_XZLMOVA,#4AH;J的ASCII码LCALLYJP_XSJMOVA,#0CBH;LCALLYJP_XZLMOVA,#5AH;Z的ASCII码RETRETCLRESETBRSCLRRWSETBEMOVP0,A;写数据CLRERET;=========查询忙碌标志============ CHECK_BUSY:PUSHACCBUSY_LOOP:CLRESETBRWCLRRSSETBEMOVA,P0;读取状态JBp0.7,BUSY_LOOPPOPACCLCALLDELRETDEL:MOVR6,#5RET/////////#definezd_cffsIT0///中断触发方式设置#definezd_dkEX0///中断打开设置////#definestc_dsqszAUXR&=0x7F;//定时器时钟12T模式,不需要可在AUXR....前加// ///**************************************************/****************************************************************** *****本程序使用外部中断加定时器来实现红外解码,占用系统软件资******** *****源极少,硬件方面占用了一个外部中断,定时器中断还可以进行******** *****一些简单的运用,软件部分可以做很多的动作,就看你发挥了!**************************************************************************/ #defineshi_jian定时器设置,请勿更改unsignedcharhwyhmh,hwyhml,hwjz,hwsj,hwjmws;///全局变量bithwjmok,yxjm;///全局变量,红外解码OK,允许解码voidmain(void){EA=1;//总中断打开zd_cffs=1;//外部中断_边沿触发方式zd_dk=1;//外部中断_打开ET0=1;//while(1)}}}定时器0{hwjz=0;TR0=0;//}voidZDhwjsCX(void)zd_rkdzusing3{unsignedinta=TH0*256+TL0;TL0=0;TH0=0;TR0=1;///开启T0if(a>shi_jian_*13000&&a<shi_jian_*14000)///if1分支2.判引导码13-14ms {hwsj=0;hwjmws=32;yxjm=1;}elseif(yxjm)///if1分支1.已收到引导码,允许解码{if(a>shi_jian_*11000&&a<shi_jian_*12000&&hwjmws==0)///if2分支1。
单片机红外接受解码程序成功版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) //判断是不是引导码。
;遥控器控制显示123456789数据保持;*************************************************************************** ;* gehuiwy@ Create by :葛辉*;*************************************************************************** REC_DATA EQU 20H ;数码管段选的数据存放在片内RAM 20H单元REC_DATA1 EQU 21H ;数码管段选的数据存放在片内RAM 21H单元ORG 0000HSJMP MAINORG 0003H ;外部中断0引脚链接红外接收头输出LJMP INT0_SERVICEORG 0030HMAIN:MOV IE,#10000001B ;外部中断使能,全局中断使能MOV REC_DATA,#00000000B ;数码管灭MOV REC_DATA,#7EH ;数码管亮MOV REC_DATA1,#7EH ;数码管亮MOV P1,#11111110B ;选中左边的数码管MOV P3,#0FFHLOOP:LCALL DISPLAY;MOV REC_DATA,#0FFH ;数码管亮;MOV P2,REC_DATA ;段选送P2,P2链接数码管驱动244的输入SJMP LOOP ;循环显示INT0_SERVICE: ;中断0服务程序SETB P1.0SETB P1.1MOV R4,#8 ;8毫秒为高电平错误SBA:MOV R5,#250SBB:JB P3.2,SXB1DJNZ R5,SBBDJNZ R4,SBAMOV R4,#2JMP SBCSXB1:MOV R5,#5SXB2: ;去掉20US的尖峰干扰信号JNB P3.2,SBBDJNZ R5,SXB2JMP EXITSBC:MOV R5,#250SB1:JB P3.2,SB2 ;2MS内不为高电平错误(监测9MS的低电平引导码)DJNZ R5,SB1DJNZ R4,SBCJMP EXITSB2: ;去掉20US的尖峰干扰信号MOV R5,#5SB2_A:JNB P3.2,SB1DJNZ R5,SB2_AMOV R4,#3SB2_1:MOV R5,#250SB3: ;监测4.5MS高电平,如3MS内出现低电平错误JNB P3.2,SXCDJNZ R5,SB3DJNZ R4,SB2_1MOV R4,#2JMP SB3_1SXC: ;去掉20US的尖峰干扰信号MOV R5,#5SXC1:JB P3.2,SB3DJNZ R5,SXC1JMP EXITSB3_1: ;监测4.5MS高电平,如5MS内不为低电平错误MOV R5,#250SB3_2:JNB P3.2,SB4DJNZ R5,SB3_2DJNZ R4,SB3_1JMP EXITSB4: ;去掉20US的尖峰干扰信号MOV R5,#5SB4_1:JB P3.2,SB3_2DJNZ R5,SB4_1MOV R1,#1AH ;设定1AH为起始RAM区MOV R2,#4PP: MOV R3,#8JJJJ:MOV R5,#250JJJJ2: ;1MS内不为低电平错误JB P3.2,JJJJ3DJNZ R5,JJJJ2JMP EXITJJJJ3:LCALL YS1 ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态MOV C,P3.2 ;将P3.2引脚此时的电平状态0或1存入C中JNC UUU ;如果为0就跳转到UUUMOV R5,#250JJJJ4:JNB P3.2,UUUNOPDJNZ R5,JJJJ4JMP EXITUUU: M OV 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,1AH ;比较高8位地址码XRL A,#00000000B ;判断1AH的值是否等于00000000,相等的话A为0JNZ EXIT ;如果不相等说明解码失败退出解码程序MOV A,1BH ;比较低8位地址XRL A,#11111111B ;再判断高8位地址是否正确JNZ EXIT ;如果不相等说明解码失败退出解码程序LCALL YS3MOV A,1CH ;比较数据码和数据反码是否正确?CPL AXRL A,1DH ;将1CH的值取反后和1DH比较不同则无效丢弃,核对数据是否准确JNZ EXIT ;如果不相等说明解码失败退出解码程序LCALL YS3AJMP BIJIAO;判断在118毫秒内是否有连发码AA: MOV R1,#25XX: ACALL YS2JNB P3.2,HH ;跳转到判断连发代码是否正确的程序段DJNZ R1,XXEXIT:RETI ;退出中断服务程序;连发码判断程序段-----------HH: MOV R6,#4S: ACALL YS1 ;调用882微秒延时子程序JB P3.2,EXIT ;延时882微秒后判断P3.2脚是否出现高电平如果有就退出解码程序DJNZ R6, S ;重复4次,目的是确认连发码的低电平信号波形JNB P3.2, $ ;等待高电?LCALL YS3AJMP AABIJIAO: MOV A,1CH ;按键数值判断执CJNE A,#5Fh,TT1 ;判断接收到的是不是1MOV REC_DATA,#00011000B ;数码管显示1MOV REC_DATA1,#01111110BAJMP AATT1:CJNE A,#50h,TT2 ;判断接收到的是不是2MOV REC_DATA,#01101101B ;数码管显示2MOV REC_DATA1,#01111110BAJMP AATT2:CJNE A,#5Dh,TT3 ;判断接收到的是不是3MOV REC_DATA,#00111101B ;数码管显示3MOV REC_DATA1,#01111110BAJMP AATT3:CJNE A,#44h,TT4 ;判断接收到的是不是4MOV REC_DATA,#00011011B ;数码管显示4MOV REC_DATA1,#01111110BAJMP AATT4:CJNE A,#41h,TT5 ;判断接收到的是不是5MOV REC_DATA,#00110111B ;数码管显示5MOV REC_DATA1,#01111110BAJMP AATT5:CJNE A,#0Ah,TT6 ;判断接收到的是不是6MOV REC_DATA,#01110111B ;数码管显示6MOV REC_DATA1,#01111110BAJMP AATT6:CJNE A,#42h,TT7 ;判断接收到的是不是7MOV REC_DATA,#00011100B ;数码管显示7MOV REC_DATA1,#01111110BAJMP AATT7:CJNE A,#46h,TT8 ;判断接收到的是不是8 MOV REC_DATA,#01111111B ;数码管显示8MOV REC_DATA1,#01111110BAJMP AATT8:CJNE A,#47h,TT9 ;判断接收到的是不是9 MOV REC_DATA,#00111111B ;数码管显示9MOV REC_DATA1,#01111110BAJMP AATT9: CJNE A,#49h,TT10MOV REC_DATA,#7EHMOV REC_DATA1,#18HAJMP AATT10: CJNE A,#05h,TT11MOV REC_DATA,#18HMOV REC_DATA1,#18HAJMP AATT11: CJNE A,#06h,TT12MOV REC_DATA,#6DHMOV REC_DATA1,#18HAJMP AATT12:CJNE A,#07h,TT13MOV REC_DATA,#3DHMOV REC_DATA1,#18HAJMP AATT13:CJNE A,#09h,TT14MOV REC_DATA,#1BHMOV REC_DATA1,#18HAJMP AATT14:CJNE A,#45h,TT15MOV REC_DATA,#37HMOV REC_DATA1,#18HAJMP AATT15:CJNE A,#03h,TT16MOV REC_DATA,#77HMOV REC_DATA1,#18HAJMP AATT16:CJNE A,#5Ch,TT17MOV REC_DATA,#1CHMOV REC_DATA1,#18HTT17:CJNE A,#1Eh,TT18 MOV REC_DATA,#7FHMOV REC_DATA1,#18HAJMP AATT18:CJNE A,#5Eh,TT19 MOV REC_DATA,#3FHMOV REC_DATA1,#18HAJMP AATT19:CJNE A,#02h,TT20 MOV REC_DATA,#7EHMOV REC_DATA1,#6DHAJMP AATT20:CJNE A,#58h,TT21 MOV REC_DATA,#18HMOV REC_DATA1,#6DHAJMP AATT21:CJNE A,#1Ah,TT22 MOV REC_DATA,#6DHMOV REC_DATA1,#6DHAJMP AATT22:CJNE A,#5Bh,TT23 MOV REC_DATA,#3DHMOV REC_DATA1,#6DHAJMP AATT23:CJNE A,#01h,TT24 MOV REC_DATA,#1BHMOV REC_DATA1,#6DHAJMP AATT24:CJNE A,#1Bh,TT25 MOV REC_DATA,#37HMOV REC_DATA1,#6DHAJMP AATT25:CJNE A,#59h,TT26 MOV REC_DATA,#77HMOV REC_DATA1,#6DHAJMP AATT26:CJNE A,#5Ah,TT27 MOV REC_DATA,#1CHMOV REC_DATA1,#6DHAJMP AATT27:CJNE A,#18h,TT28 MOV REC_DATA,#7FHMOV REC_DATA1,#6DHTT28:YS1:MOV R4,#20 ;延时子程序1,精确延时882微秒D1: MOV R5,#20DJNZ R5,$DJNZ R4,D1RETDISPLAY:SETB P1.1CLR P1.0MOV P2,REC_DATA ;段选送P2,P2链接数码管驱动244的输入LCALL YS1SETB P1.0CLR P1.1MOV P2,REC_DATA1 ;段选送P2,P2链接数码管驱动244的输入LCALL YS1RETYS2:MOV R4,#10 ;延时子程序2,精确延时4740微秒D2: MOV R5,#235DJNZ R5,$DJNZ R4,D2RETYS3: M OV R4,#2 ;延时程序3,精确延时1000微秒D3:MOV R5,#248DJNZ R5,$DJNZ R4,D3RETEND。