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

📄 ds1302.lst

📁 DS1302的1602时钟电路设计LED数码管时钟电路采用24h计时方式
💻 LST
字号:
C51 COMPILER V6.12  DS1302                                                                 01/07/2009 12:36:01 PAGE 1   


C51 COMPILER V6.12, COMPILATION OF MODULE DS1302
OBJECT MODULE PLACED IN .\DS1302.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\DS1302.c DEBUG OBJECTEXTEND

stmt level    source

   1          /*********************************************************************/
   2          /* 实时时钟模块 时钟芯片型号:DS1302 */
   3          /*/
   4          /*********************************************************************/
   5          #include<reg51.h>   //该头文件在此已包含,只要在main.c中包含DS1302.c文件即可,main中无需再包含reg51.h。自加
   6          #define uchar unsigned char
   7          sbit T_RST = P0^1; /*实时时钟复位线引脚 */
   8          sbit T_CLK = P0^2; /*实时时钟时钟线引脚 */
   9          sbit T_IO = P0^3; /*实时时钟数据线引脚 */
  10          sbit ACC7=ACC^7;  //ACC是单片机里面的累加器,在51.h头文件里已定义。
  11          sbit ACC0=ACC^0;  
  12          unsigned char ucCurtime[8]; //记录所有的读取值
  13          /******************************************************************** 
  14          *
  15          * 名称: v_RTInputByte
  16          * 说明: 
  17          * 功能: 往DS1302写入1Byte数据
  18          * 调用:
  19          * 输入: ucDa 写入的数据 
  20          * 返回值: 无
  21          ***********************************************************************/
  22          void v_RTInputByte(uchar ucDa) 
  23          { 
  24   1      uchar i;
  25   1      ACC = ucDa;              //ACC包含ACC0~ACC7.自加
  26   1      for(i=8; i>0; i--)
  27   1      {
  28   2      T_IO = ACC0; /*相当于汇编中的 RRC */
  29   2      T_CLK = 1;
  30   2      T_CLK = 0;
  31   2      ACC = ACC >> 1; 
  32   2      }  
  33   1      }
  34          /******************************************************************** 
  35          *
  36          * 名称: uchar uc_RTOutputByte
  37          * 说明: 
  38          * 功能: 从DS1302读取1Byte数据
  39          * 调用: 
  40          * 输入: 
  41          * 返回值: ACC
  42          ***********************************************************************/
  43          uchar uc_RTOutputByte(void) 
  44          { 
  45   1      uchar i;
  46   1      uchar temp_temp;
  47   1      uchar temp;
  48   1      for(i=8; i>0; i--)
  49   1      {
  50   2      ACC = ACC >>1; /*相当于汇编中的 RRC */
  51   2      ACC7 = T_IO;  //把ACC中的高位移走后把IO数据的一位送到ACC的高位,随后高位继续右移,即先读的是低位,自加
  52   2      T_CLK = 1;
  53   2      T_CLK = 0;
  54   2      }
  55   1      //.......以下为把十六进制转为十进制数后再返回十进制数,也可直接返回十六进制数,自加 
C51 COMPILER V6.12  DS1302                                                                 01/07/2009 12:36:01 PAGE 2   

  56   1       temp=ACC;
  57   1       temp_temp=temp/16;
  58   1       temp=temp%16;
  59   1       temp=temp+temp_temp*10;  //十六进制转为十进制,自加
  60   1       return (temp);
  61   1       
  62   1      }
  63          /******************************************************************** 
  64          *
  65          * 名称: v_W1302
  66          * 说明: 先写地址,后写命令/数据
  67          * 功能: 往DS1302写入数据
  68          * 调用: v_RTInputByte() 
  69          * 输入: ucAddr: DS1302地址, ucDa: 要写的数据
  70          * 返回值: 无
  71          ***********************************************************************/
  72          void v_W1302(uchar ucAddr, uchar ucDa)
  73          {
  74   1      T_RST = 0;
  75   1      T_CLK = 0;
  76   1      T_RST = 1;
  77   1      v_RTInputByte(ucAddr); /* 地址,命令 */
  78   1      v_RTInputByte(ucDa); /* 写1Byte数据*/
  79   1      T_CLK = 1;
  80   1      T_RST =0;
  81   1      } 
  82          /******************************************************************** 
  83          *
  84          * 名称: uc_R1302
  85          * 说明: 先写地址,后读命令/数据
  86          * 功能: 读取DS1302某地址的数据
  87          * 调用: v_RTInputByte() , uc_RTOutputByte()
  88          * 输入: ucAddr: DS1302地址
  89          * 返回值: ucDa :读取的数据
  90          ***********************************************************************/
  91          uchar uc_R1302(uchar ucAddr)
  92          {
  93   1      uchar ucDa;
  94   1      T_RST = 0;
  95   1      T_CLK = 0;
  96   1      T_RST = 1;
  97   1      v_RTInputByte(ucAddr); /* 地址,命令 */
  98   1      ucDa = uc_RTOutputByte(); /* 读1Byte数据 */
  99   1      T_CLK = 1;
 100   1      T_RST =0;
 101   1      return(ucDa);
 102   1      }
 103          /******************************************************************** 
 104          *
 105          * 名称: v_BurstW1302T
 106          * 说明: 先写地址,后写数据(时钟多字节方式)
 107          * 功能: 往DS1302写入时钟数据(多字节方式)
 108          * 调用: v_RTInputByte() 
 109          * 输入: pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
 110          * 8Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B 1B
 111          * 返回值: 无
 112          ***********************************************************************/
 113          void v_BurstW1302T(uchar *pSecDa)
 114          {
 115   1      uchar i;
 116   1      v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/  //是否是向控制寄存器的数据寄存器写内容0x00?自加
 117   1      T_RST = 0;
C51 COMPILER V6.12  DS1302                                                                 01/07/2009 12:36:01 PAGE 3   

 118   1      T_CLK = 0;
 119   1      T_RST = 1;
 120   1      v_RTInputByte(0xbe); /* 0xbe:时钟多字节写命令 */
 121   1      for (i=8;i>0;i--) /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/
 122   1      {
 123   2      v_RTInputByte(*pSecDa);/* 写1Byte数据*/  //顺序写入,不用再写时钟地址,自加
 124   2      pSecDa++;
 125   2      }
 126   1      T_CLK = 1;
 127   1      T_RST =0;
 128   1      } 
 129          /******************************************************************** 
 130          *
 131          * 名称: v_BurstR1302T
 132          * 说明: 先写地址,后读命令/数据(时钟多字节方式)
 133          * 功能: 读取DS1302时钟数据
 134          * 调用: v_RTInputByte() , uc_RTOutputByte()
 135          * 输入: pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 
 136          * 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
 137          * 返回值: ucDa :读取的数据
 138          ***********************************************************************/
 139          void v_BurstR1302T(uchar *pSecDa)
 140          {
 141   1      uchar i;
 142   1      T_RST = 0;
 143   1      T_CLK = 0;
 144   1      T_RST = 1;
 145   1      v_RTInputByte(0xbf); /* 0xbf:时钟多字节读命令 */
 146   1      for (i=8; i>0; i--) 
 147   1      {
 148   2      *pSecDa = uc_RTOutputByte(); /* 读1Byte数据 */ //顺序读出,不用再写时钟地址,自加
 149   2      pSecDa++;
 150   2      }
 151   1      T_CLK = 1;
 152   1      T_RST =0;
 153   1      }
 154          /******************************************************************** 
 155          *
 156          * 名称: v_BurstW1302R
 157          * 说明: 先写地址,后写数据(寄存器多字节方式)
 158          * 功能: 往DS1302寄存器数写入数据(多字节方式)
 159          * 调用: v_RTInputByte() 
 160          * 输入: pReDa: 寄存器数据地址          //注意:pReDa是寄存器数据地址,是要写入的数据的地址,可以是数组,自
             -加
 161          * 返回值: 无
 162          ***********************************************************************/
 163          void v_BurstW1302R(uchar *pReDa)
 164          {
 165   1      uchar i;
 166   1      v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
 167   1      T_RST = 0;
 168   1      T_CLK = 0;
 169   1      T_RST = 1;
 170   1      v_RTInputByte(0xfe); /* 0xbe:时钟多字节写命令 */
 171   1      for (i=31;i>0;i--) /*31Byte 寄存器数据 */
 172   1      {
 173   2      v_RTInputByte(*pReDa); /* 写1Byte数据*/
 174   2      pReDa++;
 175   2      }
 176   1      T_CLK = 1;
 177   1      T_RST =0;
 178   1      } 
C51 COMPILER V6.12  DS1302                                                                 01/07/2009 12:36:01 PAGE 4   

 179          /******************************************************************** 
 180          *
 181          * 名称: uc_BurstR1302R
 182          * 说明: 先写地址,后读命令/数据(寄存器多字节方式)
 183          * 功能: 读取DS1302寄存器数据
 184          * 调用: v_RTInputByte() , uc_RTOutputByte()
 185          * 输入: pReDa: 寄存器数据地址
 186          * 返回值: 无
 187          ***********************************************************************/
 188          void v_BurstR1302R(uchar *pReDa)
 189          {
 190   1      uchar i;
 191   1      T_RST = 0;
 192   1      T_CLK = 0;
 193   1      T_RST = 1;
 194   1      v_RTInputByte(0xff); /* 0xbf:时钟多字节读命令 */
 195   1      for (i=31; i>0; i--) /*31Byte 寄存器数据 */
 196   1      {
 197   2      *pReDa = uc_RTOutputByte(); /* 读1Byte数据 */
 198   2      pReDa++;
 199   2      }
 200   1      T_CLK = 1;
 201   1      T_RST =0;
 202   1      }
 203          /******************************************************************** 
 204          *
 205          * 名称: v_Set1302
 206          * 说明: 
 207          * 功能: 设置初始时间
 208          * 调用: v_W1302() 
 209          * 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年 
 210          * 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
 211          * 返回值: 无
 212          ***********************************************************************/
 213          void v_Set1302(uchar *pSecDa) 
 214          {
 215   1      uchar i;
 216   1      uchar ucAddr = 0x80; 
 217   1      v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
 218   1      for(i =7;i>0;i--)
 219   1      { 
 220   2      v_W1302(ucAddr,*pSecDa); /* 秒 分 时 日 月 星期 年 */
 221   2      
 222   2      pSecDa++;
 223   2      ucAddr +=2;            //用多字节写函数也行吧?自加
 224   2      }
 225   1      v_W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
 226   1      }
 227          /******************************************************************** 
 228          *
 229          * 名称: v_Get1302
 230          * 说明: 
 231          * 功能: 读取DS1302当前时间
 232          * 调用: uc_R1302() 
 233          * 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年 
 234          * 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
 235          * 返回值: 无
 236          ***********************************************************************/
 237          void v_Get1302(void) 
 238          {
 239   1      uchar i;
 240   1      uchar ucAddr = 0x81;
C51 COMPILER V6.12  DS1302                                                                 01/07/2009 12:36:01 PAGE 5   

 241   1      for (i=0;i<7;i++)
 242   1      {
 243   2      ucCurtime[i] = uc_R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */
 244   2      ucAddr += 2;       //用多字节读命令也行吧?自加
 245   2      }
 246   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    356    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      8      15
   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 + -