📄 wxbj.lst
字号:
300 1 P2=act[m];
301 1 }
302
303 /****************************************/
C51 COMPILER V7.06 WXBJ 11/18/2005 20:24:48 PAGE 6
304 void dis_adjT2_st(uchar m) //显示T3调整及设定
305 {
306 1 switch(m)
307 1 {case 0:{P0=SEG7[T2min_st%10];}break;
308 2 case 1:{P0=SEG7[T2min_st/10];}break;
309 2 case 2:{P0=SEG7[T2hou_st%10];}break;
310 2 case 3:{P0=SEG7[T2hou_st/10];}break;
311 2 case 4:{P0=0x00;}break;
312 2 case 5:{P0=0x00;}break;
313 2 case 6:{P0=SEG7[3];}break;
314 2 case 7:{P0=0x31;}break;
315 2 default:break;
316 2 }
317 1 if(!T2_startflag) P0_7=1;
318 1 else P0_7=0;
319 1 P2=act[m];
320 1 }
321
322 /**************************************/
323 void dis_adjT2_end(uchar m) //显示T4调整及设定
324 {
325 1 switch(m)
326 1 {case 0:{P0=SEG7[T2min_end%10];}break;
327 2 case 1:{P0=SEG7[T2min_end/10];}break;
328 2 case 2:{P0=SEG7[T2hou_end%10];}break;
329 2 case 3:{P0=SEG7[T2hou_end/10];}break;
330 2 case 4:{P0=0x00;}break;
331 2 case 5:{P0=0x00;}break;
332 2 case 6:{P0=SEG7[4];}break;
333 2 case 7:{P0=0x31;}break;
334 2 default:break;
335 2 }
336 1 if(!T2_endflag) P0_7=1;
337 1 else P0_7=0;
338 1 P2=act[m];
339 1 }
340
341 /***************************************/
342 void dis_adjALMtime(uchar m) // 显示报警时间调整1~59及设定
343 {
344 1 switch(m)
345 1 {case 0:{P0=SEG7[ALMmin%10];}break;
346 2 case 1:{P0=SEG7[ALMmin/10];}break;
347 2 case 2:{P0=0x00;}break;
348 2 case 3:{P0=0x00;}break;
349 2 case 4:{P0=0x00;}break;
350 2 case 5:{P0=0x00;}break;
351 2 case 6:{P0=0X38;}break;
352 2 case 7:{P0=0x77;}break;
353 2 default:break;
354 2 }
355 1 P0_7=1;
356 1 P2=act[m];
357 1 }
358
359 /************************************/
360 /*时、分、秒计时单元转换*/
361 void conv()
362 {
363 1 if(deda<=5)d_05s=0;
364 1 else d_05s=1;
365 1 if(deda>=10){sec++;deda=0;}
C51 COMPILER V7.06 WXBJ 11/18/2005 20:24:48 PAGE 7
366 1
367 1 if(sec>=60){min++;sec=0;if(ALMstart)ALMmin--;}//若报警标志启动,则报警时间递
368 1 //减
369 1 if(ALMmin==0){ALMstart=0;rdflag=0;}// 若报警时间减为0,则关闭报警标志
370 1
371 1 if(min>=60){hou++;min=0;}
372 1 if(hou>=24){day++;hou=0;}
373 1 switch(mon)
374 1 {case 1:if(day>31){mon++;day=1;}break;// 万年历计算
375 2 case 2:if(day>28){mon++;day=1;}break;
376 2 case 3:if(day>31){mon++;day=1;}break;
377 2 case 4:if(day>30){mon++;day=1;}break;
378 2 case 5:if(day>31){mon++;day=1;}break;
379 2 case 6:if(day>30){mon++;day=1;}break;
380 2 case 7:if(day>31){mon++;day=1;}break;
381 2 case 8:if(day>31){mon++;day=1;}break;
382 2 case 9:if(day>30){mon++;day=1;}break;
383 2 case 10:if(day>31){mon++;day=1;}break;
384 2 case 11:if(day>30){mon++;day=1;}break;
385 2 case 12:if(day>31){mon++;day=1;}break;
386 2 default:break;
387 2 }
388 1 if(mon>12)mon=1;
389 1 }
390
391 /****************主程序*******************/
392 void main()
393 { init();//初始化
394 1 while(1)// 无限循环
395 1 {
396 2 scankey();//扫描按键
397 2 reset()//看门狗复位
398 2 conv();//时间计算及转换
399 2 IO_fnc();//报警触发处理
400 2 pdT();}//判断定时输出
401 1 }
402
403 /************************/
404 void pdT(void)// 判断定时输出子函数
405 {reset()
406 1 //---------------------------------
407 1 if(T1_startflag){// 若T1标志启动
408 2 if((T1min_st==min)&&(T1hou_st==hou)) {out_P3_1=0;}// 若定时时与分到
409 2 P3_1=out_P3_1;}// 输出激活
410 1 if(T1_endflag){// 若T2标志启动
411 2 if((T1min_end==min)&&(T1hou_end==hou)) {out_P3_1=1;}// 若定时时与分到
412 2 P3_1=out_P3_1;}// 输出关闭
413 1 //---------------------------------------------
414 1 if(T2_startflag){// 若T3标志启动
415 2 if((T2min_st==min)&&(T2hou_st==hou)) {out_P1_2=0;}// 若定时时与分到
416 2 P1_2=out_P1_2;}// 输出激活
417 1 if(T2_endflag){// 若T4标志启动
418 2 if((T2min_end==min)&&(T2hou_end==hou)) {out_P1_2=1;}// 若定时时与分到
419 2 P1_2=out_P1_2;}// 输出关闭
420 1 //---------------------------------------------
421 1 if(ALMstart){if(ALMmin>0)P3_0=0;}// 启动报警喇叭
422 1 else P3_0=1;
423 1 }
424
425 /**********************************/
426 void scankey()//扫描按键子函数
427 {
C51 COMPILER V7.06 WXBJ 11/18/2005 20:24:48 PAGE 8
428 1 if((MS==0)||(MS==10))EX0=1;else EX0=0;// 若模式为0或10,打开外中断0
429 1 if(MS<7)// 若模式小于7
430 1 {
431 2 if(!MSKEY){MS++;delay(300);if(MS==7)MS=0;}// 调整模式
432 2 if(MS==1){
433 3 if(!MONKEY){mon++;if(mon>12)mon=1;delay(300);}// 调整月
434 3 if(!DAYKEY){day++;if(day>31)day=1;delay(300);}// 调整天
435 3 if(!HOUKEY){hou++;if(hou>23)hou=0;delay(300);}// 调整时
436 3 if(!MINKEY){min++;if(min>=60)min=0;delay(300);}// 调整分
437 3 }
438 2 if(MS==2){// 调整定时T1
439 3 if(!HOUKEY){T1hou_st++;if(T1hou_st>23)T1hou_st=0;delay(300);}
440 3 if(!MINKEY){T1min_st++;if(T1min_st>=60)T1min_st=0;delay(300);}
441 3 if(!CHECKKEY){T1_startflag=!T1_startflag;delay(300);}// 启动T1
442 3 }
443 2 if(MS==3){// 调整定时T2
444 3 if(!HOUKEY){T1hou_end++;if(T1hou_end>23)T1hou_end=0;delay(300); }
445 3 if(!MINKEY){T1min_end++;if(T1min_end>=60)T1min_end=0;delay(300);}
446 3 if(!CHECKKEY){T1_endflag=!T1_endflag;delay(300);}// 启动T2
447 3 }
448 2 if(MS==4){// 调整定时T3
449 3 if(!HOUKEY){T2hou_st++;if(T2hou_st>23)T2hou_st=0;delay(300);}
450 3 if(!MINKEY){T2min_st++;if(T2min_st>=60)T2min_st=0;delay(300);}
451 3 if(!CHECKKEY){T2_startflag=!T2_startflag;delay(300);}// 启动T3
452 3 }
453 2 if(MS==5){// 调整定时T4
454 3 if(!HOUKEY){T2hou_end++;if(T2hou_end>23)T2hou_end=0;delay(300); }
455 3 if(!MINKEY){T2min_end++;if(T2min_end>=60)T2min_end=0;delay(300);}
456 3 if(!CHECKKEY){T2_endflag=!T2_endflag;delay(300);}// 启动T4
457 3 }
458 2 if(MS==6){// 调整报警时间
459 3 if(!rdflag){ALMmin=rd_24c01(6);rdflag=1;}// 若尚未从24C01中6号单元读出
460 3 //报警时间,则读一次
461 3 if(!MINKEY){delay(30);if(!MINKEY)ALMmin++;if(ALMmin>59)ALMmin=1;delay(300);}
462 3 if(!CHECKKEY){ ALMmin_iicflag=1;delay(300);}// 将调整后的报警时间再写
463 3 //入6号单元
464 3 if(ALMmin_iicflag){EA=0;P0_7=0;wr_24c01(6,ALMmin);delay_iic(250);EA=1;
465 4 delay(2000);ALMmin_iicflag=0;}else P0_7=1;
466 3 }
467 2 }
468 1 }
469
470 /**************查询报警的历史记录子函数****************/
471 void extern_zd0(void) interrupt 0 using 0
472 {EA=0;
473 1 MS=10;P0=0x00;P2=0xff;// 置模式10
474 1 if(!checkflag){iic_cnt=rd_24c01(5);delay_iic(250);
475 2 y=iic_cnt;x=y*4;checkflag=1;}
476 1
477 1 ALMadd=rd_24c01(x);delay_iic(250);
478 1 temp_day=rd_24c01(x+1);delay_iic(250);
479 1 temp_hou=rd_24c01(x+2);delay_iic(250);
480 1 temp_min=rd_24c01(x+3);delay_iic(250);
481 1 y--;
482 1 memoryoverflag=rd_24c01(7);delay_iic(250);
483 1 if(y==1){if(memoryoverflag==55)y=31;else y=iic_cnt;}
484 1 x=y*4;EA=1;delay(500);
485 1 }
486 /************************************************************************/
487 /**********以下为24C01的读写子函数*************/
488 /*************************************************************************/
489 #include <AT89X55.H>
C51 COMPILER V7.06 WXBJ 11/18/2005 20:24:48 PAGE 9
490 #include <intrins.H>
491 #define uchar unsigned char
492 #define uint unsigned int
493 sbit SDA=P1^0;
494 sbit SCL=P1^1;
495 //sfr WDT=0xa6;
496 //#define reset() {WDT=0x1e;WDT=0xe1;}
497 bdata char com_data;
498 sbit mos_bit=com_data^7;
499 sbit low_bit=com_data^0;
500 uchar data display_buffer[10];
501 void delay_iic(int n);
502 uchar rd_24c01(char a);
503 void wr_24c01(char a,char b);
504 //***************************
505
506 //***************************************
507 void start()//启动读写时序
508 {
509 1 SDA=1;_nop_();_nop_();_nop_();_nop_();
510 1 SCL=1;_nop_();_nop_();_nop_();_nop_();
511 1 SDA=0;_nop_();_nop_();_nop_();_nop_();
512 1 SCL=0;_nop_();_nop_();_nop_();_nop_();
513 1 }
514 //*****************************************
515 void stop()//停止操作
516 {
517 1 SDA=0;_nop_();_nop_();_nop_();_nop_();
518 1 SCL=1;_nop_();_nop_();_nop_();_nop_();
519 1 SDA=1;_nop_();_nop_();_nop_();_nop_();
520 1 }
521 //***********************
522 void ack()//应答
523 {
524 1 SCL=1;_nop_();_nop_();_nop_();_nop_();
525 1 SCL=0;_nop_();_nop_();_nop_();_nop_();
526 1 }
527 //***********************
528 void shift8(char a)//8位移位输出
529 {
530 1 data uchar i;
531 1 com_data=a;
532 1 for(i=0;i<8;i++)
533 1 {
534 2 SDA=mos_bit;
535 2 SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
536 2 SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
537 2 com_data=com_data*2;
538 2 }
539 1 }
540 //******************
541 uchar rd_24c01(char a)//读24C01A中a地址单元的数据
542 {
543 1 data uchar i,command;
544 1 SDA=1;_nop_();_nop_();_nop_();_nop_();
545 1 SCL=0;_nop_();_nop_();_nop_();_nop_();
546 1 start();
547 1 command=160;
548 1 shift8(command);
549 1 ack();
550 1 shift8(a);
551 1 ack();
C51 COMPILER V7.06 WXBJ 11/18/2005 20:24:48 PAGE 10
552 1 start();
553 1 command=161;
554 1 shift8(command);
555 1 ack();
556 1 SDA=1;_nop_();_nop_();_nop_();_nop_();
557 1 for(i=0;i<8;i++)
558 1 {
559 2 com_data=com_data*2;
560 2 SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
561 2 low_bit=SDA;
562 2 SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
563 2 }
564 1 stop();
565 1 return(com_data);
566 1 }
567 //*****************
568 void wr_24c01(char a,char b)//将RAM中b地址单元的数据写入24C01A中a地址单元中
569 {
570 1 data uchar command;
571 1 _nop_();_nop_();_nop_();_nop_();_nop_();
572 1 SDA=1;_nop_();_nop_();_nop_();_nop_();
573 1 SCL=0;_nop_();_nop_();_nop_();_nop_();
574 1 start();
575 1 command=160;
576 1 shift8(command);
577 1 ack();
578 1 shift8(a);
579 1 ack();
580 1 shift8(b);
581 1 ack();
582 1 stop();
583 1 _nop_();_nop_();_nop_();_nop_();_nop_();
584 1 }
585 //***************
586 void delay_iic(int n)// 延时
587 {
588 1 int i;
589 1 for(i=1;i<n;i++){reset();}
590 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 2671 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 56 1
IDATA SIZE = ---- ----
BIT SIZE = 13 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -