多功能万年历设计.docx
- 文档编号:23535674
- 上传时间:2023-05-18
- 格式:DOCX
- 页数:17
- 大小:502.46KB
多功能万年历设计.docx
《多功能万年历设计.docx》由会员分享,可在线阅读,更多相关《多功能万年历设计.docx(17页珍藏版)》请在冰豆网上搜索。
多功能万年历设计
多功能万年历设计
内容提要………………………………………………………………2
正文………………………………………………………………………2
一、题目的意义……………………………………………….2
二、系统的功能……………………………………………….3
三、设计步骤…………………………………………………..3
1、硬件电路设计及描述……………………………………3
2、软件设计流程及描述……………………………………4
四、注意事项……………………………………………………9
五、心得与体会………………………………………………..9
六、参考文献……………………………………………………10
内容提要:
1、任务实现
1硬件:
数字钟设计要求是用单片机及8位LED数码管显示时、分、秒及其之间的间隔符,以24时计时方式运行,通过两个按键可实现时、分调整等功能;通过按键来改变频率以实现锋鸣器发出不同的响声;
2软件:
利用RTX-51Riny实时操作系统的多任务之间切换,实现在宏观上是多任务同时执行的。
2、技术指标
显示方式:
以扫描的方式通过八位数码管来显示;
可用按键进行“时校”和“分校”以及“秒校”;
时钟精度:
±30秒/天(未测试);
④程序应该模块化,即分成显示任务、校时任务、时间计时任务、改变响声任务;小函数构成大程序,让各模块相互充分独立、任务单一,并且每个任务都是在死循环内完成的;
⑤各任务完成必须是完成任务,然后自动放弃CPU,而不是使其他任务等待超时,因此各任务必须协调好,这是此次设计的难点,也是应该重点掌握的,否则就不需要用实时操作来设计了。
3、工作原理
利用RTX-51Riny操作系统的定时器T0进行定时产生最小时间片,各任务通过各自等待的时间片个数不同来实现在宏观上是多任务同时执行的。
4、
系统设计框图:
图1硬件系统的总体设计框图
正文:
一、题目的意义:
本设计综合利用RTX-51Riny知识完成一个单片机应用系统设计。
该设计的主要任务是设计类似于电子手表,通过与无操作系统的对比可深入理解操作系统的优缺点;巩固和加深课程中所学的理论知识和实验能力,基本掌握单片机应用电路的一般设计方法,提高电子电路的设计和实验能力,加深对单片机软硬知识的理解,获得初步的应用经验,为以后从事生产和科研工作打下一定的基础。
二、系统的功能:
利用单片机及8位LED数码管做成两位“时”显示,两位“分”显示,两位“秒”显示,以24时计时方式运行,并且可用按钮进行“时校”和“分校”以及“秒校”;通过按键可以改变频率来实现不同响声。
三、设计步骤
1、硬件电路设计及描述
时钟计时器的硬件电路如下所示:
图2时钟计时器硬件原理图
该电路采用AT89C52单片机最小化应用,采用共阴(1时此二极管亮)7段LED显示器,P2口作为位扫描输出,P0口输出段码数据,P1.0、P1.6口接2个按键来实现改变频率,P3.3、P3.4口接2个按钮开关,用于调整时间,采用12Mhz晶振,可提高秒计时的精确度。
器件分析
为了实现LED显示器的数字显示,系统采用动态扫描法实现LED的显示。
共阴7段LED显示器显示原理:
管脚
显示内容
P0.7
(DIP)
P0.6
(G)
P0.5
(F)
P0.4
(E)
P0.3
(D)
P0.2
(C)
P0.1
(B)
P0.0
(A)
编码
0
0
0
1
1
1
1
1
1
3FH
1
0
0
0
0
0
1
1
0
06H
2
0
1
0
1
1
0
1
1
5BH
3
0
1
0
0
1
1
1
1
4FH
4
0
1
1
0
0
1
1
0
66H
5
0
1
1
0
1
1
0
1
6DH
6
0
1
1
1
1
1
0
1
7DH
7
0
0
0
0
0
1
1
1
07H
8
0
1
1
1
1
1
1
1
7FH
9
0
1
1
0
1
1
1
1
6FH
-
0
1
0
0
0
0
0
0
40H
10μf电容作用:
上电复位;
7407作用:
同相缓冲器,驱动数码管;
12M晶振和两个电容组成晶体振荡器。
2、软件设计流程及描述
RTX-51Riny操作系统的标准时间用定时器0产生一个中断,默认的是产生10,000脉冲,因此对于12Mhz晶振来说,最小时间片为10ms。
每个任务的等待时间都是10ms整数倍。
(一)各模块功能描述:
(1)显示模块:
①功能说明:
显示模块是以扫描方式实现八个数码同时显示的,在P2口每次选中一个数码,送去相应编码(位码),然后在P1口送去显示数字内容的编码(段码),设置时间时要调用显示模块;设置顺序为闹钟、时间、年月日、闹钟工作日,由于设置
01H
20H
02H
40H
10H
04H
08H
内容太多并且设置闹钟时间年月日时显示格式一样,这将导致无法区别所设置内容是什么,因此在设置时间时除了相应位置显示设置内容外,其他位均显示数码管中间的一横。
还能在显示时间状态下通过菜单键跟加键的短按来实现显示闹钟时间及年月日星期,还有显示当前响声的频率大小,因此显示模块又分十四个部分:
显示时间的时分秒、显示设置闹钟的时分秒(三部分)、显示设置时间的时分秒(三部分)、显示设置年月日(三部分)、显示设置闹钟的工作日、显示设置好的闹钟、显示设置好的年月日、显示响声频率。
它们是相互独立的,不会相互干扰,每次循环都只执行其中某个部分。
②流程图:
(2)时间计时模块:
①功能说明:
采用24时式计时,此模块的时、分、秒,为了保证时分秒数字的有效性,都加入了判断,即使程序走乱了,也不会出现数字不对的情况;由于闹钟的工作是跟星期有关的,为了防止天数增加后和月份更替后以及年份更替后,导致闹钟失效,因为星期保留是更新前所设置的星期,因此为了闹钟能正常工作,应该在适当位置调用计算星期的任务。
②流程图:
(3)按键模块:
①功能说明:
通过两个按键设置年月日时间及闹钟,这两个都有短按及长按功能,按键都是应该有消抖的,但长按时就没有消抖了
菜单键要在显示闹钟时长按进入设置状态,否则不能进入设置状态,以达到保护已经设置好的时间,在数码不停地闪烁时就表示已经进入设置状态,闪烁是因为程序不仅等着按键的松开,还要显示数码,而数码显示时间间隔正好稍微小于人眼对光暂留时,只要稍微耽误一会数码显示就会出现闪烁;短按两种情况:
1、在设置状态下,短按则进入到设置下一位;2、在显示时间状态时短按则显示闹钟时间;
加键只有在设置状态下长按才有效,长按能使设置位按相应数据不断加一直到松开按键才停止加一,加键短按也有有两种情况:
1、在设置状态下,对相应位加一;2、在显示时间时短按则显示年月日星期。
通过四个键来改变频率及退出声响,按三种递增方式改变频率,每次加5或10或20,这样就可以组合很多种频率了,从而可以发出更多不同的声音,通过显示模块可以得知正在发出多少频率的声响。
为了使按键灵敏,此模块应该尽量少的程序,只为能及时检测出按键,每当检测到按键按下时就发送信号到按键状态来进行按键判断是何种按键状态,然后再将判断出按键状态发送到显示模块,那么按键信息就能及时反应出来。
②流程图:
(此模块的流程图待修改,由于时间仓促,不能及时修改,见谅!
)
(4)响铃模块:
①功能说明:
当本模块接收设置频率模块发来的信号后开始发出相应频率的响声,此模块应用了os_wait(K_IVL,ringx,0);函数,进一步了解到函数带参数后的方便性。
②流程图:
(5)闹钟模块:
①功能说明:
闹钟按工作日工作,即可设置成每周的周一到周五闹钟才会工作,当正常时分秒与闹钟时分秒相同时,ALARM闹钟模块就会发送信号到响铃模块,闹钟在响铃十秒钟后会自动关闭,也可以在通过按键关闭闹钟。
②流程图:
(6)加数及设置闹钟的工作日模块:
①功能说明:
当按键状态模块发来信号时,此模块对相应变量加数或者将相应星期设置为闹钟日,然后再将这些变化发送信号到显示模块。
②流程图:
(7)按年月日计算星期模块:
①功能说明:
本模块采用蔡勒(zeller)公式,(只适合于1582年10月15日之后的情形):
星期=年代+年代/4+世纪/4-2*世纪+13*(月份+1)/5+日-1
然后再对上式所得星期求余,所得数即可表示为星期:
0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,5-星期五,6-星期六
其中的月份大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2005年1月1日要看作2004年的13月1日来计算)。
②流程图:
(8)看门狗模块:
①功能说明:
本模块在一定时间timeout内将部分模块中的变量赋于初值,如menu_num、add_num、menu_state、add_state,在使进入设置状态时,若停止按键的话就会使显示恢复到时间计时模块,以便继续显示时间;也可以在显示闹钟时间及年月日星期后返回显示时间计时模块。
②流程图:
(二)各模块之间的关系:
(三)、程序清单如下:
(四)、调试及性能分析:
硬件调试:
可先检查应制板及焊接的质量情况在检查无误后可通电检查LED显示器的电亮状况。
若亮度不理想,可调节P0口电阻的大小,一般情况先取200Ω电阻可获得满意的亮度效果。
软件调试:
在LCA51编译器下进行程序编译及仿真调试应分段成以子程序为单位逐个进行,最后可结合硬件实时调试。
性能分析:
按设计程序分析,LED显示器动态到秒的频率约为167HZ,实际使用观察时完全没有闪烁,由于计时中断程序中加了中断延时误差处理,所以,实际设计时精度非常的高。
四、注意事项
1、在焊接的时候要注意正确的焊接方法,以免虚焊、漏焊、短路、断路等错误的出现。
2、在编写程序的时候,注意指令的正确应用。
3、调试编译时,注意印质板与电源及仿真机的正确连接,避免答错线对电源仿真机造成的损坏。
软件方面:
4、要注意RTX-51Riny实时操作系统的某些函数的取值范围,如os_wait(K_IVL,ringx,0)中ringx的取值,它是8位的无符号数,那么它取值范围是0到255,超过的都以对256取余数为有效值;在计算星期时,由于年份不能用8位无符号(0到255)数表示了,只能用16位无符号数(0到65535),但这会增加存储负担,为节省空间应该在闰年与非闰年数组之间应该去掉一个,(在为计算星期的定义时很有可能会导致错误)。
5、在时间走动模块里,应当注意计算星期的插入,否则闹钟可能失效。
6、在显示模块要特别注意num的初值,一定要确定从哪位数码管开始显示,否则将出现乱码。
7、在闹钟模块里要注意c的初值,一定要在最后将c赋于0值,否则在闹钟下一次到来时就不会自动退出闹钟状态。
8、在按键扫描模块里要注意判断是否在设置状态,若已经进入设置状态就应该等待按键松开,否则可能发送多次菜单键短按下的信号,导致无法设置。
9、在加数及设置闹钟的工作日的模块里,day的取值是与闰年和非闰年有差的;由于year无限制,并且year是16位无符号数(0到65535),因此得名万年历。
10、在计算星期模块里,由于公式的关系要注意各变量的取值,注意算式能节省不少空间。
五、心得与体会:
这个设计使用RTX-51Tiny实时操作系统,C语言中主程序就是指main()函数。
有人可能会认为RTX51Tiny没有主程序,其实这是一种误解,因为这个操作系统的main()函数放在了配置文件中(RTX51Tiny的主程序是以汇编代码的形式位于Rtx51tny.A51文件中)。
这个操作系统要求每个任务都在死循环里实现,否则全局变量可能会被重复性地清零。
实时操作系统使得对时间的控制方便简单,这很好地解决了用C语言编程时难于达到时间精确的问题,同时对各任务的执行时间及其顺序都不需要人为控制,只要调用RTX-51Tiny中相应的函数就可以轻松达到要求了,各任务模块化,每个任务都是单一完成某件事,大大缩短了开发时间,到目前为止,RTX-51Tiny的缺点是每个任务之间的切换需要一定的时间,对于小于1ms内要做出响应的任务无法完成(系统的任务轮转时间等于每次定时器溢出时间与TIMESHARING的乘积。
定时器溢出时间由INT_CLOCK决定,它的范围是1000到65535个周期,而TIMESHARING的范围是1到5,0是单任务的,对于晶振为12MHz单片机来说,一个机器周期为1us,那么任务最小轮换时间为1ms),关于os_wait(K_TMO,3,0)函数CPU不会及时做出响应,因为在配置文件Conf_tny.A51中默认的最小任务轮换时间为50ms,但这个问题可以由os_wait(K_IVL,count,0)来解决,任务轮转时间片的长度设置得过大,则一些持续时间较短的事件无法响应。
如果轮转时间设置得过小,则CPU的很大一部分功能被消耗在任务切换上了;如果任务多,处理时间长,无疑会无形中增加系统的负担。
;个人感觉这个操作系统最难的就是os_wait()函数中时间片的取值,虽然是不用计算应该等待多久就是程序所需的时间,但这对初学者来说是无章可循的,只能是一步步地调试程序,并且要细心观察才能选择出较理想的时间片。
时间片对各任务关系重大,时间片大了,就显示模块来说会出现闪烁的状况,对按键来说出现按键失灵的情况,等等。
RTX-51Tiny操作系统小巧精悍,能极大地提高程序的可读性及可维护性,但也占用了一定的存储空间。
这是一种以空间换取性能的办法。
俗话说“好的开始是成功的一半”。
为今后学习实时操作系统做了铺垫,在接下来的学习,要重视程序的模块化,锻炼我们个人的查阅技术资料的能力,动手能力,发现问题,解决问题的能力。
并且我们熟练掌握了有关器件的性能及测试方法。
再次感谢老师的指导以及同学的帮助,是你们让我有了一个更好的认识,无论是学习还是生活,生活是实在的,要踏实走路。
这个设计时间虽然很短,但我学习了很多的东西,感受颇深。
六、参考文献:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多功能 万年历 设计