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

📄 ds1302.lst

📁 能够显示32个汉字的LED大屏显示的单片机源代码
💻 LST
字号:
C51 COMPILER V7.06   DS1302                                                                07/24/2006 09:31:56 PAGE 1   


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

stmt level    source

   1          /********************************************************************
   2          模块名称:DS1302.c
   3          功    能:实时时钟模块           时钟芯片型号:DS1302
   4          designer:yinyuanjun       
   5          *********************************************************************/
   6          #include <stc89c54rd+.h>
   7          
   8          sbit     T_CLK      = P1^2;   /*实时时钟时钟线引脚 */
   9          sbit     T_IO       = P1^3;   /*实时时钟数据线引脚 */
  10          sbit     T_RST      = P1^4;   /*实时时钟复位线引脚 */
  11          
  12          sbit  ACC0 = ACC^0;
  13          sbit  ACC7 = ACC^7;
  14          
  15          void   RTInputByte(unsigned char);       /* 输入 1Byte */
  16          unsigned char  RTOutputByte(void);       /* 输出?1Byte */
  17          void   W1302(unsigned char, unsigned char);
  18          unsigned char  R1302(unsigned char);
  19          void   Set1302(unsigned char *);         /* 设置时间 */
  20          void   Bcd2asc(unsigned char,unsigned char *);
  21          void   Get1302(unsigned char curtime[]); /* 读取1302当前时间 */
  22          /********************************************************************
  23          函 数 名:RTInputByte()
  24          功    能:实时时钟写入一字节
  25          说    明:往DS1302写入1Byte数据 (内部函数)
  26          入口参数:d 写入的数据
  27          designer:yinyuanjun      
  28          ***********************************************************************/
  29          void RTInputByte(unsigned char d)
  30          {
  31   1          unsigned char i;
  32   1          ACC = d;
  33   1          for(i=8; i>0; i--)
  34   1          {
  35   2              T_IO = ACC0;           /*相当于汇编中的 RRC */
  36   2              T_CLK = 1;
  37   2              T_CLK = 0;
  38   2              ACC = ACC >> 1;
  39   2          }
  40   1      }
  41          /********************************************************************
  42          函 数 名:RTOutputByte()
  43          功    能:实时时钟读取一字节
  44          说    明:从DS1302读取1Byte数据 (内部函数)
  45          入口参数:无  
  46          返 回 值:ACC
  47          designer:yinyuanjun         
  48          ***********************************************************************/
  49          unsigned char RTOutputByte(void)
  50          {
  51   1          unsigned char i;
  52   1          for(i=8; i>0; i--)
  53   1          {
  54   2              ACC = ACC >>1;         /*相当于汇编中的 RRC */
  55   2              ACC7 = T_IO;
C51 COMPILER V7.06   DS1302                                                                07/24/2006 09:31:56 PAGE 2   

  56   2              T_CLK = 1;
  57   2              T_CLK = 0;
  58   2          }
  59   1          return(ACC);
  60   1      }
  61          /********************************************************************
  62          函 数 名:W1302()
  63          功    能:往DS1302写入数据
  64          说    明:先写地址,后写命令/数据 (内部函数)
  65          调    用:RTInputByte() , RTOutputByte()
  66          入口参数:ucAddr: DS1302地址, ucData: 要写的数据
  67          返 回 值:无
  68          designer:yinyuanjun
  69          ***********************************************************************/
  70          void W1302(unsigned char ucAddr, unsigned char ucDa)
  71          {
  72   1          T_RST = 0;
  73   1          T_CLK = 0;
  74   1          T_RST = 1;
  75   1          RTInputByte(ucAddr);       /* 地址,命令 */
  76   1          RTInputByte(ucDa);       /* 写1Byte数据*/
  77   1          T_CLK = 1;
  78   1          T_RST = 0;
  79   1      }
  80          /********************************************************************
  81          函 数 名:R1302()
  82          功    能:读取DS1302某地址的数据
  83          说    明:先写地址,后读命令/数据 (内部函数)
  84          调    用:RTInputByte() , RTOutputByte()
  85          入口参数:ucAddr: DS1302地址
  86          返 回 值:ucData :读取的数据
  87          designer:yinyuanjun   
  88          ***********************************************************************/
  89          unsigned char R1302(unsigned char ucAddr)
  90          {
  91   1          unsigned char ucData;
  92   1          T_RST = 0;
  93   1          T_CLK = 0;
  94   1          T_RST = 1;
  95   1          RTInputByte(ucAddr);             /* 地址,命令 */
  96   1          ucData = RTOutputByte();         /* 读1Byte数据 */
  97   1          T_CLK = 1;
  98   1          T_RST = 0;
  99   1          return(ucData);
 100   1      }
 101          /********************************************************************
 102          函 数 名:BurstW1302T()
 103          功    能:往DS1302写入时钟数据(多字节方式)
 104          说    明:先写地址,后写命令/数据
 105          调    用:RTInputByte()
 106          入口参数:pWClock: 时钟数据地址 
 107          格式为: 秒 分 时 日 月 星期 年 控制
 108          8Byte (BCD码)1B 1B 1B 1B 1B  1B  1B 1B
 109          返 回 值:无
 110          designer:yinyuanjun
 111          ***********************************************************************/
 112          void BurstW1302T(unsigned char *pWClock)
 113          {
 114   1          unsigned char i;
 115   1          W1302(0x8e,0x00);         /* 控制命令,WP=0,写操作?*/
 116   1          T_RST = 0;
 117   1          T_CLK = 0;
C51 COMPILER V7.06   DS1302                                                                07/24/2006 09:31:56 PAGE 3   

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

 180          函 数 名:BurstR1302R()
 181          功    能:读取DS1302寄存器数据
 182          说    明:先写地址,后读命令/数据(寄存器多字节方式)
 183          调    用:RTInputByte() , RTOutputByte()
 184          入口参数:pRReg: 寄存器数据地址
 185          designer:yinyuanjun     
 186          ***********************************************************************/
 187          void BurstR1302R(unsigned char *pRReg)
 188          {
 189   1          unsigned char i;
 190   1          T_RST = 0;
 191   1          T_CLK = 0;
 192   1          T_RST = 1;
 193   1          RTInputByte(0xff);            /* 0xff:时钟多字节读命令 */
 194   1          for (i=31; i>0; i--)          /*31Byte 寄存器数据 */
 195   1          {
 196   2              *pRReg = RTOutputByte();  /* 读1Byte数据 */
 197   2              pRReg++;
 198   2          }
 199   1          T_CLK = 1;
 200   1          T_RST = 0;
 201   1      }
 202          /********************************************************************
 203          函 数 名:Set1302()
 204          功    能:设置初始时间
 205          说    明:先写地址,后读命令/数据(寄存器多字节方式)
 206          调    用:W1302()
 207          入口参数:pClock: 设置时钟数据
 208          地址格式为: 秒 分 时 日 月 星期 年
 209          7Byte (BCD码)1B 1B 1B 1B 1B  1B  1B
 210          designer:yinyuanjun       
 211          ***********************************************************************/
 212          void Set1302(unsigned char *pClock)
 213          {
 214   1          unsigned char i;
 215   1          unsigned char ucAddr = 0x80;
 216   1          W1302(0x8e,0x00);           /* 控制命令,WP=0,写操作?*/
 217   1          for(i =7; i>0; i--)
 218   1          {
 219   2              W1302(ucAddr,*pClock);  /* 秒 分 时 日 月 星期 年 */
 220   2              pClock++;
 221   2              ucAddr +=2;
 222   2          }
 223   1          W1302(0x8e,0x80);           /* 控制命令,WP=1,写保护?*/
 224   1      }
 225          /********************************************************************
 226          函 数 名:Get1302()
 227          功    能:读取DS1302当前时间
 228          调    用:R1302()
 229          入口参数:ucCurtime: 保存当前时间地址。
 230          当前时间格式为: 秒 分 时 日 月 星期 年
 231          7Byte (BCD码)   1B 1B 1B 1B 1B  1B  1B
 232          designer:yinyuanjun       
 233          ***********************************************************************/
 234          void Get1302(unsigned char ucCurtime[])
 235          {
 236   1          unsigned char i;
 237   1          unsigned char ucAddr = 0x81;
 238   1          for (i=0; i<7; i++)
 239   1          {
 240   2              ucCurtime[i] = R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */
 241   2              ucAddr += 2;
C51 COMPILER V7.06   DS1302                                                                07/24/2006 09:31:56 PAGE 5   

 242   2          }
 243   1      }
 244          
 245          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    284    ----
   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 + -