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

📄 time_ds1302_51.lst

📁 51做的迷你数字钟
💻 LST
字号:
C51 COMPILER V7.06   TIME_DS1302_51                                                        08/18/2008 11:08:39 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE TIME_DS1302_51
OBJECT MODULE PLACED IN time_ds1302_51.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE time_ds1302_51.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          #include<reg51.h>
   2          #define uchar unsigned char
   3          #define uint  unsigned int
   4          //**************************修改硬件时要修改的部分********************************
   5          
   6          sbit     T_CLK      = P1^6;   /*实时时钟时钟线引脚 */
   7          sbit     T_IO       = P1^5;   /*实时时钟数据线引脚 */
   8          sbit     T_RST      = P1^4;   /*实时时钟复位线引脚 */
   9          
  10          sbit  ACC0 = ACC^0;
  11          sbit  ACC7 = ACC^7;
  12          
  13          void init_ds1302(void);
  14          void   RTInputByte(uchar);       /* 输入 1Byte */
  15          uchar  RTOutputByte(void);       /* 输出?1Byte */
  16          void   W1302(uchar, uchar);
  17          uchar  R1302(uchar);
  18          void   Set1302(uchar *);         /* 设置时间 */
  19          void   Bcd2asc(uchar,uchar *);
  20          void   Get1302(uchar curtime[]); /* 读取1302当前时间 */
  21          
  22          /********************************************************************
  23          /*********************************************************************/
  24          /* 实时时钟模块 时钟芯片型号:DS1302 */
  25          
  26          void init_ds1302(void)//初始化ds1302
  27                {                     //先写地址后写命令字或数据
  28   1             W1302(0x8e, 0x00); //控制寄存器,关写保护位
  29   1             W1302(0x90, 0xa4); //再充电寄存器,电池设置为不再充电
  30   1             W1302(0x80, 0x00); //秒寄存器,CH位为0。秒的初值为00。
  31   1             W1302(0x8e, 0x10); 
  32   1             }
  33          
  34          /*********************************************************************/
  35          
  36          
  37          
  38          //函 数 名:RTInputByte()
  39          //功    能:实时时钟写入一字节
  40          //说    明:往DS1302写入1Byte数据 (内部函数)
  41          //入口参数:d 写入的数据
  42          //返 回 值:无  
  43          //设    计:zhaojunjie          
  44          //***********************************************************************/
  45          void RTInputByte(uchar d)
  46          {
  47   1          uchar i;
  48   1          ACC = d;
  49   1          for(i=8; i>0; i--)
  50   1          {
  51   2              T_IO = ACC0;           /*相当于汇编中的 RRC */
  52   2              T_CLK = 1;
  53   2              T_CLK = 0;
  54   2              ACC = ACC >> 1;
  55   2          }
C51 COMPILER V7.06   TIME_DS1302_51                                                        08/18/2008 11:08:39 PAGE 2   

  56   1      }
  57          /********************************************************************
  58          
  59          函 数 名:RTOutputByte()
  60          功    能:实时时钟读取一字节
  61          说    明:从DS1302读取1Byte数据 (内部函数)
  62          入口参数:无  
  63          返 回 值:ACC
  64          设    计:zhaojunjie           
  65          
  66          ***********************************************************************/
  67          uchar RTOutputByte(void)
  68          {
  69   1          uchar i;
  70   1          for(i=8; i>0; i--)
  71   1          {
  72   2              ACC = ACC >>1;         /*相当于汇编中的 RRC */
  73   2              ACC7 = T_IO;
  74   2              T_CLK = 1;
  75   2              T_CLK = 0;
  76   2          }
  77   1          return(ACC);
  78   1      }
  79          /********************************************************************
  80          
  81          函 数 名:W1302()
  82          功    能:往DS1302写入数据
  83          说    明:先写地址,后写命令/数据 (内部函数)
  84          调    用:RTInputByte() , RTOutputByte()
  85          入口参数:ucAddr: DS1302地址, ucData: 要写的数据
  86          返 回 值:无
  87          设    计:zhaojunjie         
  88          ***********************************************************************/
  89          void W1302(uchar ucAddr, uchar ucDa)
  90          {
  91   1          T_RST = 0;
  92   1          T_CLK = 0;
  93   1          T_RST = 1;
  94   1          RTInputByte(ucAddr);       /* 地址,命令 */
  95   1          RTInputByte(ucDa);       /* 写1Byte数据*/
  96   1          T_CLK = 1;
  97   1          T_RST = 0;
  98   1      }
  99          /********************************************************************
 100          
 101          函 数 名:R1302()
 102          功    能:读取DS1302某地址的数据
 103          说    明:先写地址,后读命令/数据 (内部函数)
 104          调    用:RTInputByte() , RTOutputByte()
 105          入口参数:ucAddr: DS1302地址
 106          返 回 值:ucData :读取的数据
 107          设    计:zhaojunjie           
 108          ***********************************************************************/
 109          uchar R1302(uchar ucAddr)
 110          {
 111   1          uchar ucData;
 112   1          T_RST = 0;
 113   1          T_CLK = 0;
 114   1          T_RST = 1;
 115   1          RTInputByte(ucAddr);             /* 地址,命令 */
 116   1          ucData = RTOutputByte();         /* 读1Byte数据 */
 117   1          T_CLK = 1;
C51 COMPILER V7.06   TIME_DS1302_51                                                        08/18/2008 11:08:39 PAGE 3   

 118   1          T_RST = 0;
 119   1          return(ucData);
 120   1      }
 121          /********************************************************************
 122          
 123          函 数 名:BurstW1302T()
 124          功    能:往DS1302写入时钟数据(多字节方式)
 125          说    明:先写地址,后写命令/数据
 126          调    用:RTInputByte()
 127          入口参数:pWClock: 时钟数据地址 
 128          
 129          格式为: 秒 分 时 日 月 星期 年 控制
 130          8Byte (BCD码)1B 1B 1B 1B 1B  1B  1B 1B
 131          返 回 值:无
 132          设    计:zhaojunjie           
 133          
 134          ***********************************************************************/
 135          void BurstW1302T(uchar *pWClock)
 136          {
 137   1          uchar i;
 138   1          W1302(0x8e,0x00);         /* 控制命令,WP=0,写操作?*/
 139   1          T_RST = 0;
 140   1          T_CLK = 0;
 141   1          T_RST = 1;
 142   1          RTInputByte(0xbe);        /* 0xbe:时钟多字节写命令 */
 143   1          for (i = 8; i>0; i--)     /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/
 144   1          {
 145   2              RTInputByte(*pWClock); /* 写1Byte数据*/
 146   2              pWClock++;
 147   2          }
 148   1          T_CLK = 1;
 149   1          T_RST = 0;
 150   1      }
 151          /********************************************************************
 152          
 153          函 数 名:BurstR1302T()
 154          功    能:读取DS1302时钟数据
 155          说    明:先写地址/命令,后读数据(时钟多字节方式)
 156          调    用:RTInputByte() , RTOutputByte()
 157          入口参数:pRClock: 读取时钟数据地址 
 158          
 159          格式为: 秒 分 时 日 月 星期 年
 160          7Byte (BCD码)1B 1B 1B 1B 1B  1B  1B
 161          返 回 值:无
 162          设    计:zhaojunjie           
 163          
 164          ***********************************************************************/
 165          void BurstR1302T(uchar *pRClock)
 166          {
 167   1          uchar i;
 168   1          T_RST = 0;
 169   1          T_CLK = 0;
 170   1          T_RST = 1;
 171   1          RTInputByte(0xbf);             /* 0xbf:时钟多字节读命令 */
 172   1          for (i=8; i>0; i--)
 173   1          {
 174   2             *pRClock = RTOutputByte();   /* 读1Byte数据 */
 175   2             pRClock++;
 176   2          }
 177   1          T_CLK = 1;
 178   1          T_RST = 0;
 179   1      }
C51 COMPILER V7.06   TIME_DS1302_51                                                        08/18/2008 11:08:39 PAGE 4   

 180          /********************************************************************
 181          
 182          函 数 名:BurstW1302R()
 183          功    能:往DS1302寄存器数写入数据(多字节方式)
 184          说    明:先写地址,后写数据(寄存器多字节方式)
 185          调    用:RTInputByte()
 186          入口参数:pWReg: 寄存器数据地址
 187          返 回 值:无
 188          设    计:zhaojunjie         
 189          ***********************************************************************/
 190          void BurstW1302R(uchar *pWReg)
 191          {
 192   1          uchar i;
 193   1          W1302(0x8e,0x00);         /* 控制命令,WP=0,写操作*/
 194   1          T_RST = 0;
 195   1          T_CLK = 0;
 196   1          T_RST = 1;
 197   1          RTInputByte(0xfe);         /* 0xbe:时钟多字节写命令 */
 198   1          for (i=31; i>0; i--)       /* 31Byte 寄存器数据 */
 199   1          {
 200   2              RTInputByte(*pWReg);    /* 写1Byte数据*/
 201   2              pWReg++;
 202   2          }
 203   1          T_CLK = 1;
 204   1          T_RST = 0;
 205   1      }
 206          /********************************************************************
 207          
 208          函 数 名:BurstR1302R()
 209          功    能:读取DS1302寄存器数据
 210          说    明:先写地址,后读命令/数据(寄存器多字节方式)
 211          调    用:RTInputByte() , RTOutputByte()
 212          入口参数:pRReg: 寄存器数据地址
 213          返 回 值:无
 214          设    计:zhaojunjie           
 215          ***********************************************************************/
 216          void BurstR1302R(uchar *pRReg)
 217          {
 218   1          uchar i;
 219   1          T_RST = 0;
 220   1          T_CLK = 0;
 221   1          T_RST = 1;
 222   1          RTInputByte(0xff);            /* 0xff:时钟多字节读命令 */
 223   1          for (i=31; i>0; i--)          /*31Byte 寄存器数据 */
 224   1          {
 225   2              *pRReg = RTOutputByte();  /* 读1Byte数据 */
 226   2              pRReg++;
 227   2          }
 228   1          T_CLK = 1;
 229   1          T_RST = 0;
 230   1      }
 231          /********************************************************************
 232          
 233          函 数 名:Set1302()
 234          功    能:设置初始时间
 235          说    明:先写地址,后读命令/数据(寄存器多字节方式)
 236          调    用:W1302()
 237          入口参数:pClock: 设置时钟数据
 238          
 239          地址格式为: 秒 分 时 日 月 星期 年
 240          7Byte (BCD码)1B 1B 1B 1B 1B  1B  1B
 241          返 回 值:无
C51 COMPILER V7.06   TIME_DS1302_51                                                        08/18/2008 11:08:39 PAGE 5   

 242          设    计:zhaojunjie           
 243          ***********************************************************************/
 244          void Set1302(uchar *pClock)
 245          {
 246   1          uchar i;
 247   1          uchar ucAddr = 0x80;
 248   1          W1302(0x8e,0x00);           /* 控制命令,WP=0,写操作?*/
 249   1          for(i =7; i>0; i--)
 250   1          {
 251   2              W1302(ucAddr,*pClock);  /* 秒 分 时 日 月 星期 年 */
 252   2              pClock++;
 253   2              ucAddr +=2;
 254   2          }
 255   1          W1302(0x8e,0x80);           /* 控制命令,WP=1,写保护?*/
 256   1      }
 257          /********************************************************************
 258          
 259          函 数 名:Get1302()
 260          功    能:读取DS1302当前时间
 261          说    明:
 262          调    用:R1302()
 263          入口参数:ucCurtime: 保存当前时间地址。
 264          
 265          当前时间格式为: 秒 分 时 日 月 星期 年
 266          7Byte (BCD码)   1B 1B 1B 1B 1B  1B  1B
 267          返 回 值:无
 268          设    计:zhaojunjie           
 269          ***********************************************************************/
 270          void Get1302(uchar ucCurtime[])
 271          {
 272   1          uchar i;
 273   1          uchar ucAddr = 0x81;
 274   1          for (i=0; i<7; i++)
 275   1          {
 276   2              ucCurtime[i] = R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */
 277   2              ucAddr += 2;
 278   2          }
 279   1      }
 280          


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