基于STM的万年历设计
STM32 RTC万年历设计
static uint8_t num; //接收计数 uint8_t temp=0; //查询是否发生了空闲中断 if(__HAL_UART_GET_FLAG(usart->huart,UART_FLAG_IDLE) != RESET && \
注意,这部分代码要写在 用户代码区之间,闹钟初始化的部分可以保留在外面,不需要加 入到条件判断语句里面。 到这里,如果断电,在恢复以后时间就可以正常走下去了吗?当然…… 是不可以的!!! 现象是:重新上电后,时分秒的时间是可以继续延续下去,但是日期变成了 2000-01-01 , 为什么??这就需要去追一下初始化的代码了。
如果在日期更新的时候,我们没有重新备份日期到备份寄存器中,那么我们上电读回来的时 间就是我们第一次备份的时间,例如,今天我们备份了日期,然后把板子停电 3 天,三天后 再开启的话,读回来的时间就是今天备份的日期,并不是三天后的日期。
对于这个问题,我们就需要在日期更新和设置日期的时候,都需要把新的日期备份到寄存器 中,做法是在日期更新函数中增加备份代码:
我们需要去查看一下 HAL_RTC_Init(&hrtc)这个函数的代码是实现了什么功能。
在函数结尾,我们看到了上面这一段代码,当调用这个函数的时候就会把日期设置成 2000-01-01 了,找到了原因,我们要怎么改呢?这一段初始化代码什么是规避不了的,那 么我们可以在他执行之后重新把日期设置一下,思路还是利用备份寄存器。 我们可以在初始化时,把日期写到备份寄存中,完善一下之前写的条件初始化程序的内容, 增加日期备份。在这里我们备份的日期仅仅是初始化当时配置的时间,上电后读回来的也是 这个时间,不一定就是正确的!!
基于STM32的智能万年历课程设计说明书
课程设计说明书设计题目:基于STM32的智能万年历专业:电气工程及其自动化班级:设计人:课程设计任务书学院电气信息系专业电气工程及其自动化一、课程设计题目:基于STM32的智能万年历专题名称:最小应用系统二、课程设计主要参考资料(1)刘火良,杨森.STM32库开发实战指南[M].北京:机械工业出版社.2013.5(2)ADS7943中文参考资料[M/CD].(3)ILI9320控制器中文参考资料[M/CD].三、课程设计应解决主要问题(1)最小应用系统:包括MCU、复位、启动、晶振、电源等。
(2)日历的显示和设置;(3)万年历的算法和实现;(4)定时闹钟功能;(5)无线设置功能。
四、课程设计相关附件(如:图纸、软件等)(1)软件:Keil μVision4(2)开发平台:神州Ⅱ号STM32嵌入式技术开发板五、任务发出日期:课程设计完成日期:指导教师签字:系主任签字:指导教师对课程设计的评语指导教师(签章):日期:摘要单片机应用技术飞速发展,从导弹的导航装置,到飞机上各种仪表的控制,从计算机的网络通讯与数据传输,到工业自动化过程的实时控制和数据处理,以及生活中广泛使用的各种智能IC卡、电子宠物等,从大到国家防卫,小到日常生活,方方面面都离不开单片机。
单片机是集CPU,RAM,ROM,定时,计数和多种接口于一体的微控制器。
它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。
二十一世纪的今天科技与经济迅速发展,人们的生活节奏变得越来越快,生活水平越来越高,对于生活的品味和质量的要求也更高。
人们不再满足于只能提供简单计时功能的时钟,希望在能保证计时精确的基础上能多添加一些其他功能,诸如日历、定时等。
本文主要介绍了以STM32F103VCT6开发板为核心部件来设计的一款万年历,以其内部的RTC时钟模块作为时钟,用TFTLCD液晶显示器作为显示模块,时钟电路能准确提供24小时制时间、平年闰年的判断以及定时。
基于单片机的万年历设计
一、引言万年历是一种显示当前日期和时间的器件或软件。
随着科技的发展,电子产品普及率愈来愈高,基于单片机的万年历设计成为了一种非常受欢迎的设计方案。
本文将介绍一种基于单片机的万年历设计。
二、设计原理1.显示模块:采用液晶显示屏作为显示模块,可以显示日期、时间等信息。
2.时钟模块:基于RTC(实时时钟)模块,用于获取当前日期和时间。
3.按键模块:采用按键模块作为输入模块,用于设置日期和时间、切换显示模式等。
4.控制模块:基于单片机,用于控制各个模块的工作,并进行相关的计算和显示。
三、硬件设计1.单片机选择在本设计中,选择了一款常用的单片机,STM32F103C8T6、它具有低功耗、高性能的特点,并且具备丰富的外设接口,非常适合用来设计万年历。
2.RTC模块选择在本设计中,选择了一款常用的RTC模块,DS1302、它具有低功耗、稳定性好的特点,并且具备SPI接口,非常适合用来获取当前日期和时间。
3.液晶显示屏选择在本设计中,选择了一款常用的液晶显示屏,1602液晶显示屏。
它具有较大的屏幕尺寸、低功耗的特点,并且可以显示多行字符,非常适合用来显示日期、时间等信息。
4.按键模块选择在本设计中,选择了一款常用的按键模块,4x4按键模块。
它具备4行4列的按键布局,可以满足设置日期和时间、切换显示模式等功能的需求。
五、软件设计1.初始化设置在软件设计中,首先需要对各个硬件模块进行初始化设置。
2.获取当前日期和时间使用RTC模块获取当前日期和时间,并将其存储在相应的变量中。
3.显示日期和时间使用液晶显示屏将当前日期和时间显示出来。
4.设置日期和时间通过按键模块获取用户的输入,并将对应的日期和时间设置到RTC模块中。
5.切换显示模式通过按键模块获取用户的输入,并根据用户的选择切换不同的显示模式,例如切换到年模式、月模式、日模式等等。
六、总结通过以上的设计,基于单片机的万年历完成了日期和时间的获取、显示和设置等功能。
(完整word版)基于STM32的万年历设计
基于STM32的万年历设计班级:姓名:学号:成绩:电子通信工程系题目:基于STM32的万年历设计前言:随着科技的快速发展,时间的流逝,至从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。
美国DALLAS公司推出的具有涓细电流充电能的低功耗实时时钟电路DS12C887。
它可以对年、月、日、周日、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS12C887的使用寿命长,误差小。
对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒和温度等信息,还具有时间校准等功能。
该电路采用AT89S52单片机作为核心,采用数字式温度传感器DS18B20提取外界温度,功耗小,能在3V的低压工作,电压可选用3~5V电压供电。
进入新世纪LCD显示屏的技术和产业都取得了长足的发展,作为重要的现代信息发布媒体之一,LCD显示屏在证券交易、金融、交通、体育、广告等领域被广泛的应用。
伴随社会信息化进程的推进,LCD显示屏技术也在不断的推陈出新,应用领域愈加广阔。
基于STM32的LCD显示可以更好的满足各种需求,也更便于操作和实现。
现基于STM32在液晶显示屏幕上显示文本及图形。
目前,显示技术和显示工业的发展迅速。
显示技术是传递视觉的信息技术。
液晶显示器件LCD 是当今最有发展前途的一种平板显示器件,它具有很多独到的优异特性。
它具有显示信息多、易于多彩化、体积小、重量轻、功耗低、寿命长、价格低、无辐射、无污染、接口控制方便等优点。
截至目前,我国在液晶显示取得较大进步,我国LCD产业已经走过了近30年的历程.经历几次大的投资浪潮之后,我国内地已经成为世界最大的TN-LCD(扭曲液晶显示器)生产基地和主要的STN-LCD(超扭曲液晶显示器)生产基地,并且从2003年开始,涉足TFT-LCD(薄膜晶体管液晶显示器)领域.本课题设计采用STM32F103VE开发板,实现在LCD显示屏上显示由按键可操控的万年历功能。
基于STM32的智能万年历设计方案
基于STM32的智能万年历设计方案1.课程设计任务1.1 课程设计目的(1)学习万年历的原理,学会定时器、触摸屏在万年历中的应用。
(2)通过万年历的制作使学生熟练掌握所学的相关知识容,并培养学生工程设计的一般方法和技巧。
1.2 设计要求:独立思考、共同合作、保质保量、按时完成。
1.3 技术要求:(1)系统组成系统选用STM32F103单片机为微处理器,使用开发板上具有的按键、指示灯、触摸屏和串口等实现万年历的功能。
(2)实现功能:1)日历、时间的调整,通过按键切换实现对年月日时分秒的调整控制,可以设置每一部分的初始值。
2)具备闰年的自动调整功能3)具有定时闹钟功能:通过按键/触摸屏设置定时时间。
定时时间到,蜂鸣器发出鸣叫声,维持5S。
4)上位机功能:可以把单片机的时间数据通过串口或者USB传送至上位机。
5)无线设置功能:通过远程设置万年历。
(3)模块组成:STM32 单片机最小应用系统;设置显示模块;闹钟模块;时间运行模块等;1.4 解决的主要问题:(1)最小应用系统设计:设计STM32的最小应用系统,包括MCU、复位、启动、晶振、电源等。
(2)日历的显示和设置;(3)万年历的算法和实现;(4)定时闹钟功能;(5)无线设置功能。
1.5 两周时间安排(1)第一周:星期一:布置设计任务,收集相关资料。
星期二:确定设计方案星期三:软、硬件的总体设计星期四、五、六、日:上机调试(2)第二周星期一、二、三:上机调试星期四:完成设计报告。
星期五:17:00之前上交课程设计报告。
2 总体方案设计2.1 整体方案设计2.2 模块工作原理2.2.1 最小应用系统模块最小应用系统包括MCU和电源、复位、晶振、启动等,该系统可以接收数据传给上位机,通过上位机将数据传输到显示屏上显示数据,也可以通过改变数据让其调整显示屏上的数据。
另外它能使蜂鸣器发声。
2.2.2 基础配置模块基础配置模块实现对SysClock、RCC、GPIO、EXTI、NVIC、Timer、USART 等功能模块进行基础配置,设置其输入输出方式、速度及其它专属配置,并使能需要的管脚及外设,设置中断。
万年历
基于STM32万年历设计一、课题研究背景和意义1.1课题研究背景C教学起步的背景 1996年,国外计算机产业界正在全面兴起面向对象编程与设计的热潮,其主要工具就是C。
C在数据类型的安全上,弥补了C的不足,克服了C的种种安全隐患,用C开发的产品正在稳步上市,并开始超过了C。
C的开发工具正在稳步推出,在Windows环境下的两个主要C开发工具——Borland C++ Builder4.0和Microsoft Visual C++6.0标志着C开发工具已经成熟。
1.2课题研究意义二十一世纪是数字化技术高速发展的时代,而单片机在数字化高速发展的时代扮演着极为重要的角色。
电子万年历的开发与研究在信息化时代的今天亦是当务之急,因为它应用在学校、机关、企业、部队等单位礼堂、训练场地、教学室、公共场地等场合,可以说遍及人们生活的每一个角落。
由于社会对信息交换不断提高的要求及高新技术的逐步发展,促使电子万年历发展并且投入市场得到广泛应用。
二、系统总体设计本系统以STM32为控制核心,通过与DS1302和DS18B20通信获取实时时间和实时环境温度,并将得到的数据通过1602液晶显示出来,同时通过相应的按键调整相应的值。
因此本设计可分为一下模块:显示模块、实时时间计算模块、实时环境温度采集模块、报警模块、设置模块(时间设置模块、最高温度设置模块、闹钟设置模块)。
2.1 液晶显示模块方案(1):数码管是利用发光二极管的特性组合而成数字显示器件,通过控制相应的二极管的状态显示相应的数字。
要使数码管正常显示就得有驱动电路驱动相应的段码,数码管的现实方式可分为静态显示和动态显示,静态显示方式只适合显示单个的数字,因此本设计应采用动态显示方式。
由于动态显示方式利用的是人眼视觉暂留的特性,扫描的时间应不大于20毫秒,占用系统资源大,而且显示的个数和字型有限,在本设计中不易采用。
方案(2):1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符。
STM32实现万年历..
STM32学习笔记一竹天笑实现的功能:1、日历功能。
2、数字和模拟时钟功能。
图1(为LCD截屏保存在SD卡中的图像)最终界面如下,但还存在不少漏洞。
1、没有更改时间的设置;2、只有节气显示没有节假日显示3、背景不是用uCGUI画的,是在PS中画好然后存在SD卡中,然后显示的BMP 格式图像。
要点分析:1、STM32自带了RTC时钟计数器,从0开始计数到232。
每一个计数代表秒计数,每六十个计数代表分计数,以此类推。
24(小时)*60(分钟)*60(秒钟)=86400代表一天的计数时间。
假设当前计数为count,count/86400得到计数的天数,根据这个得到年月日。
Count%86400得到时分秒。
2、一些根据1中得到的年月日时分秒,进行计算的程序有:阳历转阴历,闰年判断,节气判断,星期几计算,当前月有多少天等等。
3、模拟时钟的绘制:时钟指针运动算法、屏幕重绘方法、RTC消息、画笔/画刷等。
指针运动算法和屏幕重绘方法是本程序主要难点所在。
(以下参照百度文库之模拟时钟)不论何种指针,每次转动均以π/30弧度(一秒的角度)为基本单位,且都以表盘中心为转动圆心。
计算指针端点(x, y)的公式如下:x =圆心x坐标+ 指针长度* cos (指针方向角)y =圆心y坐标+ 指针长度* sin (指针方向角)注意,指针长度是指自圆心至指针一个端点的长度(是整个指针的一部分),由于指针可能跨越圆心,因此一个指针需要计算两个端点。
由于屏幕的重绘1秒钟一次,如果采用全屏删除式重绘则闪烁十分明显,显示效果不佳。
本程序采用非删除式重绘,假定指针将要移动一格,则先采用背景色(这里是白色)重绘原来指针以删除原来位置的指针,再采用指针的颜色在当前位置绘制指针(如果指针没有动,则直接绘制指针,此句在程序中被我删除,具体原因,为数据截断导致一些误差)。
另外,秒表为RTC一秒钟定时计数。
程序分析:uCGUI+uCOS,一共三个任务:主处理任务、触摸屏任务、秒更新任务。
毕业设计---基于单片机的多功能电子万年历的设计
基于单片机的多功能电子万年历的设计摘要随着科技的快速发展,自从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。
本文主要介绍了基于单片机的智能电子万年历的研制,该万年历能够实时显示公历年、月、日、时、分、秒,以及对应的农历日期、24节气、天干地支、闹铃功能,同时还能够实时测取环境温度。
本系统的硬件部分主要由A VR单片机、时钟芯片、温度传感器等部件组成,文中给出了详细的硬件设计实现及相关电路图;软件部分主要包含公历转农历的算法设计模块、显示模块、时间的读取、温度的检测模块,按键的扫描输入模块等,文中给出了系统的软件程序流程图及各功能模块的软件程序清单,最后介绍了整体系统的设计实现、仿真及调试过程,给出了下一步的改进方案等。
关键词:单片机;液晶技术;万年历;时钟芯片Design of Multifunctional digital Perpetual Calendar Based on MCUAbstractWith the development of technology,Since the concept of the sun, Baizhong, andnow the electronic bell,human beings continue to study and constant innovation record。
This paper-based Microcontroller Development of Intelligent electronic calendar, The calendar can display real-time in the calendar year, month, day, hours, minutes and seconds,a nd the correspond ing date of the Lunar New Year, 24 Solar Terms,at the same time also to real-time measurement from the ambient temperature,In addition to the user through the keyboard input years of history,for the correspond ing period of the Lunar.The system hardware from some of the major A VR microcontroller, a number of digital control, decoder, the clock chip,temperature sensors and other components,the paper gives a detailed design and implementation of hardware and related circuit;Software contains some of the major Lunar calendar to the algorithm design module,dynamic digital display modules,time to read,temperature detection module,Press enter the scanning module.In this paper, the system software modules and flow chart of the list of software programs,Finally, the realization of the overall system design, simulation and debugging process, the next step is the improvement programmes.Keywords:MCU;crystal technology;Calendar;Clock chip目录引言 (1)第1章绪论 (2)1.1课题的背景与意义 (2)1.2 数字万年历的现状与发展 (2)1.3 论文的主要工作及章节安排 (3)1.4 本章小结 (3)第2章方案论证比较.............................................................................. (4)2.1 多功能数字万年历系统概述 (4)2.2计时方案 (4)2.3温度检测方案 (5)2.4显示方案 (5)2.5本章小结 (5)第3章系统硬件设计 (6)3.1 主控制器ATmega16 单片机介绍 (6)3.2 时钟电路DS1302 (6)3.3 温度检测DS18B20 (7)3.4 动态显示 (8)3.5 键盘接口 (8)3.6 语音闹铃模块 (8)3.7 电源设计 (9)3.8本章小结 (11)第4章系统软件设计 (12)4.1 公历计算显示程序设计 (13)4.1.1 DS1302 内部寄存器 (13)4.1.2 时间读取程序设计 (15)4.2 农历转换程序设计 (16)4.2.1 公历转农历算法研究 (16)4.2.2 干支纪年简介 (18)4.2.3 公历转农历程序 (18)4.3 温度测量程序设计 (20)4.3.1 DS18B20 的测温原理 (20)4.3.2 温度程序 (21)4.4 二十四节气算法研究 (23)4.5系统仿真 (24)4.6本章小结 (25)结论与展望 (26)致谢 (27)参考文献 (28)附录 A 电子万年历原理图 (29)附录 B 外文文献与译文 (30)英文原文: (30)中文译文: (33)附录 C 参考文献题录及摘要 (35)附录 D 电子万年历源程序 (37)插图清单图2-1 数字万年历系统框图 (4)图3-1 DS1302与ATmega16连接图 (7)图3-2 DS18B20与AtMEGA16连接图 (8)图3-3 报时电路 (9)图3-4 稳压电源原理图 (10)图3-5 电源电路 (10)图4-1 系统程序流程图 (13)图4-2 公历程序流程图 (14)图4-3 DS18B20测温原理 (21)表格清单表3-1 LCD12864显示内容 (8)表4-1 DS1302的寄存器及其控制字 (14)表4-2 RS位配置 (15)引言人类的日常生活离不开时间,任何具有周期性变化的自然现象都可以用来测量时间。
基于STM32单片机的万年历设计毕业设计论文
万年历是一种可以显示年、月、日、星期的电子设备,广泛应用于日常生活和办公场所。
本文将介绍一个基于STM32单片机的万年历的设计思路和实现过程。
首先,我们需要明确设计目标。
在这个项目中,我们的目标是使用STM32单片机开发一个功能齐全、易于操作的万年历。
具体地说,这个万年历应该能够显示当前的年、月、日和星期,并且能够进行日期的加减操作,同时应该具备一些辅助功能如闹钟设置、倒计时等。
接下来,我们需要进行硬件设计。
首先需要选择适当的显示屏,比如常见的LCD或OLED屏幕。
然后,我们需要选择合适的按键和外部触发器,用于用户的交互输入。
同时,还需要添加一些必要的接口,如USB接口用于数据传输和维护。
在软件设计方面,我们需要定义合适的数据结构来存储日期、时间、闹钟等信息。
同时,需要编写相应的程序来实现日期的显示和更新、日期的加减、闹钟的设置等功能。
在实现倒计时功能时,我们可以使用定时器中断来实现精确的计时。
此外,为了提高用户体验,我们可以添加一些额外的功能。
比如,我们可以为万年历设计一个简洁美观的用户界面,考虑使用图形库绘制用户界面元素。
同时,可以添加一些实用的功能如温湿度监测、天气预报等。
最后,在整个开发流程结束后,我们需要进行集成测试和调试,确保万年历的各项功能正常运行。
并且,我们还可以考虑为万年历添加一些优化和改进措施,如增加存储容量、优化节能技术等。
综上所述,基于STM32单片机的万年历设计主要涉及硬件设计和软件设计两个方面。
通过精心的设计和合理的实现,我们可以开发出一款功能丰富、易于使用的万年历产品,满足用户的各种需求。
毕业设计---基于单片机的多功能电子万年历的设计
基于单片机的多功能电子万年历的设计摘要随着科技的快速发展,自从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。
本文主要介绍了基于单片机的智能电子万年历的研制,该万年历能够实时显示公历年、月、日、时、分、秒,以及对应的农历日期、24节气、天干地支、闹铃功能,同时还能够实时测取环境温度。
本系统的硬件部分主要由A VR单片机、时钟芯片、温度传感器等部件组成,文中给出了详细的硬件设计实现及相关电路图;软件部分主要包含公历转农历的算法设计模块、显示模块、时间的读取、温度的检测模块,按键的扫描输入模块等,文中给出了系统的软件程序流程图及各功能模块的软件程序清单,最后介绍了整体系统的设计实现、仿真及调试过程,给出了下一步的改进方案等。
关键词:单片机;液晶技术;万年历;时钟芯片Design of Multifunctional digital Perpetual Calendar Based on MCUAbstractWith the development of technology,Since the concept of the sun, Baizhong, andnow the electronic bell,human beings continue to study and constant innovation record。
This paper-based Microcontroller Development of Intelligent electronic calendar, The calendar can display real-time in the calendar year, month, day, hours, minutes and seconds,a nd the correspond ing date of the Lunar New Year, 24 Solar Terms,at the same time also to real-time measurement from the ambient temperature,In addition to the user through the keyboard input years of history,for the correspond ing period of the Lunar.The system hardware from some of the major A VR microcontroller, a number of digital control, decoder, the clock chip,temperature sensors and other components,the paper gives a detailed design and implementation of hardware and related circuit;Software contains some of the major Lunar calendar to the algorithm design module,dynamic digital display modules,time to read,temperature detection module,Press enter the scanning module.In this paper, the system software modules and flow chart of the list of software programs,Finally, the realization of the overall system design, simulation and debugging process, the next step is the improvement programmes.Keywords:MCU;crystal technology;Calendar;Clock chip目录引言 (1)第1章绪论 (2)1.1课题的背景与意义 (2)1.2 数字万年历的现状与发展 (2)1.3 论文的主要工作及章节安排 (3)1.4 本章小结 (3)第2章方案论证比较.............................................................................. (4)2.1 多功能数字万年历系统概述 (4)2.2计时方案 (4)2.3温度检测方案 (5)2.4显示方案 (5)2.5本章小结 (5)第3章系统硬件设计 (6)3.1 主控制器ATmega16 单片机介绍 (6)3.2 时钟电路DS1302 (6)3.3 温度检测DS18B20 (7)3.4 动态显示 (8)3.5 键盘接口 (8)3.6 语音闹铃模块 (8)3.7 电源设计 (9)3.8本章小结 (11)第4章系统软件设计 (12)4.1 公历计算显示程序设计 (13)4.1.1 DS1302 内部寄存器 (13)4.1.2 时间读取程序设计 (15)4.2 农历转换程序设计 (16)4.2.1 公历转农历算法研究 (16)4.2.2 干支纪年简介 (18)4.2.3 公历转农历程序 (18)4.3 温度测量程序设计 (20)4.3.1 DS18B20 的测温原理 (20)4.3.2 温度程序 (21)4.4 二十四节气算法研究 (23)4.5系统仿真 (24)4.6本章小结 (25)结论与展望 (26)致谢 (27)参考文献 (28)附录 A 电子万年历原理图 (29)附录 B 外文文献与译文 (30)英文原文: (30)中文译文: (33)附录 C 参考文献题录及摘要 (35)附录 D 电子万年历源程序 (37)插图清单图2-1 数字万年历系统框图 (4)图3-1 DS1302与ATmega16连接图 (7)图3-2 DS18B20与AtMEGA16连接图 (8)图3-3 报时电路 (9)图3-4 稳压电源原理图 (10)图3-5 电源电路 (10)图4-1 系统程序流程图 (13)图4-2 公历程序流程图 (14)图4-3 DS18B20测温原理 (21)表格清单表3-1 LCD12864显示内容 (8)表4-1 DS1302的寄存器及其控制字 (14)表4-2 RS位配置 (15)引言人类的日常生活离不开时间,任何具有周期性变化的自然现象都可以用来测量时间。
万年历_ARM课程设计
目录4 (7)5.总结 (8)万年历系统摘要:万年历在日常生活中最常见,应用也最广泛。
本次课程设计主要就是设计一款电子万年历系统,本次嵌入式系统课程设计以STM32F103RB芯片为核心,主要能够实现显示时间、日期、节日、以及24节气和12生肖等功能。
其中时间显示包括时、分、秒,日期显示包括年、月、日,显示部分通过电脑上的超级终端进行显示,当程序编译无误后,将其下载至开发板中,然后通过超级终端进行显示,开始时用户需要自行设置时间和日期,然后万年历系统才会按照用户设计的功能开始工作。
关键字:STM32F103RB 超级终端时间日期显示 24节气显示十二生肖显示1引言STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM 内核。
按性能有不同的系列:STM32F103“增强型”系列和STM32F101“基本型”系列。
此次我们所使用的STM32F103RB芯片就是增强型系列,增强型系列时钟频率达到72MHz,是同类产品中性能最高的产品;基本型时钟频率为36MHz,以16位产品的价格得到比16位产品大幅提升的性能,是16位产品用户的最佳选择。
两个系列都内置32K到128K的闪存,不同的是SRAM的最大容量和外设接口的组合。
时钟频率72MHz时,从闪存执行代码,STM32功耗36mA,是32位市场上功耗最低的产品,相当于MHz。
ARM公司的高性能”Cortex-M3”内核具有一流的外设(1μs的双12位ADC,4兆位/秒的UART,18兆位/秒的SPI,18MHz的I/O翻转速度)、低功耗(在72MHz 时消耗36mA(所有外设处于工作状态),待机时下降到2μA)、最大的集成度(复位电路、低电压检测、调压器、精确的RC振荡器等)\简单的结构和易用的工具,STM32F10x重要参数主要有供电、容忍5V的I/O管脚、优异的安全时钟模式、带唤醒功能的低功耗模式、内部RC振荡器、内嵌复位电路、工作温度范围是-40°C至+85°C或105°C。
基于STM32的电子万年历系统设计
线 对 其 进 行 读 写操 作 。第 二 部 分 是 一 组 可 RW 、EN与 单 片 机 定 义 的 相 应 控 制 端 口相 这 个 函数 的 主 要 功 能 是将 计 数 器 中 的值 读 编 程 计 数 器 ,它 又 由 RTC预 分 频 模 块 和 连 ,最 后 根 据 液 晶 的 说 明书 正 确 连 接 电源 出来 并 转化 为 当前 的 时 间 ,类 似于 time—set
1 理论分析
通 信 。在 该 设 计 中 由于 IO口的 使 用 并 不 是 的RTC—CNT寄 存 器 中 ,作 为计 数 初 值 。当
RTC主 要 由两 部 分 组 成 。第 一 部 分 是 很 紧 张 ,故选 择 八 位 并 行 通 信 方式 。在 硬 件 然 在 程 序 中也 要 对 闰 年 和 闰年 的 2月 做 特
与APB1总 线 相连 的APB1接 口 ,它 由APB1 连 接 方 面 需 要注 意 ,将 显示 屏 的 DB0-DB7 殊 处 理 ,不再 赘述 。
总 线 时 钟 驱 动 ,主 要 用于 用 户通 过APBl总 与单 片 机定 义 的八 位 数据 口相 连 ,并将 RS、
还 有 一 个 重要 的 函 数是 time—get函数 ,
钟 标 志 和 秒 标 志 的 设 置 。这 其 中 也 有 些 是 RTC并 进 行 相 关 的 配 置 ,主 要 包 括 分 频 、 的 初 始 化 ,包 括 STM 32系统 、RTC模 块 和
需 要 注 意 的 ,比 如 位5为 RTC操 作 位 ,该 位 RTC的允 许 配 置位 、更新 配 置 和 设 置 中断 LcD12864显 示 模 块 等 。由于 没 有 外 扩 键
基 于 S T M 3 2的 电子 万年历 系统设计 ① 信息技术
STM32实现万年历演示教学
S T M32实现万年历STM32学习笔记一竹天笑实现的功能:1、日历功能。
2、数字和模拟时钟功能。
图1(为LCD截屏保存在SD卡中的图像)最终界面如下,但还存在不少漏洞。
1、没有更改时间的设置;2、只有节气显示没有节假日显示3、背景不是用uCGUI画的,是在PS中画好然后存在SD卡中,然后显示的BMP格式图像。
要点分析:1、STM32自带了RTC时钟计数器,从0开始计数到232。
每一个计数代表秒计数,每六十个计数代表分计数,以此类推。
24(小时)*60(分钟)*60(秒钟)=86400代表一天的计数时间。
假设当前计数为count,count/86400得到计数的天数,根据这个得到年月日。
Count%86400得到时分秒。
2、一些根据1中得到的年月日时分秒,进行计算的程序有:阳历转阴历,闰年判断,节气判断,星期几计算,当前月有多少天等等。
3、模拟时钟的绘制:时钟指针运动算法、屏幕重绘方法、RTC消息、画笔/画刷等。
指针运动算法和屏幕重绘方法是本程序主要难点所在。
(以下参照百度文库之模拟时钟)不论何种指针,每次转动均以π/30弧度(一秒的角度)为基本单位,且都以表盘中心为转动圆心。
计算指针端点(x, y)的公式如下:x =圆心x坐标 + 指针长度 * cos (指针方向角)y =圆心y坐标 + 指针长度 * sin (指针方向角)注意,指针长度是指自圆心至指针一个端点的长度(是整个指针的一部分),由于指针可能跨越圆心,因此一个指针需要计算两个端点。
由于屏幕的重绘1秒钟一次,如果采用全屏删除式重绘则闪烁十分明显,显示效果不佳。
本程序采用非删除式重绘,假定指针将要移动一格,则先采用背景色(这里是白色)重绘原来指针以删除原来位置的指针,再采用指针的颜色在当前位置绘制指针(如果指针没有动,则直接绘制指针,此句在程序中被我删除,具体原因,为数据截断导致一些误差)。
另外,秒表为RTC一秒钟定时计数。
程序分析:uCGUI+uCOS,一共三个任务:主处理任务、触摸屏任务、秒更新任务。
基于STM32单片机的万年历设计毕业设计论文
本科生毕业论文(或设计)(申请学士学位)论文题目基于STM32单片机的万年历设计作者姓名专业名称自动化指导教师2014年5月学生:(签字)学号:答辩日期:指导教师:(签字)目录摘要 (1)Abstract (1)1绪论 (2)1.1 研究背景及意义 (2)1.2 国内外研究现状 (2)1.3 论文主要内容 (2)2系统硬件电路设计 (3)2.1单片机开发板的介绍 (3)2.2硬件电路总体结构设计 (4)2.3 硬件电路各单元电路设计 (4)2.3.1 按键电路的设计 (4)2.3.2 显示电路的设计 (5)3系统软件设计 (6)3.1 RealView MDK3.80简介 (6)3.2 软件总体设计 (6)3.3 TFT-LCD显示程序设计 (7)3.4 时钟程序设计 (8)3.5 汉字显示程序 (10)3.6 图片显示程序 (11)3.7 按键功能程序 (11)4系统调试 (12)结论 (14)参考文献 (14)附录一 (15)程序列表 (15)主程序 (15)TFT-LCD显示程序 (21)时钟程序 (24)汉字显示程序 (29)图片显示程序 (31)按键程序 (36)致谢 (39)基于STM32单片机的万年历设计摘要:随着现代社会生活和工作节奏的加快,及时准确的掌握时间变得越来越重要。
STM32包含Cortex-M3内核,具有低功耗、低成本、丰富的片内外设以及处理速度快等特点。
本文采用STM32F103RBT6作为主控制器,利用其内部的实时时钟(RTC)在相应软件的配置下,设计了具有时间显示功能的电子万年历,可提供24小时制的实时时钟和区分平、闰年的日历。
测试表明该设计计时准确、界面美观、操作简便。
关键词:万年历;STM32F103RBT6;TFTLCD;Cortex-M3;RTCCalendar Design Based On STM32 MicrocontrollerAbstract:With the development of modern society, the accelerated pace of life and work,to grasp time timely and accurately becomes more and more important. STM32 contains the Cortex-M3 kernel, with low power consumption, low cost, rich on-chip and high processing speed. This paper uses STM32F103RBT6 as the main controller, using real time clock the internal (RTC) with the corresponding software configuration, designs electronic calendar with the function of time display, and it can provide 24 hour real-time clock and the calendar which can distinguish the flat year or the leap year. The test shows that the design of accurate timing, beautiful interface, and easy operation.Key words: Calendar; STM32F103RBT6; TFTLCD; Cortex-M3; RTC1 绪论1.1 研究背景及意义对于时间这个概念一开始在长达几千年的时间里,根本就没有任何测定时间的精确方法。
嵌入式智能万年历设计
任务要求:用ARM—M3芯片设计一个智能万年历,要求能够正确显示近100 年时间,星期几,时间格式为****年**月**日(星期**) **:**:**(时:分:秒),能够识别出闰年(计时范围能够从1970年1月1日到2100年左右)。
该程序设计工程里包含有main.c(相关配置、和终端联系,提醒输出初始时间、输出实时时间)/date.c(计算实时时间)/stm32f10x_it.c三个文件,各文件内容如下。
Main.c文件:#include "stm32f10x.h"#include "stdio.h"#include "date.h"__IO uint32_t TimeDisplay = 0;void RCC_Configuration(void);void NVIC_Configuration(void);void GPIO_Configuration(void);void USART_Configuration(void);int fputc(int ch, FILE *f);void RTC_Configuration(void);void Time_Regulate(struct rtc_time *tm);void Time_Adjust(void);void Time_Display(uint32_t TimeVar);void Time_Show(void);u8 USART_Scanf(u32 value);#define RTCClockSource_LSEu8 const *WEEK_STR[] = {"日", "一", "二", "三", "四", "五", "六"};struct rtc_time systmtime;int main(){RCC_Configuration();NVIC_Configuration();GPIO_Configuration();USART_Configuration();/*在启动时检查备份寄存器BKP_DR1,如果内容不是0xA5A5,则需重新配置时间并询问用户调整时间*/printf("\r\n\n RTC not yet configured....");RTC_Configuration();printf("\r\n RTC configured....");Time_Adjust();BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);}else{/*启动无需设置新时钟*//*检查是否掉电重启*/if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET){printf("\r\n\n Power On Reset occurred....");}/*检查是否Reset复位*/else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET){printf("\r\n\n External Reset occurred....");}printf("\r\n No need to configure RTC....");/*等待寄存器同步*/RTC_WaitForSynchro();/*允许RTC秒中断*/RTC_ITConfig(RTC_IT_SEC, ENABLE);/*等待上次RTC寄存器写操作完成*/RTC_WaitForLastTask();}#ifdef RTCClockOutput_EnableRCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); PWR_BackupAccessCmd(ENABLE);BKP_TamperPinCmd(DISABLE);BKP_RTCOutputConfig(BKP_RTCOutputSource_CalibClock);RCC_ClearFlag();Time_Show();}void RCC_Configuration(){SystemInit();RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);}void NVIC_Configuration(){NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}void GPIO_Configuration(){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);}void USART_Configuration(){USART_InitTypeDef USART_InitStructure;USART_ART_WordLength = USART_WordLength_8b;USART_ART_StopBits = USART_StopBits_1;USART_ART_Parity = USART_Parity_No ;USART_ART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_ART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART1, &USART_InitStructure);USART_Cmd(USART1, ENABLE);}int fputc(int ch, FILE *f){/* 将Printf内容发往串口 */USART_SendData(USART1, (unsigned char) ch);while (!(USART1->SR & USART_FLAG_TXE));return (ch);}void RTC_Configuration(){/*允许PWR和BKP时钟*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);/*允许访问BKP域*/PWR_BackupAccessCmd(ENABLE);/*复位备份域*/BKP_DeInit();#ifdef RTCClockSource_LSI/*允许LSI*/RCC_LSICmd(ENABLE);/*等待LSI准备好*/while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY)==RESET){}/*选择LSI作为RTC时钟源*/RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);#elif defined RTCClockSource_LSE/*允许LSE*/RCC_LSEConfig(RCC_LSE_ON);/*等待LSE准备好*/while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET){}/*选择LSE作为RTC时钟源*/RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);#endif/* Enable RTC Clock */RCC_RTCCLKCmd(ENABLE);#ifdef RTCClockOutput_Enable/*禁止Tamper引脚*/BKP_TamperPinCmd(DISABLE);/*为了将RTCCLK/64在Tamper引脚输出,Tamper功能必须被禁止*//*允许RTC时钟在Tamper引脚上输出*/BKP_RTCCalibrationClockOutputCmd(ENABLE);#endif/*等待寄存器同步*/RTC_WaitForSynchro();/*等待上次RTC寄存器写操作完成*/RTC_WaitForLastTask();/*允许RTC秒中断*/RTC_ITConfig(RTC_IT_SEC, ENABLE);/*等待上次RTC寄存器写操作完成*/RTC_WaitForLastTask();#ifdef RTCClockSource_LSI/*设置分频系数*/RTC_SetPrescaler(31999); /*RTC周期=RTCCLK/RTC_PR=(32.000kHz/(31999+1))*/#elif defined RTCClockSource_LSERTC_SetPrescaler(32767); /*RTC周期=RTCCLK/RTC_PR=(32.768kHz/(31767+1))*/ #endif/*等待上次RTC寄存器写操作完成*/RTC_WaitForLastTask();}void Time_Regulate(struct rtc_time *tm){u32 Tmp_YY = 0xFF, Tmp_MM = 0xFF, Tmp_DD = 0xFF, Tmp_HH = 0xFF, Tmp_MI = 0xFF, Tmp_SS = 0xFF;printf("\r\n=========================Time Settings==================");printf("\r\n 请输入年份(Please Set Years): 20");while (Tmp_YY == 0xFF){Tmp_YY = USART_Scanf(99);}printf("\n\r 年份被设置为: 20%0.2d\n\r", Tmp_YY);tm->tm_year = Tmp_YY+2000;Tmp_MM = 0xFF;printf("\r\n 请输入月份(Please Set Months): ");while (Tmp_MM == 0xFF){Tmp_MM = USART_Scanf(12);}printf("\n\r 月份被设置为: %d\n\r", Tmp_MM);tm->tm_mon= Tmp_MM;Tmp_DD = 0xFF;printf("\r\n 请输入日期(Please Set Dates): ");while (Tmp_DD == 0xFF){Tmp_DD = USART_Scanf(31);}printf("\n\r 日期被设置为: %d\n\r", Tmp_DD);tm->tm_mday= Tmp_DD;Tmp_HH = 0xFF;printf("\r\n 请输入时钟(Please Set Hours): ");while (Tmp_HH == 0xFF){Tmp_HH = USART_Scanf(23);}printf("\n\r 时钟被设置为: %d\n\r", Tmp_HH );tm->tm_hour= Tmp_HH;Tmp_MI = 0xFF;printf("\r\n 请输入分钟(Please Set Minutes): ");while (Tmp_MI == 0xFF){Tmp_MI = USART_Scanf(59);}printf("\n\r 分钟被设置为: %d\n\r", Tmp_MI);tm->tm_min= Tmp_MI;Tmp_SS = 0xFF;printf("\r\n 请输入秒钟(Please Set Seconds): ");while (Tmp_SS == 0xFF){Tmp_SS = USART_Scanf(59);}printf("\n\r 秒钟被设置为: %d\n\r", Tmp_SS);tm->tm_sec= Tmp_SS;}void Time_Adjust()RTC_WaitForLastTask();Time_Regulate(&systmtime);GregorianDay(&systmtime);RTC_SetCounter(mktimev(&systmtime));RTC_WaitForLastTask();}void Time_Display(uint32_t TimeVar){to_tm(TimeVar, &systmtime);printf("\r 当前时间为: %d年 %d月 %d日 (星期%s) %0.2d:%0.2d:%0.2d", systmtime.tm_year, systmtime.tm_mon, systmtime.tm_mday, WEEK_STR[systmtime.tm_wday], systmtime.tm_hour,systmtime.tm_min, systmtime.tm_sec);}void Time_Show(){printf("\n\r");/* Infinite loop */while (1){/* 每过1s */if (TimeDisplay == 1){Time_Display(RTC_GetCounter());TimeDisplay = 0;}}}u8 USART_Scanf(u32 value){u32 index = 0;u32 tmp[2] = {0, 0};{while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET){}tmp[index++] = (USART_ReceiveData(USART1));if ((tmp[index - 1] < 0x30) || (tmp[index - 1] > 0x39)) /*数字0到9的ASCII 码为0x30至0x39*/{if((index == 2) && (tmp[index - 1] == '\r')){tmp[1] = tmp[0];tmp[0] = 0x30;}else{printf("\n\rPlease enter valid number between 0 and 9 -->: ");index--;}}}/* 计算输入字符的相应ASCII值*/index = (tmp[1] - 0x30) + ((tmp[0] - 0x30) * 10);/* Checks */if (index > value){printf("\n\rPlease enter valid number between 0 and %d", value);return 0xFF;}return index;}Date.c文件内容如下:#include "date.h"#define FEBRUARY 2#define STARTOFTIME 1970#define SECDAY 86400L#define SECYR (SECDAY * 365)#define leapyear(year) ((year) % 4 == 0)#define days_in_month(a) (month_days[(a) - 1])static int month_days[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };/*计算公历*/void GregorianDay(struct rtc_time * tm){int leapsToDate;int lastYear;int day;int MonthOffset[] = { 0,31,59,90,120,151,181,212,243,273,304,334 };lastYear=tm->tm_year-1;/*计算到计数的前一年之中一共经历了多少个闰年*/leapsToDate = lastYear/4 - lastYear/100 + lastYear/400;/*如若计数的这一年为闰年,且计数的月份在2月之后,则日数加1,否则不加1*/ if((tm->tm_year%4==0) && ((tm->tm_year%100!=0) || (tm->tm_year%400==0)) && (tm->tm_mon>2)){day=1;}else{day=0;}day += lastYear*365 + leapsToDate + MonthOffset[tm->tm_mon-1] + tm->tm_mday; /*计算从计数元年元旦到计数日期一共有多少天*/tm->tm_wday=day%7;}u32 mktimev(struct rtc_time *tm){if (0 >= (int) (tm->tm_mon -= 2)){tm->tm_mon += 12;tm->tm_year -= 1;}return ((((u32) (tm->tm_year/4 - tm->tm_year/100 + tm->tm_year/400 + 367*tm->tm_mon/12 + tm->tm_mday)}void to_tm(u32 tim, struct rtc_time * tm){register u32 i;register long hms, day;day = tim / SECDAY;hms = tim % SECDAY;tm->tm_hour = hms / 3600;tm->tm_min = (hms % 3600) / 60;tm->tm_sec = (hms % 3600) % 60;/*算出当前年份,起始的计数年份为1970年*/for (i = STARTOFTIME; day >= days_in_year(i); i++) {day -= days_in_year(i);}tm->tm_year = i;/*计算当前的月份*/if (leapyear(tm->tm_year)){days_in_month(FEBRUARY) = 29;}for (i = 1; day >= days_in_month(i); i++){day -= days_in_month(i);}days_in_month(FEBRUARY) = 28;tm->tm_mon = i;/*计算当前日期*/tm->tm_mday = day + 1;GregorianDay(tm);}stm32f10x_it.c文件内容:#include "stm32f10x_it.h"extern uint32_t TimeDisplay;void NMI_Handler(void){}/*** @brief This function handles Hard Fault exception.* @param None* @retval : None*/void HardFault_Handler(void){/* Go to infinite loop when Hard Fault exception occurs */while (1){}}/*** @brief This function handles Memory Manage exception.* @param None* @retval : None*/void MemManage_Handler(void){/* Go to infinite loop when Memory Manage exception occurs */ while (1){}}/*** @brief This function handles Bus Fault exception.* @param None* @retval : None*/void BusFault_Handler(void){/* Go to infinite loop when Bus Fault exception occurs */while (1){}}* @brief This function handles Usage Fault exception.* @param None* @retval : None*/void UsageFault_Handler(void){/* Go to infinite loop when Usage Fault exception occurs */ while (1){}}/*** @brief This function handles SVCall exception.* @param None* @retval : None*/void SVC_Handler(void){}/*** @brief This function handles Debug Monitor exception.* @param None* @retval : None*/void DebugMon_Handler(void){}/*** @brief This function handles PendSVC exception.* @param None* @retval : None*/void PendSV_Handler(void){}/*** @brief This function handles SysTick Handler.* @param None* @retval : None*/}void RTC_IRQHandler(void){if (RTC_GetITStatus(RTC_IT_SEC) != RESET){/* Clear the RTC Second interrupt */RTC_ClearITPendingBit(RTC_IT_SEC);/* Enable time update */TimeDisplay = 1;/* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask();/* Reset RTC Counter when Time is 23:59:59 */if (RTC_GetCounter() == 0x00015180){RTC_SetCounter(0x0);/* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask();}}}。
基于STM 的万年历设计
基于STM32的万年历设计班级:姓名:学号:成绩:电子通信工程系题目:基于STM32的万年历设计前言:随着科技的快速发展,时间的流逝,至从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。
美国DALLAS公司推出的具有涓细电流充电能的低功耗实时时钟电路DS12C887。
它可以对年、月、日、周日、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS12C887的使用寿命长,误差小。
对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒和温度等信息,还具有时间校准等功能。
该电路采用AT89S52单片机作为核心,采用数字式温度传感器DS18B20提取外界温度,功耗小,能在3V的低压工作,电压可选用3~5V电压供电。
进入新世纪LCD显示屏的技术和产业都取得了长足的发展,作为重要的现代信息发布媒体之一,LCD显示屏在证券交易、金融、交通、体育、广告等领域被广泛的应用。
伴随社会信息化进程的推进,LCD显示屏技术也在不断的推陈出新,应用领域愈加广阔。
基于STM32的LCD显示可以更好的满足各种需求,也更便于操作和实现。
现基于STM32在液晶显示屏幕上显示文本及图形。
目前,显示技术和显示工业的发展迅速。
显示技术是传递视觉的信息技术。
液晶显示器件LCD 是当今最有发展前途的一种平板显示器件,它具有很多独到的优异特性。
它具有显示信息多、易于多彩化、体积小、重量轻、功耗低、寿命长、价格低、无辐射、无污染、接口控制方便等优点。
截至目前,我国在液晶显示取得较大进步,我国LCD产业已经走过了近30年的历程.经历几次大的投资浪潮之后,我国内地已经成为世界最大的TN-LCD(扭曲液晶显示器)生产基地和主要的STN-LCD(超扭曲液晶显示器)生产基地,并且从2003年开始,涉足TFT-LCD(薄膜晶体管液晶显示器)领域.本课题设计采用STM32F103VE开发板,实现在LCD显示屏上显示由按键可操控的万年历功能。
基于STM32的万年历设计
基于STM32的万年历设计班级:姓名:学号:题目:基于STM32的万年历设计前言:随着科技的快速发展,时间的流逝,至从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。
美国DALLAS公司推出的具有涓细电流充电能的低功耗实时时钟电路DS12C887。
它可以对年、月、日、周日、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS12C887的使用寿命长,误差小。
对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、一,目前,体经历几次)领域.在液00:00:00。
1.功能描述1.1设计要求1.具有数字时钟功能。
2.具有简单日历功能。
3.具有手动校准时间功能。
4.具有闰年识别功能。
1.2RTC(实时时钟)简介实时时钟是一个独立的定时器。
RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。
修改计数器的值可以重新设置系统当前的时间和日期。
RTC模块和时钟配置系统(RCC_BDCR寄存器)是在后备区域,即在系统复位或从待机模式唤醒后RTC的设置和时间维持不变。
系统复位后,禁止访问后备寄存器和RTC,防止对后备区域(BKP)的意2.需要主电源给得到时4.个小键盘。
方案一:采用89C51芯片采用89C51芯片作为硬件核心,采用FlashROM,内部具有4KBROM存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备ISP在线编程技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。
方案二:采用AT89S52芯片片内ROM全都采用FlashROM;能以3V的超底压工作;同时也与MCS-51系列单片机完全该芯片内部存储器为8KBROM存储空间,同样具有89C51的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏。
基于单片机的数字万年历的设计与实现
基础课程设计(论文)基于单片机的数字万年历的设计与实现专业:电气工程及其自动化指导教师:小组成员:信息技术学院电气工程系2014年12月15日摘要本次设计就是设计一款万年历,以C51单片机为核心,配备数码管显示模块、按键等功能模块。
万年历采用24小时制方式显示时间,在数码管上显示年、月、日、小时、分钟、秒等功能。
设计的核心主要包括硬件设计和软件编程两个方面。
硬件电路设计主要包括中央处理单元电路、时钟电路、执行电路等几部分。
软件用汇编语言来实现,主要包括主程序、键盘扫描子程序、时间设置子程序等软件模块。
近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入,由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此特别适合于与控制有关的系统,越来越广泛地应用于自动控制,智能化仪器,仪表,数据采集,军工产品以及家用电器等各个领、域,单片机往往是作为一个核心部件来使用,在根据具体硬件结构,以及针对具体应用对象特点的软件结合,以作完善。
而51系列单片机是各单片机中最为典型和最有代表性的一种,通过本次课程设计进一步对单片机学习和应用,从而更熟悉单片机的原理和相关设计并提高了开发软、硬件的能力。
本设计主要设计一个基于 80C51单片机的电子时钟,并在LED上显示相应的时间,通过两个控制键和4×4键盘来实现时间的调节功能。
应用Proteus软件实现单片机数字时钟系统的设计与仿真。
关键词:单片机时钟电路 C51 万年历目录摘要 (I)1绪论 (1)1.1 方案选择与DIY电子万年历的研究情况 (1)1.1.1时钟芯片选择 (1)1.1.2键盘选择 (2)1.1.3显示模块选择 (3)1.2 DIY万年历的研究情况 (3)2 主要硬件描述 (3)2.1 89C51模块 (3)2.2 显示模块LCM12864 (4)2.2.1液晶模块概述 (4)2.2.2液晶模块特点 (4)2.3 芯片DS1302简介 (5)2.4 芯片DS18B20简介 (5)3 硬件设计与实现 (6)3.1 单片机最小系统的设计 (6)3.2 时钟电路的设计 (7)3.3 温度采集模块的设计 (7)3.4 人机交互模块设计 (8)4 系统软件设计与实现 (9)4.1 主要算法流程图描述 (9)4.2 各子程序设计 (13)参考文献 (20)1绪论多功能数字万年历已成为人们日常生活中必不可少的物品,广泛用于个人家庭以及车站、码头、医院、办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于S T M32的万年历设计班级:姓名:学号:成绩:题目:基于STM32的万年历设计前言:随着科技的快速发展,时间的流逝,至从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。
美国DALLAS公司推出的具有涓细电流充电能的低功耗实时时钟电路DS12C887。
它可以对年、月、日、周日、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS12C887的使用寿命长,误差小。
对于数字电子万年历采用直观的数字显示,可功耗小,在液晶.)生产薄线、LCD电子仪器仪表的发展趋势,具有广阔的市场前景。
本课题利用 STM32 的 RTC 实现一个简易的电子时钟,在液晶显示屏中显示时间值。
显示时间格式为XX:XX:XX(时:分:秒),当时间计数为: 23: 59: 59 时将刷新为:00: 00: 00。
1.功能描述1.1设计要求1.具有数字时钟功能。
2.具有简单日历功能。
3.具有手动校准时间功能。
4.具有闰年识别功能。
1.2 RTC(实时时钟)简介实时时钟是一个独立的定时器。
RTC 模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。
修改计数器的值可以重新设置系统当前的时间和日期。
RTC的锂1.3.1可选择的芯片方案整个系统用STM32F103VE单片机作为中央控制器,由单片机执行采集内部RTC值,时钟信号通过单片机I/O口传给LCD12864,单片机模块控制驱动模块驱动显示模块,通过显示模块来实现信号的输出、LCD12864的显示及相关的控制功能。
系统设有按键模块用于对时间进行调整及扩展多个小键盘。
方案一:采用89C51芯片采用89C51芯片作为硬件核心,采用Flash ROM,内部具有4KB ROM 存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备ISP在线编程技术, 当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。
方案二:采用AT89S52芯片片内ROM全都采用Flash ROM;能以3V的超底压工作;同时也与MCS-51系列单片机完全该芯片内部存储器为8KB ROM 存储空间,同样具有89C51的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏。
不使用时钟芯片,而直接用AT89S52单片机来实现电子万年历设计。
AT89S52是一种带8K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS 8位微处理器,俗称单片机。
单片机的可擦除只读存储器可的中断年进位。
单口线、,方案二:采用点阵式数码管显示动态显示,即各位数码管轮流点亮,对于显示器各位数码管,每隔一段延时时间循环点亮一次。
利用人的视觉暂留功能可以看到整个显示,但须保证扫描速度足够快,人的视觉暂留功能才可察觉不到字符闪烁。
显示器的亮度与导通电流、点亮时间及间隔时间的比例有关。
调整参数可以实现较高稳定度的显示。
动态显示节省了I/O口,降低了能耗。
点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高,所以也不用此种作为显示.方案三:采用LED数码管动态扫描LED数码管价格适中,对于显示数字最合适,而且采用动态扫描法与单片机连接时,占用的单片机口线少。
从节省单片机芯片I/O口和降低能耗角度出发,本数字电子钟数码管显示选择设计采用方案一,既ILI9341LED显示。
方案一:直接采用单片机定时计数器直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。
采用此种方案虽然减少芯片的使用,节约成本,但是,实现的时间误差较大。
所以不采用此方案。
方案二:采用DS1302时钟芯片实现时钟自带的4个I/O 口可与按键直接相连,通过编程,单片机芯片即可控制按键接口电平的高低,即按键的开与关,以达到用按键进行显示时间的调整与设置扩展的小键盘的设计要求。
2.硬件设计2.1设计组成框图ST)公(16KCAN,256K),支持在●片内双RC 晶振,提供8M和32K 的频率.●支持片外高速晶振(8M),和片外低速晶振(32K).其中片外低速晶振可用于 CPU 的实时时钟,带后备电源引脚,用于掉电后的时钟行走.●42个16位的后备寄存器(可以理解为电池保存的RAM),利用外置的纽扣电池,和实现掉电数据保存功能.●支持 JTAG,SWD调试.配合廉价的J-LINK,实现高速低成本的开发调试方案。
●多达80个IO(大部分兼容5V逻辑),4个通用定时器,2个高级定时器,2个基本定时器,3路SPI接口,2路I2S 接口,2路I2C接口,5路USART,一个USB从设备接口,一个 CAN接口,SDIO接口,可兼容SRAM,NOR和NAND Flash 接口的16位总线-FSMC。
●3路共16通道的12位AD输入,2路共2 通道的12位 DA 输出.支持片外独立电压基准.●CPU操作电压范围:2.0-3.6V2.3 USB线USB开发涉及主机和设备,为了避免开发驱动程序,使用Windows自带的驱动程序。
所以设备枚举成HID类设备。
USB鼠标就是标准的USB-HID设备。
不过操作系统阻止了应。
USB2.0编程经产品。
配在一起的组件。
由于液晶显示屏功耗低、体积小,承载的信息量大,因而被广泛用于信息输出、与用户进行交互。
由于 STM32 内部没有集成专用的液晶屏和触摸屏的控制接口,所以在显示面板中应自带含有驱动芯片的驱动电路(液晶屏和触摸屏的驱动电路是独立的),STM32 芯片通过驱动芯片来控制液晶屏和触摸屏。
以本实验 3.2 寸液晶屏(240*320)为例,它使用 ILI9341 芯片控制液晶屏,通过XPT2046 芯片控制触摸屏。
LCD 为非发光性的显示装置,它需要借助背光源才能达到显示功能,LED 控制器就是用来控制液晶屏中的 LED 背光源。
1.驱动板(也叫主板):主要是用以接收、处理从外部送进来的模拟(VGA)或者数字(DVI)视频信号,并通过屏线送出信号去控制液晶屏(PANEL)正常工作。
驱动板上含有MCU单元,它是液晶显示器的检测控制中心和大脑。
2.电源板:用于将90~240V 的交流电压转变为12V、5V、3V 等的直流电供给显示器工作。
3.背光板(也叫高压板):用于将主板或电源板输出的12V 的直流电压转变为PANEL 需要的高频的1500~1800V 的高压交流电,用于点亮PANEL的背光灯。
电源板和背光板有时会做在一起也就是所谓的电源背光二合一板。
4.液晶屏:液晶显示用模块,它是液晶显示器的核心部件,其包含液晶板和驱动电路。
,接。
个级向3.软件设计3.1程序流程框图图时间调整程序流程图3.2字模的创建使用字模III-增强版v3.91软件来制作中文字库。
打开软件,点击“自动批量生成字库”按钮选项,点击选择“二级汉字库”按钮。
在“源字体”选项里面做如下设置,需要注意的是大小问题,因为我们本次的设计目标是实现16*16的汉字,所以在此选择小四字体。
设置好之后如下点击“开始转换进程”按钮.就会在安装目录下或者你设置好的目录下生成.c后缀的字库文件。
对LCD显示来说,只要能够在指定的位置描写制定颜色的点,那么就能够很好地根据汉字字模信息来描写汉字。
在此,为了能够更好的清楚字模的取向和高低位的排列顺序,可以现先在pc测试刚才制作好的库文件。
件(文件,{(OS_STK*)&AppTaskUserIFStk[APP_TASK_USER_IF_STK_SIZE-1],APP_TASK_USER_IF_PRIO,APP_TASK_USER_IF_PRIO,(OS_STK *)&AppTaskUserIFStk[0],APP_TASK_USER_IF_STK_SIZE,(void *)0,OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);//触摸屏任务--------------------------------------------------------- os_err = OSTaskCreateExt(AppTaskKbd,(void *)0,(OS_STK *)&AppTaskKbdStk[APP_TASK_KBD_STK_SIZE-1],APP_TASK_KBD_PRIO,APP_TASK_KBD_PRIO,(OS_STK *)&AppTaskKbdStk[0],APP_TASK_KBD_STK_SIZE,(void *)0,OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);//秒更新任务}{//界面初始化GUI_Init();//ucgui 初始化_ExecCalibration(); /* 触摸屏校准 */GUI_SetBkColor(GUI_WHITE);//设置背景色GUI_SetColor(GUI_GRAY);//设置前景色GUI_Clear();//清屏Lcd_show_bmp(0, 0,"/RTC.bmp");//显示万年历背景GUI_SetFont(&GUI_FontHZ_SimSun_16);GUI_DispStringAt("一",15,47); //显示星期一GUI_DispStringAt("二",44,47);//显示星期二//////////////////GUI_SetFont(&GUI_FontHZ_SimSun_16); //设置中文字体GUI_DispString("年");//显示年GUI_SetFont(&GUI_Font16_1 );//设置英文字体GUI_DispDec(s_time.tm_mon,2);//显示万年历的月份GUI_SetFont(&GUI_FontHZ_SimSun_16);//设置中文字体GUI_DispString("月");//显示月GUI_SetFont(&GUI_Font16_1 );//设置英文字体GUI_DispDec(s_time.tm_mday,2);//显示万年历的日子GUI_SetFont(&GUI_FontHZ_SimSun_16);//////////{WM_SetCreateFlags(WM_CF_MEMDEV); /* Automatically use memory devices on all windows */if(flag==0) //初始化按键,只执行一次。