1. DS1302介绍

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

•RTC(Real Time Clock):实时时钟,是一种集成电路,通常称为时钟芯片

  1. DS1302引脚介绍

  1. 内部结构图

  1. 寄存器定义

  1. 时序定义

  1. BCD码

•BCD码(Binary Coded Decimal‎),用4位二进制数来表示1位十进制数

•例:00010011表示13,1000 0101表示85,00011010不合法

•在十六进制中的体现:0x13表示13,0x85表示85,0x1A不合法

•BCD码转十进制:DEC=BCD/16*10+BCD%16; (2位BCD)

•十进制转BCD码:BCD=DEC/10*16+DEC%10; (2位BCD)

  1. DS1302时钟的实现

1)程序

#include <REGX52.H>
#include "LCD1602.h"
#include "Delay.h"
#include "Ds1302.h"
#include "Key.h"#include "Timer0.h"void main ()
{LCD_Init();DS1302_Init();LCD_ShowString(1,1,"  -  -  ");LCD_ShowString(2,1,"  :  :  ");DS1302_SetTime();while(1){DS1302_ReadTime();//读取时间LCD_ShowNum(1,1,DS1302_Time[0],2);//显示年LCD_ShowNum(1,4,DS1302_Time[1],2);//显示月LCD_ShowNum(1,7,DS1302_Time[2],2);//显示日LCD_ShowNum(2,1,DS1302_Time[3],2);//显示时LCD_ShowNum(2,4,DS1302_Time[4],2);//显示分LCD_ShowNum(2,7,DS1302_Time[5],2);//显示秒}
}

DS1302.C

#include <REGX52.H>
//引脚定义sbit DS1302_SCLK=P3^6;
sbit DS1302_IO=P3^4;
sbit DS1302_CE=P3^5;//寄存器写入地址/指令命令
#define DS1302_SECOND 0x80
#define DS1302_MINUTE 0x82
#define DS1302_HOUR         0x84
#define DS1302_DATA         0x86
#define DS1302_MONTH     0x88
#define DS1302_DAY     0x8A
#define DS1302_YEAR     0x8C
#define DS1302_WP         0x8E//定义一个数组表示年月日时间
unsigned char DS1302_Time[]={23,02,11,20,55,55};
/*** @brief  DS1302初始化* @param  无* @retval 无*/
void DS1302_Init(void)
{DS1302_SCLK=0;DS1302_CE=0;
}/*** @brief  DS1302写入一个字节* @param  Command 命令字/地址* @param  Data 将要写入数据* @retval 无*/
void DS1302_WriteByte(unsigned char Command ,Data)
{ unsigned char i;DS1302_CE=1;for (i=0;i<8;i++){DS1302_IO=Command&( 0x01<<i);DS1302_SCLK=1;DS1302_SCLK=0;}for (i=0;i<8;i++){DS1302_IO=Data&( 0x01<<i);DS1302_SCLK=1;DS1302_SCLK=0;}DS1302_CE=0;
}
/*** @brief  DS1302读出一个字节* @param  Command 命令字/地址* @retval 读出的数据*/unsigned char DS1302_ReadByte( unsigned char Command)
{unsigned char i,Data=0x00;Command|=0x01;//指令转换为读指令DS1302_CE=1;for (i=0;i<8;i++){DS1302_IO=Command&( 0x01<<i);DS1302_SCLK=0;//根据时序表变换而来DS1302_SCLK=1;}for (i=0;i<8;i++){DS1302_SCLK=1;DS1302_SCLK=0;if(DS1302_IO){Data|=(0x01<<i);}        }DS1302_CE=0;DS1302_IO=0;//读取后将IO设置为0,否则读出的数据会出错return Data;
}
/*** @brief  DS1302设置时间,调用之后,DS1302_Time数组的数字会被设置到DS1302中* @param  * @retval */
void DS1302_SetTime(void)
{十进制转BCD码后写入DS1302_WriteByte(DS1302_WP,0x00);//解除保护DS1302_WriteByte(DS1302_YEAR,DS1302_Time[0]/10*16+DS1302_Time[0]%10);DS1302_WriteByte(DS1302_MONTH,DS1302_Time[1]/10*16+DS1302_Time[1]%10);DS1302_WriteByte(DS1302_DATA,DS1302_Time[2]/10*16+DS1302_Time[2]%10);DS1302_WriteByte(DS1302_HOUR,DS1302_Time[3]/10*16+DS1302_Time[3]%10);DS1302_WriteByte(DS1302_MINUTE,DS1302_Time[4]/10*16+DS1302_Time[4]%10);DS1302_WriteByte(DS1302_SECOND,DS1302_Time[5]/10*16+DS1302_Time[5]%10);DS1302_WriteByte(DS1302_DAY,DS1302_Time[6]/10*16+DS1302_Time[6]%10);DS1302_WriteByte(DS1302_WP,0x80);
}/*** @brief  DS1302读取时间,调用之后,DS1302中的数据会被读取到DS1302_Time数组中* @param  无* @retval 无*/void DS1302_ReadTime(void)
{unsigned char Temp;//BCD码转十进制后读取Temp=DS1302_ReadByte(DS1302_YEAR);DS1302_Time[0]=Temp/16*10+Temp%16;Temp=DS1302_ReadByte(DS1302_MONTH);DS1302_Time[1]=Temp/16*10+Temp%16;Temp=DS1302_ReadByte(DS1302_DATA);DS1302_Time[2]=Temp/16*10+Temp%16;Temp=DS1302_ReadByte(DS1302_HOUR);DS1302_Time[3]=Temp/16*10+Temp%16;Temp=DS1302_ReadByte(DS1302_MINUTE);DS1302_Time[4]=Temp/16*10+Temp%16;Temp=DS1302_ReadByte(DS1302_SECOND);DS1302_Time[5]=Temp/16*10+Temp%16;Temp=DS1302_ReadByte(DS1302_DAY);DS1302_Time[6]=Temp/16*10+Temp%16;
}

2)Proteus仿真

注意事项晶振

  1. 进阶版可调时钟

#include <REGX52.H>
#include "LCD1602.h"
#include "Delay.h"
#include "Ds1302.h"
#include "Key.h"#include "Timer0.h"
unsigned char KeyNum,MODE=1,TimeSetSelect,TimeSetFlashFlag;void TimeShow()
{DS1302_ReadTime();//读取时间LCD_ShowNum(1,1,DS1302_Time[0],2);//显示年LCD_ShowNum(1,4,DS1302_Time[1],2);//显示月LCD_ShowNum(1,7,DS1302_Time[2],2);//显示日LCD_ShowNum(2,1,DS1302_Time[3],2);//显示时LCD_ShowNum(2,4,DS1302_Time[4],2);//显示分LCD_ShowNum(2,7,DS1302_Time[5],2);//显示秒
}
void TimeSet(void)//时间设置功能
{if(KeyNum==2)//按键2按下{TimeSetSelect++;//设置选择位加1TimeSetSelect%=6;//越界清零}if(KeyNum==3)//按键3按下{DS1302_Time[TimeSetSelect]++;//时间设置位数值加1if(DS1302_Time[0]>99){DS1302_Time[0]=0;}//年越界判断if(DS1302_Time[1]>12){DS1302_Time[1]=1;}//月越界判断if( DS1302_Time[1]==1 || DS1302_Time[1]==3 || DS1302_Time[1]==5 || DS1302_Time[1]==7 || DS1302_Time[1]==8 || DS1302_Time[1]==10 || DS1302_Time[1]==12)//日越界判断{if(DS1302_Time[2]>31){DS1302_Time[2]=1;}//大月}else if(DS1302_Time[1]==4 || DS1302_Time[1]==6 || DS1302_Time[1]==9 || DS1302_Time[1]==11){if(DS1302_Time[2]>30){DS1302_Time[2]=1;}//小月}else if(DS1302_Time[1]==2){if(DS1302_Time[0]%4==0){if(DS1302_Time[2]>29){DS1302_Time[2]=1;}//闰年2月}else{if(DS1302_Time[2]>28){DS1302_Time[2]=1;}//平年2月}}if(DS1302_Time[3]>23){DS1302_Time[3]=0;}//时越界判断if(DS1302_Time[4]>59){DS1302_Time[4]=0;}//分越界判断if(DS1302_Time[5]>59){DS1302_Time[5]=0;}//秒越界判断}if(KeyNum==4)//按键3按下{DS1302_Time[TimeSetSelect]--;//时间设置位数值减1if(DS1302_Time[0]<0){DS1302_Time[0]=99;}//年越界判断if(DS1302_Time[1]<1){DS1302_Time[1]=12;}//月越界判断if( DS1302_Time[1]==1 || DS1302_Time[1]==3 || DS1302_Time[1]==5 || DS1302_Time[1]==7 || DS1302_Time[1]==8 || DS1302_Time[1]==10 || DS1302_Time[1]==12)//日越界判断{if(DS1302_Time[2]<1){DS1302_Time[2]=31;}//大月if(DS1302_Time[2]>31){DS1302_Time[2]=1;}}else if(DS1302_Time[1]==4 || DS1302_Time[1]==6 || DS1302_Time[1]==9 || DS1302_Time[1]==11){if(DS1302_Time[2]<1){DS1302_Time[2]=30;}//小月if(DS1302_Time[2]>30){DS1302_Time[2]=1;}}else if(DS1302_Time[1]==2){if(DS1302_Time[0]%4==0){if(DS1302_Time[2]<1){DS1302_Time[2]=29;}//闰年2月if(DS1302_Time[2]>29){DS1302_Time[2]=1;}}else{if(DS1302_Time[2]<1){DS1302_Time[2]=28;}//平年2月if(DS1302_Time[2]>28){DS1302_Time[2]=1;}}}if(DS1302_Time[3]<0){DS1302_Time[3]=23;}//时越界判断if(DS1302_Time[4]<0){DS1302_Time[4]=59;}//分越界判断if(DS1302_Time[5]<0){DS1302_Time[5]=59;}//秒越界判断}//更新显示,根据TimeSetSelect和TimeSetFlashFlag判断可完成闪烁功能if(TimeSetSelect==0 && TimeSetFlashFlag==1){LCD_ShowString(1,1,"  ");}else {LCD_ShowNum(1,1,DS1302_Time[0],2);}if(TimeSetSelect==1 && TimeSetFlashFlag==1){LCD_ShowString(1,4,"  ");}else {LCD_ShowNum(1,4,DS1302_Time[1],2);}if(TimeSetSelect==2 && TimeSetFlashFlag==1){LCD_ShowString(1,7,"  ");}else {LCD_ShowNum(1,7,DS1302_Time[2],2);}if(TimeSetSelect==3 && TimeSetFlashFlag==1){LCD_ShowString(2,1,"  ");}else {LCD_ShowNum(2,1,DS1302_Time[3],2);}if(TimeSetSelect==4 && TimeSetFlashFlag==1){LCD_ShowString(2,4,"  ");}else {LCD_ShowNum(2,4,DS1302_Time[4],2);}if(TimeSetSelect==5 && TimeSetFlashFlag==1){LCD_ShowString(2,7,"  ");}else {LCD_ShowNum(2,7,DS1302_Time[5],2);}
}void main()
{LCD_Init();DS1302_Init();Timer0_Init();LCD_ShowString(1,1,"  -  -  ");LCD_ShowString(2,1,"  :  :  ");DS1302_SetTime();while(1){KeyNum=Key();if(KeyNum==1){if(MODE==0){MODE=1;}else if(MODE==1){MODE=0;DS1302_SetTime();}}switch(MODE){case 0:TimeShow();break;case 1:TimeSet();break;}}
}void Timer0_Routine() interrupt 1
{static unsigned int T0Count;TL0 = 0x18;        //设置定时初值TH0 = 0xFC;        //设置定时初值T0Count++;if(T0Count>=500)//每500ms进入一次{T0Count=0;TimeSetFlashFlag=!TimeSetFlashFlag;//闪烁标志位取反}
}

7. DS1302时钟相关推荐

  1. 一个完整的DS1302时钟在STM32上的应用实例

    一个完整的DS1302时钟在STM32上的应用(代码位置有点乱). 整理后的完整代码https://blog.csdn.net/weibo1230123/article/details/8037279 ...

  2. DS1302时钟芯片在STM32F0中的完整应用代码

                                     DS1302在STM32F0中的应用 /** *作者:魏波 *时间:2017.6.6 * **///DS1302在STM32F0中的应 ...

  3. 基于STM32的DS1302时钟芯片驱动

    基于STM32的DS1302时钟芯片驱动 /****************************************************************************** ...

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

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

  5. 蓝桥杯单片机DS1302时钟芯片驱动代码注释

    蓝桥杯单片机DS1302时钟芯片驱动代码之前的疑惑注释了下 /* DS1302 芯片包含一个 实时时钟/日历和 31 字节的静态 RAM. 与时钟/RAM 通讯只需要三根线: CE,I/O (数据线) ...

  6. 单片机课程设计——《基于AT89S52单片机和DS1302时钟芯片的电子时钟(可蓝牙校准)》...

    引言 本设计以AT89S52单片机为控制核心,时钟芯片DS1302提供时钟源,配合LCD1602液晶显示模块,组成基本硬件系统,同时利用HC-05嵌入式蓝牙串口通讯模块,可在手机端进行日期.时间的校准 ...

  7. 【蓝桥杯单片机】DS1302时钟芯片+DS18B20单总线温度传感器(官方驱动源码改写)

    实验开发板为CT107D蓝桥官方板,编译环境为MDK5 采用蓝桥官方驱动改写 目录 一.DS1302时钟芯片 二.DS18B20温度传感器 一.DS1302时钟芯片 CE 复位脚 I/O 数据输入/输 ...

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

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

  9. 单片机课程设计——《基于AT89S52单片机和DS1302时钟芯片的电子时钟(可蓝牙校准)》... 1

    引言 本设计以AT89S52单片机为控制核心,时钟芯片DS1302提供时钟源,配合LCD1602液晶显示模块,组成基本硬件系统,同时利用HC-05嵌入式蓝牙串口通讯模块,可在手机端进行日期.时间的校准 ...

  10. DS1302 时钟 51单片机实现时钟显示

    DS1302 具有能计算2100年以前的秒分时--的能力,还有闰年调整功能 主要性能指标: 1.工作电压范围:2.0~5.5V 2.工作电流范围:2.0V时,电流小于200nA,功耗极低 3.TTL兼 ...

最新文章

  1. R语言构建xgboost模型:基于稀疏数据(dgCMatrix which is a sparse matrix)、稠密数据(dense matrix)、xgb.DMatrix数据聚合
  2. 控件无法安装,windows已经阻止此软件因为无法验证发行者
  3. java开发和测试开发,附小技巧
  4. for循环:用turtle画一颗五角星
  5. 矿Spring入门Demo
  6. pyspark读写SequenceFile
  7. 查看某个github commit属于哪一个github pull request
  8. java追加txt文件_java怎么追加写入txt文件
  9. java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory
  10. matlab的max与min函数
  11. ddd 企业应用架构模式_灵魂拷问:用了DDD分包就是落地了领域驱动设计吗?谈谈DDD本质...
  12. Validform实时表单验证插件实例使用
  13. 《编程之美:分层遍历二叉树》的另外两个实现
  14. 实用分享-Visual Studio图像查看插件(Image Watch)
  15. linux文件及文件夹权限
  16. 淘宝/天猫获得淘宝商品类目 API 返回值说明
  17. 大数据之 Kafka API 从入门到放弃 (第四章)
  18. 入侵网络游戏服务器修改,如何入侵网络游戏服务器
  19. Flutter Sliver系列组件入门
  20. html 字体样式斜体,CSS font-style斜体字体倾斜体样式

热门文章

  1. 1248. 统计「优美子数组」 前缀和
  2. Sun的逆向之路(一)——元气骑士的内购破解
  3. 基于 x86 SoC 的车辆智能驾驶舱和ADAS设计(一)
  4. thinkjs的select,find,getField
  5. 对蚁群算法中轮盘赌选择城市的理解
  6. Wordpress建站教程
  7. Thinkphp6如何跨域请求
  8. Python根据域名批量获取IP地址和经纬度(2021.12.1)
  9. 单nginx配置多个代理服务
  10. 代码随想录训练营day59