找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3607|回复: 3
打印 上一主题 下一主题
收起左侧

51单片机DS1302的时钟源代码(掉电也能准确走时)

[复制链接]
跳转到指定楼层
楼主


全部资料51hei下载地址:
DS1302.rar (57.12 KB, 下载次数: 69)

装上纽扣电池,即使掉电也能准确走时
DS1302  51MCU  LCD1602显示时钟
年  月  日  星期
时  分  秒

硬件部分:(参见郭天祥51实验板)
LCD1602
D0至D7接51MCU的P0口;

DS1302
RST接P1.1
SCLK接P1.2
SDA接P1.3

按键(按键一端连接上拉电阻,另一端接地)
S1接 P3.0
S2接 P3.1
S3接 P3.2

软件部分:
1.对DS1302内部的寄存器地址进行宏定义,定义变量以便存储 年月日 时分秒 星期
2.编写LCD1602写命令和写数据的子程序,编写显示年月日子程序,时分秒子程序以及显示星期的子程序。注意:从DS1302中读取的数据是两位BCD码,要注意转换。
3.编写DS1302读一个字节的子程序以及写一个字节的子程序,编写DS1302从对应的地址读和写数据的子程序。
4.按键分为三个功能键,增大键以及减小键。

部分程序:
/************************************************
*名称:DS1302WriteByte
*说明:无
*功能:写入8bit数据
*调用:delayus()
*输入:dat:要写入的数据
*输出:无
*************************************************/
void DS1302WriteByte(uchar dat)
{
    uchar i;
    SCLK=0;//初始时钟线置为0
    delayus();
    for(i=0;i<8;i++)//开始传输8个字节的数据
      {
         SDA=dat&0x01;//取最低位,注意DS1302的数据和地址都是从最低位开始传输的
         delayus();
         SCLK=1;//时钟线拉高,制造上升沿,SDA的数据被传输
         delayus();
         SCLK=0;//时钟线拉低,为下一个上升沿做准备
         dat>>=1;//数据右移一位,准备传输下一位数据
      }
}

/************************************************
*名称:DS1302ReadByte()
*说明:无
*功能:读取8bit的数据
*调用:delayus()
*输入:无
*输出:dat:读取的数据
*************************************************/
uchar DS1302ReadByte()
{
   uchar i,dat;
   delayus();
   for(i=0;i<8;i++)
    {
       dat>>=1;//要返回的数据右移一位
       if(SDA==1)//当数据线为高时,证明该位数据为1
         dat|=0x80;//要传输数据的当前值置为1,若不是,则为0
       SCLK=1;//拉高时钟线
       delayus();
       SCLK=0;//制造下降沿
       delayus();
     }
       return dat;//返回读取出的数据

}

/************************************************
*名称:ucharDS1302Read()
*说明:先写地址,后读数据
*功能:从cmd相应地址中读取一个字节的数据
*调用:DS1302WriteByte(),DS1302ReadByte()
*输入:cmd:要写入的控制字节
*输出:dat:读取的数据
*************************************************/
uchar DS1302Read(uchar cmd)
{

   uchar dat;
   RST=0;//初始CE线置为0
   SCLK=0;//初始时钟线置为0
   RST=1;//初始CE置为1,传输开始
   DS1302WriteByte(cmd);//传输命令字,要读取的时间/日历地址   
   dat=DS1302ReadByte();//读取要得到的时间/日期
   SCLK=1;//时钟线拉高
   RST=0;//读取结束,CE置为0,结束数据的传输
   return dat;//返回得到的时间/日期
}

/************************************************
*名称:DS1302Write
*说明:先写地址,后写数据
*功能:向cmd相应地址中写一个字节的数据
*调用:DS1302WriteByte()
*输入:cmd:要写入的控制字,dat:要写入的数据
*输出:无

*************************************************/
void DS1302Write(uchar cmd,uchar dat)
{
   RST=0;//初始CE线置为0
   SCLK=0;//初始时钟线置为0
   RST=1;//初始CE置为1,传输开始
   DS1302WriteByte(cmd);//传输命令字,要写入的时间/日历地址
   DS1302WriteByte(dat);//写入要修改的时间/日期
   SCLK=1;//时钟线拉高
   RST=0;//读取结束,CE置为0,结束数据的传输
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:291815 发表于 2018-6-14 16:10 | 只看该作者
学习了
回复

使用道具 举报

板凳
ID:469380 发表于 2019-4-16 08:50 | 只看该作者
请问掉电走时体现在程序的哪一部分呢?
回复

使用道具 举报

地板
ID:276089 发表于 2019-4-17 15:37 | 只看该作者
DS1302准不了的兄弟  想准就得上DS3231
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表