⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dsq_main.lst

📁 单片机控制RTC(DS1302)时钟程序
💻 LST
📖 第 1 页 / 共 4 页
字号:
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 + -