程序设计目标及程序运行效果说明
程序设计目标:通过DS1302芯片、晶振、电池和数码管实现实时时钟的数码管显示。
程序运行效果说明:将程序下载至芯片,数码管会出现实时的时钟,断开USB端口,不给实验板外部供电,时钟依然走秒。
程序相关电路及原理说明
1.原理说明
生活中大多数时钟大多是非实时的,只要把电池取下来时钟就将停止工作,或者当你的时钟电池耗尽时它将也停止工作。但是在掉电之后时钟将停止走秒,并丢失掉电前的时间。就像我们的老式洛基亚手机在拆卸电池之后再次安装电池开机会出现要求时间重置的界面,其无法保证手机在掉电之后依然维持时钟走秒。而实时时钟就很好的解决了这个难题。
DS1302是 DALLAS 公司推出的涓流充电时钟芯片内含有一个实时时钟/日历和 31 字节静态 RAM,外接32.768kHz晶振,为芯片提供计时脉冲,在电路板的纽扣电池(位于电路板左下方圆柱体)的持续供电下,实现DS1302的独立时间走动。我们可以直接对DS1302的寄存器进行读写,然后把时分秒等数据显示在实验板的数码管上面。
实时时钟的核心是晶振,晶振频率为32768 Hz。它为分频计数器提供精确的与低功耗的实基信号。它可以用于产生秒、分、时、日等信息。为了确保时钟长期的准确性,晶振必须正常工作,不能够收到干扰。
那实时时钟的晶振频率为什么是32768Hz? 实时时钟时间是以振荡频率来计算的。故它不是一个时间器而是一个计数器。而一般的计数器都是16位的。又因为时间的准确性很重要,故震荡次数越低,时间的准确性越低。所以必定是个高次数。32768 Hz = 2^15 即分频15次后为1Hz,周期 = 1s;经过工程师的经验总结32768 Hz,时钟最准确。
2.电路原理图及其工作原理
2.1 DS1302模块电路

DS1302的2、3引脚外接32.768kHz 的晶振,为芯片提供计时脉冲,通过秒寄存器的最高位控制晶振的工作状态,当为高时,停止工作;当为低时,晶振开始工作,实时模块自动计时。
RTC_SCLK引脚作为输入引脚,用于在串行接口上控制数据的输入与输出
RTC_IO引脚作为输入输出引脚,为实时时钟的数据线。
RTC_/RST引脚作为输入引脚,在读、写数据时必须置为高电平。该引脚有两个功能:第一,CE开始控制字访问移位寄存器的控制逻辑;其次,CE 提供结束单字节或多字节数据传输的方法,即:

DS1302对应的时序:单个字节读:在前8个SCLK时钟周期内,上升沿写入控制字,在后8个SCLK时钟周期内,下降沿读取数据字;均从最低位开始。
单个字节写:在前8 个 SCLK 时钟周期,上升沿写入控制字,在后 8 个 SCLK 时钟周期,上升沿写入数据字;均从最低位开始。
2.2 数码管显示电路

其中LED_SEL(P2.3)引脚决定E3的值:当LED_SEL为低时,使能74HC138译码器工作产生位选信号;LED共阴极,段选信号有效相应位置的LED管亮;通过定时器以一定频率扫描位选信号,结合段选信号进行数码管点亮,从而给人视觉上几个数码管几乎同时显示的效果。

用途
实时时钟不但可以作为家用,而且更可以在公共场合使用,如车站、码头、商场等场所,一个稳定可靠的时钟在我们的日常生活中具有很实际的意义,特别实在各种嵌入式系统中用于记录事件发生的时间和相关信息,如通信工程、电力自动化、工业控制等自动化程度高的领域的无人值守环境中。

代码如下:

#include"STC15F2K60S2.H"
#include"intrins.H"
#include"ctype.h"
#define uchar unsigned char
#define uint unsigned int
//DS1302寄存器的定义
#define DS1302_second_write  0X80
#define DS1302_minutes_write  0X82
#define DS1302_hour_write  0X84
#define DS1302_date_write  0X86
#define DS1302_week_write  0X8A
#define DS1302_month_write  0X88
#define DS1302_year_write  0X8C
#define DS1302_second_read  0X81
#define DS1302_minutes_read  0X83
#define DS1302_hour_read  0X85
#define DS1302_date_read  0X87
#define DS1302_week_read  0X8B
#define DS1302_month_read  0X89
#define DS1302_year_read  0X8D
//位定义
sbit RTC_sclk=P1^5;//时钟控制引脚,控制数据的输入输出
sbit RTC_rst=P1^6;//CE引脚,读写时必须置高电平
sbit RTC_io=P5^4;//数据引脚
//显示的位定义
sbit led_sel=P2^3;
uchar wei[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};   //数码管位选
uchar duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数码管段选
//定义时间结构体
typedef struct _systemtime_
{uchar second;uchar minute;uchar hour;uchar day;uchar week;uchar  month;uchar year;
}systemtime;
systemtime t;
uchar i;
uchar temp;
int sec=0;
char flag_100mS=0;
//DS1302写一个字节的数据
void DS1302WriteByte(uchar dat)
{uchar i;RTC_sclk=0;//初始时钟线置0_nop_();_nop_();for(i=0;i<8;i++)//开始传输8位数据{RTC_io=dat&0x01;//取最低位_nop_();_nop_();RTC_sclk=1;//时钟线拉高,制造上升沿,数据被传输_nop_();_nop_();RTC_sclk=0;//时钟线拉低,为下一个上升沿作准备dat>>=1;//数据右移以为,准备传输下一位数据}
}
DS1302读一个字节的数据
uchar DS1302ReadByte()
{uchar i,dat;_nop_();_nop_();for(i=0;i<8;i++){dat>>=1;//要返回的数据右移一位if(RTC_io==1)//当数据线为高时,证明该位数据为1dat|=0x80;RTC_sclk=1;_nop_();_nop_();RTC_sclk=0;//制造下降沿_nop_();_nop_();}return dat;//返回读取出的数据
}
//读相应地址中写一个字节的数据
uchar DS1302Read(uchar cmd)
{uchar dat;RTC_rst=0;//初始CE置0RTC_sclk=0;//初始时钟置0RTC_rst=1;//初始CE置1,传输开始DS1302WriteByte(cmd);//传输命令字dat=DS1302ReadByte();//读取得到的时间RTC_sclk=1;//时钟线拉高RTC_rst=0;//读取结束,CE置0,结束数据传输return dat;//返回得到的时间日期
}
//在相应地址写数据
void DS1302Write(uchar cmd,uchar dat)
{RTC_rst=0;//初始CE置0RTC_sclk=0;//初始时钟置0RTC_rst=1;//初始CE置1,传输开始DS1302WriteByte(cmd);//传输命令字,要写入的时间的地址DS1302WriteByte(dat);//写入修改的时间RTC_sclk=1;//时钟线拉高RTC_rst=0;//读取结束,CE=0,结束数据传输
}
//DS1302的时间值获取程序
systemtime GetDA1302()
{systemtime time;uchar realvalue;realvalue=DS1302Read(DS1302_second_read);time.second=((realvalue&0x70)>>4)*10+(realvalue&0x0f);realvalue=DS1302Read(DS1302_minutes_read);time.minute=((realvalue&0x70)>>4)*10+(realvalue&0x0f);realvalue=DS1302Read(DS1302_hour_read );time.hour=((realvalue&0x70)>>4)*10+(realvalue&0x0f);realvalue=DS1302Read(DS1302_date_read );time.day=((realvalue&0x70)>>4)*10+(realvalue&0x0f);realvalue=DS1302Read(DS1302_week_read);time.week=((realvalue&0x70)>>4)*10+(realvalue&0x0f);realvalue=DS1302Read(DS1302_month_read);time.month=((realvalue&0x70)>>4)*10+(realvalue&0x0f);realvalue=DS1302Read(DS1302_year_read);time.year=((realvalue&0x70)>>4)*10+(realvalue&0x0f);return time;
}
//DS1302初始化程序
void Init_DS1302()
{   unsigned char hour,min,sec;
//    unsigned char code DataStr[]=__DATE__;     //格式: "Jan 13 2017"   12字符(含结束符)unsigned char code DataStr[]=__TIME__;     //格式:"09:12:04"    9字符(含结束符)hour=((toint(DataStr[0]))<<4)+toint(DataStr[1]);min=((toint(DataStr[3]))<<4)+toint(DataStr[4]);sec=((toint(DataStr[6]))<<4)+toint(DataStr[7]);DS1302Write(0X8E,0X00);写保护关DS1302Write(DS1302_second_write,sec);DS1302Write(DS1302_minutes_write,min);DS1302Write(DS1302_hour_write,hour);
//    DS1302Write(DS1302_week_write,0X00);
//  DS1302Write(DS1302_month_write,0X00);
//  DS1302Write(DS1302_date_write,0X00);
//  DS1302Write(DS1302_year_write,0X00);temp=DS1302Read(DS1302_second_read)&0x7f;DS1302Write(DS1302_second_write,temp);
//  DS1302Write(0x90,0xa9);         //充电设置:允许充电,2个二极管,2k电DS1302Write(0X8E,0X80);//写保护置1
}void set_charge_DS1302()
{ DS1302Write(0X8E,0X00); //写保护关DS1302Write(0x90,0xa9); //充电设置:允许充电,2个二极管,2k电DS1302Write(0X8E,0X80); //写保护置1
}
//系统初始化程序
void init()
{   P3=0xEF;                 //关蜂鸣器P2M0=0XFF;P2M1=0X00;P0M0=0XFF;P0M1=0X00;led_sel=0;//选通数码管TMOD=0X01;//定时器0,工作方式1EA=1;//打开总中断TH0=(65535-1000)/256;//设置定时初值TL0=(65535-1000)%256;TR0=1;//启动定时器ET0=1;//开启定时器中断
}
void time0() interrupt 1
{TH0=(65535-1000)/256;//设置定时初值TL0=(65535-1000)%256;EA=0;i++;if(++sec==100) {sec=0; flag_100mS=1; }if(i==8)i=0;led_sel=0;P0=0X00;P2=wei[i];switch(i){case 0:P0=duan[t.hour/10];break;case 1:P0=duan[t.hour%10];break;case 3:P0=duan[t.minute/10];break;case 4:P0=duan[t.minute%10];break;case 6:P0=duan[t.second/10];break;case 7:P0=duan[t.second%10];break;default :P0=0x40;break;}EA=1;
}void main()
{init();if(DS1302Read(DS1302_second_read)&0X80) Init_DS1302();set_charge_DS1302();while(1){if (flag_100mS==1){t=GetDA1302();flag_100mS=0;}}
}

STC学习:实时时钟相关推荐

  1. 【STC单片机学习】第十四课:SPI通信-实时时钟DS1302

    [朱老师课程总结 侵删] 第一部分.章节目录 1.14.1.RTC有关的背景知识 1.14.2.原理图和接线 1.14.3.数据手册带读 1.14.4.时序图的读法1​ 1.14.5.编程实践1 1. ...

  2. STC学习:可校准的实时时钟

    程序设计目标及程序运行效果说明 程序设计目标:通过DS1302芯片.晶振.电池和数码管实现实时时钟的数码管显示,并实现实时时钟的时间的准确校准. 程序运行效果说明:将程序下载至芯片,数码管会出现实时的 ...

  3. STM32学习心得二十一:实时时钟RTC和备份寄存器BKP特征、原理及相关实验代码解读

    记录一下,方便以后翻阅~ 主要内容 1) RTC特征与原理: 2) BKP备份寄存器特征与原理: 3) RTC常用寄存器+库函数介绍: 4) 相关实验代码解读. 实验内容: 因为没有买LCD屏,所以计 ...

  4. 基于Proteus学习单片机系列(七)——实时时钟DS1302

    获取更多资源,请关注微信公众号:嵌入式基地 获取项目资源:公众号后台回复:单片机仿真 基于Proteus学习单片机系列(一)--点亮LED 基于Proteus学习单片机系列(二)--驱动数码管 基于P ...

  5. 【嵌入式】MSP430系统实时时钟RTC学习日志(完善中)

    目录 MSP430系统实时时钟RTC [时钟初始化]系统时钟初始化需要注意的问题 MSP430F149时钟源选择(部分转) MSP430 系统时钟 ACLK.MCLK.SMCLK [MSP430时钟] ...

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

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

  7. 【STM32学习】实时时钟 —— RTC

    [STM32学习]实时时钟 -- RTC 零.参考 一.工作原理 1.RTC介绍 2.工作过程 二.相关寄存器 三.代码说明 1.rtc初始化 2.关于中断 3.中断配置代码(仅供参考) 3.1 秒中 ...

  8. (实验15)单片机,STM32F4学习笔记,代码讲解【RTC实时时钟实验】【正点原子】【原创】

    文章目录 其它文章链接,独家吐血整理 实验现象 主程序 RTC初始化程序 代码讲解 其它文章链接,独家吐血整理 (实验3)单片机,STM32F4学习笔记,代码讲解[按键输入实验][正点原子][原创] ...

  9. STM32学习笔记(十九)RTC实时时钟实验

    STM32F103ZET6之RTC实时时钟实验 文章目录 STM32F103ZET6之RTC实时时钟实验 前言 一.简介 二.相关寄存器及配置过程 三.程序源码 1.rtc.h 2.rtc.c 3.m ...

  10. STM32基于固件库学习笔记(11)RTC实时时钟

    实时时钟(RTC) 小容量产品是指闪存存储器容量在16K至32K字节之间的STM32F101xx.STM32F102xx和STM32F103xx微控制器. 中容量产品是指闪存存储器容量在64K至128 ...

最新文章

  1. LINUX学习笔记高度浓缩版之一 :用户管理、启动过程、硬盘管理
  2. 祝福遨游:傲游浏览器3月将入住欧盟Win7用户桌面
  3. 【Network Security!】NTFS安全权限(看不懂你来打我)
  4. Linux环境部署jenkins
  5. 第二天学习Java的笔记
  6. Python——中国大学MOOC——神经网络与深度学习——Matblotlib绘图基础
  7. RAC的搭建(一)--安装环境准备
  8. Visual Studio 和 Team Foundation Server 产品维护及周期策略
  9. 惊呆了!被公司辞退拿了22万补偿金,原东家称每月涨薪7000,只要退还22万
  10. linux有个进程有问题_第五十五章、linux下进程的基本知识
  11. C Primer Plus 第13章 文件输入/输出 13.11 编程练习答案
  12. 分治法:快排划分法(单向扫描法)
  13. 51. Element replaceChild() 方法
  14. php架构师都会有什么面试题,PHP架构师面试题目和答案
  15. java毕业生设计学生管理部门信息共享交流系统计算机源码+系统+mysql+调试部署+lw
  16. SpringBoot中使用MyBatis-Plus是如何解决Invalid bound statement (not found)这个异常的
  17. 还想野蛮生长?互联网金融有《意见》了
  18. 在线教育项目02_前端知识(es6、vue)
  19. 塞班s60v3手电筒sisx_塞班s60v3闪光灯手电筒软件可以发给我吗?谢谢!
  20. 文本分类+机器学习浅谈?

热门文章

  1. Office 2007中的config.xml个性定制说明
  2. 阿里云ECS云服务器通过SAP HANA认证 海量数据处理技术助力企业数字化转型
  3. VC通用控件自适应屏幕类
  4. 蓝桥杯 第几个幸运数 set
  5. Linux将文件复制粘贴到另外一个位置
  6. 【算法】排序_快速排序
  7. 消防信号二总线有没电压_杭后旗医院消防消防设备电源原理
  8. 服务端访问Linux的DNS出现DNS request timed out..
  9. java 获取class的方法_[Java教程]Java反射定义、获取Class三种方法
  10. springcloud feign负载均衡_SpringCloud学习笔记(2)——Ribbon