📄 遥控解码程序.lst
字号:
C51 COMPILER V7.08 襙控絖码砡序 08/22/2007 15:13:45 PAGE 1
C51 COMPILER V7.08, COMPILATION OF MODULE 襙控絖码砡序
OBJECT MODULE PLACED IN 遥控解码程序.OBJ
COMPILER INVOKED BY: D:\单片机~1\C51\Bin\c51.exe 遥控解码程序.c DB OE SMALL ROM(LARGE)
line level source
*** WARNING C500 IN LINE 1 OF 遥控解码程序.C: MISSING DEVICE (SECURITY KEY NOT FOUND)
1 //红外线遥控器软件解码原理和程序(C语言)
2 //红外线一开始发送一段13.5ms的引导码,引导码由9ms的高电平和4.5ms的低电平组成,跟着引导码
3 //是系统码,系统反码,按键码,按键反码,如果按着键不放,则遥控器则发送一段重复码,重复码
4 //由9ms的高电平,2.25ms的低电平,跟着是一个短脉冲。
5
6 #include"reg52.h"
7 #define NULL 0x00//数据无效
8 #define RESET 0X01//程序复位
9 #define REQUEST 0X02//请求信号
10 #define ACK 0x03//应答信号,在接收数据后发送ACK信号表示数据接收正确,
11 //也位请求信号的应答信号
12 #define NACK 0x04//应答信号,表示接收数据错误
13 #define BUSY 0x05//忙信号,表示正在忙
14 #define FREE 0x06//空闲信号,表示处于空闲状态
15 #define READ_IR 0x0b//读取红外
16 #define STORE_IR 0x0c//保存数据
17 #define READ_KEY 0x0d//读取键值
18 #define RECEIVE 0Xf400//接收缓冲开始地址
19 #define SEND 0xfa00//发送缓冲开始地址
20 #define IR 0x50//红外接收缓冲开始地址
21 #define HEAD 0xaa//数据帧头
22 #define TAIL 0x55//数据帧尾
23 #define SDA P1^7
24 #define SCL P1^6
25
26
27 unsigned char xdata *buf1; //接受数据缓冲
28 unsigned int buf1_length; //接收到的数据实际长度
29 unsigned char xdata *buf2; //发送数据缓冲
30 unsigned int buf2_length; //要发送的数据实际长度
31 bit buf1_flag; //接收标志,1表示接受到一个数据帧,0表示没有接受到数据帧或数据
32 //帧为空
33
34 bit buf2_flag; //发送标志,1表示需要发送或没发送完毕,0表示没有要发送的数据或
35 //发送完毕
36 unsigned char state1,state2; //用来标志接收字符的状态,state1用来表示接
37 //收状态,state2用来表示发送状态
38 unsigned char data *ir;
39 union{
40 unsigned char a[2];
41 unsigned int b;
42 unsigned char data *p1[2];
43 unsigned int data *p2[2];
44 unsigned char xdata *p3; //红外缓冲的指针
45 unsigned int xdata *p4;
46 }p;
47 //union{ //
48 // unsigned char a[2]; //
49 // unsigned int b;
50 // unsigned char data *p1[2];
51 // unsigned int data *p2[2];
52 // unsigned char xdata *p3;
53 // unsigned int xdata *p4; //地址指针
54 //}q; //
C51 COMPILER V7.08 襙控絖码砡序 08/22/2007 15:13:45 PAGE 2
55
56 union{
57 unsigned char a[2];
58 unsigned int b;
59 }count;
60 union{
61 unsigned char a[2];
62 unsigned int b;
63 }temp;
64 union{
65 unsigned char a[4];
66 unsigned int b[2];
67 unsigned long c;
68 }ir_code;
69
70 union{
71 unsigned char a[4];
72 unsigned int b[2];
73 unsigned long c;
74 unsigned char data *p1[4];
75 unsigned int data *p2[4];
76 unsigned char xdata *p3[2];
77 unsigned int xdata *p4[2];
78 }I;
79 unsigned char ir_key;
80 bit ir_flag; //红外接收标志,0为缓冲区空,1为接收成功,2为缓冲溢出
81 void sub(void);
82 void delay(void);
83 void ie_0(void);
84 void tf_0(void);
85 void ie_1(void);
86 void tf_1(void);
87 void tf_2(void);
88 void read_ir(void);
89 void ir_jiema(void);
90 void ir_init(void);
91 void ir_exit(void);
92 void store_ir(void);
93 void read_key(void);
94 void reset_iic(void);
95 unsigned char read_byte_ack_iic(void);
96 unsigned char read_byte_nack_iic(void);
97 bit write_byte_iic(unsigned char a);
98 void send_ack_iic(void);
99 void send_nack_iic(void);
100 bit receive_ack_iic(void);
101 void start_iic(void);
102 void stop_iic(void);
103 void write_key_data(unsigned char a);
104 unsigned int read_key_data(unsigned char a);
105 void ie0(void) interrupt 0{ie_0();}
106 void tf0(void) interrupt 1{tf_0();}
107 void ie1(void) interrupt 2{ie_1();}
108 void tf1(void) interrupt 3{tf_1();tf_2();}
109 void tf2(void) interrupt 5{ //采用中断方式跟查询方式相结合的办法解码
110 1 EA=0; //禁止中断
111 1 if(TF2){ //判断是否是溢出还是电平变化产生的中断
112 2 TF2=0; //如果是溢出产生的中断则清除溢出位,重新开放中断退出
113 2 EA=1;
114 2 goto end;
115 2 }
116 1 EXF2=0; //清除电平变化产生的中断位
C51 COMPILER V7.08 襙控絖码砡序 08/22/2007 15:13:45 PAGE 3
117 1 *ir=RCAP2H; //把捕捉的数保存起来
118 1 ir++;
119 1 *ir=RCAP2L;
120 1 *ir++;
*** WARNING C275 IN LINE 120 OF 遥控解码程序.C: expression with possibly no effect
121 1 F0=1;
122 1 TR0=1; //开启计数器0
123 1 loop:
124 1 TL0=0; //将计数器0重新置为零
125 1 TH0=0;
126 1 while(!EXF2){ //查询等待EXF2变为1
127 2 if(TF0)goto exit; //检查有没超时,如果超时则退出
128 2 };
129 1 EXF2=0; //将EXF2清零
130 1 if(!TH0) //判断是否是长低电平脉冲过来了
131 1 { //不是长低电平脉冲而是短低电平
132 2 if(F0)count.b++; //短脉冲数加一
133 2 temp.a[0]=RCAP2H; //将捕捉数临时存放起来
134 2 temp.a[1]=RCAP2L;
135 2 goto loop; //返回继续查询
136 2 }
137 1 else{ //是低电平脉冲,则进行处理
138 2
139 2 F0=0;
140 2 *ir=temp.a[0]; //把连续的短脉冲总时间记录下来
141 2 ir++;
142 2 *ir=temp.a[1];
143 2 ir++;
144 2 *ir=RCAP2H; //把长电平脉冲时间记录下来
145 2 ir++;
146 2 *ir=RCAP2L;
147 2 ir++;
148 2 if(ir>=0xda) {
149 3 goto exit; //判断是否溢出缓冲,如果溢出则失败退出
150 3 }
151 2 goto loop; //返回继续查询
152 2 }
153 1 exit:
154 1 ir_flag=1; //置ir_flag为1表示接收成功
155 1 end:
156 1 ;
157 1 }
158
159
160 void rs232(void) interrupt 4{
161 1 static unsigned char sbuf1,sbuf2,rsbuf1,rsbuf2; //sbuf1,sbuf2用来接收
162 1 //发送临时用,rsbuf1,rsbuf2用来分别用来存放接收发送的半字节
163 1 EA=0; //禁止中断
164 1 if(RI){
165 2 RI=0; //清除接收中断标志位
166 2 sbuf1=SBUF; //将接收缓冲的字符复制到sbuf1
167 2 if(sbuf1==HEAD){ //判断是否帧开头
168 3 state1=10; //是则把state赋值为10
169 3 buf1=RECEIVE; //初始化接收地址
170 3 }
171 2 else{
172 3 switch(state1){
173 4 case 10:sbuf2=sbuf1>>4; //把高半字节右移到的半字节
174 4 sbuf2=~sbuf2; //把低半字节取反
175 4 if((sbuf2&0x0f)!=(sbuf1&0x0f)) //判断接收是否正确
176 4 { //接收错误,有可能接收的是数据帧尾,也有可能是接收错
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -