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

📄 ds1302.lst

📁 该程序详细介绍了实时时钟芯片DS1302的使用编程代码
💻 LST
字号:
C51 COMPILER V7.20   DS1302                                                                06/03/2005 17:25:52 PAGE 1   


C51 COMPILER V7.20, COMPILATION OF MODULE DS1302
OBJECT MODULE PLACED IN ds1302.OBJ
COMPILER INVOKED BY: C:\KEIL\C51\BIN\C51.EXE ds1302.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /**************************************************************************
   2          YB-51-B  时钟演示程序(函数模块)
   3          来源: 郑州远博科技   王兴民
   4          0371-66949037  0371-67256036 13949105551
   5          需要参看DS1302的相关原理和时序,见配套光盘
   6          ***************************************************************************/
   7          #include <config.h>
   8          
   9          #define T_CLK  P1_6    /*实时时钟时钟线引脚 */
  10          #define T_IO   P1_7    /*实时时钟数据线引脚 */
  11          #define T_RST  P3_3    /*实时时钟复位线引脚 */
  12          
  13          /*********************************************************************
  14           实时时钟模块 时钟芯片型号:DS1302 
  15          *********************************************************************/
  16          
  17          /******************************************************************** 
  18          *
  19          * 名称: v_RTInputByte
  20          * 说明: 
  21          * 功能: 往DS1302写入1Byte数据
  22          * 调用:
  23          * 输入: ucDa 写入的数据 
  24          * 返回值: 无
  25          ***********************************************************************/
  26          void v_RTInputByte(Uchar ucDa) 
  27          { 
  28   1      Uchar i,xbyte;
  29   1      xbyte = ucDa;
  30   1      for(i=8; i>0; i--)
  31   1      {
  32   2      T_IO = xbyte&0x01;
  33   2      T_CLK = 1;
  34   2      T_CLK = 0;
  35   2      xbyte = xbyte >> 1; 
  36   2      } 
  37   1      }
  38          /******************************************************************** 
  39          *
  40          * 名称: Uchar uc_RTOutputByte
  41          * 说明: 
  42          * 功能: 从DS1302读取1Byte数据
  43          * 调用: 
  44          * 输入: 
  45          * 返回值: xbyte
  46          ***********************************************************************/
  47          Uchar uc_RTOutputByte(void) 
  48          { 
  49   1      Uchar i,xbyte,xbyte1=0;
  50   1      for(i=8; i>0; i--)
  51   1      {
  52   2      xbyte = xbyte >>1;
  53   2      xbyte1 =(xbyte1|((Uchar)(T_IO)))<<7;
  54   2      xbyte=xbyte|xbyte1;
  55   2      T_CLK = 1;
C51 COMPILER V7.20   DS1302                                                                06/03/2005 17:25:52 PAGE 2   

  56   2      T_CLK = 0;
  57   2      } 
  58   1      return(xbyte); 
  59   1      }
  60          /******************************************************************** 
  61          *
  62          * 名称: v_W1302
  63          * 说明: 先写地址,后写命令/数据
  64          * 功能: 往DS1302写入数据
  65          * 调用: v_RTInputByte() 
  66          * 输入: ucAddr: DS1302地址, ucDa: 要写的数据
  67          * 返回值: 无
  68          ***********************************************************************/
  69          void v_W1302(Uchar ucAddr, Uchar ucDa)
  70          {
  71   1      T_RST = 0;
  72   1      T_CLK = 0;
  73   1      T_RST = 1;
  74   1      v_RTInputByte(ucAddr); /* 地址,命令 */
  75   1      v_RTInputByte(ucDa); /* 写1Byte数据*/
  76   1      T_CLK = 1;
  77   1      T_RST =0;
  78   1      } 
  79          /******************************************************************** 
  80          *
  81          * 名称: uc_R1302
  82          * 说明: 先写地址,后读命令/数据
  83          * 功能: 读取DS1302某地址的数据
  84          * 调用: v_RTInputByte() , uc_RTOutputByte()
  85          * 输入: ucAddr: DS1302地址
  86          * 返回值: ucDa :读取的数据
  87          ***********************************************************************/
  88          Uchar uc_R1302(Uchar ucAddr)
  89          {
  90   1      Uchar ucDa;
  91   1      T_RST = 0;
  92   1      T_CLK = 0;
  93   1      T_RST = 1;
  94   1      v_RTInputByte(ucAddr); /* 地址,命令 */
  95   1      ucDa = uc_RTOutputByte(); /* 读1Byte数据 */
  96   1      T_CLK = 1;
  97   1      T_RST =0;
  98   1      return(ucDa);
  99   1      }
 100          /******************************************************************** 
 101          *
 102          * 名称: v_BurstW1302T
 103          * 说明: 先写地址,后写数据(时钟多字节方式)
 104          * 功能: 往DS1302写入时钟数据(多字节方式)
 105          * 调用: v_RTInputByte() 
 106          * 输入: pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
 107          * 8Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B 1B
 108          * 返回值: 无
 109          ***********************************************************************/
 110          void v_BurstW1302T(Uchar *pSecDa)
 111          {
 112   1      Uchar i;
 113   1      v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
 114   1      T_RST = 0;
 115   1      T_CLK = 0;
 116   1      T_RST = 1;
 117   1      v_RTInputByte(0xbe); /* 0xbe:时钟多字节写命令 */
C51 COMPILER V7.20   DS1302                                                                06/03/2005 17:25:52 PAGE 3   

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

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

 242   2      ucAddr += 2;
 243   2      }
 244   1      }


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