




免费预览已结束,剩余45页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
源动力电子网 单片机 红外线遥控器解码程序2005-1-14 19:29 sina3228红外线遥控器解码程序以红外线遥控编码芯片LC7461等芯片为例来说明用单片机实现红外遥控解码的详细过程,站长琢磨这个解码程序花了相当多的精力,后来还用它开发了几个小产品,希望能对网友学习单片机有所帮助。 1 红外遥控系统2 遥控发射器及其编码遥控发射器专用芯片很多,根据编码格式可以分成脉冲宽度调制和脉冲相位调制两大类,这里我们以运用比较广泛,解码比较容易的脉冲宽度调制来加以说明,现以LC7461组成发射电路为例说明编码原理。这种遥控码具有以下特征:采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”上述“0”和“1”组成的42位二进制码经38kHz的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。然后再通过红外发射二极管产生红外线向空间发射,7461产生的遥控编码是连续的42位二进制码组,其中前26位为用户识别码,能区别不同的红外遥控设备,防止不同机种遥控码互相干扰。后16位为8位的操作码和8位的操作反码用于核对数据是否接收准确。当遥控器上任意一个按键按下超过36ms时,LC7461芯片的振荡器使芯片激活,将发射一个特定的同步码头,对于接收端而言就是一个9ms的低电平,和一个4.5ms的高电平,这个同步码头可以使程序知道从这个同步码头以后可以开始接收数据。解码的关键是如何识别“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左右即可。LT0038是塑封一体化红外线接收器,它是一种集红外线接收、放大、整形于一体的集成电路,不需要任何外接元件,就能完成从红外线接收到输出与TTL电平信号兼容的所有工作,没有红外遥控信号时为高电平,收到红外信号时为低电平,而体积和普通的塑封三极管大小一样,它适合于各种红外线遥控和红外线数据传输。 下面是一个对51实验板配套的红外线遥控器的解码程序,它可以把上图32键的红外遥控器每一个按键的键值读出来,并且通过实验板上P1口的8个LED显示出来,在解码成功的同时并且能发出“嘀嘀嘀”的提示音。ORG 0000H AJMP MAIN;转入主程序ORG 0003H ;外部中断P3.2脚INT0入口地址 AJMP INT ;转入外部中断服务子程序(解码程序)MAIN:;以下为主程序进行CPU中断方式设置SETB EA ;打开CPU总中断请求SETB IT0 ;设定INT0的触发方式为脉冲负边沿触发SETB EX0 ;打开INT0中断请求;以下对单片机的所有引脚进行初始化,全部设置成高电平MOV P2,#11100111BAJMP $;以下为进入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 R7,#26;忽略前26位系统识别码 JJJJA:JNB P3.2,$;等待地址码第一位的高电平信号LCALL YS1;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态MOV C,P3.2;将P3.2引脚此时的电平状态0或1存入C中JNC UUUA;如果为0就跳转到UUUALCALL YS3;检测到高电平1的话延时1毫秒等待脉冲高电平结束UUUA: DJNZ R7,JJJJAMOV R1,#1AH ;设定1AH为起始RAM区MOV R2,#2;接收从1AH到1BH的2个内存,用于存放操作码和操作反码 PP: MOV R3,#8;每组数据为8位 JJJJ: JNB P3.2,$;等待地址码第一位的高电平信号LCALL YS1;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态MOV C,P3.2;将P3.2引脚此时的电平状态0或1存入C中JNC UUU;如果为0就跳转到UUULCALL YS3;检测到高电平1的话延时1毫秒等待脉冲高电平结束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 ;接收完8位数据码和8位数据反码,存放在1AH/1BH中MOV A,1AHCPL A;对1AH取反后和1BH比较CJNE A,1BH,EXIT;如果不等表示接收数据发生错误,放弃MOV P1,1AH;将按键的键值通过P1口的8个LED显示出来!CLR P2.5;蜂鸣器鸣响嘀嘀嘀的声音,表示解码成功LCALL YS2LCALL YS2LCALL YS2SETB P2.5;蜂鸣器停止EXIT: SETB EA ;允许中断RETI ;退出解码子程序YS1: MOV R4,#20 ;延时子程序1,精确延时882微秒D1: MOV R5,#20DJNZ R5,$DJNZ R4,D1 RETYS2: MOV R4,#10 ;延时子程序2,精确延时4740微秒D2: MOV R5,#235DJNZ R5,$DJNZ R4,D2 RETYS3: MOV R4,#2;延时程序3,精确延时1000微秒D3:MOV R5,#248DJNZ R5,$DJNZ R4,D3RETEND0A 01 11 12 13 14 15 16 17 18 19 10 1A 1B 0E 02 03 1C 06 04 05 0C 0D 08 09 1D 00 1F 1E 0B 07 0F 这是按照红外遥控器按键的实际位置给出的32个按键的键值(16进制)2005-1-14 19:37 sina3228ORG 0000H AJMP MAINORG 0003H ;外部中断INT0入口地址 AJMP INT ;转中断服务子程序MAIN: MOV SP,#40H MOV P1,#00HSETB EA ;开CPU中断SETB IT0 ;设定INT0触发方式SETB EX0 ;INT0请求中断DSP: MOV R2,#9 ;将遥控器键值转化成A(09)MOV DPTR,#TAB1VV: MOV A,R2MOVC A,A+DPTRXRL A,1CHJZ ABCDJNZ R2,VVABC: MOV A,R2MOV DPTR,#TAB ;将A的值通过数码管显示出来 MOVC A,A+DPTR RX1: MOV P1,A CLR P0.1 AJMP DSPINT: CLR EA MOV R6,#10SB: ACALL YS1JB P3.2,EXITDJNZ R6, SBJNB P3.2, $ ;等待高电平避开9毫秒低电平引导脉冲ACALL YS2 ;延时4。74毫秒判断是否连发JB P3.2,EXITCPL P0.0MOV R1,#1AH ;将32位代码分别放在1AH/1BH/1CH/1DH中MOV R2,#4 PP: MOV R3,#8JJJJ: JNB P3.2,$LCALL YS1MOV C,P3.2JNC UUUJB P3.2,$UUU: MOV A,R1RRC AMOV R1,ADJNZ R3,JJJJINC R1DJNZ R2,PP MOV P2,1CHMOV A,1AH ;进行代码识别 XRL A,#0 ;判断1AH的值是否等于00000000JNZ EXI ;如果不同则无效将1CH清零CLR P0.1 MOV A,1BHXRL A,#11110111B ;再判断高8位地址是否正确JNZ EXIMOV A,1CHCPL AXRL A,1DH ;将1CH的值取反后和1DH比较 不同则无效丢弃核对数据是否准确JNZ EXI AJMP EXITEXI: MOV 1CH,#0EXIT: SETB EA ;允许中断RETI YS1: MOV R4,#20 ;精确延时882微秒D1: MOV R5,#20DJNZ R5,$DJNZ R4,D1 RETYS2: MOV R4,#10 ;精确延时4740微秒D2: MOV R5,#235DJNZ R5,$DJNZ R4,D2 RETTAB: DB 60H,7DH,0D0H,58H,4DH DB 4AH,42H,7CH,40H,48HTAB1:DB 0CH,09H,1DH,1FH,0DH DB 19H,1BH,11H,15H,17HEND;TAB LED数码管显示表 TAB1遥控器键值表这里我们以红外线遥控编码芯片为uPD6121G(或者是 HT622、7461等芯片)为例来说明用单片机实现红外遥控解码的详细过程采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”,其波形如图2所示。UPD6121G产生的遥控编码是连续的32位二进制码组,其中前16位为用户识别码,能区别不同的电器设备,防止不同机种遥控码互相干扰。该芯片的用户识别码固定为十六进制01H;后16位为8位操作码(功能码)及其反码。UPD6121G最多额128种不同组合的编码。遥控器在按键按下后,周期性地发出同一种32位二进制码,周期约为108ms。一组码本身的持续时间随它包含的二进制“0”和“1”的个数不同而不同,大约在4563ms之间,图4为发射波形图。当一个键按下超过36ms,振荡器使芯片激活,将发射一组108ms的编码脉冲,这108ms发射代码由一个起始码(9ms),一个结果码(4.5ms),低8位地址码(9ms18ms),高8位地址码(9ms18ms),8位数据码(9ms18ms)和这8位数据的反码(9ms18ms)组成。如果键按下超过108ms仍未松开,接下来发射的代码(连发代码)将仅由起始码(9ms)和结束码(2.5ms)组成。代码宽度算法:16位地址码的最短宽度:1.1216=18ms 16位地址码的最长宽度:2.24ms16=36ms 易知8位数据代码及其8位反代码的宽度和不变:(1.12ms+2.24ms)8=27ms32位代码的宽度为(18ms+27ms)(36ms+27ms)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左右均可。2 根据码的格式,应该等待9ms的起始码和4.5ms的结果码完成后才能读码。接收器及解码下面是一个对51实验板配套的红外线遥控器的解码程序,它可以把上图32键的红外遥控器每一个按键的键值读出来,并且通过实验板上P1口的8个LED显示出来,在解码成功的同时并且能发出“嘀嘀嘀”的提示音。这是站长最新用单片机AT89C51制作的30路红外遥控器,遥控器就是自家的VCD遥控器,接收板用了5片CD4069作为输出缓冲隔离,当按下遥控器30个按键中的一个,接收板对应的一个触点会变成高电平,松开按键,立即恢复成低电平,和TTL兼容。2005-1-14 19:45 sina3228红外遥控器软件解码原理及程序 红外一开始发送一段13.5ms的引导码,引导码由9ms的高电平和4.5ms的低电平组成,跟着引导码是系统码,系统反码,按键码,按键反码,如果按着键不放,则遥控器则发送一段重复码,重复码由9ms的高电平,2.25ms的低电平,跟着是一个短脉冲,本程序经过试用,能解大部分遥控器的编码!#include at89x52.h#define NULL 0x00/数据无效#define RESET 0X01/程序复位#define REQUEST 0X02/请求信号#define ACK 0x03/应答信号,在接收数据后发送ACK信号表示数据接收正确,也位请求信号的应答信号#define NACK 0x04/应答信号,表示接收数据错误#define BUSY 0x05/忙信号,表示正在忙#define FREE 0x06/空闲信号,表示处于空闲状态#define READ_IR 0x0b/读取红外#define STORE_IR 0x0c/保存数据#define READ_KEY 0x0d/读取键值#define RECEIVE 0Xf400/接收缓冲开始地址#define SEND 0xfa00/发送缓冲开始地址#define IR 0x50/红外接收缓冲开始地址#define HEAD 0xaa/数据帧头#define TAIL 0x55/数据帧尾#define SDA P1_7#define SCL P1_6unsigned char xdata *buf1; /接受数据缓冲unsigned int buf1_length; /接收到的数据实际长度unsigned char xdata *buf2; /发送数据缓冲unsigned int buf2_length; /要发送的数据实际长度bit buf1_flag; /接收标志,1表示接受到一个数据帧,0表示没有接受到数据帧或数据帧为空bit buf2_flag; /发送标志,1表示需要发送或没发送完毕,0表示没有要发送的数据或发送完毕unsigned char state1,state2; /用来标志接收字符的状态,state1用来表示接收状态,state2用来表示发送状态unsigned char data *ir;unionunsigned char a2;unsigned int b;unsigned char data *p12;unsigned int data *p22;unsigned char xdata *p3; /红外缓冲的指针unsigned int xdata *p4;p;/union / unsigned char a2; / unsigned int b;/ unsigned char data *p12;/ unsigned int data *p22;/ unsigned char xdata *p3;/ unsigned int xdata *p4; /地址指针/q; /unionunsigned char a2;unsigned int b;count;unionunsigned char a2;unsigned int b;temp;unionunsigned char a4;unsigned int b2;unsigned long c;ir_code;unionunsigned char a4;unsigned int b2;unsigned long c;unsigned char data *p14;unsigned int data *p24;unsigned char xdata *p32;unsigned int xdata *p42;i;unsigned char ir_key;bit ir_flag; /红外接收标志,0为缓冲区空,1为接收成功,2为缓冲溢出void sub(void);void delay(void);void ie_0(void);void tf_0(void);void ie_1(void);void tf_1(void);void tf_2(void);void read_ir(void);void ir_jiema(void);void ir_init(void);void ir_exit(void);void store_ir(void);void read_key(void);void reset_iic(void);unsigned char read_byte_ack_iic(void);unsigned char read_byte_nack_iic(void);bit write_byte_iic(unsigned char a);void send_ack_iic(void);void send_nack_iic(void);bit receive_ack_iic(void);void start_iic(void);void stop_iic(void);void write_key_data(unsigned char a);unsigned int read_key_data(unsigned char a);void ie0(void) interrupt 0ie_0();void tf0(void) interrupt 1tf_0();void ie1(void) interrupt 2ie_1();void tf1(void) interrupt 3tf_1();tf_2();void tf2(void) interrupt 5 /采用中断方式跟查询方式相结合的办法解码EA=0; /禁止中断if(TF2) /判断是否是溢出还是电平变化产生的中断TF2=0; /如果是溢出产生的中断则清除溢出位,重新开放中断退出EA=1;goto end;EXF2=0; /清除电平变化产生的中断位*ir=RCAP2H; /把捕捉的数保存起来ir+;*ir=RCAP2L;*ir+;F0=1;TR0=1; /开启计数器0loop:TL0=0; /将计数器0重新置为零TH0=0;while(!EXF2) /查询等待EXF2变为1if(TF0)goto exit; /检查有没超时,如果超时则退出;EXF2=0; /将EXF2清零if(!TH0) /判断是否是长低电平脉冲过来了 /不是长低电平脉冲而是短低电平if(F0)count.b+; /短脉冲数加一temp.a0=RCAP2H; /将捕捉数临时存放起来temp.a1=RCAP2L;goto loop; /返回继续查询else /是低电平脉冲,则进行处理F0=0;*ir=temp.a0; /把连续的短脉冲总时间记录下来ir+;*ir=temp.a1;ir+;*ir=RCAP2H; /把长电平脉冲时间记录下来ir+;*ir=RCAP2L;ir+;if(ir=0xda) goto exit; /判断是否溢出缓冲,如果溢出则失败退出goto loop; /返回继续查询exit:ir_flag=1; /置ir_flag为1表示接收成功end:;void rs232(void) interrupt 4static unsigned char sbuf1,sbuf2,rsbuf1,rsbuf2; /sbuf1,sbuf2用来接收发送临时用,rsbuf1,rsbuf2用来分别用来存放接收发送的半字节EA=0; /禁止中断if(RI)RI=0; /清除接收中断标志位sbuf1=SBUF; /将接收缓冲的字符复制到sbuf1if(sbuf1=HEAD) /判断是否帧开头state1=10; /是则把state赋值为10buf1=RECEIVE; /初始化接收地址 elseswitch(state1)case 10:sbuf2=sbuf14; /把高半字节右移到的半字节sbuf2=sbuf2; /把低半字节取反if(sbuf2&0x0f)!=(sbuf1&0x0f) /判断接收是否正确 /接收错误,有可能接收的是数据帧尾,也有可能是接收错误if(sbuf1=TAIL) /判断是否接收到数据帧尾 /是接收到数据帧尾buf1=RECEIVE; /初始化接收的地址if(*buf1=RESET) /判断是否为复位命令ES=0;sbuf2=SP+1;for(p.p10=SP-0x10;p.p104; /把高半字节右移到的半字节sbuf2=sbuf2; /将低半字节取反if(sbuf2&0x0f)!=(sbuf1&0x0f) /判断接收是否正确 /接受错误state1=0; / 将接收状态标志置为零,重新接收buf1=RECEIVE; /初始化接收的地址*buf1=NACK; /把NACK信号存入发送缓冲里buf1_flag=1; /置标志位为1,使主程序能对接收错误进行处理REN=0; /禁止接收elsesbuf1&=0x0f; /仅保留低半字节,去掉高半字节rsbuf1|=sbuf1; /高低半字节合并*buf1+=rsbuf1; /将接收的数据保存至接收缓冲里,并且数据指针加一buf1_length+; /接收数据长度加一state1=10; /将state1置为10,准备接收下个字节的高半字节break;elseTI=0; /清除发送中断标志if(buf2_length) /判断发送长度是否为零 /发送长度不为零if(state2=0) /判断是否发送高半字节 /发送高半字节sbuf2=*buf2; /将要发送的字节送到sbuf2rsbuf2=sbuf2; /取反,使高半字节变为反码sbuf2=4; /将高半字节右移到低半字节rsbuf2&=0xf0; /保留高半字节,去掉低半字节sbuf2&=0x0f; /保留低半字节,去掉高半字节rsbuf2|=sbuf2; /合并高低半字节SBUF=rsbuf2; /发送出去state2=10; /将state2置为10准备发送下半字节else /发送低半字节sbuf2=*buf2; /将要发送的字节送到sbuf2buf2+; /指针加一buf2_length-; /发送数据长度减一rsbuf2=sbuf2; /取反,使低半字节变为反码rsbuf2=4; /将低半字节反码左移到高半字节rsbuf2&=0xf0; /保留高半字节,去掉低半字节sbuf2&=0x0f; /保留低半字节,去掉高半字节rsbuf2|=sbuf2; /合并高低半字节SBUF=rsbuf2; /发送出state2=0;else /如果发送数据长度为零则发送数据帧尾if(buf2_flag) /判断是否发过数据帧尾SBUF=TAIL; /将数据帧尾发送出去while(TI=0);TI=0;buf2_flag=0; /置发送标志为零,表示发送完毕EA=1; /开放中断void ack(void) /发送ACK信号子程序buf1_flag=0; /置接收标志位位零表示已经相应了,可以接收下一帧数据REN=1; /接收使能while(buf2_flag); /判断上一帧有没发送完,没有则继续等待buf2=SEND; /初始化发送地址*buf2=ACK; /将ACK信号存入发送缓冲里buf2_length=1; /存入发送数据长度buf2_flag=1; /置发送长度为1SBUF=HEAD; /发送数据帧头void nack(void) /发送NACK信号子程序buf1_flag=0; /置接收标志位位零表示已经相应了,可以接收下一帧数据REN=1; /接收使能while(buf2_flag); /判断上一帧有没发送完,没有则继续等待buf2=SEND; /初始化发送地址*buf2=NACK; /将NACK信号存入发送缓冲里buf2_length=1; /存入发送数据长度buf2_flag=1; /置发送长度为1SBUF=HEAD; /发送数据帧头void free(void) /发送FREE信号子程序buf1_flag=0; /置接收标志位位零表示已经相应了,可以接收下一帧数据REN=1; /接收使能while(buf2_flag); /判断上一帧有没发送完,没有则继续等待buf2=SEND; /初始化发送地址*buf2=FREE; /将FREE信号存入发送缓冲里buf2_length=1; /存入发送数据长度buf2_flag=1; /置发送长度为1SBUF=HEAD; /发送数据帧头void busy(void) /发送BUSY信号子程序buf1_flag=0; /置接收标志位位零表示已经相应了,可以接收下一帧数据REN=1; /接收使能while(buf2_flag); /判断上一帧有没发送完,没有则继续等待buf2=SEND; /初始化发送地址*buf2=BUSY; /将BUSY信号存入发送缓冲里buf2_length=1; /存入发送数据长度buf2_flag=1; /置发送长度为1SBUF=HEAD; /发送数据帧头void download(void)int i; /用于循环计数i=buf1_length-3; /数据长度等于数据包长度减去一个字节控制字和两个字节地址buf1=RECEIVE+1; /使指针指向地址p.a0=*buf1+; /读入目标地址高字节p.a1=*buf1+; /读入目标地址低字节while(i-) /长度减一直至为零*p.p3+=*buf1+; /将接受缓冲里数据送到目标地址,并且两个指针加一REN=1; /数据处理完,允许接收下一帧数据buf1_flag=0; /置接收标志为零,表示已经处理完free(); /发送FREE信号表示已经处理完处于空闲状态void upload(void)int i; /while(buf2_flag); /判断上一帧有没发送完,没有则继续等待buf1=RECEIVE+1; /将指针指向地址buf2=SEND; /初始化发送地址*buf2+=UPLOAD; /把控制字存进去并且指针加一*buf2+=*buf1+; /把地址高字节复制过去*buf2+=*buf1+; /把地址低字节复制过去p.a0=*buf1+; /把数据长度高字节复制过去p.a1=*buf1+; /把数据长度低字节复制过去i=p.b; /把数据长度复制过去buf1-=4; /将指针减4,使其指向地址处p.a0=*buf1+; /把地址高字节复制过去p.a1=*buf1+; /把地址低字节复制过去buf1_flag=0; /已经对接受数据处理完毕REN=1; /允许接收buf2_length=i+3; /数据包长度等于数据长度加3while(i-) /判断数据长度是否为零,为零则不执行循环语句,同时长度减一*buf2+=*p.p3+; /把数据复制到发送缓冲区buf2=SEND;buf2_flag=1; /置发送标志为1SBUF=HEAD; /发送数据帧头void run(void) /运行下载的程序sub();void delay1s(void)for(i.b0=0;i.b00xffff;i.b0+)i.b0=i.b0+;i.b0=i.b0-;void ir_init(void)ir_flag=0; /将红外接收标志置为零for(ir=IR;iri.b1)i.b0=0xffff-i.b0;i.b0+=i.b1;i.b0+;elsei.b0=i.b1-i.b0;*p.p20=i.b0;p.p20+;i.b0=*p.p20;p.p21+;i.b1=*p.p21;*p.p20=0;p.p20=IR;temp.b=*p.p20;ir_code.c=count.b;ir_code.b0=(ir_code.c*1536000)/temp.b;for(;temp.b!=0;)*p.p20=temp.b/154;p.p20+;temp.b=*p.p20;ir_code.b1=0;if(p.p20=IR+132)p.p20=IR;p.p20+=3;i.c=0;temp.b=*p.p20;for(;temp.b!=0;)i.c=11)i.a3+;p.p20+=2;temp.b=*p.p20;if(i.a0=(i.a1)&i.a2=(i.a3)ir_code.a2=i.a0;ir_code.a3=i.a2;else ir_code.b0=0;elseif(p.p20=IR+4)p.p20=IR;p.p20+;temp.b=*p.p20;if(temp.b=30)ir_code.b0=1;else ir_code.b0=0;else ir_code.b0=2;/if(ir_flag=2)ir_code.b0=3;void read_ir(void)buf1_flag=0;REN=1;buf2_length=4;while(buf2_flag);ir_init();while(!ir_flag);ir_exit();ir_jiema();buf2=SEND;*buf2+=ir_code.a0;*buf2+=ir_code.a1;*buf2+=ir_code.a2;*buf2=ir_code.a3;buf2=SEND;buf2_flag=1;SBUF=HEAD;void delay(void)void start_iic(void)SCL=0;SDA=1;delay();delay();SCL=1;delay();SDA=0;delay();SCL=0;delay();void stop_iic(void)SDA=0;delay();SCL=1;delay();SDA=1;delay();SCL=0;delay();delay();SCL=1;delay();void send_ack_iic(void)SDA=0;delay();SCL=1;delay();delay();SCL=0;delay();void send_nack_iic(void)SDA=1;delay();SCL=1;delay();delay();SCL=0;delay();bit receive_ack_iic(void)bit a;SDA=1;delay();SCL=1;delay();if(SDA) a=1;else a=0;delay();SCL=0;delay();return a;unsigned char read_byte_ack_iic(void)unsigned char a;SDA=1;for(p.a0=0;p.a08;p.a0+)a=1;delay();SCL=1;delay();if(SDA) a+;delay();SCL=0;delay();send_ack_iic();return a;unsigned char read_byte_nack_iic(void)unsigned char a;SDA=1;for(p.a0=0;p.a08;p.a0+)a=1;delay();SCL=1;delay();if(SDA) a+;delay();SCL=0;delay();send_nack_iic();return a;void reset_iic(void)SDA=1;for(p.a0=0;p.a010;p.a0+)SCL=0;delay();delay();SCL=1;delay();delay();bit write_byte_iic(unsigned char a)for(p.a0=0;p.a08;p.a0+)if(a&0x80)SDA=1;elseSDA=0;delay();SCL=1;delay();delay();SCL=0;delay();a=1;return receive_ack_iic();unsigned int read_key_data(unsigned char a)unionunsigned char a2;unsigned int b;key_data;reset_iic();start_iic();write_byte_iic(0xa0);write_byte_iic(a);start_iic();write_byte_iic(0xa1);key_data.a0=read_byte_ack_iic();key_data.a1=read_byte_nack_iic();stop_iic();return key_data.b;void write_key_data(unsigned char a)reset_iic();start_iic();write_byte_iic(0xa0);write_byte_iic(a);write_byte_iic(ir_code.a2);write_byte_iic(ir_code.a3);stop_iic();void store_ir(void)buf1_flag=0;REN=1;buf1=RECEIVE+1;*buf1=(*buf1)1;write_key_data(*buf1);unsigned char yima(void)unsigned char a;for(a=0;a=1;return a;void read_key()unsigned char a;buf1_flag=0;REN=1;ir_init();while(!ir_flag);ir_exit();ir_jiema();buf2=SEND;a=yima();if(a=50)*buf2=0xff;else *buf2=a;buf2_length=1;buf2_flag=1;SBUF=HEAD;main()unsigned char ctr;delay1s();P0=0xff;P1=0xff;P2=0xff;P3=0xff;c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 软件测试类型题目及答案
- 8 1 直线和圆-高考数学真题分类 十年高考
- 《经济与社会》选择题100题(原卷版)
- 2023-2024学年河南省南阳市六校高二下学期期末考试数学试题(解析版)
- 2025年秋三年级上册语文同步教案 语文园地
- 碳中和行业研究报告
- 自贡统计年鉴-2009-环境保护主要统计指标解释
- 佳能公司人员管理制度
- 供水抢修应急管理制度
- 供水设备检修管理制度
- 主题3 乡土情怀-2025年中考语文现代文阅读主题预测与答题技巧指导(原卷版)
- 湘教版七年级数学下册期末考试卷(含答案与解析)
- DB32T3614-2019 工贸企业安全风险管控基本规范
- 高效规划优化工业园区的基础设施布局
- (王瑞元版本)运动生理学-课件-3-第三章-血液
- 浙江省医疗服务价格项目目录
- 玻璃吊装施工专项施工方案
- 焊接安全知识考核试题及答案
- 2025燃气电厂智能巡检系统技术方案
- ICU谵妄管理课件
- 2025至2030年COB产品项目投资价值分析报告
评论
0/150
提交评论