文章目录

  • 写在前面
  • 一、DS1302写入和读取时分秒的地址命令
  • 二、DS1302读/写命令
    • 1)、写命令
    • 2)、读命令
  • 三、DS1302初始化
  • 四、读取时钟信息
  • 五、DS1302头文件
  • 六、主函数
  • 附*数码管函数
    • 1)、shumguan.h
    • 2)、shumaguan.c

写在前面

DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.0V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。
程序功能: 系统运行时, 数码管上显示电子时钟, 格式为“XX-XX-XX” 。

一、DS1302写入和读取时分秒的地址命令

实时时钟的缩写是RTC(Real_Time Clock),RTC 是集成电路,通常称为时钟芯片。
存储顺序是秒分时日月周年,存储格式是用BCD码。

//---秒分时日月周年 最低位读写位;-------//
uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
//---DS1302时钟初始化2020年4月2日星期四12点00分00秒。---//
uchar TIME[7] = {0, 0, 0x12, 0x02, 0x04, 0x04, 0x20};

二、DS1302读/写命令

1)、写命令

CE=RST
简要:
RST=0
SCLK=0
RST=1
循环传送八位地址命令
循环写入八位数据(同上)
*数据从低位开始传送(addr & 0x01)

void Ds1302Write(uchar addr, uchar dat)
{uchar n;RST = 0;_nop_();SCLK = 0;//先将SCLK置低电平。_nop_();RST = 1; //然后将RST(CE)置高电平。_nop_();for (n=0; n<8; n++)//开始传送八位地址命令{DSIO = addr & 0x01;//数据从低位开始传送addr >>= 1;SCLK = 1;//数据在上升沿时,DS1302读取数据_nop_();SCLK = 0;_nop_();}for (n=0; n<8; n++)//写入8位数据{DSIO = dat & 0x01;dat >>= 1;SCLK = 1;//数据在上升沿时,DS1302读取数据_nop_();SCLK = 0;_nop_();    }   RST = 0;//传送数据结束_nop_();
}

2)、读命令

简要:
RST=0
SCLK=0
RST=1
循环传送八位地址命令
循环读八位数据(同上)
*数据从低位开始传送(addr & 0x01)

uchar Ds1302Read(uchar addr)
{uchar n,dat,dat1;RST = 0;_nop_();SCLK = 0;//先将SCLK置低电平。_nop_();RST = 1;//然后将RST(CE)置高电平。_nop_();for(n=0; n<8; n++)//开始传送八位地址命令{DSIO = addr & 0x01;//数据从低位开始传送addr >>= 1;SCLK = 1;//数据在上升沿时,DS1302读取数据_nop_();SCLK = 0;//DS1302下降沿时,放置数据_nop_();}_nop_();for(n=0; n<8; n++)//读取8位数据{dat1 = DSIO;//从最低位开始接收dat = (dat>>1) | (dat1<<7);SCLK = 1;_nop_();SCLK = 0;//DS1302下降沿时,放置数据_nop_();}RST = 0;_nop_();    //以下为DS1302复位的稳定时间,必须的。SCLK = 1;_nop_();DSIO = 0;_nop_();DSIO = 1;_nop_();return dat;
}

三、DS1302初始化

控制寄存器的位 7是写保护位,前 7位(位 0至位 6)被强制为 0且读取时总是读 0 在任何对时钟或 RAM的写操作以前,位 7必须为 0 。当为高时,写保护位禁止任何寄存器的写操作. 初始加电状态未定义. 因此,在试图写器件之前应该清除 WP(write protect)位
*void Ds1302Write(uchar addr, uchar dat);
写保护地址:0x8E(见图一)

void Ds1302Init()
{uchar n;Ds1302Write(0x8E,0X00);         //禁止写保护,就是关闭写保护功能for (n=0; n<7; n++)                  //写入7个字节的时钟信号:分秒时日月周年{Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);    }Ds1302Write(0x8E,0x80);         //打开写保护功能
}

四、读取时钟信息

TIME : 时钟初始化时间为2020年4月2日星期四12点00分00秒
READ_RTC_ADDR[n] :秒分时日月周年相对应的地址

void Ds1302ReadTime()
{uchar n;for (n=0; n<7; n++)//读取7个字节的时钟信号:秒分时日月周年{TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);}
}

五、DS1302头文件

#ifndef __DS1302_H_
#define __DS1302_H_//---包含头文件---//
#include<reg52.h>
#include<intrins.h>//---重定义关键词---//
#ifndef uchar
#define uchar unsigned char
#endif#ifndef uint
#define uint unsigned int
#endif//---定义ds1302使用的IO口---//
sbit DSIO=P3^4;
sbit RST=P3^5;
sbit SCLK=P3^6;//---定义全局函数---//
void Ds1302Write(uchar addr, uchar dat);
uchar Ds1302Read(uchar addr);
void Ds1302Init();
void Ds1302ReadTime();//---加入全局变量--//
extern uchar TIME[7];   //加入全局变量#endif

六、主函数

#include "reg52.h"
#include "ds1302.h"
#include "shumaguan.h"void main()
{   Ds1302Init();      //第一次初始化后可以注释该条语句,这样下次重启就不会再次初始化了while(1){datapros();  //数据处理函数DigDisplay();//数码管显示函数     }
}

附*数码管函数

1)、shumguan.h

#ifndef __shumaguan_H_
#define __shumaguan_H_#include<reg52.h>#ifndef u8
#define u8 unsigned char
#endif#ifndef u16
#define u16 unsigned int
#endifsbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;void datapros()    ;
void delay(u16 i)  ;
void DigDisplay()  ;
void Ds1302ReadTime();#endif

2)、shumaguan.c

#include"shumaguan.h"char num=0;
u8 DisplayData[8];
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
extern u8 TIME[7];/*******************************************************************************
* 函 数 名         : delay
* 函数功能         : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{while(i--);
}/*******************************************************************************
* 函 数 名         : datapros()
* 函数功能         : 时间读取处理转换函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void datapros()
{Ds1302ReadTime();DisplayData[0] = smgduan[TIME[2]/16];                //时DisplayData[1] = smgduan[TIME[2]&0x0f];              DisplayData[2] = 0x40;DisplayData[3] = smgduan[TIME[1]/16];              //分DisplayData[4] = smgduan[TIME[1]&0x0f]; DisplayData[5] = 0x40;DisplayData[6] = smgduan[TIME[0]/16];               //秒DisplayData[7] = smgduan[TIME[0]&0x0f];
}/*******************************************************************************
* 函数名         :DigDisplay()
* 函数功能       :数码管显示函数
* 输入           : 无
* 输出             : 无
*******************************************************************************/
void DigDisplay()
{u8 i;for(i=0;i<8;i++){switch(i)   //位选,选择点亮的数码管,{case(0):LSA=1;LSB=1;LSC=1; break;//显示第0位case(1):LSA=0;LSB=1;LSC=1; break;//显示第1位case(2):LSA=1;LSB=0;LSC=1; break;//显示第2位case(3):LSA=0;LSB=0;LSC=1; break;//显示第3位case(4):LSA=1;LSB=1;LSC=0; break;//显示第4位case(5):LSA=0;LSB=1;LSC=0; break;//显示第5位case(6):LSA=1;LSB=0;LSC=0; break;//显示第6位case(7):LSA=0;LSB=0;LSC=0; break;//显示第7位}P0=DisplayData[i];//发送数据delay(100); //间隔一段时间扫描  P0=0x00;//消隐}
}

DS1302时钟程序解读相关推荐

  1. 单片机c语言程序流程图,ds1302时钟程序详解,ds1302程序流程图(C程序)

    ds1302时钟程序详解 DS1302 的控制字如图2所示.控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RA ...

  2. 寻路机器人单片机程序示例_单片机精华程序代码示例:DS1302时钟程序

    真正的熟练掌握单片机,实际操作是很重要的.多看程序,多分析,从别人规范的程序代码中学习技巧是很必要的. 硬件部分: 程序部分: main.c文件 /************************** ...

  3. ds1302的c语言程序,ds1302时钟程序详解,ds1302程序流程图(C程序)

    DS1302 的控制字如图2所示.控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据, 为1表示存取RAM数据;位5至位1指示操 ...

  4. Ds1302时钟+独立按键校正时间

    计算机专业的学生一枚,为了将来的大四的生活先做个小准备. 这不,为了面试一个物联网中心,简单做一个:按键控制的Ds1302时钟,通过数码管显示. 多接触硬件的感觉也挺好. 不过,51编程费劲,Ardu ...

  5. python小程序-第一个python小程序——即时动态时钟(代码解读)

    代码资源来自: 一.完整代码: #coding=UTF-8 from turtle import * from datetime import * def Skip(step): #建立表的外框 pe ...

  6. 两个单片机iic通讯程序_PIC单片机之DS1302时钟

    大家好,通过前一期的学习,我们已经对ICD2 仿真烧写器和增强型PIC 实验板的使用方法及学习方式有所了解与熟悉,学会了如何用单片机来控制发光管.继电器.蜂鸣器.按键.数码管.RS232串口.步进电机 ...

  7. 基于51单片机的DS1302实时时钟程序

    DS1302概述 DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片.它可以对年.月.日.周.时.分.秒进行计时,且具有闰年补偿等多种功能. 工作原理 DS1302 是 ...

  8. 【51单片机学习笔记】DS1302实时时钟程序

    目录 实验现象 DS1302介绍 ds1302简介 引脚 工作流程 寄存器 控制寄存器 时间寄存器 读写与时序 写 读 ds1302的GPIO 代码 ds1302.c main.c 备注 实验现象 将 ...

  9. 用单片机用c语言做闹钟,基于单片机与ds1302时钟芯片的电子闹钟C程序

    原标题:基于单片机与ds1302时钟芯片的电子闹钟C程序 #include #define w_second 0x80 //秒写入地址 #define w_minute 0x82 //分写入地址 #d ...

最新文章

  1. 【Qt】ubuntu14.04.5 qt5.6中使用opencv3.4报错:Using GTK+ 2.x and GTK+ 3 in the same process is not supported
  2. ubuntu12.04安装node.js详细步骤
  3. python基础代码事例-python基础代码大全
  4. 类加载子系统的详解——未完待续
  5. ML之FE:特征工程中数据缺失值填充的简介、方法、全部代码实现之详细攻略
  6. python 虚拟环境 virtualenv virtualenvwrapper的使用方法、命令
  7. 【数据挖掘实例】构建Xgboost模型,在电力用户的95598工单数据中的电费敏感用户预测(高敏用户模型)
  8. dhcp计算机毕业论文,基于线程池机制的高性能DHCP服务器研究与实现-计算机科学与技术专业毕业论文.docx...
  9. 简单的Session案例 —— 一次性验证码
  10. python基础之序列类型的方法——列表元组
  11. mysql基本sql语句总结(一)
  12. iOS ApplePay paymentData 加解密 (待续)
  13. 电脑无法启动显示计算机comt,电脑开机显示press any key to restart进不了系统怎么办?...
  14. Flink 第8.2章 Flink 的键组 KeyGroup 与 缩放 Rescale
  15. html鼠标点击后变换样式,css鼠标样式(css鼠标点击切换样式)
  16. android模拟器的录屏,夜神安卓模拟器如何录制视频
  17. 【Visual C++】游戏开发四十九 浅墨DirectX教程十七 三维天空的实现
  18. linux安装软件之./configure、make、make install 命令含义
  19. Unirech腾讯云代充-云服务器登陆及远程连接常见问题
  20. “好家园房产中介网后台管理”python项目

热门文章

  1. 软件工程项目——大学生综测评分计算管理系统
  2. mysql学生表_课程表_选课表,连表查询
  3. Linux操作系统安装
  4. 杰理-AC632x开发之usb无法下载问题和原因
  5. (找规律)3,5,7,2,4,11,7,5,29,23,? 填什么数字
  6. 哔咔服务器维护时间,哔咔
  7. 计算机与汽车智能信息化管理,谈计算机控制系统在汽车行业的应用
  8. Qt 使用阿里巴巴字体图标库 iconfont
  9. UE4轮廓描边【非后处理】
  10. Markdown - Emoji表情大全