📄 main.lst
字号:
284 2 {
285 3 recnum = 0; //全部清空
286 3 // 开中断返回主程序,等待接收下一个数据
287 3 }
288 2 loop1: //结束处理流程
289 2 enable(); //开中断返回
290 2 }
291 1
292 1 //如果是发送中断
293 1 if (TI)
294 1 {
295 2 TI = 0; //清除发送中断
296 2 }
297 1
298 1 }
299
300 //ADC initialize
301 // Conversion time: 48uS
302 void adc_init(void)
303 {
C51 COMPILER V8.08 MAIN 04/06/2012 21:53:17 PAGE 6
304 1 P1ASF = 0x00; //P1.0用作AD转换
305 1 //转换结果清零
306 1 ADC_RES = 0;
307 1 ADC_RESL = 0;
308 1
309 1 //ADC_POWER=1,SPEED1=0,SPEED0=0,
310 1 //ADC_FLAG=0,ADC_START=0,CHS2/CHS1/CHS0=000
311 1 //11.0592MHz,540个时钟周期转换一次,速度约125KHz,时间约 48us
312 1 ADC_CONTR = 0X80;
313 1 //等待4周期
314 1 _nop_();
315 1 _nop_();
316 1 _nop_();
317 1 _nop_();
318 1 //ADRJ = 0,ADC_RES寄存器保存10位A/D转换结果的高8位,ADC_RESL保存结果的低2位
319 1 AUXR1 &= 0xfb;
320 1 }
321
322 //AD转换中断
323 void ADC_interrupt() interrupt 5
324 {
325 1 ADC_CONTR &= 0Xef; //ADC_FLAG清零
326 1 //计算电压值
327 1 ad_result10 = ADC_RES;
328 1 ad_result10 = ( ad_result10 << 2 ) | ADC_RESL;
329 1
330 1 f_adconverting = 0;
331 1 }
332
333
334 //call this routine to initialize all peripherals
335 void init_devices(void)
336 {
337 1 char i=0;
338 1 //stop errant interrupts until set up
339 1 _nop_();
340 1 _nop_();
341 1 _nop_();
342 1 _nop_();
343 1 _nop_();
344 1 EA = 0; //disable all interrupts
345 1 port_init();
346 1 watchdog_init(); //设置且启动看门狗
347 1 timer0_init();
348 1 timer1_init();
349 1 uart0_init();
350 1 adc_init();
351 1
352 1 PCON &= 0xfd; //关闭power down模式,PD位置0
353 1
354 1 //all peripherals are now initialized
355 1 //按键清零
356 1 ty=0;
357 1 qq=0;
358 1 fd=0;
359 1 key0=0;
360 1 key1=0;
361 1 //时间、计数清零
362 1 time=0;
363 1 time_m=0;
364 1 time_f=0;
365 1 cnt=0;
C51 COMPILER V8.08 MAIN 04/06/2012 21:53:17 PAGE 7
366 1
367 1 //状态清零
368 1 f_start=0;
369 1 f_sleep=0;
370 1 f_volt=0;
371 1 f_adconverting = 0;
372 1
373 1 readset();//读取本机地址
374 1 me=addr;
375 1 WDR(); //喂狗
376 1
377 1 //刚上电,AD不准,多检查一次
378 1 checkpower(); //检查电源
379 1 WDR();
380 1 checkpower();
381 1 WDR();
382 1
383 1 if (vin<1.75) //如果需要充电
384 1 {
385 2 //灯全关
386 2 d_vote = 1;
387 2 P3 |= 0xe0;
388 2 for (i=0;i<5;i++)
389 2 { //闪烁5次d_vote
390 3 d_vote=0; //亮d_vote
391 3 msdelay(500);
392 3 WDR();
393 3 d_vote=1; //灭d_vote
394 3 msdelay(500);
395 3 WDR(); //喂狗
396 3 }
397 2 }
398 1 }
399
400
401 void main(void)
402 {
403 1 int i;
404 1
405 1 init_devices();
406 1 //insert your functional code here...
407 1 EA = 1; //开总中断
408 1
409 1 while(1)
410 1 {
411 2 //关INT0 INT1中断
412 2 IE &= 0xfa; //111 1010
413 2 WDR();
414 2 if (recnum>5) //任意时刻接收计数器大于5,清零
415 2 {
416 3 recnum=0;
417 3 }
418 2
419 2 if (f_sleep==1) //休眠标
420 2 {
421 3 msdelay(10);
422 3 f_start=0;
423 3 f_sleep=0;
424 3 sleep(); //休眠power down
425 3 }
426 2
427 2 if (f_volt==1) //低电提示
C51 COMPILER V8.08 MAIN 04/06/2012 21:53:17 PAGE 8
428 2 {
429 3 f_volt=0;
430 3 //灯全关
431 3 d_vote = 1;
432 3 P3 |= 0xe0;
433 3 for (i=0;i<5;i++)
434 3 {
435 4 //闪烁5次d_vote
436 4 d_vote=0; //亮d_vote
437 4 msdelay(500);
438 4 WDR();
439 4 d_vote=1; //灭d_vote
440 4 msdelay(500);
441 4 WDR(); //喂狗
442 4 }
443 3 }
444 2
445 2 //---------------------------------------------------
446 2 if (s1==0) //按键S1 P3.4 同意
447 2 {
448 3 ty++;
449 3 time_f=0;
450 3 msdelay(10);
451 3 if ((s1==0) && (ty==1))
452 3 {
453 4 offled(1); //点亮D1,关闭D2、D3
454 4 time=0;
455 4 if (f_start==1) //如果是投票状态
456 4 {
457 5 key0=1;
458 5 }
459 4 key1++; //按键次数加1
460 4 if(key1>3)
461 4 {
462 5 key1=0; //按三次
463 5 }
464 4 }
465 3 }
466 2 else
467 2 {
468 3 ty=0;
469 3 }
470 2 //----------------------------------------------------
471 2 if ((s2==0)&(s1=1))//s2按下,s1未按,key0=3
472 2 {
473 3 qq++;
474 3 time_f=0;
475 3 msdelay(10);
476 3 if ((s2==0)&(s1=1) & (qq==1))
477 3 {
478 4 offled(2);//点亮D2,关闭D1、D3
479 4 time=0;
480 4 if (f_start==1) key0=3;
481 4 if ((key1>2)&(key1<5))
482 4 {
483 5 key1++; //同意按三次后弃权按过2次
484 5 }
485 4 else key1=0;
486 4 }
487 3 }
488 2 else
489 2 {
C51 COMPILER V8.08 MAIN 04/06/2012 21:53:17 PAGE 9
490 3 qq=0;
491 3 }
492 2 //--------------------------------------------------------
493 2 if (s3==0) //s3按下,key0=2
494 2 {
495 3 fd++;
496 3 time_f=0;
497 3 msdelay(10);
498 3 if ((s3==0) && (fd==1))
499 3 {
500 4 offled(3); //点亮D3,关闭D2、D1
501 4 if (f_start==1) key0=2;
502 4 time=0;
503 4 d3=1; //关d3
504 4 if ((key1>4)&(key1<8))
505 4 {
506 5 key1++; //之后反对按3下
507 5 }
508 4 else key1=0;
509 4 }
510 3 if(key1==8) //按第3下反对 一整套进入工厂模式动作做完
511 3 {
512 4 REN=1; //允许串口接收
513 4 key1=0;
514 4 //offled(1);
515 4 key0=12; //key0=12,编地址状态
516 4 }
517 3 }
518 2 else
519 2 {
520 3 fd=0;
521 3 }
522 2 //-------------------------------------------------
523 2 if(key0==12) //工厂模式
524 2 {
525 3 //从下往上循环亮灯
526 3 //灯全关
527 3 d_vote = 1;
528 3 P3 |= 0xe0;
529 3 d3=0; //开d3
530 3 msdelay(500);
531 3 WDR();
532 3 d3=1; //关d3
533 3 d2=0;
534 3 msdelay(500);
535 3 WDR(); //喂狗
536 3 d2=1;
537 3 d1=0;
538 3 msdelay(500);
539 3 WDR();
540 3 d1=1;
541 3 d_vote=0;
542 3 msdelay(500);
543 3 WDR(); //喂狗
544 3 d_vote=1;
545 3
546 3 time_m++;
547 3 }
548 2 if ((key0==12) && (time_m>5)) //循环超过5次
549 2 {
550 3 key0=0;
551 3 time_m=0;
C51 COMPILER V8.08 MAIN 04/06/2012 21:53:17 PAGE 10
552 3 //灯全关
553 3 d_vote = 1;
554 3 P3 |= 0xe0;
555 3 }
556 2 }
557 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 3686 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 39 25
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -