基于STM32的智能万年历课程设计说明书
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 了,找到了原因,我们要怎么改呢?这一段初始化代码什么是规避不了的,那 么我们可以在他执行之后重新把日期设置一下,思路还是利用备份寄存器。 我们可以在初始化时,把日期写到备份寄存中,完善一下之前写的条件初始化程序的内容, 增加日期备份。在这里我们备份的日期仅仅是初始化当时配置的时间,上电后读回来的也是 这个时间,不一定就是正确的!!
万年历单片机课程设计
万年历单片机课程设计一、课程目标知识目标:1. 学生能理解单片机的基本原理,掌握其功能和应用。
2. 学生能掌握万年历的运行机制,理解日期、时间计算的方法。
3. 学生能了解并运用编程语言(如C语言)进行单片机程序设计。
技能目标:1. 学生能运用所学知识,设计并实现一个具有日期和时间显示功能的万年历单片机系统。
2. 学生能够通过实践操作,掌握使用开发工具和调试技巧,提高问题解决能力。
情感态度价值观目标:1. 学生培养对单片机技术及编程的兴趣,激发创新意识和探索精神。
2. 学生通过团队协作,培养沟通、合作能力,提高集体荣誉感。
3. 学生在学习过程中,认识到科技发展对社会的重要性,增强社会责任感。
课程性质:本课程为实践性较强的课程,结合理论知识与实践操作,让学生在动手实践中掌握单片机技术。
学生特点:学生具备一定的电子技术基础,对编程有一定了解,好奇心强,喜欢动手实践。
教学要求:教师需结合学生特点,采用任务驱动、案例教学等方法,引导学生主动探究,确保课程目标的实现。
在教学过程中,注重培养学生的实践能力和创新能力。
通过对课程目标的分解和教学评估,确保学生达到预期学习成果。
二、教学内容1. 单片机基础知识:介绍单片机的组成、工作原理及功能特点,结合教材第二章内容,使学生建立单片机的基本概念。
2. 编程语言基础:回顾C语言编程基础,强调其在单片机编程中的应用,参考教材第四章进行教学。
3. 万年历原理:讲解日期和时间的计算方法,分析万年历的运行机制,结合教材第三章内容进行教学。
4. 单片机程序设计:教授如何使用C语言编写单片机程序,实现万年历功能,参考教材第五章内容。
5. 硬件电路设计:介绍万年历单片机系统的硬件组成,分析电路原理,结合教材第六章进行教学。
6. 实践操作:指导学生使用开发工具进行程序编写、调试和烧录,完成万年历单片机系统的搭建和测试。
7. 教学进度安排:- 第1周:单片机基础知识学习;- 第2周:编程语言基础复习;- 第3-4周:万年历原理讲解和单片机程序设计;- 第5周:硬件电路设计;- 第6周:实践操作,完成万年历单片机系统设计;- 第7周:总结与展示,进行教学评估。
基于单片机的万年历设计
一、引言万年历是一种显示当前日期和时间的器件或软件。
随着科技的发展,电子产品普及率愈来愈高,基于单片机的万年历设计成为了一种非常受欢迎的设计方案。
本文将介绍一种基于单片机的万年历设计。
二、设计原理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、日历功能。
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单片机的万年历的设计思路和实现过程。
首先,我们需要明确设计目标。
在这个项目中,我们的目标是使用STM32单片机开发一个功能齐全、易于操作的万年历。
具体地说,这个万年历应该能够显示当前的年、月、日和星期,并且能够进行日期的加减操作,同时应该具备一些辅助功能如闹钟设置、倒计时等。
接下来,我们需要进行硬件设计。
首先需要选择适当的显示屏,比如常见的LCD或OLED屏幕。
然后,我们需要选择合适的按键和外部触发器,用于用户的交互输入。
同时,还需要添加一些必要的接口,如USB接口用于数据传输和维护。
在软件设计方面,我们需要定义合适的数据结构来存储日期、时间、闹钟等信息。
同时,需要编写相应的程序来实现日期的显示和更新、日期的加减、闹钟的设置等功能。
在实现倒计时功能时,我们可以使用定时器中断来实现精确的计时。
此外,为了提高用户体验,我们可以添加一些额外的功能。
比如,我们可以为万年历设计一个简洁美观的用户界面,考虑使用图形库绘制用户界面元素。
同时,可以添加一些实用的功能如温湿度监测、天气预报等。
最后,在整个开发流程结束后,我们需要进行集成测试和调试,确保万年历的各项功能正常运行。
并且,我们还可以考虑为万年历添加一些优化和改进措施,如增加存储容量、优化节能技术等。
综上所述,基于STM32单片机的万年历设计主要涉及硬件设计和软件设计两个方面。
通过精心的设计和合理的实现,我们可以开发出一款功能丰富、易于使用的万年历产品,满足用户的各种需求。
单片机万年历课程设计
单片机万年历课程设计一、课程目标知识目标:1. 让学生理解单片机的基本原理和万年历的功能需求。
2. 使学生掌握单片机编程的基本语法和逻辑结构。
3. 帮助学生掌握如何在单片机上实现日期、时间的计算与显示。
技能目标:1. 培养学生运用单片机进行项目设计的能力,特别是万年历的实际应用。
2. 培养学生独立编程和调试程序的能力,解决实际项目中遇到的问题。
3. 提高学生团队协作能力和项目管理的意识。
情感态度价值观目标:1. 培养学生对单片机及电子制作的兴趣,激发学生的创新意识和探索精神。
2. 增强学生面对困难的勇气和毅力,培养他们积极解决问题的态度。
3. 通过团队合作,培养学生的集体荣誉感和责任感。
课程性质:本课程为实践性强的设计与制作课程,以单片机技术为核心,结合编程和电子技术,实现万年历的制作。
学生特点:学生为高年级学生,已具备一定的单片机基础知识,有编程基础,具备独立思考和解决问题的能力。
教学要求:注重理论与实践相结合,强调动手操作和实际应用。
教学过程中要关注学生的个体差异,提供适当的指导与帮助,确保每个学生都能在原有基础上得到提升。
通过课程学习,使学生能够将所学知识应用于实际项目中,达到学以致用的目的。
二、教学内容1. 单片机基础回顾:复习单片机的硬件结构、工作原理及I/O口编程。
- 教材章节:第三章单片机硬件结构与工作原理;第四章I/O口编程。
2. 定时器与中断:学习单片机定时器的工作原理,掌握中断编程方法。
- 教材章节:第五章定时器与中断;第六章中断编程。
3. 日期时间计算:讲解日期时间的计算方法,如何在单片机中进行实现。
- 教材章节:第七章日期时间计算;第八章单片机实现日期时间计算。
4. 显示技术:学习LED显示技术,掌握动态扫描显示方法。
- 教材章节:第九章LED显示技术;第十章动态扫描显示。
5. 万年历设计与实现:结合所学知识,设计并实现单片机万年历。
- 教材章节:第十一章项目设计与实现;第十二章万年历设计与制作。
万年历_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实现万年历演示教学
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,一共三个任务:主处理任务、触摸屏任务、秒更新任务。
基于单片机的电子万年历硬件设计说明书
硬件详细设计说明书——基于单片机电子万年历设计姓名:部门:编号:目录一、系统概述 (1)二、硬件详细设计 (1)2.1主控模块 (1)2.2 电源模块 (2)2.3 时钟模块 (2)2.4 键盘输入模块 (3)2.5 显示模块 (3)2.6 闹钟模块 (4)2.7 温度采集模块 (4)2.8 ISP下载电路 (5)一、系统概述基于单片机的万年历是运用51系列单片机为主处理器实现日期、时间、温度等信息的显示,并带有闹钟提示功能。
该系统主要由主控模块、电源模块、时钟模块、键盘输入模块、显示模块、闹钟模块、温度采集模块、ISP下载模块共八个模块组成。
系统框图如图1.1所示。
图1.1 电子万年历系统框图二、硬件详细设计2.1主控模块P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7P2.0P2.1P2.2P2.3P2.4P2.5P2.6P2.7P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RDU7STC12LE5A60S2-35I-PDIP40RST9XTAL218XTAL119GND20PSEN29ALE/PROG30EA/VPP31VCC40P1.0/T21P1.1/T2-EX2P1.23P1.34P1.45P1.56P1.67P1.7821P2.0/A8P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427P2.7/A1528P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.5/T115P3.6/WR16P3.7/RD17P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732VCC_3.3VR144.7KP2.[0..7]RSTXTAL1XTAL2P0.0P0.1P0.2P0.3P0.4VCC_3.3VP0.5P0.6P0.7图1.1 主控模块电路主控模块电路如图1.1所示。
基于单片机的万年历设计毕业设计说明书
设计说明书第 1 页基于单片机的万年历设计1 绪论万年历就是记录一定时间范围内的具体阳历与阴历的日期的年历,方便有需要的人查询使用。
随着人们生活水平的提高和生活节奏的加快,对时间的要求越来越高,精准数字计时的消费需求也是越来越多。
二十一世纪的今天,最具代表性的计时产品就是电子万年历,它是近代世界钟表业界的第三次革命。
电子万年历的出现带来了钟表计时业界跨跃性的进步。
近年来,电子钟已成为人们日常生活中必不可少的物品,广泛用于个人家庭以及车站、码头、剧院、办公室等公共场所,给人们的生活、学习、工作、娱乐带来了极大的方便。
随着技术的发展,人们已不再满足于钟表原先简单的计时功能,希望出现一些新的功能,诸如日历的显示、闹钟的应用等,以带来更大的方便,而所有这些,又都是以数字化的电子时钟为基础的。
因此,研究实用电子时钟及其扩展应用,有着非常现实的意义,具有很大的实用价值。
由于数字集成电路技术的发展和采用了先进的石英技术,现代电子钟具有走时准确、性能稳定、制作简单等优点,弥补了传统钟表的许多不足之处。
我们利用单片机技术设计制作的电子万年历,可以很方便的由软件编程进行功能的调整和改进,使其在能够准确显示年、月、日、时间、星期的同时,还能具有其他的功能。
如设定闹钟、语单报时、阴阳历的转换、二十四节气的显示等,有一定的新颖性和实用性,同时体积小,携带方便,使用也更为方便,具有技术更新周期短、成本低、开放灵活等优点,具备一定的市场前景。
以基于单片机的万年历作为设计课题,因为它具有很好的开放性和可发挥性,要求比较高,不仅考察了对单片机的掌握能力而且强调了对单片机的扩展的应用。
另外液晶显示的万年历已经越来越流行,具有显示清晰直观、走时准确、可以进行夜视等功能,并且还可以扩展出其它多钟功能。
所以,电子万年历作设计课题很有价值。
单片机万年历设计说明
单芯片万年历设计教学目标一、课程设计的性质本课程是在预先验证的认知实验和相关理论课程编制依据上,设计更高层次命题的教学环节。
它是一种供学生在教师指导下自主获取资料、设计、安装和编程特定功能的电子程序。
电路课程。
对提高学生的电子工程素质和科学实验能力具有十分重要的意义。
2.课程设计的目的本课程旨在培养学生综合数字电路和单片机知识的能力,解决电子信息中常见的实际问题,了解一般电子电路和单片机形成简单系统和更复杂的编程方法的能力。
是参加各类大学生电子竞赛前的技能训练课程,促进学生积累单片机系统开发经验,为更复杂、更实际的应用领域做准备。
目的是夯实基础,专注设计,发展技能,追求创新,变得实用。
二、课程设计专题(万年历设计)功能要求:1、显示年、月、日、时、分、秒;2、分、时、年、月、日可调;技术要求:课程设计通过制作PCB完成。
三、编程1.液晶1602初始化;PB口为数据输入输出口#define LCD_DDR PB_DDR MOV LCD_DDR,#0MOV PB_CR1,#0FFHMOV PB_CR2,#0#define Data_IN PB_IDR #define Data_Out PB_ODR;初始化PE5为RSBSET PE_DDR,#5BSET PE_CR1,#5BRES PE_CR2,#5BSET PE_ODR,#5#define RS PE_ODR, #5;初始化PE6为RWBSET PE_DDR,#6BSET PE_CR1,#6BRES PE_CR2,#6BSET PE_ODR,#6#define RW PE_ODR, #6;初始化PE7为E(片选信号)BSET PE_DDR,#7BSET PE_CR1,#7BRES PE_CR2,#7BRES PE_ODR,#7定义E PE_ODR,#7;液晶初始化MOV R03,#15呼叫延迟MOV LCD_COM,#38H ;调用 LCDWR_NDMOV R03,#05呼叫延迟MOV LCD_COM,#38H调用 LCDWR_ND移动 R03,#05 ;显示关闭呼叫延迟MOV LCD_COM,#08H调用 LCDWR_NDMOV R03,#05 ;显示清屏呼叫延迟MOV LCD_COM,#01H调用 LCDWR_NDMOV R03,#12 ;读或写一个字符后,地址指针减一呼叫延迟MOV LCD_COM,#04H调用 LCDWR_NDMOV R03,#15 ;显示开,光标不显示呼叫延迟MOV LCD_COM,#0CH调用 LCDWR_NDMOV R03,#15呼叫延迟2.子程序LCDWR_ND.LCDWR_ND.LBSET RW布雷斯 RS ;选择命令;阅读模式MOV LCD_DDR,#00H ;0,数据总线处于输入状态灯带1.LBSET E无无MOV LCD_D1,数据_IN布雷斯BTJT LCD_D1,#7,灯带1;写模式MOV LCD_DDR,#0FFHBRES RWMOV Data_Out, LCD_COMBSET E无无布雷斯RET3.子程序W_CODE.W_CODE.L ;读取数据布雷斯 RS ;数据指令BSET RWMOV LCD_DDR,#00HW_CODE_1.LBSET E无无LD A,Data_IN布雷斯LD R11,ABTJT R11,#7,W_CODE_1MOV LCD_DDR,#0FFHBSET RSBRES RWMOV Data_Out, LCD_COMBSET E无无布雷斯RETRETRETRETRET4. Subroutine Delay(起到延时作用)(1) TIM3初始化;计数器初始化MOV TIM3_PSCR,#01H移动 TIM3_ARRH,#27HMOV TIM3_ARRL,#10HMOV TIM3_CR1,#04HBRES TIM3_IER,#0BSET TIM3_CR1,#0(2)中断程序中断 TIM3_Interrupt_OverTIM3_Interrupt_Over.lBRES TIM3_SR1,#0十二月 R03IRET(3) 主要部分.延迟.LBSET TIM3_EGR,#0BSET TIM3_IER,#0延迟_1.lLD A, R03CP A,#00JRUGT 延迟_1BRES TIM3_IER,#0RET5、计时部分:(1) TIM1初始化;计数器初始化MOV TIM1_SMCR,#00HBRES TIM1_ETR,#6MOV TIM1_PSCRL,#01HMOV TIM1_ARRH,#{HIGH 10000} ;初始化自动重载初值寄存器TIM1_ARR MOV TIM1_ARRL,#{LOW 10000}MOV TIM1_RCR,#00H ;初始化重复计数寄存器 TIM1_RCRMOV TIM1_CR1,#05H BSET TIM1_CR1,#0 ;启动定时器 TIM1 (2) 中断程序中断 TIM1_Interrupt_OverTIM1_Interrupt_Over.lBRES TIM1_SR1,#0十二月 R19JRNE TIM1MOV R19,#100公司 R05 ; R05 是秒的一位数CLR ALD A, R05CP A,#10JRNE TIM1CLR R05INC R06 ;R06 是第二个的十位LD A, R06CP A,#6JRNE TIM1CLR R06公司 R07 ; R07 是分钟的一位数TIM1.LIRET6、LCD1602显示部分(1) 年、月、日的显示无限循环1.l移动地址,#08CHMOV LCD_COM,地址调用 LCDWR_ND无限循环2.lCLRW XCLR ACLRW YLDW X, R22LDW Y,#4DIVW X,YLD A, YLCP A,#0JRNE FRNCLRW YCLRW XCLR ALDW Y,#100LDW X, R22DIVW X,YLD A, YLCP A,#0JRNE润年CLRW YCLRW XCLR ALDW Y,#400LDW X,R22DIVW X,YLD A, YLCP A,#0JRNE FRN润年.lCLR ALD A,R21CP A,#2JRNE AS8LD A,R20CP A,#30JRC SD1MOV R20,#1INC R21JPF ASFRN.lCLR ALD A,R21CP A,#2JRNE AS8LD A,R20CP A,#29JRC SD1MOV R20,#1INC R21JPF ASAS8.LLD A,R21CP A,#1JRNE AS1LD A,R20CP A,#32JRC SD1MOV R20,#1INC R21 SD1.LJPF ASAS1.LLD A,R21CP A,#3JRNE AS2LD A,R20CP A,#32JRC SD2MOV R20,#1INC R21 SD2.LJPF ASAS2.LLD A,R21CP A,#5JRNE AS3LD A,R20CP A,#32JRC SD3INC R21 SD3.LJPF ASAS3.LLD A,R21CP A,#7JRNE AS4LD A,R20CP A,#32JRC SD4MOV R20,#1INC R21 SD4.LJPF ASAS4.LLD A,R21CP A,#8JRNE AS5LD A,R20CP A,#32JRC SD5MOV R20,#1INC R21 SD5.LJPF ASAS5.LLD A,R21CP A,#10JRNE AS6LD A,R20CP A,#32JRC SD6MOV R20,#1INC R21 SD6.LJPF ASAS6.LLD A,R21CP A,#12JRNE AS7LD A,R20CP A,#32JRC SD7INC R21 SD7.LJPF ASAS7.LIKELD A,R20CP A,#31JRC ASMOV R20,#1INC R21升学CLRW XCLR ALD A,R20LD XL,ALDW Y,#10DIVW X,YLD A,XLLD R31,ALD A, YLLD R30,ALD A,R21CP A,#13JRNE DFMOV R21,#1LDW X,R22INCW XLDW R22,X东风CLRW XCLR ALD A,R21LD XL,ALDW Y,#10DIVW X,YLD A,XLLD R33,ALD A, YLLD R32,ACLRW XCLR ALDW X,R22LDW Y,#1000DIVW X,YLD A,XLLD R37,ALDW X,YLDW Y,#100DIVW X,YLD A,XLLD R36,ALDW X,YLDW Y,#10DIVW X,YLD A,XLLD R35,ALD A,YLLD R34,A;日;个位LD A,R30CLRW XCLR ALD A,R30LD XL,ALD A,(树子,X)LD LCD_COM,A调用 W_CODE;十位CLRW XCLR ALD A,R31LD XL,ALD A,(树子,X)LD LCD_COM,A调用 W_CODECLR ALD A,{风哥2+0}LD LCD_COM,A调用 W_CODE;月;个位CLRW XCLR ALD A,R32LD XL,ALD A,(树子,X)LD LCD_COM,A调用 W_CODE;十位CLRW XCLR ALD A,R33LD XL,ALD A,(树子,X)LD LCD_COM,A调用 W_CODECLR ALD A,{风哥2+0}LD LCD_COM,A调用 W_CODELD A,R34CP A,#10JRNE条112CLR R34INC R35条112.lCLRW XCLR ALD A,R34LD XL,ALD A,(ShuZi,X) ;年的个位LD LCD_COM,A调用 W_CODELD A,R35CP A,#10JRNE条113CLR R35INC R36条113.lCLRW XCLR ALD A,R35LD XL,ALD A,(ShuZi,X) ;年的十位LD LCD_COM,A调用 W_CODELD A,R36CP A,#10JRNE条114CLR R36INC R37条114.lCLRW XCLR ALD A,R36LD XL,ALD A,(ShuZi,X) ;百岁LD LCD_COM,A调用 W_CODECLRW XCLR ALD A,R37LD XL,ALD A,(树子,X) ;年以千计LD LCD_COM,A调用 W_CODE(2) 时、分、秒显示部分.鲜食.l;秒的一位数条1.lCLRW XCLR ALD A, R05LD XL,ALD A,(树子,X)LD LCD_COM,A调用 W_CODE;几十秒条2.lCLRW XCLR ALD A, R06LD XL,ALD A,(树子,X)LD LCD_COM,A调用 W_CODECLR ALD A,{风哥+0}LD LCD_COM,A调用 W_CODE;分钟的一位数LD A, R07CP A,#10JRNE条3CLR R07INC R08条3.lCLRW XCLR ALD A, R07LD XL,ALD A,(树子,X)LD LCD_COM,A调用 W_CODE;分钟的十位LD A,R08CP A,#6JRNE条4CLR R08INC R09条4.lCLRW XCLR ALD A,R08LD XL,ALD A,(树子,X)LD LCD_COM,A调用 W_CODECLR ALD A,{风哥+0}LD LCD_COM,A调用 W_CODE;小时的个位LD A,R10CP A,#2JRNE庆玲LD A,R09CP A,#4JRNE条5CLR R09CLR R10INC R20MOV R24,#0FFHJRT条5青灵.lLD A,R09CP A,#10JRNE条5CLR R09INC R10条5.lCLRW XCLR ALD A,R09LD XL,ALD A,(树子,X)LD LCD_COM,A调用 W_CODE;小时的十位LD A,R10CP A,#3JRNE条6CLR R10条6.lCLRW XCLR ALD A,R10LD XL,ALD A,(树子,X)LD LCD_COM,A调用 W_CODELD A,{WEL_1+0}LD LCD_COM,A调用 W_CODECLR ALD A,R24CP A,#0FFHJRNE QCLR R24JPF 无限循环1QLJPF 无限循环RET7、键盘调时部分中断 TIM3_Interrupt_OverTIM3_Interrupt_Over.lBRES TIM3_SR1,#0十二月 R03IRETIRETIRETIRETIRET中断 TIM2_Interrupt_Over TIM2_Interrupt_Over.lBRES TIM2_SR1,#0十二月 R12JRNE 中断_TIM2_Key1MOV R12,#20BSET KeySTU,#4中断_TIM2_Key1.lLD A,KeySTU和 A,#07HJRNE 中断_TIM2_Key_exitLD A,KeyTIMECP A,#125JRNC 中断_TIM2_Key_exitINC KeyTIME中断_TIM2_Key_exit.lSCAN_Key.lBTJT KeySTU,#4,SCAN_Key_NEXT1JPF SCAN_Key_EXIT SCAN_Key_NEXT1.LBRES PG_ODR,#1无无无LD A,PC_IDR和 A,#0FEHCP A,#0FEHJRNE SCAN_Key_NEXT2供应链金融JRT SCAN_Key_NEXT3 SCAN_Key_NEXT2.LRCFSCAN_Key_NEXT3.LLD A,KeySTURLC A和 A,#07HLD KeySTU,AJREQ SCAN_Key_NEXT41CP A,#010BJRNE SCAN_Key_NEXT4BRES KeySTU,#1SCAN_Key_NEXT41.LLD A,KeyTIMECP A,#125JPF SCAN_Key_EXITCLR 密钥时间JRT SCAN_Key_NEXT6 SCAN_Key_NEXT4.LCLR 密钥时间CP A,#101BJRNE SCAN_Key_NEXT5BSET KeySTU,#1JPF SCAN_Key_EXITSCAN_Key_NEXT5.LCP A,#100BJREQ SCAN_Key_NEXT6IRETSCAN_Key_NEXT6.LCALL Key_Check_ProcSCAN_Key_EXIT.LIRETIRETIRETIRETIRET.Key_Check_Proc.lBTJT PC_IDR,#1,Key_Check_Proc_1INC R18LD A,R18CP A,#6JRNE 一号CLR R18MOV R24,#0FFH一个.lJPF Key_Check_Proc_6Key_Check_Proc_1.lLD A,R18CP A,#1JRNE Key_Check_Proc_2BTJT PC_IDR,#2,JianYi_1CLR R05CLR R06INC R07JPF Key_Check_Proc_6简一_1.lBTJT PC_IDR,#6,Key_Check_Proc_1_1LD A,R07CP A,#0JRNE建一_1_1MOV R07,#10LD A,R08CP A,#0JREQ建一_1_1十二月 R08建一_1_1.lCLR R05CLR R06十二月 R07Key_Check_Proc_1_1.LJPF Key_Check_Proc_6Key_Check_Proc_2.lLD A,R18CP A,#2JRNE Key_Check_Proc_3BTJT PC_IDR,#2,JianYi_2INC R09JPF Key_Check_Proc_6简一_2.lBTJT PC_IDR,#6,JianYi_2_2LD A,R09CP A,#0JRNE建一_2_1MOV R09,#10LD A,R10CP A,#0JREQ建一_2_1十二月 R10简一_2_1.l十二月 R09简一_2_2.lJRT Key_Check_Proc_6Key_Check_Proc_3.lLD A,R1CP A,#3JRNE Key_Check_Proc_4BTJT PC_IDR,#2,JianYi_3INC R20MOV R24,#0FFHJRT Key_Check_Proc_6简一_3.lBTJT PC_IDR,#6,Key_Check_Proc_6CP A,#0JRNE建一_3_1MOV R20.29建一_3_1.l十二月 R20MOV R24,#0FFHJRT Key_Check_Proc_6Key_Check_Proc_4.lLD A,R18CP A,#4JRNE Key_Check_Proc_5BTJT PC_IDR,#2,JianYi_4INC R21MOV R24,#0FFHJRT Key_Check_Proc_6简一_4.lBTJT PC_IDR,#6,Key_Check_Proc_6LD A,R21CP A,#1JRNE建一_4_1MOV R21,#13简一_4_1.l十二月 R21MOV R24,#0FFHJRT Key_Check_Proc_6Key_Check_Proc_5.lLD A,R18CP A,#5JRNE Key_Check_Proc_6BTJT PC_IDR,#2,JianYi_5CLRW XLDW X,R22INCW XLDW R22,XMOV R24,#0FFHJRT Key_Check_Proc_6简一_5.lBTJT PC_IDR,#6,Key_Check_Proc_6CLRW XLDW X, R22DECW XMOV R24,#0FFHJRT Key_Check_Proc_6 Key_Check_Proc_6.lRETRETRETRETRET4.硬件设计一、一般电路原理图2、LCD1602电路3、微控制器最小系统[1]世伟.印刷电路板的排版设计:科技文献,1983[2]永雄,沙河等。
嵌入式智能万年历设计
任务要求:用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();}}}。
基于STM32单片机的万年历设计设计
本科生毕业论文(或设计)(申请学士学位)论文题目基于STM32单片机的万年历设计作者姓名李杨专业名称自动化指导教师王斌2014年5月学生:(签字)学号:2010210328答辩日期:2014年5 月24日指导教师:(签字)目录摘要 (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 研究背景及意义对于时间这个概念一开始在长达几千年的时间里,根本就没有任何测定时间的精确方法。
基于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的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏。
基于STM32的电子万年历系统设计
信 息 技 术20科技资讯 SC I EN C E & TE C HN O LO G Y I NF O R MA T IO N 1 理论分析R T C 主要由两部分组成。
第一部分是与A PB 1总线相连的AP B1接口,它由A PB 1总线时钟驱动,主要用于用户通过APB1总线对其进行读写操作。
第二部分是一组可编程计数器,它又由R T C 预分频模块和RTC可编程计数模块组成,前者用于产生1秒时间基准,后者主要用于初始化当前时钟时间和进行时钟计数。
R T C 内核完全独立于APB1接口,软件可以通过APB1接口来访问预分频值和时钟计数器值。
要实现万年历功能,必须对R TC 的寄存器进行相应的配置。
R T C 的控制寄存器有两个,分别为R T C _C R H 和R T C _C R L 。
对R T C _C R H 的最低位置1可以允许秒中断,这也是该系统所需要的。
在R T C _C R L 中,位5到位0是有效位,分别是关于RTC关闭、配置标志、寄存器同步标志、溢出标志、闹钟标志和秒标志的设置。
这其中也有些是需要注意的,比如位5为R TC 操作位,该位只能由硬件操作,软件只读,在进行完一次RTC操作后,必须判断该位来确定操作是否完成,若未完成,进行等待。
RTC的预分频装载寄存器也是十分重要的寄存器之一,由RTC _PRL H和RTC _PRL L组成,主要用来配置R T C 的分频数。
R T C 最重要的寄存器是计数寄存器RTC_C NT,由两个16位寄存器组成用来进行秒钟的计数,最大计数值折合成年大概为136年。
在修改R T C_C N T 时需要进入配置模式。
2 硬件电路STM32最小系统需要搭建好两个晶振模块,分别为32768HZ的低速晶振和8MMZ 的高速晶振。
然后接入复位电路,用于实现系统的复位功能。
最后接入JTA G电路,就可以进行程序的下载和硬件仿真了。
L CD 12864液晶显示屏可以显示较多的汉字和字符,程序简单,支持串行和并行通信。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计说明书设计题目:基于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小时制时间、平年闰年的判断以及定时。
采用Keil uVision4进行编写调试程序,以神州二号嵌入式技术开发板为硬件平台进行设计,最终实现在显示屏上显示时间、日期、以及进行定时等功能。
以基于STM32的智能万年历作为设计的课题,因为它有很好的开放性和可发挥性,不仅考察了对单片机的掌握能力而且强调了对单片机扩展的应用。
另外液晶显示的万年历已经越来越流行,特别适合在家庭居室、办公室、大厅、会议室、车站和广场等地方使用,它具有显示清晰直观、走时准确、可以进行夜视等功能,并且还可以扩展出其它多种功能。
所以,电子万年历作为设计课题很有价值。
经过两周的课程设计,我们完成了按键和触摸两种方式对万年历的控制,实现了基本的万年历功能和闹钟功能。
本次课程设计让我对万年历有了深刻理解,更让我对stm32有了更进一步的学习。
关键词:STM32F103VCT6;最小应用系统;万年历目录1.课程设计任务 (1)1.1课程设计目的 (1)1.2设计要求 (1)1.3技术要求 (1)1.4解决的主要问题 (2)1.5两周时间安排 (2)2 总体方案设计 (3)2.1整体方案设计 (3)2.2模块工作原理 (3)2.2.1 最小应用系统模块 (3)2.2.2 基础配置模块 (3)2.2.3 时间运行模块 (3)2.2.4 触摸屏显示模块 (4)2.2.5 触摸屏触摸模块 (4)2.2.6 闹钟设置模块 (4)2.3硬件模块简介 (4)2.3.1 最小应用系统 (5)2.3.2 TFTLCD显示屏 (5)3 硬件设计 (6)3.1STM32硬件系统原理图 (6)3.1.1 MCU (6)3.1.2 复位电路 (7)3.1.3 启动电路 (8)3.1.4 晶振电路 (8)3.1.5 电源电路 (9)3.1.6 蜂鸣器电路 (9)3.2触摸屏模块电路设计 (11)3.2.1 TFTLCD简介 (11)3.2.2 显示设置 (11)3.2.3 触摸设置 (12)3.2.4 驱动设置 (12)3.3硬件系统模块电路 (12)3.3.1专题硬件选型依据及简介 (12)3.3.2 专题主芯片的内部逻辑结构 (13)3.3.3 外部管脚特性 (14)3.3.4 与MCU的硬件接口连接 (15)4 软件设计 (18)4.1万年历定时设计思路 (18)4.2主程序模块 (18)4.3TFT-LCD触摸屏模块 (19)4.4专题设计 (19)4.4.1.针对专题的信息传输 (19)4.4.2.芯片的工作方式 (20)4.4.3.时序图 (21)4.4.4.流程图 (22)5 调试与结果 (23)5.1测试任务 (23)5.2测试目的目标 (24)5.3测试软硬件环境 (24)5.4测试的过程及其步骤 (24)5.5测试结果 (24)6 总结 (26)7 致谢 (27)参考文献 (28)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 等功能模块进行基础配置,设置其输入输出方式、速度及其它专属配置,并使能需要的管脚及外设,设置中断。
2.2.3 时间运行模块时间运行模块是用来对时间运行的算法进行编程,通过算法编程实现对年、月、日、时、分、秒的处理,实现秒满60清零并进1,分满60清零并进1,时满24清零并进1,日满28或29或30或31清零并进1,月满12清零并进1的功能。
2.2.4 触摸屏显示模块触摸屏显示模块使用TFT-LCD即薄膜晶体管液晶显示器,使用TFTLCD模块驱动芯片中的ILI9320芯片,实现触摸屏的显示。
TFT-LCD与无源TN-LCD、STN-LCD的简单矩阵不同,它在液晶显示屏的每一个像素上都设置有一个薄膜晶体管(TFT),可以有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。
TFT-LCD也被叫做真彩液晶显示器。
2.2.5 触摸屏触摸模块触摸屏的主要部分是一块与显示器表面非常配合的电阻薄膜屏,当手指触摸屏幕时,两层导电层在触摸点位置就有了接触,电阻发生变化,在X和Y两个方向上产生信号,然后送到触摸屏控制器。
控制器侦测到这一接触并计算出X,Y的位置,再根据获得的位置模拟鼠标的方式运行。
2.2.6 闹钟设置模块定时闹钟模块是利用Timer函数进行操作,通过设置闹钟时间,倒计时使其到达指定时间触发蜂鸣器,从而实现闹钟提示的功能。
2.3 硬件模块简介在智能万年历项目中,我们采用的硬件主要是基于STM32F103VCT6的神州二号开发板,它的主要性能如下表所示:2.3.1 最小应用系统最小应用系统是完成此项目所有功能的基础,它主要包含MCU和电源、复位、晶振、启动等,我们通过程序使能这些硬件,让它完成相应的功能。
MCU:微控制单元,是把中央处理器的频率与规格做适当缩减,并将内存、计数器、USB、A/D转换、UART、PLC、DMA等周边接口,LCD驱动电路都整合在单一芯片上,形成芯片级的计算机,为不同的应用场合做不同组合控制。
复位电路:就是利用它把电路恢复到起始状态。
就像计算器的清零按钮的作用一样,以便回到原始状态,重新进行计算。
和计算器清零按钮有所不同的是,复位电路启动的手段有所不同。
晶振电路:驱动整个系统中的各个时钟进行工作。
启动电路:启动整个系统。
电源:给整个系统供电。
2.3.2 TFTLCD显示屏TFT(Thin Film Transistor)即薄膜场效应晶体管。
所谓薄膜晶体管,是指液晶显示器上的每一液晶像素点都是由集成在其后的薄膜晶体管来驱动。
从而可以做到高速度、高亮度、高对比度显示屏幕信息。
3 硬件设计3.1 stm32硬件系统原理图我们组选用神州二号开发板来完成我们的任务目标,它是基于STM32F103VCT6开发的,面向企业和广大爱好者,开发板功能强大,外围资源丰富,例程丰富,如下图所示:此章主要介绍最小应用系统(MCU、复位、启动、晶振、电源等)和此设计相关硬件。
3.1.1 MCU神州二号STM32开发板选择的是STM32F103VCT6作为MCU,该芯片是STM32F103系列里面配置非常强大的了,它拥有的资源包括:48KB RAM、256KB FLASH、2个基本定时器、4个通用定时器、2个高级定时器、3个SPI、2个IIC、5个串口、1个USB、1个CAN、3个ADC、1个DAC、1个SDIO接口、以及80个通用IO口。
神州二号开发板选用的是外设资源和管脚资源最丰富的100脚LQFP封装的STM32F103VCT6芯片,充分满足企业和广大爱好者的评估开发需求。
所以我们选择了它作为我们的主芯片。
MCU部分原理图如下图所示3.1.2 复位电路图中所示是开发板板载的复位按键(RESET),用于复位STM32,还具有复位液晶显示屏的功能,因为液晶模块的复位引脚和STM32的复位引脚是连接在一起的,当按下该键的时候,STM32和液晶一并被复位。