




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、红外遥控器软件解码原理和程序红外一开始发送一段13.5ms的引导码,引导码由9ms的高电平和4.5ms的低电平组成,跟着引导码是系统码,系统反码,按键码,按键反码,如果按着键不放,则遥控器则发送一段重复码,重复码由9ms的高电平,2.25ms的低电平,跟着是一个短脉冲,本程序经过试用,能解大部分遥控器的编码!#include "at89x52.h"#define NULL 0x00/数据无效
2、#define RESET 0X01/程序复位#define REQUEST 0X02/请求信号#define ACK 0x03/应答信号,在接收数据后发送ACK信号表示数据接收正确,也位请求信号的应答信号#defi
3、ne NACK 0x04/应答信号,表示接收数据错误#define BUSY 0x05/忙信号,表示正在忙#define FREE 0x06/空闲信号,表示处于空闲状态#defin
4、e READ_IR 0x0b/读取红外#define STORE_IR 0x0c/保存数据#define READ_KEY 0x0d/读取键值#define RECEIVE 0Xf400/接收缓冲开始地址#d
5、efine SEND 0xfa00/发送缓冲开始地址#define IR 0x50/红外接收缓冲开始地址#define HEAD 0xaa/数据帧头#def
6、ine TAIL 0x55/数据帧尾#define SDA P1_7#define SCL P1_6unsigned char xdata *buf1;
7、160; /接受数据缓冲unsigned int buf1_length; /接收到的数据实际长度unsigned char xdata *buf2; /发送数据缓冲unsigned int buf2_length; /要发送的数据实际长度bit buf1_flag; /接收标志,1表示接受到一个数据帧,0表示没有接受到数据帧或数据帧为空bit buf2_flag; /发送标志,1表示
8、需要发送或没发送完毕,0表示没有要发送的数据或发送完毕unsigned char state1,state2; /用来标志接收字符的状态,state1用来表示接收状态,state2用来表示发送状态unsigned char data *ir;union unsigned char a2; unsigned int b; unsigned char dat
9、a *p12; unsigned int data *p22; unsigned char xdata *p3; /红外缓冲的指针 unsigned int xdata *p4;p;/union
10、60; / / unsigned char a2; / / unsigned int b; / unsigned char data *p12; / unsigned int data *p22; / u
11、nsigned char xdata *p3; / unsigned int xdata *p4; /地址指针/q; /union unsigned ch
12、ar 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; uns
13、igned 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; /红
14、外接收标志,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_
15、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)
16、 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
17、0; /采用中断方式跟查询方式相结合的办法解码 EA=0; /禁止中断 if(TF2)
18、60; /判断是否是溢出还是电平变化产生的中断 TF2=0;
19、160; /如果是溢出产生的中断则清除溢出位,重新开放中断退出 EA=1; goto end; EXF2=0;
20、60; /清除电平变化产生的中断位 *ir=RCAP2H;
21、60; /把捕捉的数保存起来 ir+; *ir=RCAP2L; *ir+; F0=1; TR0=1;
22、0; /开启计数器0loop: TL0=0; /将计数器0重新置为零 TH0=0; while(!EXF2)
23、; /查询等待EXF2变为1 if(TF0)goto exit; /检查有没超时,如果超时则退出 EXF2=0;
24、160; /将EXF2清零 if(!TH0)
25、0; /判断是否是长低电平脉冲过来了 &
26、#160; /不是长低电平脉冲而是短低电平 if(F0)count.b+; /短脉冲数加一 temp.a0=RCAP2H;
27、60; /将捕捉数临时存放起来 temp.a1=RCAP2L; goto loop;
28、60; /返回继续查询 else
29、0; /是低电平脉冲,则进行处理 F0=0; *ir=temp.a0; /把连续的短脉冲总时间记录下来 ir+; *ir=temp.a1;
30、60; ir+; *ir=RCAP2H; /把长电平脉冲时间记录下来 ir+; *ir=RCAP2L; ir+;
31、0; if(ir>=0xda) goto exit; /判断是否溢出缓冲,如果溢出则失败退出 goto lo
32、op; /返回继续查询 exit: ir_flag=1; /置ir_flag为1表示接收成功end: void rs232(void)
33、0;interrupt 4 static unsigned char sbuf1,sbuf2,rsbuf1,rsbuf2; /sbuf1,sbuf2用来接收发送临时用,rsbuf1,rsbuf2用来分别用来存放接收发送的半字节 EA=0;
34、; /禁止中断 if(RI) RI=0; &
35、#160; /清除接收中断标志位 sbuf1=SBUF;
36、0; /将接收缓冲的字符复制到sbuf1 if(sbuf1=HEAD)
37、60; /判断是否帧开头 s
38、tate1=10; /是则把state赋值为10 buf1=RECEIVE;
39、 /初始化接收地址
40、0; else switch(state1) case 10:sbuf2=sbuf1>>4;
41、;/把高半字节右移到的半字节 sbuf2=sbuf2; /把低半字节取反
42、160; if(sbuf2&0x0f)!=(sbuf1&0x0f) /判断接收是否正确
43、; /接收错误,有可能接收的是数据帧尾,也有可能是接收错误 if
44、(sbuf1=TAIL) /判断是否接收到数据帧尾
45、 /是接收到数据帧尾
46、60;buf1=RECEIVE; /初始化接收的地址 if(*buf1=RESET) /判断是否为复位命令
47、0;
48、0; ES=0;
49、; sbuf2=SP+1;
50、 for(p.p10=SP-0x10;p.p10<=sbuf2;p.p10+)*p.p10=0;
51、0; state1=0; /将接收状态标志置为零,接
52、收下一个数据帧 buf1_flag=1; /置接收标志为1,表示已经接收到一个数据帧
53、160; REN=0; /禁止接收
54、60; else
55、; /不是接受到数据帧尾,表明接收错误
56、 state1=0; / 将接收状态标志置为零,重新接收
57、0; buf1=RECEIVE; /初始化发送的地址
58、 *buf1=NACK; /把NACK信号存入接收缓冲里
59、0; buf1_flag=1; /置标志位为1,使主程序能对接收错误进行处理
60、 REN=0; /禁止接收 &
61、#160; else
62、60; /接收正确
63、0; rsbuf1=sbuf1; /按位取反,使高半字节变原码 &
64、#160;rsbuf1&=0xf0; /仅保留高半字节,低半字节去掉 state1=20; &
65、#160; /将状态标志置为20,准备接收低半字节
66、 break; case 20:sbuf2=sbuf1>>4; /把高半字节右移到的半字节
67、 sbuf2=sbuf2; /将低半字节取反 if(sbuf2&0x0
68、f)!=(sbuf1&0x0f) /判断接收是否正确 &
69、#160; /接受错误 state1=0;
70、; / 将接收状态标志置为零,重新接收 buf1=RECEIVE; /初始化接收的地址
71、160; *buf1=NACK; /把NACK信号存入发送缓冲里
72、 buf1_flag=1; /置标志位为1,使主程序能对接收错误进行处理
73、160; REN=0; /禁止接收
74、60; else
75、; sbuf1&=0x0f; /仅保留低半字节,去掉高半字节
76、0; rsbuf1|=sbuf1; /高低半字节合并 *buf1+=rsbuf1;
77、0; /将接收的数据保存至接收缓冲里,并且数据指针加一 buf1_length+;
78、60; /接收数据长度加一 state1=10;
79、160; /将state1置为10,准备接收下个字节的高半字节 break;
80、 else TI=0;
81、60; /清除发送中断标志 if(buf2_length)
82、60; /判断发送长度是否为零
83、0; /发送长度不为零 if(state2=0) /判
84、断是否发送高半字节
85、60; /发送高半字节 sbuf2=*buf2; /将要发送的字节送到sbuf2
86、; rsbuf2=sbuf2; /取反,使高半字节变为反码
87、60; sbuf2>>=4; /将高半字节右移到低半字节
88、0; rsbuf2&=0xf0; /保留高半字节,去掉低半字节 sbu
89、f2&=0x0f; /保留低半字节,去掉高半字节 rsbuf2|=sbuf2; &
90、#160; /合并高低半字节 SBUF=rsbuf2;
91、; /发送出去 state2=10; /将state2置为10准备发送下半字节
92、 else
93、160; /发送低半字节 &
94、#160; sbuf2=*buf2; /将要发送的字节送到sbuf2
95、0; buf2+; /指针加一 buf2_
96、length-; /发送数据长度减一 rsbuf2=sbuf2;
97、 /取反,使低半字节变为反码 rsbuf2<<=4; /将低半字节反码左移到高半字节
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年汉中市汉台区河东店镇中心卫生院招聘考试真题
- 突起路标行业行业发展趋势及投资战略研究分析报告
- 2024年福建片仔癀化妆品商贸有限公司社会招聘考试真题
- 2025年度个人车位使用权转让与车位车位使用权终止及补偿协议
- 2025年度电子设备维修工程师劳动合同范本
- 港口集装箱装卸安全协议
- 2025年度房产代理佣金收取诚意金合同
- 2025年度交通事故损害赔偿及保险理赔谅解协议
- 2025年中国锥体蜡烛机行业市场发展前景及发展趋势与投资战略研究报告
- 2025年度医院食堂营养膳食承包管理协议
- 航空航天标准与认证互认
- 心理课教案自我认知与情绪管理
- 幼儿园 中班心理健康《我会倾诉》
- GB/T 6553-2024严酷环境条件下使用的电气绝缘材料评定耐电痕化和蚀损的试验方法
- 中职旅游专业《中国旅游地理》说课稿
- 微积分试卷及规范标准答案6套
- 【乡村振兴背景下农村基层治理问题探究开题报告(含提纲)3000字】
- 药物警戒管理体系记录与数据管理规程
- 2024-2029年扩展坞行业市场现状供需分析及市场深度研究发展前景及规划投资研究报告
- SH/T 3003-2024 石油化工合理利用能源设计导则(正式版)
- 中国人民大学613卫生统计历年真题12-16
评论
0/150
提交评论