《2022年2022年红外遥控代码 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年红外遥控代码 .pdf(8页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、红外线遥控器软件解码原理和程序(C 语言)UPD6121G 产生的遥控编码是连续的32位二进制码组,其中前16位为用户识别码,能区别不同的电器设备,防止不同机种遥控码互相干扰。该芯片的用户识别码固定为十六进制01H;后 16 位为 8 位操作码(功能码)及其反码。UPD6121G最多额 128 种不同组合的编码。遥控器在按键按下后,周期性地发出同一种32 位二进制码,周期约为 108ms。一组码本身的持续时间随它包含的二进制“0”和“1”的个数不同而不同,大约在 4563ms之间,图 4 为发射波形图。当一个键按下超过36ms,振荡器使芯片激活,将发射一组108ms的编码脉冲,这 108ms发
2、射代码由一个起始码(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
3、=27ms所以 32 位代码的宽度为(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 最为
4、可靠,一般取0.84ms 左右均可。2 根据码的格式,应该等待9ms的起始码和 4.5ms 的结果码完成后才能读码。接收器及解码一体化红外线接收器是一种集红外线接收和放大于一体,不需要任何外接元名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 8 页 -件,就能完成从红外线接收到输出与TTL电平信号兼容的所有工作,而体积和普通的塑封三极管大小一样,它适合于各种红外线遥控和红外线数据传输。下面是一个对 51 实验板配套的红外线遥控器的解码程序,它可以把上图 32 键的红外遥控器每一个按键的键值读出来,并且通过实验板上P1口的 8 个 LED显示出来,在解码成功的同时并且能发出“嘀嘀嘀
5、”的提示音。红外线一开始发送一段13.5ms的引导码,引导码由9ms 的高电平和4.5ms的低电平组成,跟着引导码是系统码,系统反码,按键码,按键反码,如果按着键不放,则遥控器则发送一段重复码,重复码由9ms的高电平,2.25ms的低电平,跟着是一个短脉冲。本程序经过试用,能解大部分遥控器的编码!#include at89x52.h#define NULL 0 x00/数据无效#define RESET 0X01/程序复位#define REQUEST 0X02/请求信号#define ACK 0 x03/应答信号,在接收数据后发送ACK 信号表示数据接收正确,也位请求信号的应答信号#defi
6、ne NACK 0 x04/应答信号,表示接收数据错误#define BUSY 0 x05/忙信号,表示正在忙#define FREE 0 x06/空闲信号,表示处于空闲状态#define READ_IR 0 x0b/读取红外#define STORE_IR 0 x0c/保存数据#define READ_KEY 0 x0d/读取键值#define RECEIVE 0Xf400/接收缓冲开始地址#define SEND 0 xfa00/发送缓冲开始地址#define IR 0 x50/红外接收缓冲开始地址#define HEAD 0 xaa/数据帧头#define TAIL 0 x55/数据帧尾
7、#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 表示没有要发送的数据或名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 8
8、页 -发送完毕unsigned char state1,state2;/用来标志接收字符的状态,state1用来表示接收状态,state2用来表示发送状态unsigned char data*ir;union unsigned 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*p1
9、2;/unsigned int data*p22;/unsigned char xdata*p3;/unsigned int xdata*p4;/地址指针/q;/union unsigned char a2;unsigned int b;count;union unsigned char a2;unsigned int b;temp;union unsigned char a4;unsigned int b2;unsigned long c;ir_code;union unsigned char a4;unsigned int b2;unsigned long c;unsigned char
10、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 为缓冲溢出名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 8 页 -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 rea
11、d_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 rece
12、ive_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
13、 /采用中断方式跟查询方式相结合的办法解码 EA=0;/禁止中断 if(TF2)/判断是否是溢出还是电平变化产生的中断TF2=0;/如果是溢出产生的中断则清除溢出位,重新开放中断退出EA=1;goto end;EXF2=0;/清除电平变化产生的中断位 *ir=RCAP2H;/把捕捉的数保存起来 ir+;*ir=RCAP2L;*ir+;F0=1;TR0=1;/开启计数器0 loop:名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 8 页 -TL0=0;/将计数器 0 重新置为零 TH0=0;while(!EXF2)/查询等待 EXF2 变为 1 if(TF0)goto exit;/
14、检查有没超时,如果超时则退出 ;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=0 xda)goto exit;/判断是否溢出缓
15、冲,如果溢出则失败退出 goto loop;/返回继续查询 exit:ir_flag=1;/置 ir_flag为 1 表示接收成功end:;void rs232(void)interrupt 4 static unsigned char sbuf1,sbuf2,rsbuf1,rsbuf2;/sbuf1,sbuf2用来接收发送临时用,rsbuf1,rsbuf2用来分别用来存放接收发送的半字节 EA=0;/禁止中断 if(RI)RI=0;/清除接收中断标志位 sbuf1=SBUF;/将接收缓冲的字符复制到sbuf1 if(sbuf1=HEAD)/判断是否帧开头 state1=10;/是则把 sta
16、te赋值为 10 buf1=RECEIVE;/初始化接收地址名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 8 页 -else switch(state1)case 10:sbuf2=sbuf14;/把高半字节右移到的半字节 sbuf2=sbuf2;/把低半字节取反 if(sbuf2&0 x0f)!=(sbuf1&0 x0f)/判断接收是否正确 /接收错误,有可能接收的是数据帧尾,也有可能是接收错误 if(sbuf1=TAIL)/判断是否接收到数据帧尾 /是接收到数据帧尾buf1=RECEIVE;/初始化接收的地址if(*buf1=RESET)/判断是否为复位命令 ES=0;sb
17、uf2=SP+1;for(p.p10=SP-0 x10;p.p104;/把高半字节右移到的半字节 sbuf2=sbuf2;/将低半字节取反 if(sbuf2&0 x0f)!=(sbuf1&0 x0f)/判断接收是否正确名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 8 页 -/接受错误state1=0;/将接收状态标志置为零,重新接收buf1=RECEIVE;/初始化接收的地址*buf1=NACK;/把 NACK 信号存入发送缓冲里buf1_flag=1;/置标志位为1,使主程序能对接收错误进行处理REN=0;/禁止接收 else sbuf1&=0 x0f;/仅保留低半字节,去掉
18、高半字节rsbuf1|=sbuf1;/高低半字节合并*buf1+=rsbuf1;/将接收的数据保存至接收缓冲里,并且数据指针加一buf1_length+;/接收数据长度加一state1=10;/将 state1置为 10,准备接收下个字节的高半字节 break;else TI=0;/清除发送中断标志 if(buf2_length)/判断发送长度是否为零 /发送长度不为零 if(state2=0)/判断是否发送高半字节 /发送高半字节 sbuf2=*buf2;/将要发送的字节送到sbuf2 rsbuf2=sbuf2;/取反,使高半字节变为反码 sbuf2=4;/将高半字节右移到低半字节 rsbu
19、f2&=0 xf0;/保留高半字节,去掉低半字节 sbuf2&=0 x0f;/保留低半字节,去掉高半字节 rsbuf2|=sbuf2;/合并高低半字节 SBUF=rsbuf2;/发送出去 state2=10;/将 state2置为 10 准备发送下半字节 else /发送低半字节 sbuf2=*buf2;/将要发送的字节送到sbuf2 buf2+;/指针加一 buf2_length-;/发送数据长度减一 rsbuf2=sbuf2;/取反,使低半字节变为反码名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 8 页 -rsbuf2=4;/将低半字节反码左移到高半字节 rsbuf2&=0 xf0;/保留高半字节,去掉低半字节 sbuf2&=0 x0f;/保留低半字节,去掉高半字节 rsbuf2|=sbuf2;/合并高低半字节 SBUF=rsbuf2;/发送出 state2=0;else /如果发送数据长度为零则发送数据帧尾if(buf2_flag)/判断是否发过数据帧尾SBUF=TAIL;/将数据帧尾发送出去while(TI=0);TI=0;buf2_flag=0;/置发送标志为零,表示发送完毕 EA=1;/开放中断名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 8 页 -