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

📄 ds1302.lst

📁 51单片机驱动的LED点阵万年历显示
💻 LST
字号:
C51 COMPILER V8.16   DS1302                                                                12/25/2008 19:46:19 PAGE 1   


C51 COMPILER V8.16, COMPILATION OF MODULE DS1302
OBJECT MODULE PLACED IN .\bin\ds1302.obj
COMPILER INVOKED BY: C:\Program Files\Keil\C51\BIN\C51.EXE src\ds1302.c ROM(COMPACT) BROWSE DEBUG OBJECTEXTEND PRINT(.\b
                    -in\ds1302.lst) OBJECT(.\bin\ds1302.obj)

line level    source

   1          #include<reg52.h>
   2          #include<rtx51tny.h>
   3          #include"inc/define.h"
   4          #include"inc/ds1302.h"
   5          
   6          sbit rtc_rst=P1^5;
   7          sbit rtc_clk=P1^6;
   8          sbit rtc_io=P1^7;
   9          sbit ACC_0=ACC^0;
  10          sbit ACC_7=ACC^7;
  11          
  12          extern vu8 idata for_showh[6];  
  13          extern vu8 idata for_showl[6];                                                                  
  14          extern vu8 idata week_tempert[8];
  15          
  16          
  17          vu8 nowTime[7][2];
  18          
  19          
  20          /*********************************************************
  21          *将获取的当前时间、日期设置为待显示数据
  22          *函数名称:setTimeShowData()
  23          *说明:这是一个RTX51任务,os_create_task(2)之后开始运行
  24          *********************************************************/
  25          void setTimeShowData(void ) _task_ 3    
  26          {
  27   1              
  28   1      
  29   1              while(1)
  30   1              {
  31   2                      getTime(nowTime);
  32   2              
  33   2                      for_showh[0]=nowTime[6][1];             //设置年
  34   2                      for_showh[1]=nowTime[6][0];
  35   2                      for_showh[2]=nowTime[4][1];             //设置月
  36   2                      for_showh[3]=nowTime[4][0];
  37   2                      for_showh[4]=nowTime[3][1];             //设置日
  38   2                      for_showh[5]=nowTime[3][0];
  39   2                      
  40   2                      if(!(nowTime[2][1] & 0x08))             //24时制
  41   2                              for_showl[0]=(nowTime[2][1] & 0x03);    //设置时
  42   2                      else                                                    //12时制
  43   2                              for_showl[0]=(nowTime[2][1] & 0x01);    //设置时
  44   2                      for_showl[1]=nowTime[2][0];
  45   2                      for_showl[2]=nowTime[1][1];             //设置分
  46   2                      for_showl[3]=nowTime[1][0];
  47   2                      for_showl[4]=nowTime[0][1];             //设置秒
  48   2                      for_showl[5]=nowTime[0][0];
  49   2                              
  50   2                      week_tempert[2]=nowTime[5][0];  //设置周                
  51   2                      os_wait(K_TMO,4,0);
  52   2              }
  53   1      }
  54          
C51 COMPILER V8.16   DS1302                                                                12/25/2008 19:46:19 PAGE 2   

  55          
  56          
  57          /*********************************************************************
  58          *向DS1302输入一个字节
  59          *函数名称:DS1302_inputByte()
  60          *说明:从低位开始传输
  61          **********************************************************************/
  62          void DS1302_inputByte(u8 byte)
  63          {
  64   1              u8 i;
  65   1              ACC=byte;
  66   1      
  67   1              for(i=8;i>0;i--)
  68   1              {
  69   2                      rtc_io=ACC_0;
  70   2                      rtc_clk=1;      //上升沿写入一位数据
  71   2                      rtc_clk=0;
  72   2                      ACC=ACC>>1;
  73   2              }
  74   1      }
  75          
  76          
  77          /*********************************************************************
  78          *从DS1302读出一个字节
  79          *函数名称:DS1302_output()
  80          *说明:从地位开始传输
  81          **********************************************************************/
  82          u8 DS1302_outputByte()
  83          {
  84   1              u8 i;
  85   1      
  86   1              for(i=8;i>0;i--)
  87   1              {
  88   2              //      rtc_io=1;       //P1为准双向口,作为输入前先置高电平
  89   2      
  90   2                      ACC=ACC>>1;     
  91   2                      rtc_clk=0;      //下降沿读出一位数据
  92   2                      ACC_7=rtc_io;   //???读一次读不到,应该是proteus设置的问题
  93   2                      ACC_7=rtc_io;
  94   2                      rtc_clk=1;
  95   2              }
  96   1              return ACC;
  97   1      }
  98          
  99          
 100          /***************************************************************
 101          *写一个字节的时间数据到DS1302的时间寄存器
 102          *函数名称:wr_1302()
 103          *说明:
 104          ****************************************************************/
 105          void wr_1302(u8 cmdw,u8 byte)
 106          {
 107   1              rtc_rst=0;      //复位终止当前数据传输,准备新的数据传输
 108   1              rtc_clk=0;      //SCLK置低为~RST置高做准备
 109   1              rtc_rst=1;      //启动数据传送
 110   1              DS1302_inputByte(cmdw);
 111   1              DS1302_inputByte(byte);
 112   1              rtc_rst=0;      
 113   1      }
 114          
 115          
 116          /****************************************************************
C51 COMPILER V8.16   DS1302                                                                12/25/2008 19:46:19 PAGE 3   

 117          *从DS1302的时间寄存器读一个字节的时间数据出来
 118          *函数名称:rd_1302()
 119          *说明:
 120          *****************************************************************/
 121          u8 rd_1302(u8 cmdw)
 122          {
 123   1              u8 byte;
 124   1      
 125   1              rtc_rst=0;      //复位终止当前数据传输,准备新的数据传输
 126   1              rtc_clk=0;      //SCLK置低为~RST置高做准备
 127   1              rtc_rst=1;      //启动数据传送
 128   1              DS1302_inputByte(cmdw);
 129   1              byte=DS1302_outputByte();
 130   1              rtc_rst=0;
 131   1      
 132   1              return byte;
 133   1      }
 134          
 135          
 136          /*****************************************************************
 137          *将给定时间设定为当前时间
 138          *函数名称:setTime()
 139          *说明:
 140          ******************************************************************/
 141          void setTime(u8 newTime[7][2])
 142          {
 143   1              u8 i;
 144   1              u8 cmdw=0x80;                   //
 145   1              u8 sect;
 146   1              wr_1302(0x8e,0x00);             //关闭写保护
 147   1              for(i=0;i<7;i++)
 148   1              {
 149   2                      if(i==5)        //星期不设置,由芯片自动设置
 150   2                              ;
 151   2                      else
 152   2                      {
 153   3                              sect=newTime[i][1]<<4;
 154   3                              sect+=newTime[i][0];
 155   3                              wr_1302(cmdw,sect);
 156   3                      }
 157   2      
 158   2                      cmdw+=2;
 159   2              }
 160   1              wr_1302(0x8e,0x80);             //开启写保护
 161   1      }
 162          
 163          
 164          /****************************************************************
 165          *从DS1302读取当前时间
 166          *函数名称:getTime()
 167          *说明:
 168          *****************************************************************/
 169          void getTime(u8 nowTime[7][2])
 170          {
 171   1              u8 i;
 172   1              u8 cmdw=0x81;
 173   1              u8 sect;
 174   1              for(i=0;i<7;i++)
 175   1              {
 176   2                      sect=rd_1302(cmdw);
 177   2                      nowTime[i][0]=sect & 0x0F;
 178   2                      nowTime[i][1]=(sect>>4) & 0x0F;
C51 COMPILER V8.16   DS1302                                                                12/25/2008 19:46:19 PAGE 4   

 179   2      
 180   2                      cmdw+=2;
 181   2              }
 182   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    322    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     14      11
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -