📄 控制系统.lst
字号:
482
483 /*延时(一次10个机器周期不等) 参数格式:延时数*/
484 void delay(unsigned int det)
485 {
486 1 while(det--);
487 1 }
488
489
C51 COMPILER V8.02 縚制系统 08/08/2008 18:31:54 PAGE 9
490
491 /*1s延时*/
492 void delay_pw()
493 {
494 1 delay(60000);
495 1 delay(60000);
496 1 }
497
498
499 /*6个周期 6us */
500 void delay_b20(uchar n)
501 {
502 1 while(n--);
503 1 }
504
505
506
507 /*主时钟中断处理*/
508 void time0_isr(void) interrupt TF0_VECTOR using 1
509 {
510 1 TR0=0;
511 1 TL0=(time_count&0x00FF);
512 1 TH0=(time_count>>8);
513 1 TR0=1;
514 1 if(--time_tick) return;
515 1 time_tick=20;
516 1 t0_isr=1;
517 1 if(nba_tim&!oth_run) // 当在篮球器界面时 nba_tim==1、oth_run==0
518 1 {
519 2 if(resu[3]==0)
520 2 {
521 3 resu[3]=59;
522 3 if(resu[2]>0) resu[2]--;
523 3 }
524 2 else resu[3]--;
525 2 if(resu[2]==0&resu[3]==0) // 比赛时间到后停止
526 2 {
527 3 TR0=0;TR1=0;EA=0;
528 3 }
529 2 return;
530 2 }
531 1 if((++temp_min)==60) // 实现温度的更新
532 1 {
533 2 temp_min=0;
534 2 temp_delay--;
535 2 if(temp_delay==0)
536 2 {
537 3 b20time=1;temp_delay=5;
538 3 }
539 2 }
540 1 }
541
542
543 /*24时钟中断处理*/
544 void time1_isr(void) interrupt TF1_VECTOR using 2
545 {
546 1 TR1=0;
547 1 TL1=(time_count&0x00FF);
548 1 TH1=(time_count>>8);
549 1 TR1=1;
550 1 if(--time_tick1) return;
551 1 time_tick1=20;
C51 COMPILER V8.02 縚制系统 08/08/2008 18:31:54 PAGE 10
552 1 if(resu[4]>0)resu[4]--; // 篮球器24秒中断
553 1 t0_isr=1;
554 1 if(resu[4]==0)
555 1 { TR0=0;TR1=0;EA=0;}
556 1 }
557
558
559 /*定时器初始化*/
560 void time_init()
561 {
562 1 EA=0;
563 1 TR0=0;
564 1 TR1=0;
565 1 TMOD=0x11;
566 1 TL0=(time_count&0x00FF);
567 1 TH0=(time_count>>8);
568 1 TL1=(time_count&0x00FF);
569 1 TH1=(time_count>>8);
570 1 IE=0;
571 1 ET0=1;
572 1 ET1=1;
573 1 }
574
575
576
577 /*=====================================================================================
578 函数名称:LCD驱动
579 功能描述:基本驱动(写1个字节、清屏、初始化)
580 全局变量:无
581 参数说明:dat_comm(0:命令 1:数据),content(数值)
582 返回说明:无返回值
583 设 计 人:LIJH
584 版 本:1.0
585 说 明:
586 ======================================================================================*/
587
588
589 /*检查忙碌位*/
590 void chk_busy (void)
591 {
592 1 lcd_data = 0xff;
593 1 lcd_rs = 0; // 命令
594 1 lcd_rw = 1; // 读
595 1 lcd_e = 1;
596 1 while(busy==1);
597 1 lcd_e = 0;
598 1 }
599
600
601 /*写LCD 参数格式:0:命令,1:数值 ,数据*/
602 void wr_lcd (uchar dat_comm,uchar content)
603 {
604 1 chk_busy ();
605 1 lcd_rs=dat_comm;
606 1 lcd_rw = 0; // 写
607 1 lcd_data=content; // 输出数据或命令
608 1 lcd_e=1;
609 1 lcd_e=0;
610 1 }
611
612
613 /*清绘图*/
C51 COMPILER V8.02 縚制系统 08/08/2008 18:31:54 PAGE 11
614 void clrgdram(void)
615 {
616 1 uchar i,j;
617 1 for(j=0;j<32;j++)
618 1 {
619 2 wr_lcd(comm,0x34);
620 2 wr_lcd(comm,0x80+j);
621 2 wr_lcd(comm,0x80);
622 2 wr_lcd(comm,0x30);
623 2 for(i=0;i<32;i++)
624 2 wr_lcd(dat,0x00); // 写入0x00
625 2 }
626 1 wr_lcd(comm,0x36);
627 1 }
628
629
630 /*清除显示*/
631 void clear_dis(void)
632 {
633 1 wr_lcd(comm,0x30);
634 1 wr_lcd(comm,0x01); // 清屏,地址指针指向00H
635 1 clrgdram(); // 请绘图RAM
636 1 }
637
638
639
640 /*开机LCD初始化*/
641 void init_lcd (void)
642 {
643 1 lcd_rst=1;
644 1 wr_lcd(comm,0x30); // 30---基本指令动作
645 1 wr_lcd(comm,0x06); // 光标的移动方向
646 1 wr_lcd(comm,0x0c); // 开显示,关游标
647 1 clear_dis();
648 1 }
649
650
651
652
653
654 /*=====================================================================================
655 函数名称:DS1302驱动
656 功能描述:基本驱动(读写数据、读写日期,时间、初始化)
657 全局变量:无
658 参数说明:w_adder(写地址),r_adder(读地址),w_data(写入数据)
659 返回说明:返回读取的数据
660 设 计 人:LIJH
661 版 本:1.0
662 说 明:上升沿写入数值,下降沿读出数值,没用设立后背电池充电
663 ======================================================================================*/
664
665
666 /*向1302写数据 参数格式:地址,数据*/
667 void w1302(uchar w_adder,uchar w_data)
668 {
669 1 uchar d;
670 1 ret_ds1302();
671 1 for(d=0;d<16;d++)
672 1 {
673 2 if(d==8) w_adder=w_data;
674 2 d02_data=(bit)(w_adder&0x01);
675 2 d02_sclk=0; // 上升沿
C51 COMPILER V8.02 縚制系统 08/08/2008 18:31:54 PAGE 12
676 2 w_adder>>=1;
677 2 d02_sclk=1;
678 2 }
679 1 end_ds1302();
680 1 }
681
682
683
684 /*接收1302一个字节的数据 参数格式:读地址*/
685 uchar r1302(uchar r_adder)
686 {
687 1 uchar d=0;
688 1 ret_ds1302();
689 1 for(d=0;d<8;d++) // 写地址
690 1 {
691 2 d02_data=(bit)(r_adder&0x01);
692 2 d02_sclk=0;
693 2 r_adder>>=1;
694 2 d02_sclk=1;
695 2 }
696 1 r_adder=0;
697 1 for(d=0;d<8;d++) // 读数据
698 1 {
699 2 d02_data=1;
700 2 d02_sclk=1; // 下降沿
701 2 r_adder>>=1;
702 2 d02_sclk=0;
703 2 if(d02_data) r_adder|=0x80;
704 2 }
705 1 end_ds1302();
706 1 return(r_adder);
707 1 }
708
709
710
711 /*写入时间与日期*/
712 void wds1302_time_date(void)
713 {
714 1 w1302(d02_wrc,0x00); // 写允许
715 1 w1302(0x90,0xa5); // 单二极管2K电阻充电
716 1 w1302(d02_year,today.year); // 年
717 1 w1302(d02_weeks,today.week); // 星期
718 1 w1302(d02_month,today.month); // 月
719 1 w1302(d02_day,today.day); // 日
720 1 w1302(d02_hour,0x7f&now.hour); // 时
721 1 w1302(d02_minute,now.minute); // 分
722 1 w1302(d02_second,0x7f&now.second); // 秒
723 1 w1302(d02_wrc,0x80); // 写禁止
724 1 }
725
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -