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

下载本文档

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

文档简介

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

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

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

4、D 和 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、是否到达整点并进行整点报时。通过Word资料 OSTimeDly(100)将任务挂起一段时间。用这样的方式实现 码如下: void LED_Display_Task(void *Id) structTime led_curre nttime; Zlg7289_Reset();/zlg7289 复位 for(;) Get_Rtc(&l ed_curre nttime);/ 获取当前时间 ZLG7289_ENABLE(); 使 zlg7289 占有同步串口 if(led_flag=0) /进入显示时间分支 Dela y(5);/ 延时 WriteSDIO(ZLG7289_CMD_DATA0

7、|5); WriteSDIO(0 x0a); 显示- Delay(1); WriteSDIO(ZLG7289_CMD_DATA0|2); WriteSDIO(0 x0a); 显示- Delay(1); WriteSDIO(ZLG7289_CMD_DATA0|7); WriteSDIO(led_curre nttime.hour/16);/ Delay(1); WriteSDIO(ZLG7289_CMD_DATA0|6); WriteSDIO(led_curre nttime.hour%16); Delay(1); WriteSDIO(ZLG7289_CMD_DATA0|4); WriteSDI

8、O(led_curre nttime.mi nu te/16);/ Delay(1); LED显示数码管以方式 数码管以方式 数码管以方式 显示十位 数码管以方式 显示个位 0译码, 0译码, 0译码, 0译码, 数码管以方式 显示十位 0译码, 6个数3个数码管亮 8个数码管亮 7个数码管亮 5个数码管亮 LED_Display_Task_Prio 实现 LED 对时间、日期的显示和更新。使用多任务系统中的信 号量保证多个任务同时对系统的一个资源(系统时钟)访问而不产生冲突。 3.1 LED 显示时间和日期 万年历启动后,按下“ NumLock 按键可以切换 LED 显示日期或时间,其中年、

9、月、 日、时、分、秒均为 2 位数字,并且每两个数字之间用“-”隔开,并且其显示的时间 和日期与LCD 屏幕上的时间和日期保持一致,其实现函数是在任务 LED_Display_Task_Prio 中,任务实时获取系统当前的时间和星期存放于 led_currenttime 中,再根据显示时间或日期的标识符led_flag 的数值来进入不同的分 支以显示时间或日期,其中 curren ttime 是一个自定义的结构体,它存放了当前时间的 年、月、日、时、分、秒。通过函数 Get_Rtc(&led_currenttime) 取得当前的时间信息, 并通过调用 LED 相关的 API 函数将时间

10、显示出来,通过 WriteSDIO(ZLG7289_CMD_DATA0|0) 使得,第一个数码管亮,同样使用 WriteSDIO(ZLG7289_CMD_DATA0|数码管以方式 0 译码,第二个数码管亮,按照同样的方法就可以使得其他数码管灯也亮。最后用 Word资料 WriteSDIO(ZLG7289_CMD_DATAO|3);数码管以方式 0译码, 第4个数码管亮 WriteSDIO(led_curre nttime.mi nu te%16); 显示个位 Delay(1); WriteSDIO(ZLG7289_CMD_DATA0|1);数码管以方式 0译码,第2个数码管亮 WriteSDI

11、O(led_curre nttime.sec on d/16); 显示十位 Delay(1); WriteSDI0(ZLG7289_CMD_DATA0|0);数码管以方式 0译码,第1个数码管亮 WriteSDIO(led_curre nttime.seco nd%16); 显示个位 Delay(1); else if(led_flag=1) /进入显示日期分支 Dela y(5);/ 延时 WriteSDIO(ZLG7289_CMD_DATA0|5);数码管以方式 0译码,第6个数码管亮 WriteSDIO(0 x0a); 显示- Delay(1); WriteSDIO(ZLG7289_CM

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

13、以方式 0译码,第5个数码管亮 WriteSDIO(led_curre nttime.mo nth/16); 显示十位 Delay(1); WriteSDIO(ZLG7289_CMD_DATA0|3);数码管以方式 0译码,第4个数码管亮 WriteSDIO(led_curre nttime.mo nth%16); 显示个位 Delay(1); WriteSDIO(ZLG7289_CMD_DATA0|1);数码管以方式 0译码,第2个数码管亮 WriteSDIO(led_curre nttime.day/16); 显示十位 Delay(1); WriteSDIO(ZLG7289_CMD_DAT

14、A0|0);数码管以方式 0译码,第1个数码管亮 WriteSDIO(led_curre nttime.day%16); 显示个位 Delay(1); Delay(1); ZLG7289_DISABLE();/zlg7289 放弃同步串口控制 OSTimeDly(200); Word资料 3.2 LCD 显示文本形式的系统时间、闹钟时间、日期和星期 LCD 显示文本形式的时间和日期比较简单,时间、日期、星期和闹钟时间的显示都 是用文本框显示的,并且时间要实时刷新,所以放在了 Rtc_Disp_Task 时钟刷新任务里 面,其中时间文本框为 pTimeTextCtrl,日期文本框为 pDateT

15、extCtrl,闹钟文本框为 pAlarmTextCtrl ,星期文本框为 pWeekDayTextCtrl,只要在系统初始时,将文本框初始 化,并且在 Rtc_Disp_Task 任务里面实时提取当前系统时间,以显示系统时间为例,获 取当前系统时间的函数为 Get_Rtc(&curre nttime),它把时间信息存入 curre nttime , 然后将 currenttime 中的时间存入 strtime,最后再用 SetTextCtrlText(pTimeTextCtrl, strtime,TRUE)语句便将时间显示到系统时间文本框中,类似的其他文本框显示也是用 这种方式。比较

16、特殊的是星期的显示,需要先根据年月日计算出当前是周几,然后再根 据周几设定显示的字符,其中计算星期的函数如下: U8 GetSysWeek(U8 year,U8 mon th,U8 day) U8 y,m,d,w; U8 c = 20; y = (year 4)*1O+(year&OxOf); /bed 转 dec m = (mo nth 4)*10+(mo nth& OxOf); d = (day 4)*1O+(da y&0 x0f); if(m2) m+=12; y-=i; w=y+(y/4)+(c/4)+(26*(m+1)/10)+d-1-(2*c); 计算星期

17、return (w%=7); 3.3 LCD 显示图形形式的时间、日历和背景图片 由于背景图片和图形形式的时间、日历位置是重叠的,同时要使背景图片实现根据 日期变化图片功能,而且时钟要实时变化、日历也要根据日期点亮当天的日期。所以要 求它们全部实时刷新显示,这就牵扯到刷新的顺序问题,否则会出现显示不正常的情况。 最终确定的刷新顺序是先刷新背景图片,之后是圆形表盘,最后是日历,这样做的好处 是保证全部都可以显示正常,而且不需要额外擦除表盘之前留下的秒针、分针和日历的 咼亮日期。 背景图片随季节变化的实现比较简单, 只需要在加载图片时判断当前日期的月份即 可, 在 1-3月就在指定位置加载春天的背

18、景,在 4-6 月就加载夏天的背景,同理在 6-9 月和 10-12 月分别加载秋天和冬天的背景图片。 圆形表盘形式的显示,需要画出表盘、时针、分针、和秒针,主要包括以下过程: (1) 先画出表盘一圈的 60 个短刻度和 12 个长刻度,其中给秒针、分针各对应 60 个坐 标,表示 60 秒和 60 分,给时针设定 12 个坐标对应一圈的 12 个小时。 Word资料 (2) 再根据当前系统时间画出对应的时针、分针、秒针 ,其中主要用了函数 MoveTo() 和 LineTo ()来有关的线画表盘主要代码如下: m=60; n=120; SetDrawOrg(pdc, m,n, &ol

19、dx, & oldy);/ 设定画板 60,120 为原点 for(i=0;i=60;i+) 画时钟刻度短线 /短线长度为5 x仁 50*cos(PI/30*i); y仁 50*si n(PI/30*i); x2=45*cos(PI/30*i); y2=45*si n(PI/30*i); MoveTo(pdc,x2,y2); Lin eTo(pdc,x1,y1); /* - 画刻度值3*/ MoveTo(pdc,34,-4); Lin eTo(pdc,38,-4); Lin eTo(pdc,38,4); Lin eTo(pdc,34,4); MoveTo(pdc,34,0); Lin

20、eTo(pdc,38,0); /根据当前时间画秒针 timeys=30*si n(PI/30*time_s-(PI/2); timexs=30*cos(PI/30*time_s-(PI/2); MoveTo(pdc,0,0); SetPe nColor(pdc,0 xffff0000); Lin eTo(pdc,timexs,timeys); 类似的可以画出分针、时针。 画日历也采用了划线的方式,把 1-31 这 31 个数字先分别计算出它所在的位置,以 及要划线的坐标,然后用连线的方式画出来,过程比较繁琐,这是代码量最大的一部分, 然后根据日期去高亮显示对应的日期,高亮的方式就是通过改变画线

21、的颜色再画一遍。 举其中一个例子,画数字7 /* - 画数字7 -*/ if(curre ntdate.day=7) SetPe nColor(pdc,0 xff00ff00); 设置划线为绿色 MoveTo(pdc,160,8); Lin eTo(pdc,165,8); Lin eTo(pdc,165,18); SetPe nColor(pdc,0 x00000000); 设置划线为黑色 else MoveTo(pdc,160,8); Lin eTo(pdc,165,8); Lin eTo(pdc,165,18); 其中比较困难的部分是根据不同月份日历显示不同的天数,并且要考虑平年和闰年 的

22、二月天数不一致的问题。 最终采用分支策略,判断当前日期属于哪种情况,然后进 PI/30*i 为角度范围 从0到360度 Word资料 入不同分支,进行日历绘制。 3.4 闹钟提醒和整点报时 闹钟提醒和整点报时也是需要实时检测的,所以放在了 Rtc_Disp_Task 时钟更新任 务中,闹钟提醒需要先从设置闹钟的文本框中获取到设定的闹钟时间,然后获取系统当 前时间,并实时比较两者,当不相等时不执行任何操作,当相等时开始播放指定的音乐。 整点报时也放在了 Rtc_Disp_Task 时钟更新任务中,任务实时获取当前时间并且实 时判断当前秒数和分数是否同时为 0,如果同时为 0 则表明是到整点时刻,于是便再按 照当前小时的数值去播放对应的语音进行整点报时。 4. 系统实现 几处关键部分的实现: (1) 表盘绘制函数 CreateClockFigure() 圆形表盘的实现先画一个圆,对圆 12 等分获得分针刻度,60 等分获得表针刻度。 使用 sin和 cos 获得坐标值,利用 API 函数 MoveTc 和 LineTo 画出刻度。 (2) 时间设定函数 SetSystemTime() 首先从文本框中取出

温馨提示

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

评论

0/150

提交评论