基于STM32的电子万年历系统设计

发布时间:2023-03-15 11:25:15   来源:文档文库   
字号:
龙源期刊网http://www.qikan.com.cn基于STM32的电子万年历系统设计
作者:刘磊
来源:《科技资讯》2015年第01
要:电子万年历是集时间、日期、星期和温度功能于一身,读取直观方便,市场发展前景广阔的一个实用系统。本系统利用STM32内部RTC实时时钟模块,通过相应的软件配置和算法设计,实现电子万年历的功能,可以在LCD12864显示屏上实时显示当前的年、月、日、时、分、秒、星期等信息,具有闰年补偿功能,硬件实现简单,界面友好,系统可靠程度高。本系统就是利用这个模块,配合LCD12864显示屏幕,来实时显示当前时间。下面从理论分析、硬件电路、软件设计等几个方面分别说明。关键词:时钟电路万年历STM32LCD12864中图分类号:TN873文献标识码:A文章编号:1672-3791201501a-0000-00作者简介:刘磊(1993-),男,汉族,河北蔚县人,学历:本科,研究方向:电气工程及其自动化。1理论分析
RTC主要由两部分组成。第一部分一是与APB1总线相连的APB1接口,它由APB1总线时钟驱动,主要用于用户通过APB1总线对其进行读写操作。第二部分是一组可编程计数器,它又由RTC预分频模块和RTC可编程计数模块组成,前者用于产生1秒时间基准,后者主要用于初始化当前时钟时间和进行时钟计数。RTC内核完全独立于APB1接口,软件可以通过APB1接口来访问预分频值和时钟计数器值。
要实现万年历功能,必须对RTC的寄存器进行相应的配置。RTC的控制寄存器有两个,分别为RTC_CRHRTC_CRL。对RTC_CRH的最低位置1可以允许秒中断,这也是我们系统所需要的。在RTC_CRL中,位5到位0是有效位,分别是关于RTC关闭、配置标志、寄存器同步标志、溢出标志、闹钟标志和秒标志的设置。这其中也有些是需要我们注意的,比如位5RTC操作位,该位只能由硬件操作,软件只读,在进行完一次RTC操作后,必须判断该位来确定操作是否完成,若未完成,进行等待。RTC的预分频装载寄存器也是十分重要的寄存器之一,由RTC_PRLHRTC_PRLL组成,主要用来配置RTC的分频数。RTC最重要的寄存器是计数寄存器RTC_CNT,由两个16位寄存器组成用来进行秒钟的计数,最大计数值折合成年大概为136年。在修改RTC_CNT时需要进入配置模式。2硬件电路

龙源期刊网http://www.qikan.com.cnSTM32最小系统需要搭建好两个晶振模块,分别为32768HZ的低速晶振和8MMZ的高速晶振。然后接入复位电路,用于实现系统的复位功能。最后接入JTAG电路,就可以进行程序的下载和硬件仿真了。
LCD12864液晶显示屏可以显示较多的汉字和字符,程序简单,支持串行和并行通信。在本设计中由于IO口的使用并不是很紧张,故选择八位并行通信方式。在硬件连接方面需要注意,将显示屏的DB0-DB7与单片机定义的八位数据口相连,并将RSRWEN与单片机定义的相应控制端口相连,最后根据液晶的说明书正确连接电源和背光引脚。3软件设计
软件方面首先要对STM32RTC进行相关配置。第一步,使能电源时钟和备份区域的时钟,这样这些区域才能开始正常工作。第二步,要取消备份区域的写保护,方便对备份区域的数据进行读写。同时要标记时钟已经经过配置,避免每次复位之后需要重新配置时钟。第三步,使能外部低速振荡器并为RTC选择时钟源,为万年历的运行提供基本的时钟信号。第四步,使能RTC并进行相关的配置,主要包括分频、RTC的允许配置位、更新配置和设置中断等。这些配置为RTC按我们的需求工作提供了基础。第五步也是十分重要的一步,编写中断服务函数,在中断中需要读出当前的时间值实现时间的实时刷新。
在程序设计方面有几个重要的函数。首先是time_set函数,这个函数主要功能是以软件的方式设定一个时间的起始值,也相当于现实生活中的时钟校准。time_set函数有六个参数分别yearmonthdayhourminsec,用来表示用户欲设定的年、月、日、时、分、秒,返回值为0表示设置失败,1表示设置成功。程序算法是:若设置年份大于1970年,则将该年份减去1970再乘以一年时间对应的秒数存入某一变量,若设置月份大于1月,则将该月份减去1月乘以一月对应的秒数存入另一变量,依次类推,最后将每一个参数对应的变量相加即得到当前时间相对于197011000秒所走过的秒数。最后将这个秒数写入到RTCRTC_CNT寄存器中,作为计数初值。当然在程序中也要对闰年和闰年的2月做特殊处理,不再赘述。
还有一个重要的函数是time_get函数,这个函数的主要功能是将计数器中的值读出来并转化为当前的时间,类似于time_set函数的逆过程。首先要将RTC_CNT寄存器中的值存入变量,用这个变量进行关于时间换算的计算。并且我们要定义一个结构体calendar来存放转换完成后的各个变量的值。换算的方法也是简单的数学问题,用取商和取余运算就可以得到秒数对应的年、月、日等变量的值。
对于中断服务函数的处理也很简单,只需要判断标志位来确定产生的中断是不是我们需要的秒中断,若是则调用time_get函数刷新当前时间。

龙源期刊网http://www.qikan.com.cn在主函数中首先要注意的是各个模块的初始化,包括STM32系统、RTC模块和LCD12864显示模块等。由于没有外扩键盘,所以在下载程序时候需要进行一次时间的校准,即手动更改time_set函数的参数值。然后程序便可以进入while1)死循环,在循环中不断执LCD显示程序,因为时间是在中断中刷新,故LCD12864也可以实时显示当前时间,达到万年历的效果。4结论
本系统硬件电路简单,成本低,性价比高,以软件的方式充分利用STM32片上资源实现了万年历的功能,能精确显示当前时间,系统可靠性高。参考文献
[1]滕振芳,张昆.基于单片机的电子万年历的设计.价值工程.20106056.[2]何乃味.基于LED点阵显示的电子万年历的设计与实现.安徽电子信息职业技术学院学.2014119

本文来源:https://www.2haoxitong.net/k/doc/f8c7baba690203d8ce2f0066f5335a8102d26602.html

《基于STM32的电子万年历系统设计.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式