📄 rs_main.lst
字号:
181 3 break;
182 3 /* 通道切换,通过SHIFT + 数字键,0键表示所有*/
183 3 case KEY_0: if( Fresh_KEY_Flag )
184 3 if( PRE_KEY == KEY_SHIFT )
185 3 Current_CH = 0;
186 3 break;
187 3 case KEY_1: if( Fresh_KEY_Flag )
188 3 if( PRE_KEY == KEY_SHIFT )
189 3 Current_CH = 1;
190 3 break;
191 3 case KEY_2: if( Fresh_KEY_Flag )
192 3 if( PRE_KEY == KEY_SHIFT )
193 3 Current_CH = 2;
194 3 break;
195 3 case KEY_3: if( Fresh_KEY_Flag )
196 3 if( PRE_KEY == KEY_SHIFT )
197 3 Current_CH = 3;
198 3 break;
199 3 case KEY_4: if( Fresh_KEY_Flag )
200 3 if( PRE_KEY == KEY_SHIFT )
201 3 Current_CH = 4;
202 3 break;
203 3 case KEY_ESC: if( Fresh_KEY_Flag )
204 3 Current_CH = 0;
205 3 break;
206 3
207 3 }
208 2
209 2 Fresh_KEY_Flag = 0;
210 2 PRE_KEY = KEY_DECODE; /* 前一个键值更新*/
211 2 }
212 1 }
213
214 /********************************************************************/
215 /* 主初始化程序 */
216 /* 初始化定时器,中断模式等 */
217 /********************************************************************/
218 void Main_Initlization( void ) /*主初始化程序*/
219 {
220 1 TMOD = 0x19; /* 定时器1用于PWM 定时,定时器0用于遥控信号解码*/
221 1 TCON = 0x55; /* 启动两个定时器,外部中断模式为下降沿*/
222 1 TH1 = 0xF9; /* PWM 调节步长*/
223 1 TL1 = 0x7D;
224 1 TH0 = 0x00; /* 定时设置,最长约80ms, 24MHz晶振*/
225 1 TL0 = 0x00;
226 1 IE = 0x8F; /* 开放中断:INT0-遥控解码,INT1-10ms中断,T0-遥控解码, T1-PWM 发生*/
227 1 IP = 0x0C; /* 10ms外部中断优先级最高*/
228 1 }
229
230
231 /********************************************************************/
232 /* 外部中断0服务程序( 遥控解码) */
233 /********************************************************************/
234 /* 解码输出在RS_DECODE,标志为RS_DECODE_OK,首次按键为Fresh_KEY_Flag */
235
236 void Interrupt_INT0( void ) interrupt 0
237 {
238 1 /* 搜索帧头,帧尾,数据*/
239 1 /* 00 22数据为帧头*/
240 1 /* 00 03为数据0,00 0C为数据1*/
241 1 /* 01 38为帧尾*/
CX51 COMPILER x7.00 RS_MAIN 05/07/2006 20:40:55 PAGE 5
242 1 /* 00 11, 02 F1为重复标志*/
243 1
244 1 bit Error_Flag;
245 1
246 1 switch( TH0 )
247 1 {
248 2 case 0x02: /* 数据0 */
249 2 case 0x03:
250 2 case 0x04: if( RS_High == 0 )
251 2 {
252 3 RS_CODE.FULL_KEY <<= 1;
253 3 RS_Index ++;
254 3 }
255 2 else
256 2 RS_Index = 0;
257 2 break;
258 2
259 2 case 0x0B: /* 数据1 */
260 2 case 0x0C:
261 2 case 0x0D: if( RS_High == 0 )
262 2 {
263 3 RS_CODE.FULL_KEY <<= 1;
264 3 RS_CODE.FULL_KEY ++;
265 3 RS_Index ++;
266 3 }
267 2 else
268 2 RS_Index = 0;
269 2 break;
270 2
271 2 case 0x10: /* 重复按键译码*/
272 2 case 0x11:
273 2 case 0x12: if(( RS_High == 0 ) && ( RS_Index == 50 ))
274 2 RS_Index ++;
275 2 else
276 2 RS_Index = 0;
277 2 break;
278 2
279 2 case 0x21: /* 帧头搜索*/
280 2 case 0x22:
281 2 case 0x23: if( RS_High == 0 )
282 2 RS_Index = 1;
283 2 else
284 2 RS_Index = 0;
285 2 break;
286 2
287 2 case 0x37: /* 帧尾搜索*/
288 2 case 0x38:
289 2 case 0x39: Error_Flag = 1;
290 2 if(( RS_Index == 33 ) && ( RS_High == 1 ))
291 2 if(( RS_CODE.KEY[0] == 0x1E ) && ( RS_CODE.KEY[1] == 0xE1 ))
292 2 if(( RS_CODE.KEY[2] ^ RS_CODE.KEY[3] ) == 0xFF )
293 2 {
294 3 KEY_DECODE = RS_CODE.KEY[3];
295 3 RS_Index = 50; /* 数据帧尾结束*/
296 3 KEY_DECODE_OK = 1;
297 3 Error_Flag = 0;
298 3 }
299 2 if( Error_Flag )
300 2 RS_Index = 0;
301 2 break;
302 2
303 2 case 0xF0: /* 重复按键译码*/
CX51 COMPILER x7.00 RS_MAIN 05/07/2006 20:40:55 PAGE 6
304 2 case 0xF1:
305 2 case 0xF2: if(( RS_High == 2 ) && ( RS_Index == 51 ))
306 2 {
307 3 RS_Index = 50;
308 3 KEY_DECODE_OK = 1; /* 重复按键*/
309 3 }
310 2 else
311 2 RS_Index = 0;
312 2 break;
313 2
314 2 default: RS_Index = 0; /* 误码,重新定帧*/
315 2 break;
316 2 }
317 1
318 1 /* 重新启动遥控器解码脉冲测量*/
319 1 RS_High = 0;
320 1 TH0 = 0;
321 1 TL0 = 0;
322 1 }
323
324
325 /********************************************************************/
326 /* 定时器中断0服务程序( 遥控解码) */
327 /********************************************************************/
328 void Interrupt_T0( void ) interrupt 1
329 {
330 1 RS_High++;
331 1 if( RS_High > ( IDLE_Cnt + 2 )) /* 1个单位为32.768ms */
332 1 {
333 2 Fresh_KEY_Flag = 1; /* 首次按键标志*/
334 2 RS_Index = 0;
335 2 RS_High = IDLE_Cnt + 2;
336 2 }
337 1 }
338
339 /********************************************************************/
340 /* 外部中断1服务程序( 10ms脉冲输入) */
341 /* 同时用于系统定时任务 */
342 /********************************************************************/
343 void Interrupt_INT1( void ) interrupt 2
344 {
345 1 /* 定时器复位,时间基准对齐*/
346 1 TimeSlot = PWM_INIT;
347 1 TH1 = 0xFE;
348 1 TL1 = 0x70;
349 1
350 1 /* 系统定时标志*/
351 1 System_Timer = 1;
352 1 }
353
354
355 /********************************************************************/
356 /* 定时器中断1服务程序( PWM 定时器) */
357 /********************************************************************/
358 void Interrupt_T1( void ) interrupt 3
359 {
360 1
361 1 unsigned char CH_Mirror;
362 1
363 1 /* 0.2ms定时器,PWM步长为0.2ms,占空比从2%起*/
364 1 TH1 = 0xFE;
365 1 TL1 = 0x70;
CX51 COMPILER x7.00 RS_MAIN 05/07/2006 20:40:55 PAGE 7
366 1
367 1 P1 = P1_Mirror; /*输出到端口*/
368 1
369 1 /* 计算各通道PWM 脉冲输出*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -