DS1302 时钟 51单片机实现时钟显示
DS1302 具有能计算2100年以前的秒分时……的能力,还有闰年调整功能
主要性能指标:
1、工作电压范围:2.0~5.5V
2、工作电流范围:2.0V时,电流小于200nA,功耗极低
3、TTL兼容
4、采用主电源和备份电源双电源供应
5、两种数据传送方式:单字节传送和多字节传送
6、采用串行数据传送方式
x1,x2:晶振接入引脚
I/O:input/output具有三态功能
VCC1:工作电源
vcc2:备用电源引脚,接入电池或者大电容
sclk: 串行时钟输入
DS1302.h#ifndef DS1302_H
#define DS1302_H#include "reg52.h"
#include "intrins.h"#ifndef uchar //同理于c文件中的typedef unsigned char uchar;
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endifsbit 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
SPI:串行外围接口
SPI接口主要以主从方式工作的,这种模式通常有一个主器件或多个从器件,其接口包括以下四种信号:
sclk: 时钟器件由主器件产生
MOSI:主器件数据output,从器件input
MISO:主器件数据input,从器件output
~SS:从器件使能信号,由主器件控制
缺点:没有指定的流控制,没有应答机制,确认是否接受到数据
Ds1302.c
#include "Ds1302.h"
/*
DS1302写入和读取时分秒的地址命令
秒分时日月周年 最低位读写位;
*/
uchar code READ_RTC_ADDR[7]={0x81,0x83,0x85,0x87,0x89,0x8B,0x8D};
uchar code WEITE_RTC_ADDR[7]={0x80,0x82,0x84,0x86,0x88,0x8A,0x8C};
/*
DS1302时钟初始化2018年5月13日星期六23点00分00秒。
存储顺序是秒分时日月周年,存储格式是用BCD码
*/
uchar TIME[7]={0,0,0x23,0x013,0x05,0x06,0x18};/*
DS1302是通过SPI串行总线跟单片机通信的,当进行一次读写操作时最少得读写两个字节,第一个字节是控制字节,就是一个命令,告诉DS1302是读还是写操作,是对RAM还是对CLOK寄存器操作。第二个字节就是要读或写的数据了。单字节读写:只有在SCLK为低电平时,才能将CE置为高电平。所以在进行操作之前先将SCLK置低电平,然后将CE置为高电平,接着开始在IO上面放入要传送的电平信号,然后跳变SCLK。数据在SCLK上升沿时,DS1302读写数据,在SCLK下降沿时,DS1302放置数据到IO上*/
void Ds1302Write(uchar addr,uchar dat)//向DS1302命令(地址+数据)
{uchar n;RST=0;_nop_();SCLK=0;_nop_();RST=1;_nop_();for(n=0;n<8;n++){//地址传送DSIO=addr&0x01;addr>>=1;SCLK=1;_nop_();SCLK=0;_nop_();}for(n=0;n<8;n++){//读数据DSIO=dat&0x01;dat>>=1;SCLK=1;_nop_();//数据在SCLK上升沿时,DS1302读写数据,//在SCLK下降沿时,DS1302放置数据到IO上SCLK=0;_nop_();}RST=0;_nop_();
}
uchar Ds1302Read(uchar addr)
{uchar r,dat1,dat;RST=0;_nop_();SCLK=0;_nop_();RST=1;_nop_();for(r=0;r<8;r++){DSIO=addr&0x01;addr>>=1;SCLK=1;_nop_();SCLK=0;_nop_();}_nop_();for(r=0;r<8;r++){dat1=DSIO;dat=(dat>>1)|(dat1<<7);SCLK=1;_nop_();//数据在SCLK上升沿时,DS1302读写数据,//在SCLK下降沿时,DS1302放置数据到IO上SCLK=0;_nop_();}RST=0;_nop_();SCLK=1;_nop_();DSIO=0;_nop_();DSIO=1;_nop_();return dat;}
/*
控制寄存器用于存放DS1302的控制命令字,
DS1302的RST引脚回到高电平后写入的第一个字就为控制命令。
它用于对DS1302读写过程进行控制,它的格式如下:
D7:固定为1
D6:RAM/CK位,=1片内RAM,=0日历、时钟寄存器选择位。
D5~D1:地址位,用于选择进行读写的日历、时钟寄存器或片内RAM。对日历、时钟寄存器或片内RAM的选择见表。
D0: 读写选择,=0写,=1读
*/
void Ds1302Init()
{uchar n;Ds1302Write(0x8e,0x00);//禁止写保护for(n=0;n<8;n++){Ds1302Write(WRITE_RTC_ADDR[n],TIME[N]);}Ds1302Write(0x8e,0x80);//打开写保护
}void Ds1302readTime()//读取时钟信息
{uchar n;for(n=0;n<8;n++){TIME[n]=Ds1302Read(READ_RTC_ADDR[n]);}
}
main.c
#include "reg52.h"
#include "Ds1302.h"sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;typedef unsigned int u16;
typedef unsigned char u8;char num=0;
u8 DisplayData[8];
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void delay(u16 i){//最简单的延时程序while(i--);
}void dispros()
{Da1302readtime();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];
}void display()
{
u8 i;for(i=0;i<8;i++){switch(i) //位选,选择点亮的数码管,{case(0):LSA=0;LSB=0;LSC=0; break;//显示第0位case(1):LSA=1;LSB=0;LSC=0; break;//显示第1位case(2):LSA=0;LSB=1;LSC=0; break;//显示第2位case(3):LSA=1;LSB=1;LSC=0; break;//显示第3位case(4):LSA=0;LSB=0;LSC=1; break;//显示第4位case(5):LSA=1;LSB=0;LSC=1; break;//显示第5位case(6):LSA=0;LSB=1;LSC=1; break;//显示第6位case(7):LSA=1;LSB=1;LSC=1; break;//显示第7位 }P0=DisplayData[i];//发送数据delay(100); //间隔一段时间扫描 P0=0x00;//消隐} }//最基本的简单实现函数
void main()
{ Ds1302Init();while(1){datapros(); //数据处理函数DigDisplay();//数码管显示函数 }
}
DS1302 时钟 51单片机实现时钟显示相关推荐
- 基于51单片机1602温度显示时钟
基于51单片机LCD1602温度显示时钟 要在1602上显示时间和温度先要了解1602是如何显示的.详情可以参考我之前的文章基于51单片机1602显示 :时间显示可以用时钟芯片DS1302,但是此次我 ...
- 51单片机 外部时钟_基于51单片机的LCD12864显示模拟时钟
今天要分享的仿真和程序是基于51单片机的LCD12864显示模拟时钟.公众号之前也分享过数字时钟,但是那些时钟都是采用数字显示的形式来显示时间,而今天分享一个采用LCD12864显示的模拟指针式时钟. ...
- 基于51单片机的时钟系统
这一次带来的项目是课程设计级别的基于51单片机的时钟系统,本次的项目共有两种,一种是基础功能时钟,上电后自动从00-00-00开始计时,另一种加上了调时功能,上电后自动从00-00-00开始,当需要 ...
- 8脚51单片机DIY时间显示+闹钟技术分享(一)
@[8脚51单片机DIY时间显示+闹钟技术分享(一) 最近因为家里闹钟被小朋友摔坏了,所以想着买来买去还是没什么新意,不如自己做一个,这样不是更有意义吗? 那就开始吧,想着自己做就可以用最小资源来实现 ...
- 基于51单片机点阵汉字显示程序设计
文章目录 基于51单片机点阵汉字显示程序设计 一.实践目的 二.实践依托的实验设备与软件 1.设备 2.软件 二. 系统或装置的设计 1. 硬件原理图设计 2.印制板图绘制 三.程序框架及主要算法流程 ...
- 基于51单片机数码管显示
基于51单片机数码管显示 ## 数码管显示原理 数码管(LED Segment Displays)由多个发光二极管封装在一起组成"8"字型的器件,引线已在内部连接完成,只需引出它们 ...
- 51单片机数码管显示60秒倒计时(C语言)
51单片机数码管显示60秒倒计时(C语言) 基于普中51单片机开发板,运用定时器/计数器0和1,实现60秒的倒计时和LED灯0.5s间隔闪烁 文章目录 51单片机数码管显示60秒倒计时(C语言) 前言 ...
- 基于51单片机的LCD1602显示温湿度
51单片机基础难点知识理解后,直接通过下面3个小项目可以更好理解51单片机.中断 定时器 串口甚至是基础的IO输入输出都有结合,再加上一些外设模块的学习(如1602显示屏,L298N电机驱动等) 项目 ...
- 【嵌入式】51单片机+1602+dht11显示温湿度
51单片机+1602+dht11显示温湿度例程代码如下: /*****************************************************************联系:请勿 ...
最新文章
- 微信小程序教程 [第五篇]脚本语言(WXS)
- 快速排序 C++代码实现及其算法思想及时间复杂度分析及优化 恋上数据结构笔记
- 11.浅析Java中的final关键字
- html选择树形菜单代码,jquery+css实现html选择树或树形菜单
- 川大计算机学院研究生分数线,四川大学计算机学院2018年硕士研究生招生拟录取名单及成绩公示...
- 《转》浅谈CSRF攻击方式
- 微软 .NET Core 3.0 版本发布
- 搜索引擎设计实用教程(1)-以百度为例 之一:查询处理以及分词技术
- python list相关知识
- 主流服务器虚拟化技术厂商,各大服务器厂商虚拟化技术剖析
- Axure 8.1.0.3388授权码
- 完善智慧办公建设,小熊U租获京东数千万元A+轮融资...
- javascript学习笔记-基础语法篇
- Java音频格式转换,支持amr、aud、slk、silk转成mp3的程序
- tomcat启动一直卡在Root WebApplicationContext: initialization completed
- 数据结构(C语言)-串子系统(实验)
- 摸鱼技能学习-持续更新
- 下一个好莱坞巨头——计算机
- 计算机控制的电子点火系统,计算机控制点火系统的组成及工作原理.ppt
- disconf源码分析