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单片机实现时钟显示相关推荐

  1. 基于51单片机1602温度显示时钟

    基于51单片机LCD1602温度显示时钟 要在1602上显示时间和温度先要了解1602是如何显示的.详情可以参考我之前的文章基于51单片机1602显示 :时间显示可以用时钟芯片DS1302,但是此次我 ...

  2. 51单片机 外部时钟_基于51单片机的LCD12864显示模拟时钟

    今天要分享的仿真和程序是基于51单片机的LCD12864显示模拟时钟.公众号之前也分享过数字时钟,但是那些时钟都是采用数字显示的形式来显示时间,而今天分享一个采用LCD12864显示的模拟指针式时钟. ...

  3. 基于51单片机的时钟系统

     这一次带来的项目是课程设计级别的基于51单片机的时钟系统,本次的项目共有两种,一种是基础功能时钟,上电后自动从00-00-00开始计时,另一种加上了调时功能,上电后自动从00-00-00开始,当需要 ...

  4. 8脚51单片机DIY时间显示+闹钟技术分享(一)

    @[8脚51单片机DIY时间显示+闹钟技术分享(一) 最近因为家里闹钟被小朋友摔坏了,所以想着买来买去还是没什么新意,不如自己做一个,这样不是更有意义吗? 那就开始吧,想着自己做就可以用最小资源来实现 ...

  5. 基于51单片机点阵汉字显示程序设计

    文章目录 基于51单片机点阵汉字显示程序设计 一.实践目的 二.实践依托的实验设备与软件 1.设备 2.软件 二. 系统或装置的设计 1. 硬件原理图设计 2.印制板图绘制 三.程序框架及主要算法流程 ...

  6. 基于51单片机数码管显示

    基于51单片机数码管显示 ## 数码管显示原理 数码管(LED Segment Displays)由多个发光二极管封装在一起组成"8"字型的器件,引线已在内部连接完成,只需引出它们 ...

  7. 51单片机数码管显示60秒倒计时(C语言)

    51单片机数码管显示60秒倒计时(C语言) 基于普中51单片机开发板,运用定时器/计数器0和1,实现60秒的倒计时和LED灯0.5s间隔闪烁 文章目录 51单片机数码管显示60秒倒计时(C语言) 前言 ...

  8. 基于51单片机的LCD1602显示温湿度

    51单片机基础难点知识理解后,直接通过下面3个小项目可以更好理解51单片机.中断 定时器 串口甚至是基础的IO输入输出都有结合,再加上一些外设模块的学习(如1602显示屏,L298N电机驱动等) 项目 ...

  9. 【嵌入式】51单片机+1602+dht11显示温湿度

    51单片机+1602+dht11显示温湿度例程代码如下: /*****************************************************************联系:请勿 ...

最新文章

  1. 微信小程序教程 [第五篇]脚本语言(WXS)
  2. 快速排序 C++代码实现及其算法思想及时间复杂度分析及优化 恋上数据结构笔记
  3. 11.浅析Java中的final关键字
  4. html选择树形菜单代码,jquery+css实现html选择树或树形菜单
  5. 川大计算机学院研究生分数线,四川大学计算机学院2018年硕士研究生招生拟录取名单及成绩公示...
  6. 《转》浅谈CSRF攻击方式
  7. 微软 .NET Core 3.0 版本发布
  8. 搜索引擎设计实用教程(1)-以百度为例 之一:查询处理以及分词技术
  9. python list相关知识
  10. 主流服务器虚拟化技术厂商,各大服务器厂商虚拟化技术剖析
  11. Axure 8.1.0.3388授权码
  12. 完善智慧办公建设,小熊U租获京东数千万元A+轮融资...
  13. javascript学习笔记-基础语法篇
  14. Java音频格式转换,支持amr、aud、slk、silk转成mp3的程序
  15. tomcat启动一直卡在Root WebApplicationContext: initialization completed
  16. 数据结构(C语言)-串子系统(实验)
  17. 摸鱼技能学习-持续更新
  18. 下一个好莱坞巨头——计算机
  19. 计算机控制的电子点火系统,计算机控制点火系统的组成及工作原理.ppt
  20. disconf源码分析

热门文章

  1. 基于SSM梵杰妮纺织品公司订单管理系统
  2. 总结中间方攻击和CA认证中心
  3. U8650真正一键root,适合不刷机人群,绝对可用
  4. B站头部UP主抱团垄断优质资源,腰部UP主的流量突破口在哪?
  5. 解决PHP项目显示“该网页无法正常运作”,但没有显示报错内容
  6. PTA-C语言-解一元二次方程
  7. 【已解决】找不到某服务器 IP 地址
  8. Linux守护进程设计规范及python实现
  9. iOS_44_导入第3方APP内的文件_UTI
  10. 什么是模块化代码?如何写?