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

📄 ds1302.lst

📁 51单片机和DS1302构成的时钟程序 C语言编写
💻 LST
字号:
C51 COMPILER V7.01  DS1302                                                                 06/26/2004 23:32:50 PAGE 1   


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

stmt level    source

   1          //**********************************************************************
   2          //功能          : 实时时钟DS1302操作模块
   3          //作者          : lihj
   4          //创建日期      : 2004-06-22
   5          //版本          : V1.0
   6          //修改记录      :
   7          //***********************************************************************
   8          #include <REG51.h>
   9          
  10          #define U8      unsigned char 
  11          //DS1302-51连接管脚定义
  12          sbit RT_CLK = P1^0;                                     //实时时钟时钟线引脚 
  13          sbit RT_IO = P1^1;              //实时时钟数据线引脚 
  14          sbit ACC0=ACC^0;                //累加器A可位寻址
  15          sbit ACC7=ACC^7;
  16          
  17          //函数功能: 往DS1302写入1Byte数据
  18          //输入参数: <byIn> : 写入数据
  19          void WriteByte(U8 byIn) 
  20          { 
  21   1              U8 i;
  22   1              ACC = byIn;
  23   1              for(i=8; i>0; i--)              //先写D0(低位)
  24   1              {
  25   2                      RT_IO = ACC0;           
  26   2                      RT_CLK = 1;             //产生一个上升沿
  27   2                      RT_CLK = 0;
  28   2                      ACC = ACC >> 1; 
  29   2              } 
  30   1      }
  31          
  32          //函数功能: 从DS1302读取1Byte数据
  33          //返回参数: 读出的数据
  34          U8 ReadByte(void) 
  35          { 
  36   1              U8 i;
  37   1              for(i=8; i>0; i--)
  38   1              {
  39   2                      ACC = ACC >>1;  
  40   2                      ACC7 = RT_IO;
  41   2                      RT_CLK = 1;
  42   2                      RT_CLK = 0;             //产生一个下降沿
  43   2              } 
  44   1              return(ACC); 
  45   1      }
  46          
  47          //函数功能: 往DS1302指定地址内存写入数据
  48          //输入参数: <byAddr>    : DS1302地址
  49          //          <byData>    : 要写的数据
  50          //说    明: 先写地址,后写命令/数据
  51          void WrRTC(U8 byAddr, U8 byData)
  52          {
  53   1      //      byAddr |= 0xC0;         //D7D6 = 11,表示操作内存
  54   1      //      byAddr &= 0xFE;         //D0 = 0,表示写操作
  55   1              WriteByte(byAddr);      //地址、操作命令 
C51 COMPILER V7.01  DS1302                                                                 06/26/2004 23:32:50 PAGE 2   

  56   1              WriteByte(byData);      //写1Byte数据
  57   1      } 
  58          
  59          //函数功能: 读取DS1302指定地址内存的数据
  60          //输入参数: <byAddr>    : DS1302内存单元地址
  61          //返回参数: <byDa>      : 读取的数据
  62          //说明: 先写地址,后读命令/数据
  63          U8 RdRTC(U8 byAddr)
  64          {
  65   1              U8 byData;
  66   1              
  67   1      //      byAddr |= 0xC0;         //D7D6 = 11,表示操作内存
  68   1      //      byAddr &= 0xFE;         //D0= 1,表示读操作
  69   1              WriteByte(byAddr);      //地址、操作命令  
  70   1              byData = ReadByte();    //读1Byte数据
  71   1              
  72   1              return(byData);
  73   1      }
  74          
  75          //功能: 往DS1302 RAM区写入数据(多字节方式)
  76          //输入: <pData>: 写入数据
  77          //说明: 先写地址,后写数据(多字节方式)
  78          void BurstWrRTC(U8 *pData)
  79          {
  80   1              U8 i;
  81   1              WrRTC(0x8e,0x00);               //写之前确保去掉写保护功能
  82   1              WriteByte(0xfe);                //0xfe:多字节写模式(burst方式)
  83   1              for (i=31;i>0;i--)              //31字节内存单元,从地址0单元的第0位开始写
  84   1              {
  85   2                      WriteByte(*pData++);    //写1Byte数据
  86   2              }
  87   1      } 
  88          
  89          //功能: 读取DS1302 RAM数据(多字节方式)
  90          //输入: <pData>: 寄存器数据地址
  91          //说明: 先写地址,后读命令/数据(寄存器多字节方式)
  92          void BurstRdRTC(U8 *pData)
  93          {
  94   1              U8 i;
  95   1      
  96   1              WriteByte(0xff);                //0xff:多字节读模式
  97   1              for (i=31; i>0; i--)            //31Byte 寄存器数据
  98   1              {
  99   2                      *pData++ = ReadByte();  //读1Byte数据
 100   2              }
 101   1      }
 102          
 103          //功能: 往DS1302写入时钟数据(多字节方式)
 104          //输入: <pData>: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
 105          //                       8Byte (BCD码) 1B 1B 1B 1B 1B 1B   1B  1B
 106          //说明: 先写地址,后写数据(多字节方式)
 107          void BurstWrTime(U8 *pData)
 108          {
 109   1              U8 i;
 110   1              WrRTC(0x8e,0x00);               //写之前确保去掉写保护功能
 111   1              WriteByte(0xbe);                //0xbe:时钟多字节写命令 
 112   1              
 113   1              for (i=8;i>0;i--)               //8Byte = 7Byte 时钟数据 + 1Byte 控制
 114   1              {
 115   2                      WriteByte(*pData);      //写1Byte数据
 116   2                      pData++;
 117   2              }
C51 COMPILER V7.01  DS1302                                                                 06/26/2004 23:32:50 PAGE 3   

 118   1      } 
 119          
 120          //功能: 读取DS1302时钟数据(多字节方式)
 121          //输入: <pData>: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 
 122          //                       7Byte (BCD码) 1B 1B 1B 1B 1B  1B  1B
 123          //返回值: byData :读取的数据
 124          //说明: 先写地址,后读命令/数据(多字节方式)
 125          void BurstpData(U8 *pData)
 126          {
 127   1              U8 i;
 128   1      
 129   1              WriteByte(0xbf);                //0xbf:时钟多字节读命令
 130   1              for (i=8; i>0; i--) 
 131   1              {
 132   2                      *pData = ReadByte();    //读1Byte数据
 133   2                      pData++;
 134   2              }
 135   1      }
 136          
 137          //功能: 写时钟(按字节方式),实际作用同Burst方式写时钟函数
 138          //输入: <pData>: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年 
 139          //                                7Byte (BCD码) 1B 1B 1B 1B 1B  1B   1B
 140          void WrTime(U8 *pData) 
 141          {
 142   1              U8 i;
 143   1              U8 byAddr = 0x80;               //秒寄存器地址,D0=0:写操作
 144   1              WrRTC(0x8e,0x00);               //写之前确保去掉写保护功能
 145   1              for(i =7;i>0;i--)
 146   1              { 
 147   2                      WrRTC(byAddr,*pData);   //秒 分 时 日 月 星期 年
 148   2                      pData++;
 149   2                      byAddr +=2;
 150   2              }
 151   1              WrRTC(0x8e,0x80);               //写保护
 152   1      }  
 153          
 154          //输入: <pData>: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年 
 155          //7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
 156          //功能: 读取DS1302当前时间
 157          void RdTime(U8 *pData) 
 158          {
 159   1              U8 i;
 160   1              U8 byAddr = 0x81;               //秒寄存器地址,D0=1,读操作
 161   1              for (i=0;i<7;i++)
 162   1              {
 163   2                      pData[i] = RdRTC(byAddr);//秒 分 时 日 月 星期 年
 164   2                      byAddr += 2;
 165   2              }
 166   1      }


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