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

📄 ds1302.lst

📁 此程序是单片机进行模数转换的程序
💻 LST
字号:
C51 COMPILER V8.02   DS1302                                                                03/13/2008 15:39:35 PAGE 1   


C51 COMPILER V8.02, 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          
   3          // 文件名:              ds1302.c
   4          // 创建日期:   080303
   5          // 创建:            神之吻
   6          // 试验难度:   入门级试验
   7          // 描述:                该文件包含了操作ds1302时钟芯片的底层驱动函数,
   8          //              自底向上依次为:
   9          //              1.向I/O引脚发送/接受一个字节的数据(可为命令/地址或是数据)
  10          //              2.向ds1302芯片的寄存器读/写一个字节数据
  11          //              3.设置初始时间以及读出当前时间(秒,分,小时,日,月,星期,年
  12          //                 
  13          //------------------------------------------------------------
  14          
  15          //********************************************************
  16          //*                    头文件
  17          //********************************************************
  18          
  19          #include <reg52.h>
  20          #include "main.h"
  21          
  22          
  23          //*******************************************************
  24          //*                    WriteByte
  25          //*
  26          //*功能描述:该函数是最底层的驱动函数,负责向ds1302的I/0口
  27          //          发送一个字节的数据
  28          //*输入参数: ByteData,
  29          //*返回值:无
  30          //*******************************************************
  31          
  32          void WriteByte(uint8 ByteData)
  33          {
  34   1          uint8 i,DataTmp;
  35   1              DataTmp = ByteData;    //缓存数据
  36   1              //NOP
  37   1              //由低位(bit0)到高位(bit7)依次向I/O引脚写入数据
  38   1              for(i = 0;i < 8;i ++)
  39   1              {
  40   2                      SCLK = 0;
  41   2                      //NOP      //此处延时函数待定,手册给出的最小值为100ns
  42   2                  //在SCLK上升沿之前,向I/O口准备好数据
  43   2                      if((DataTmp & 0x01) == 1)
  44   2                         IO = 1;
  45   2                      else
  46   2                         IO = 0;
  47   2                      //NOP      //延时建立时间tDC,手册上给出最小值位50ns
  48   2                      SCLK = 1;          //SCLK的上升沿向写入字节中的一位数据
  49   2                      DataTmp >>= 1;   //右移一位,以便下一位写入
  50   2              }               
  51   1      }
  52          
  53          //*******************************************************
  54          //*                    ReadByte
  55          //*
C51 COMPILER V8.02   DS1302                                                                03/13/2008 15:39:35 PAGE 2   

  56          //*功能描述:该函数是最底层的驱动函数,负责从ds1302的I/0口
  57          //          接收一个字节的数据
  58          //*输入参数:无
  59          //*返回值:读出的一个字节数据
  60          //*******************************************************
  61          uint8 ReadByte()
  62          {
  63   1              uint8 i,DataTmp;
  64   1              DataTmp = 0;    //数据缓冲初始化为0
  65   1              for(i = 0;i < 8;i ++)
  66   1              {
  67   2                      SCLK = 0;    //下降沿触发I/O口读出一位数据
  68   2                      //NOP        //延迟至少Tcdd时间,以等待输出数据有效,手册上给出Tcdd最大值为200ns
  69   2                      DataTmp += ((uint8)IO<<7);      //读出I/O输出的一位数据,置于dataTmp的最高位(由于数据是按bit0~bit7读出)
  70   2                      DataTmp >>= 1;    //右移一位,以便存储读出后续数据
  71   2                      SCLK = 1;
  72   2              }
  73   1              return DataTmp; //返回读出的一个字节数据
  74   1      }
  75          
  76          //*******************************************************
  77          //*                    WriteReg
  78          //*
  79          //*功能描述: 1.该函数通过调用最底层驱动函数WriteByte,向ds1302
  80          //           的RAM中写入一个字节数据
  81          //           2.写入方法为:在连续的十六个SCLK时钟内,
  82          //             前八个时钟周期写入一个字节的命令/地址,后八个
  83          //             时钟周期写入一个字节的数据
  84          //           3.每一位在时钟周期的上升沿写入
  85          //*输入参数: 
  86          //           Addr:待写入寄存器的地址
  87          //           Data:待写入的一个字节数据
  88          //*返回值:无
  89          //*******************************************************
  90          void WriteReg(uint8 Addr,uint8 Data)
  91          {
  92   1              RST = 1;   //拉高RST,以使能读写操作
  93   1              //NOP      //延时tCC后方可拉高SCLK,手册上给出Vcc=5V的条件下,tCC的最小值为1us   
  94   1              WriteByte(Addr);  //写入地址
  95   1              WriteByte(Data);  //写入数据
  96   1              RST = 0;    //RST复位为0,以便下一次读写操作   
  97   1              SCLK = 0;   //SCLK复位为0,以便下一次读写操作    
  98   1      }
  99          
 100          //*******************************************************
 101          //*                    ReadReg
 102          //*
 103          //*功能描述: 1.该函数通过调用最底层驱动函数WriteByte和ReadByte,从ds1302
 104          //           的RAM中读出一个字节数据
 105          //           2.写入方法为:在连续的十六个SCLK时钟内,
 106          //             前八个时钟周期写入一个字节的命令/地址,后八个
 107          //             时钟周期写入一个字节的数据
 108          //           3.其中地址在前八个时钟周期上升沿写入,数据在后八个
 109          //             时钟周期的下降沿读出
 110          //*输入参数: 
 111          //           Addr:待读出数据的目的寄存器的地址
 112          //*返回值:    Data:读出的一个字节数据
 113          //*******************************************************
 114          uint8 ReadReg(uint8 Addr)
 115          {
 116   1         uint8 ReadData;   //缓冲读出的一个字节数据
 117   1         RST = 1; //拉高RST,以使能读写操作
C51 COMPILER V8.02   DS1302                                                                03/13/2008 15:39:35 PAGE 3   

 118   1         //NOP      //延时tCC后方可拉高SCLK,手册上给出Vcc=5V的条件下,tCC的最小值为1us        
 119   1         WriteByte(Addr);  //写入地址
 120   1         ReadData = ReadByte(); //读出寄存器内容
 121   1         RST = 0;    //RST复位为0,以便下一次读写操作 
 122   1         SCLK = 0;   //SCLK复位为0,以便下一次读写操作
 123   1         return ReadData; //返回读出数据
 124   1      }
 125          
 126          //*******************************************************
 127          //*                    SetTime
 128          //*
 129          //*功能描述: 1.该函数通过调用最驱动函数WriteReg,向ds1302的时间/日历寄存器
 130          //           中写入初始化时间(写入顺序为秒 分 时 日 月 星期 年)
 131          //           2.写入方法为:先写控制寄存器,将其WP置为0,以解除写保护,然后依次
 132          //                         写入秒 分 时 日 月 星期 年寄存器
 133          //*输入参数: 
 134          //           *TimePtr:指向时间信息区域首地址的指针(格式为秒 分 时 日 月 星期 年)
 135          //*返回值: 无
 136          //*******************************************************
 137          void SetTime(uint8* TimePtr)
 138          {
 139   1          uint8* TimePtrTmp;
 140   1              uint8 CtrRegAddr = 0x8E;          //控制寄存器地址,RD/WR位(Bit0)为0,表明对该寄存器进行写操作,
 141   1              uint8 CtrRegData = 0x00;      //写入控制寄存器的数据,WP为0,以解除写保护
 142   1              uint8 InitRegAddr = 0x80;   //初始寄存器地址,即秒寄存器地址,RD/WR位(Bit0)为0,表明对该寄存器进行写操作
 143   1              uint8 i;
 144   1              TimePtrTmp = TimePtr;
 145   1              RST = 0;
 146   1              WriteReg(CtrRegAddr,CtrRegData);   //写控制寄存器,以解除写保护
 147   1              //启动写操作(顺序为秒 分 时 日 月 星期 年)
 148   1              for( i = 0;i < 7;i ++)
 149   1              {
 150   2                      WriteReg(InitRegAddr,*TimePtrTmp);   //将时间信息写入当前寄存器
 151   2                      InitRegAddr += 0x02;  //指向下一个时间/日历寄存器   
 152   2                      TimePtrTmp += 1;          //指向下一个数据
 153   2              }                          
 154   1      }
 155          
 156          //*******************************************************
 157          //*                    ReadTime
 158          //*
 159          //*功能描述: 1.该函数通过调用最驱动函数ReadReg,从ds1302的时间/日历寄存器
 160          //           中读出当前时间(读出顺序为秒 分 时 日 月 星期 年)
 161          //           2.读方法为:依次读出秒 分 时 日 月 星期 年寄存器
 162          //*输入参数: 
 163          //           *TimePtr:指向时间信息存储区域首地址的指针(格式为秒 分 时 日 月 星期 年)
 164          //*返回值: 无
 165          //*******************************************************
 166          void ReadTime(uint8 *TimePtr)
 167          {
 168   1              uint8* TimePtrTmp;
 169   1              uint8 InitRegAddr = 0x81;   //初始寄存器地址,即秒寄存器地址,RD/WR位(Bit0)为1,表明对该寄存器进行读操作
 170   1              uint8 i;
 171   1              TimePtrTmp = TimePtr;
 172   1              RST = 0;     //读写之前将RST复位为0
 173   1              //启动读操作(顺序为秒 分 时 日 月 星期 年)
 174   1              for( i = 0;i < 7;i ++)
 175   1              {
 176   2                      *TimePtrTmp = ReadReg(InitRegAddr);  //读出当前寄存器的值
 177   2                      InitRegAddr += 0x02;  //指向下一个时间/日历寄存器   
 178   2                      TimePtrTmp += 1;          //指向下一个数据的存储区域
 179   2              }                               
C51 COMPILER V8.02   DS1302                                                                03/13/2008 15:39:35 PAGE 4   

 180   1      }
 181          
 182          


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