DS1302时钟程序解读
文章目录
- 写在前面
- 一、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时钟程序解读相关推荐
- 单片机c语言程序流程图,ds1302时钟程序详解,ds1302程序流程图(C程序)
ds1302时钟程序详解 DS1302 的控制字如图2所示.控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RA ...
- 寻路机器人单片机程序示例_单片机精华程序代码示例:DS1302时钟程序
真正的熟练掌握单片机,实际操作是很重要的.多看程序,多分析,从别人规范的程序代码中学习技巧是很必要的. 硬件部分: 程序部分: main.c文件 /************************** ...
- ds1302的c语言程序,ds1302时钟程序详解,ds1302程序流程图(C程序)
DS1302 的控制字如图2所示.控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据, 为1表示存取RAM数据;位5至位1指示操 ...
- Ds1302时钟+独立按键校正时间
计算机专业的学生一枚,为了将来的大四的生活先做个小准备. 这不,为了面试一个物联网中心,简单做一个:按键控制的Ds1302时钟,通过数码管显示. 多接触硬件的感觉也挺好. 不过,51编程费劲,Ardu ...
- python小程序-第一个python小程序——即时动态时钟(代码解读)
代码资源来自: 一.完整代码: #coding=UTF-8 from turtle import * from datetime import * def Skip(step): #建立表的外框 pe ...
- 两个单片机iic通讯程序_PIC单片机之DS1302时钟
大家好,通过前一期的学习,我们已经对ICD2 仿真烧写器和增强型PIC 实验板的使用方法及学习方式有所了解与熟悉,学会了如何用单片机来控制发光管.继电器.蜂鸣器.按键.数码管.RS232串口.步进电机 ...
- 基于51单片机的DS1302实时时钟程序
DS1302概述 DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片.它可以对年.月.日.周.时.分.秒进行计时,且具有闰年补偿等多种功能. 工作原理 DS1302 是 ...
- 【51单片机学习笔记】DS1302实时时钟程序
目录 实验现象 DS1302介绍 ds1302简介 引脚 工作流程 寄存器 控制寄存器 时间寄存器 读写与时序 写 读 ds1302的GPIO 代码 ds1302.c main.c 备注 实验现象 将 ...
- 用单片机用c语言做闹钟,基于单片机与ds1302时钟芯片的电子闹钟C程序
原标题:基于单片机与ds1302时钟芯片的电子闹钟C程序 #include #define w_second 0x80 //秒写入地址 #define w_minute 0x82 //分写入地址 #d ...
最新文章
- 【Qt】ubuntu14.04.5 qt5.6中使用opencv3.4报错:Using GTK+ 2.x and GTK+ 3 in the same process is not supported
- ubuntu12.04安装node.js详细步骤
- python基础代码事例-python基础代码大全
- 类加载子系统的详解——未完待续
- ML之FE:特征工程中数据缺失值填充的简介、方法、全部代码实现之详细攻略
- python 虚拟环境 virtualenv virtualenvwrapper的使用方法、命令
- 【数据挖掘实例】构建Xgboost模型,在电力用户的95598工单数据中的电费敏感用户预测(高敏用户模型)
- dhcp计算机毕业论文,基于线程池机制的高性能DHCP服务器研究与实现-计算机科学与技术专业毕业论文.docx...
- 简单的Session案例 —— 一次性验证码
- python基础之序列类型的方法——列表元组
- mysql基本sql语句总结(一)
- iOS ApplePay paymentData 加解密 (待续)
- 电脑无法启动显示计算机comt,电脑开机显示press any key to restart进不了系统怎么办?...
- Flink 第8.2章 Flink 的键组 KeyGroup 与 缩放 Rescale
- html鼠标点击后变换样式,css鼠标样式(css鼠标点击切换样式)
- android模拟器的录屏,夜神安卓模拟器如何录制视频
- 【Visual C++】游戏开发四十九 浅墨DirectX教程十七 三维天空的实现
- linux安装软件之./configure、make、make install 命令含义
- Unirech腾讯云代充-云服务器登陆及远程连接常见问题
- “好家园房产中介网后台管理”python项目
热门文章
- 软件工程项目——大学生综测评分计算管理系统
- mysql学生表_课程表_选课表,连表查询
- Linux操作系统安装
- 杰理-AC632x开发之usb无法下载问题和原因
- (找规律)3,5,7,2,4,11,7,5,29,23,? 填什么数字
- 哔咔服务器维护时间,哔咔
- 计算机与汽车智能信息化管理,谈计算机控制系统在汽车行业的应用
- Qt 使用阿里巴巴字体图标库 iconfont
- UE4轮廓描边【非后处理】
- Markdown - Emoji表情大全