📄 7.1.3.lst
字号:
C51 COMPILER V6.20c 7_1_3 09/02/2001 14:55:17 PAGE 1
C51 COMPILER V6.20c, COMPILATION OF MODULE 7_1_3
OBJECT MODULE PLACED IN 7.1.3.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 7.1.3.c DEBUG OBJECTEXTEND
stmt level source
1 #include <REG768.H> /*Philips 87LPC768 寄存器定义头文件*/
2 #define REDINT 0x06 /*红外线间隔*/
3
4 /*存放消息标志的可位寻址字节Message,Message=NULL时无任消息*/
5 unsigned char bdata Message;
6
7 /*在接收过程中置位,检测标置位Get可以有效防止其它进程干扰接收,防止数据丢失*/
8 sbit RedMsg=Message^0; /*红外遥控消息*/
9 sbit RedRead=Message^1; /*位接收过程标志*/
10 sbit RedBit =Message^2; /*接收到的位值*/
11 sbit RSend =Message^3; /*红外接收中重新发送标志*/
12
13 /*存放遥控的字数据,低4位存放接收到的bit的位移,高12位从低到高存放接收到的bit*/
14 unsigned char bdata RedDataL,RedDataH;
15
16 /*RedDataH字节低6位代表指令,只有一个1,C1~C3是用户码,H表示连续,S1、S2分别表示第
17 一、二组单发*/
18 sbit RedData0=RedDataL^4; /*C1*/
19 sbit RedData1=RedDataL^5; /*C2*/
20 sbit RedData2=RedDataL^6; /*C3*/
21 sbit RedData3=RedDataL^7; /*H*/
22 sbit RedData11=RedDataH^0; /*D6*/
23 sbit RedData10=RedDataH^1; /*D5*/
24 sbit RedData9=RedDataH^2; /*D4*/
25 sbit RedData8=RedDataH^3; /*D3*/
26 sbit RedData7=RedDataH^4; /*D2*/
27 sbit RedData6=RedDataH^5; /*D1*/
28 sbit RedData5=RedDataH^6; /*S2*/
29 sbit RedData4=RedDataH^7; /*S1*/
30 unsigned char bdata State; /*状态字节*/
31 sbit RedControl=State^6; /*遥控状态*/
32
33 /*定时器T00 的高位定时参数为Timer,定时256*Timer+(80--336)个周期,共139Timer+(43~
34 182)us<37ms。定时器T01的高位定时节参数为nTimer,定时256*nTimer+(24~280)个周期,
35 139nTimer+(13~152)us<9.1s。RedCon存放红外接收时的载波计数*/
36 unsigned char data RedCon,Timer;
37 unsigned int nTimer; /*定时整型参数*/
38
39 void main()
40 {
41 1 IEN0=0x14; /*只打开INT1中断*/
42 1 WDRST=0x1E; /*看门狗清0*/
43 1 WDRST=0xE1;
44 1 WDCON=0x12; /*40-90ms看门狗(>最大延时37ms)*/
45 1 TCON=0x40; /*定时器1开始工作, INT1低电平触发*/
46 1 TMOD=0x23; /*定时器0扩展成两个8位定时器T00和T01用于同步控制*/
47 1 if((WDCON&0x30)!=0x30) /*看门狗陷阱复位时无需初始化*/
48 1 {
49 2 Message=0; /*无消息*/
50 2 State=0; /*正常复位无任何状态*/
51 2 }
52 1 while(1) /*消息循环*/
53 1 {
54 2 WDRST=0x1E; /*看门狗清0*/
55 2 WDRST=0xE1;
C51 COMPILER V6.20c 7_1_3 09/02/2001 14:55:17 PAGE 2
56 2 EX1= RedControl; /*设置遥控中断INT1 */
57 2 if(RedMsg) /*执行遥控指令*/
58 2 {
59 3 EX1=0; /*在指令没有处理完之前不能重复中断*/
60 3 switch(RedDataH) /*这里加入红外指令的控制过程*/
61 3 {
62 4 case 0x82: /*Channel 1*/
63 4 break;
64 4 case 0xA0: /*Channel 2*/
65 4 break;
66 4 }
67 3 EX1=1;
68 3 RedDataL=0; /*复位红外数据*/
69 3 RedDataH=0; /*复位红外数据*/
70 3 RedMsg=0; /*复位红外遥控消息*/
71 3 }
72 2 }
73 1 }
74
75 void Count0(void) interrupt 1 using 3 /*定时器T00中断,最大定时37ms*/
76 {
77 1 if(Timer!=0) /*检测定时器T00的扩展高位*/
78 1 {
79 2 Timer--;
80 2 return;
81 2 }
82 1 }
83
84
85 /*INT1用于红外解码状态遥控解码数据处理,nTimer=1定时152~291us*/
86 void Inte1() interrupt 2 using 2
87 {
88 1 for(nTimer=8;nTimer>1;nTimer--); /*使处理周期达到51机器周期=27.7us使得
89 1 RedCon<32*/
90 1 if(RedRead) /*0信号宽度a=420us,1信号宽度a=1260us,周期4a=1680us*/
91 1 RedCon++;
92 1 else /*开始计数或者重新发送时开始计数*/
93 1 {
94 2 RedBit=0; /*复位接收位*/
95 2 RedCon=0; /*复位载波计数*/
96 2 RedRead=1; /*置位位接收标志*/
97 2 if(!ET1) /*首次接收时没有启动定时器T01接收第一个位*/
98 2 {
99 3 TF1=0; /*复位定时器T01溢出标志*/
100 3 ET1=1; /*启动T01 定时*/
101 3 RedDataL=0; /*复位红外数据*/
102 3 RedDataH=0; /*复位红外数据*/
103 3 RSend=0; /*复位重新发送标志*/
104 3 }
105 2 }
106 1 }
107
108 void Count1(void) interrupt 3 using 3 /*定时器T01中断,最大定时9.1s*/
109 {
110 1 if(nTimer!=0) /*检测定时器T01 的扩展高位*/
111 1 {
112 2 nTimer--;
113 2 return;
114 2 }
115 1 ET1=0; /*关闭T01 定时*/
116 1 if(RedRead) /*红外接收状态*/
117 1 {
C51 COMPILER V6.20c 7_1_3 09/02/2001 14:55:17 PAGE 3
118 2 if((RedDataL&0xF)==12) /*第一阶段接收已经结束*/
119 2 {
120 3 RSend=1; /*置位重新发送标志以便校验*/
121 3 RedDataL&=0xF0; /*复位位指针以便校验*/
122 3 }
123 2 if(RedCon>27-REDINT&&RedCon<27+REDINT)
124 2 RedBit=1;
125 2 else /*低电平计数9 表示0 27 表示1*/
126 2 RedBit=0;
127 2 if(RSend) /*检验重复发送的数据是否与第一次符合*/
128 2 {
129 3 switch(RedDataL&0xF)
130 3 {
131 4 case 0: /*检验重复发送的第1 位数据*/
132 4 if(RedBit!=RedData0) goto RClear;
133 4 break;
134 4 case 1: /*检验重复发送的第2 位数据*/
135 4 if(RedBit!=RedData1) goto RClear;
136 4 break;
137 4 case 2: /*检验重复发送的第3 位数据*/
138 4 if(RedBit!=RedData2) goto RClear;
139 4 break;
140 4 case 3: /*检验重复发送的第4 位数据*/
141 4 if(RedBit!=RedData3) goto RClear;
142 4 break;
143 4 case 4: /*检验重复发送的第5 位数据*/
144 4 if(RedBit!=RedData4) goto RClear;
145 4 break;
146 4 case 5: /*检验重复发送的第6 位数据*/
147 4 if(RedBit!=RedData5) goto RClear;
148 4 break;
149 4 case 6: /*检验重复发送的第7 位数据*/
150 4 if(RedBit!=RedData6) goto RClear;
151 4 break;
152 4 case 7: /*检验重复发送的第8 位数据*/
153 4 if(RedBit!=RedData7) goto RClear;
154 4 break;
155 4 case 8: /*检验重复发送的第9 位数据*/
156 4 if(RedBit!=RedData8) goto RClear;
157 4 break;
158 4 case 9: /*检验重复发送的第10 位数据*/
159 4 if(RedBit!=RedData9) goto RClear;
160 4 break;
161 4 case 10: /*检验重复发送的第11 位数据*/
162 4 if(RedBit!=RedData10) goto RClear;
163 4 break;
164 4 case 11: /*检验重复发送的第12 位数据*/
165 4 if(RedBit!=RedData11) goto RClear;
166 4 RedMsg=1; /*接受到经过检验正确的编码后置位遥控消息*/
167 4 RedBit=0; /*复位接收位*/
168 4 RSend=0; /*复位重新发送标志*/
169 4 RedRead=0; /*复位接收过程标志*/
170 4 RedCon=0; /*复位载波计数*/
171 4 return;
172 4 default: /*重复发送的数据多于12 位时判断为错误*/
173 4 goto RClear;
174 4 }
175 3 }
176 2 else
177 2 {
178 3 switch(RedDataL&0xF)
179 3 {
C51 COMPILER V6.20c 7_1_3 09/02/2001 14:55:17 PAGE 4
180 4 case 0: /*保存首次发送的第1 位数据*/
181 4 RedData0=RedBit;
182 4 break;
183 4 case 1: /*保存首次发送的第2 位数据*/
184 4 RedData1=RedBit;
185 4 break;
186 4 case 2: /*保存首次发送的第3 位数据*/
187 4 RedData2=RedBit;
188 4 break;
189 4 case 3: /*保存首次发送的第4 位数据*/
190 4 RedData3=RedBit;
191 4 break;
192 4 case 4: /*保存首次发送的第5 位数据*/
193 4 RedData4=RedBit;
194 4 break;
195 4 case 5: /*保存首次发送的第6 位数据*/
196 4 RedData5=RedBit;
197 4 break;
198 4 case 6: /*保存首次发送的第7 位数据*/
199 4 RedData6=RedBit;
200 4 break;
201 4 case 7: /*保存首次发送的第8 位数据*/
202 4 RedData7=RedBit;
203 4 break;
204 4 case 8: /*保存首次发送的第9 位数据*/
205 4 RedData8=RedBit;
206 4 break;
207 4 case 9: /*保存首次发送的第10 位数据*/
208 4 RedData9=RedBit;
209 4 break;
210 4 case 10: /*保存首次发送的第11 位数据*/
211 4 RedData10=RedBit;
212 4 break;
213 4 case 11: /*保存首次发送的第12 位数据*/
214 4 RedData11=RedBit;
215 4 break;
216 4 default: /*首次发送的数据多于12 位时判断为错误*/
217 4 goto RClear;
218 4 }
219 3 }
220 2 RedDataL++; /*位位移加1*/
221 2 RedBit=0; /*复位接收位*/
222 2 RedRead=0; /*复位接收过程标志*/
223 2 RedCon=0; /*复位载波计数*/
224 2 nTimer=423; /*用定时140a 检测同步信号208a*/
225 2 TF1=0; /*复位定时器T01 益出标志*/
226 2 ET1=1; /*启动定时器*/
227 2 }
228 1 else if(RSend) /*在位接收没有结束时发生定时中断需要复位接收信息(同步)*/
229 1 {
230 2 RClear:
231 2 RedDataL=0; /*复位红外数据*/
232 2 RedDataH=0; /*复位红外数据*/
233 2 RedBit=0; /*复位接收位*/
234 2 RedRead=0; /*复位接收过程标志*/
235 2 RSend=0; /*复位重新发送标志*/
236 2 RedCon=0; /*复位载波计数*/
237 2 ET1=0; /*关闭T01 定时*/
238 2 }
239 1 }
C51 COMPILER V6.20c 7_1_3 09/02/2001 14:55:17 PAGE 5
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 607 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 8 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -