📄 dsq_main.lst
字号:
C51 COMPILER V6.12 DSQ_MAIN 03/11/2009 20:31:19 PAGE 9
490 2 led_scan_counter=0;
491 2 break;
492 2
493 2 }
494 1 led_scan_counter++;
495 1 if (led_scan_counter>16)
496 1 {led_scan_counter=1;}
497 1
498 1 }
499
500
501
502
503 void timer0() interrupt 1 using 3
504 {
505 1 TH0 =0x00;
506 1 TL0 =0x10;
507 1 ym_out();
508 1 light_on++;
509 1 }
510
511 void system_start()
512 {
513 1
514 1 EA=1; /**允许总中断**/
515 1
516 1 /**定时器0初始化:定时方式**/
517 1 TMOD=0x22; /**定时器0工作在模式1,**/
518 1 TCON=0x08;
519 1 TH0 =0x4c;
520 1 TL0 =0x4c;
521 1
522 1 TR0=1; /**启动定时器0**/
523 1 ET0=1; /**定时器0中断允许**/
524 1 }
525
526 void delay500ms()
527 {
528 1 uint l;
529 1 for (l=0;l<4000;l++)
530 1 {
531 2 _nop_();
532 2 }
533 1
534 1 }
535 void delay5000ms()
536 {
537 1 uint l;
538 1 for (l=0;l<30000;l++) //20000
539 1 {
540 2 _nop_();
541 2 }
542 1
543 1 }
544
545
546
547
548 /*********************************************************************/
549 /* 实时时钟模块 时钟芯片型号:DS1302 */
550 /*/
551 /*********************************************************************/
C51 COMPILER V6.12 DSQ_MAIN 03/11/2009 20:31:19 PAGE 10
552 sbit T_CLK = P1^0; /*实时时钟时钟线引脚 */
553 sbit T_IO = P1^1; /*实时时钟数据线引脚 */
554 sbit T_RST = P1^2; /*实时时钟复位线引脚 */
555 sbit ACC0 = ACC ^ 0;
556 sbit ACC7 = ACC ^ 7;
557
558 /********************************************************************
559 *
560 * 名称: v_RTInputByte
561 * 说明:
562 * 功能: 往DS1302写入1Byte数据
563 * 调用:
564 * 输入: ucDa 写入的数据
565 * 返回值: 无
566 ***********************************************************************/
567 void v_RTInputByte(uchar ucDa)
568 {
569 1 uchar i;
570 1 ACC = ucDa;
571 1 for(i=8; i>0; i--)
572 1 {
573 2 T_IO = ACC0; /*相当于汇编中的 RRC */
574 2 T_CLK = 1;
575 2 T_CLK = 0;
576 2 ACC = ACC >> 1;
577 2 }
578 1 }
579 /********************************************************************
580 *
581 * 名称: uchar uc_RTOutputByte
582 * 说明:
583 * 功能: 从DS1302读取1Byte数据
584 * 调用:
585 * 输入:
586 * 返回值: ACC
587 ***********************************************************************/
588 uchar uc_RTOutputByte(void)
589 {
590 1 uchar i;
591 1 for(i=8; i>0; i--)
592 1 {
593 2 ACC = ACC >>1; /*相当于汇编中的 RRC */
594 2 ACC7 = T_IO;
595 2 T_CLK = 1;
596 2 T_CLK = 0;
597 2 }
598 1 return(ACC);
599 1 }
600 /********************************************************************
601 *
602 * 名称: v_W1302
603 * 说明: 先写地址,后写命令/数据
604 * 功能: 往DS1302写入数据
605 * 调用: v_RTInputByte()
606 * 输入: ucAddr: DS1302地址, ucDa: 要写的数据
607 * 返回值: 无
608 ***********************************************************************/
609 void v_W1302(uchar ucAddr, uchar ucDa)
610 {
611 1 T_RST = 0;
612 1 T_CLK = 0;
613 1 T_RST = 1;
C51 COMPILER V6.12 DSQ_MAIN 03/11/2009 20:31:19 PAGE 11
614 1 v_RTInputByte(ucAddr); /* 地址,命令 */
615 1 v_RTInputByte(ucDa); /* 写1Byte数据*/
616 1 T_CLK = 1;
617 1 T_RST =0;
618 1 }
619 /********************************************************************
620 *
621 * 名称: uc_R1302
622 * 说明: 先写地址,后读命令/数据
623 * 功能: 读取DS1302某地址的数据
624 * 调用: v_RTInputByte() , uc_RTOutputByte()
625 * 输入: ucAddr: DS1302地址
626 * 返回值: ucDa :读取的数据
627 ***********************************************************************/
628 uchar uc_R1302(uchar ucAddr)
629 {
630 1 uchar ucDa;
631 1 T_RST = 0;
632 1 T_CLK = 0;
633 1 T_RST = 1;
634 1 v_RTInputByte(ucAddr); /* 地址,命令 */
635 1 ucDa = uc_RTOutputByte(); /* 读1Byte数据 */
636 1 T_CLK = 1;
637 1 T_RST =0;
638 1 return(ucDa);
639 1 }
640 /********************************************************************
641 *
642 * 名称: v_BurstW1302T
643 * 说明: 先写地址,后写数据(时钟多字节方式)
644 * 功能: 往DS1302写入时钟数据(多字节方式)
645 * 调用: v_RTInputByte()
646 * 输入: pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
647 * 8Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B 1B
648 * 返回值: 无
649 ***********************************************************************/
650 void v_BurstW1302T(uchar *pSecDa)
651 {
652 1 uchar i;
653 1 v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
654 1 T_RST = 0;
655 1 T_CLK = 0;
656 1 T_RST = 1;
657 1 v_RTInputByte(0xbe); /* 0xbe:时钟多字节写命令 */
658 1 for (i=8;i>0;i--) /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/
659 1 {
660 2 v_RTInputByte(*pSecDa);/* 写1Byte数据*/
661 2 pSecDa++;
662 2 }
663 1 T_CLK = 1;
664 1 T_RST =0;
665 1 }
666 /********************************************************************
667 *
668 * 名称: v_BurstR1302T
669 * 说明: 先写地址,后读命令/数据(时钟多字节方式)
670 * 功能: 读取DS1302时钟数据
671 * 调用: v_RTInputByte() , uc_RTOutputByte()
672 * 输入: pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年
673 * 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
674 * 返回值: ucDa :读取的数据
675 ***********************************************************************/
C51 COMPILER V6.12 DSQ_MAIN 03/11/2009 20:31:19 PAGE 12
676 void v_BurstR1302T(uchar *pSecDa)
677 {
678 1 uchar i;
679 1 T_RST = 0;
680 1 T_CLK = 0;
681 1 T_RST = 1;
682 1 v_RTInputByte(0xbf); /* 0xbf:时钟多字节读命令 */
683 1 for (i=8; i>0; i--)
684 1 {
685 2 *pSecDa = uc_RTOutputByte(); /* 读1Byte数据 */
686 2 pSecDa++;
687 2 }
688 1 T_CLK = 1;
689 1 T_RST =0;
690 1 }
691 /********************************************************************
692 *
693 * 名称: v_BurstW1302R
694 * 说明: 先写地址,后写数据(寄存器多字节方式)
695 * 功能: 往DS1302寄存器数写入数据(多字节方式)
696 * 调用: v_RTInputByte()
697 * 输入: pReDa: 寄存器数据地址
698 * 返回值: 无
699 ***********************************************************************/
700 void v_BurstW1302R(uchar *pReDa)
701 {
702 1 uchar i;
703 1 v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
704 1 T_RST = 0;
705 1 T_CLK = 0;
706 1 T_RST = 1;
707 1 v_RTInputByte(0xfe); /* 0xbe:时钟多字节写命令 */
708 1 for (i=31;i>0;i--) /*31Byte 寄存器数据 */
709 1 {
710 2 v_RTInputByte(*pReDa); /* 写1Byte数据*/
711 2 pReDa++;
712 2 }
713 1 T_CLK = 1;
714 1 T_RST =0;
715 1 }
716 /********************************************************************
717 *
718 * 名称: uc_BurstR1302R
719 * 说明: 先写地址,后读命令/数据(寄存器多字节方式)
720 * 功能: 读取DS1302寄存器数据
721 * 调用: v_RTInputByte() , uc_RTOutputByte()
722 * 输入: pReDa: 寄存器数据地址
723 * 返回值: 无
724 ***********************************************************************/
725 void v_BurstR1302R(uchar *pReDa)
726 {
727 1 uchar i;
728 1 T_RST = 0;
729 1 T_CLK = 0;
730 1 T_RST = 1;
731 1 v_RTInputByte(0xff); /* 0xbf:时钟多字节读命令 */
732 1 for (i=31; i>0; i--) /*31Byte 寄存器数据 */
733 1 {
734 2 *pReDa = uc_RTOutputByte(); /* 读1Byte数据 */
735 2 pReDa++;
736 2 }
737 1 T_CLK = 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -