嵌入式系统课程设计报告_哈工程_万年历_第1页
嵌入式系统课程设计报告_哈工程_万年历_第2页
嵌入式系统课程设计报告_哈工程_万年历_第3页
嵌入式系统课程设计报告_哈工程_万年历_第4页
嵌入式系统课程设计报告_哈工程_万年历_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、下载可编辑课程设计报告数字万年历的设计与实现班级:20120616学号:姓名:教师评语 :教师签名 :2015 年9月.专业 .整理 .下载可编辑课程设计题目数字万年历的设计与实现显示年、月、日和时间 ,支持 LED 和 LCD 显示时间显示方式两种 :文本方式 ,图形方式主要内容时间日期设置功能 ,闹钟设置功能 ,整点报时功能显示当日周数功能 ,显示当月日历功能支持触摸屏操作和小键盘输入UP-NETARM3000 嵌入式开发平台ADS1.2 集成开发环境采用的工具方法JTAG仿真器驱动程序超级终端通信程序第 1 天系统的初步设计进度安排第 2-5天 编代码,实现系统功能第 6-7天 系统的调

2、试与完善1 基于 ARM 的嵌入式系统设计实验与实践教程 ,清华大学出版社, 2011.参考资料2 嵌入式系统开发原理与实践,清华大学出版社 ,2005.专业 .整理 .下载可编辑3 ARM 微处理器应用开发技术详解与实例分析 电子科技大学出版社,2007.专业 .整理 .下载可编辑1. 题目数字万年历的设计与实现2. 系统简介二十一世纪的今天 ,最具代表性的计时产品就是电子万年历,它是近代世界钟表业界的第三次革命 。使计时产品的走时日差从分级缩小到1/600万秒,从原有传统指针计时的方式发展为人们日常更为熟悉的夜光数字显示方式,直观明了 ,并增加了全自动日期 、星期以及其他日常附属信息的显示

3、功能,它更符合消费者的生活需求。因此,电子万年历的出现带来了钟表计时业界跨跃性的进步。如今电子万年历飞入了寻常百姓家 ,挂式、台式以及带装饰画面等丰富的电子万年历数不胜数 ,不但满足了精准的计时需求 ,还将计时带上了科技时尚的味道 。ARM 嵌入式技术可进行多种功能的设置 ,如闹钟 、报时、日历查询 、语音等 ;并改善了很多原有石英钟不能解决的问题 ,例如:数字夜光显示 、数据存储以及全自动温度检测等功能;这给传统计时消费带来了新的动力 ,越来越多的消费者选择了电子万年历 。所以,我们这次嵌入式课程设计的题目选为电子万年历 。本数字万年历系统实现了以下功能:1.显示年、月、日和时间 ,支持 L

4、ED 和 LCD 两种方式显示 ;2.时间显示方式有两种 :文本方式 ,图形方式 ;3.时钟加入背景图片 ,并且图片可以根据季节变化,整体界面美观 ;4.能通过小键盘调节万年历的年、月、日、时、分、秒;5.定时闹钟提醒功能和整点报时功能;6.显示当月日历 ,显示当天星期功能 ;7.掉电后无需重新设置时间和日期。3. 系统设计本次设计是基于 ARM 微处理芯片并用 ADS1.2 开发完成的 ,该万年历能够显示年 、月、日、星期、时、分、秒 ,还有闹钟和整点报时功能 ,并且可任意设定时间和日期 。显示年、月、日和时间的方式均支持 LED 和 LCD 显示,时间的 LCD 显示方式又分为两种,一种是

5、文本方式 ,另一种是图形方式 ,再配上背景图片 ,界面非常美观 。 它还支持触摸屏操作和小键盘 ,修改时间和日期可以通过小键盘来调节 。 并且掉电后无需重新设置时间和日期 。 本系统采用多任务设计 。 除了系统已定义的任务外 ,再定义了Main_Task_Prio、Rtc_Disp_Task_Prio 和 LED_Display_Task_Prio三个任务,任务优先级分别为 12 、14 和和 11。 通过 Main_Task_Prio 任务中响应键盘和触摸屏消息 ,可以对时钟和闹钟进行设置 。通过 Rtc_Disp_Task 实现系统时钟和日历的显示和更新 ,并判断.专业 .整理 .下载可编

6、辑闹钟时间是否到达并做到达后的相应处理以及判断是否到达整点并进行整点报时。通过 LED_Display_Task_Prio 实现 LED 对时间、日期的显示和更新 。使用多任务系统中的信号量保证多个任务同时对系统的一个资源(系统时钟 )访问而不产生冲突 。3.1 LED 显示时间和日期万年历启动后 ,按下 “NumLock ”按键可以切换 LED显示日期或时间 ,其中年、月、日、时、分、秒均为 2 位数字,并且每两个数字之间用 “-”隔开 ,并且其显示的时间和日期与 LCD 屏幕上的时间和日期保持一致,其实现函数是在任务 LED_Display_Task_Prio 中 , 任 务 实 时 获

7、取 系 统 当 前 的 时 间 和 星 期 存 放 于 led_currenttime 中,再根据显示时间或日期的标识符 led_flag 的数值来进入不同的分支以显示时间或日期 ,其中 currenttime 是一个自定义的结构体 ,它存放了当前时间的年、月、日、时、分、秒 。 通过函数 Get_Rtc(&led_currenttime) 取得当前的时间信息,并通过调用 LED 相关的 API 函数将时间显示出来,通过WriteSDIO(ZLG7289_CMD_DATA0|0) 使 得 , 第 一 个 数 码 管 亮 , 同 样 使 用 WriteSDIO(ZLG7289_CMD_D

8、ATA0|1) 数码管以方式 0 译码,第二个数码管亮 ,按照同样的方法就可以使得其他数码管灯也亮 。最后用 OSTimeDly(100) 将任务挂起一段时间。用这样的方式实现 LED 显示时间和日期 。主要代码如下 :void LED_Display_T ask(void *Id)structTime led_currenttime;Zlg7289_Reset();/zlg7289复位for(;)Get_Rtc(&led_currenttime);/获取当前时间ZLG7289_ENABLE();/ 使 zlg7289占有同步串口if(led_flag=0)/ 进入显示时间分支Dela

9、y(5);/ 延时WriteSDIO(ZLG7289_CMD_DATA0|5);/数码管以方式0 译码 ,第 6 个数码管亮.专业 .整理 .下载可编辑WriteSDIO(0x0a);/显示 -Delay(1);WriteSDIO(ZLG7289_CMD_DATA0|2);/数码管以方式0 译码 ,第 3 个数码管亮WriteSDIO(0x0a);/显示 -Delay(1);WriteSDIO(ZLG7289_CMD_DATA0|7);/数码管以方式0 译码 ,第 8 个数码管亮WriteSDIO(led_currenttime.hour/16);/显示十位Delay(1);WriteSDIO

10、(ZLG7289_CMD_DATA0|6);/数码管以方式0 译码 ,第 7 个数码管亮WriteSDIO(led_currenttime.hour%16);/显示个位Delay(1);WriteSDIO(ZLG7289_CMD_DATA0|4);/数码管以方式0 译码 ,第 5 个数码管亮WriteSDIO(led_currenttime.minute/16);/显示十位Delay(1);WriteSDIO(ZLG7289_CMD_DATA0|3);/数码管以方式0 译码 ,第 4 个数码管亮WriteSDIO(led_currenttime.minute%16);/显示个位Delay(1)

11、;WriteSDIO(ZLG7289_CMD_DATA0|1);/数码管以方式0 译码 ,第 2 个数码管亮WriteSDIO(led_currenttime.second/16);/显示十位Delay(1);WriteSDIO(ZLG7289_CMD_DATA0|0);/数码管以方式0 译码 ,第 1 个数码管亮WriteSDIO(led_currenttime.second%16);/显示个位Delay(1);.专业 .整理 .下载可编辑else if(led_flag=1)/ 进入显示日期分支Delay(5);/ 延时WriteSDIO(ZLG7289_CMD_DATA0|5);/数码管

12、以方式0 译码 ,第 6 个数码管亮WriteSDIO(0x0a);/显示 -Delay(1);WriteSDIO(ZLG7289_CMD_DATA0|2);/数码管以方式0 译码 ,第 3 个数码管亮WriteSDIO(0x0a);/显示 -Delay(1);WriteSDIO(ZLG7289_CMD_DATA0|7);/数码管以方式0 译码 ,第 8 个数码管亮WriteSDIO(led_currenttime.year/16);/显示十位Delay(1);WriteSDIO(ZLG7289_CMD_DATA0|6);/数码管以方式0 译码 ,第 7 个数码管亮WriteSDIO(led_

13、currenttime.year%16);/显示个位Delay(1);WriteSDIO(ZLG7289_CMD_DATA0|4);/数码管以方式0 译码 ,第 5 个数码管亮WriteSDIO(led_currenttime.month/16);/显示十位Delay(1);WriteSDIO(ZLG7289_CMD_DATA0|3);/数码管以方式0 译码 ,第 4 个数码管亮WriteSDIO(led_currenttime.month%16);/显示个位Delay(1);.专业 .整理 .下载可编辑WriteSDIO(ZLG7289_CMD_DATA0|1);/数码管以方式0 译码 ,第

14、 2 个数码管亮WriteSDIO(led_currenttime.day/16);/显示十位Delay(1);WriteSDIO(ZLG7289_CMD_DATA0|0);/数码管以方式0 译码 ,第 1 个数码管亮WriteSDIO(led_currenttime.day%16);/显示个位Delay(1);Delay(1);ZLG7289_DISABLE();/zlg7289放弃同步串口控制?OSTimeDly(200);3.2 LCD 显示文本形式的系统时间、闹钟时间 、日期和星期LCD 显示文本形式的时间和日期比较简单 ,时间、日期、星期和闹钟时间的显示都是用文本框显示的 ,并且时间

15、要实时刷新 ,所以放在了 Rtc_Disp_Task 时钟刷新任务里面,其中时间文本框为 pTimeTextCtrl ,日期文本框为 pDateTextCtrl ,闹钟文本框为 pAlarmTextCtrl ,星期文本框为 pWeekDayTextCtrl ,只要在系统初始时 ,将文本框初始化,并且在 Rtc_Disp_Task 任务里面实时提取当前系统时间 ,以显示系统时间为例 ,获取当前系统时间的函数为 Get_Rtc(&currenttime) ,它把时间信息存入 currenttime ,然后将 currenttime 中的时间存入 strtime ,最后再用 SetTextC

16、trlText(pTimeTextCtrl,strtime,TRUE) 语句便将时间显示到系统时间文本框中,类似的其他文本框显示也是用这种方式 。比较特殊的是星期的显示 ,需要先根据年月日计算出当前是周几 ,然后再根据周几设定显示的字符 ,其中计算星期的函数如下 :U8 GetSysWeek(U8 year,U8 month,U8 day)U8 y,m,d,w;.专业 .整理 .下载可编辑U8 c = 20;y = (year>>4)*10+(year&0x0f);/bcd转 decm = (month>>4)*10+(month&0x0f);d = (

17、day>>4)*10+(day&0x0f);if(m<2)m+=12;y-=1;w=y+(y/4)+(c/4)+(26*(m+1)/10)+d-1-(2*c);/计算星期return (w%=7);3.3 LCD 显示图形形式的时间 、日历和背景图片由于背景图片和图形形式的时间 、日历位置是重叠的 ,同时要使背景图片实现根据日期变化图片功能 ,而且时钟要实时变化 、日历也要根据日期点亮当天的日期 。 所以要求它们全部实时刷新显示 ,这就牵扯到刷新的顺序问题 ,否则会出现显示不正常的情况。 最终确定的刷新顺序是先刷新背景图片 ,之后是圆形表盘 ,最后是日历 ,这样做的好

18、处是保证全部都可以显示正常 ,而且不需要额外擦除表盘之前留下的秒针 、分针和日历的高亮日期 。背景图片随季节变化的实现比较简单 ,只需要在加载图片时判断当前日期的月份即可,在 1-3 月就在指定位置加载春天的背景 ,在 4-6 月就加载夏天的背景 ,同理在 6-9 月和 10-12 月分别加载秋天和冬天的背景图片 。圆形表盘形式的显示 ,需要画出表盘 、时针、分针、和秒针,主要包括以下过程 :(1)先画出表盘一圈的 60 个短刻度和 12 个长刻度 ,其中给秒针 、分针各对应 60 个坐标,表示 60 秒和 60 分,给时针设定 12 个坐标对应一圈的 12 个小时 。( 2)再根据当前系统时

19、间画出对应的时针 、分针、秒针 ,其中主要用了函数 MoveTo ()和 LineTo()来有关的线画表盘主要代码如下 :m=60;n=120;.专业 .整理 .下载可编辑SetDrawOrg(pdc, m,n, &oldx, & oldy);/设定画板60,120 为原点for(i=0;i<=60;i+)/画时钟刻度短线/ 短线长度为 5x1=50*cos(PI/30*i);/PI/30*i为角度范围从0到360度y1=50*sin(PI/30*i);x2=45*cos(PI/30*i);y2=45*sin(PI/30*i);MoveT o(pdc,x2,y2);Lin

20、eTo(pdc,x1,y1);/*-画刻度值 3-*/MoveT o(pdc,34,-4);LineTo(pdc,38,-4);LineTo(pdc,38,4);LineTo(pdc,34,4);MoveT o(pdc,34,0);LineTo(pdc,38,0);/ 根据当前时间画秒针timeys=30*sin(PI/30*time_s-(PI/2);timexs=30*cos(PI/30*time_s-(PI/2);MoveT o(pdc,0,0);SetPenColor(pdc,0xffff0000);.专业 .整理 .下载可编辑LineTo(pdc,timexs,timeys);类似的

21、可以画出分针 、时针。画日历也采用了划线的方式 ,把 1-31 这 31 个数字先分别计算出它所在的位置 ,以及要划线的坐标 ,然后用连线的方式画出来 ,过程比较繁琐 ,这是代码量最大的一部分,然后根据日期去高亮显示对应的日期 ,高亮的方式就是通过改变画线的颜色再画一遍。举其中一个例子 ,画数字 7/*-画数字 7-*/if(currentdate.day=7)SetPenColor(pdc,0xff00ff00);/设置划线为绿色MoveT o(pdc,160,8);LineTo(pdc,165,8);LineTo(pdc,165,18);SetPenColor(pdc,0x00000000

22、);/设置划线为黑色elseMoveT o(pdc,160,8);LineTo(pdc,165,8);LineTo(pdc,165,18);其中比较困难的部分是根据不同月份日历显示不同的天数 ,并且要考虑平年和闰年的二月天数不一致的问题 。 最终采用分支策略 ,判断当前日期属于哪种情况 ,然后进入不同分支 ,进行日历绘制 。3.4 闹钟提醒和整点报时闹钟提醒和整点报时也是需要实时检测的,所以放在了Rtc_Disp_Task 时钟更新任务中,闹钟提醒需要先从设置闹钟的文本框中获取到设定的闹钟时间 ,然后获取系统当前时间 ,并实时比较两者 ,当不相等时不执行任何操作 ,当相等时开始播放指定的音乐。

23、.专业 .整理 .下载可编辑整点报时也放在了 Rtc_Disp_Task 时钟更新任务中 ,任务实时获取当前时间并且实时判断当前秒数和分数是否同时为 0,如果同时为 0 则表明是到整点时刻 ,于是便再按照当前小时的数值去播放对应的语音进行整点报时。4. 系统实现几处关键部分的实现 :(1)表盘绘制函数CreateClockFigure( )圆形表盘的实现先画一个圆,对圆 12 等分获得分针刻度 , 60 等分获得表针刻度 。使用 sin 和 cos 获得坐标值 ,利用 API 函数 MoveTo 和 LineTo 画出刻度 。(2)时间设定函数SetSystemTime( )首先从文本框中取出时间

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论