ImageVerifierCode 换一换
格式:DOCX , 页数:31 ,大小:220.24KB ,
资源ID:579876      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-579876.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(电子设计报告.docx)为本站会员(b****2)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

电子设计报告.docx

1、电子设计报告 电子设计报告 题目 多功能数字时钟 专业 电子信息科学与技术 班级 姓名 学号 中国矿业大学计算机科学与技术学院2012年5月1.2任务概述 31.3功能需求规定 31.4性能需求规定31.31.31.需求分析 设计题目:多功能数字时钟设计目的:(1)巩固、加深和扩大单片机应用的知识面,提高综合及灵活运用所学知识解决问题的能力;(2)培养针对课题需要,选择和查阅有关手册、图表及文献资料的自学能力,提高组成系统、编程、调试的动手能力;(3)过对课题设计方案的分析、选择、比较、熟悉单片机用系统开发、研制的过程,软硬件设计的方法、内容及步骤。设计意义:数字钟已成为人们日常生活中必不可少

2、的必需品,广泛用于个人家庭以及车站、码头、剧场、等公共场合,给人们的生活、学习、工作、娱乐带来了极大的方便。由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。因此,研究数字钟及扩大其应用,有着非常重要的意义。概述利用用51单片机、8位数码管和时钟芯片DS1302制作一个时钟日历,该时钟除了能够显示时、分、秒、年、月、日外,还需实现如下功能:(1)时分

3、秒年月日都能加减可调,调时能识别平闰年和大小月(2)12小时与24小时切换显示功能(3)能设置闹钟,闹钟时间到播放音乐(4)整点报时功能(5)模拟作息时间表,实现上课下课打铃功能功能需求规定 数字时钟的主要功能为显示时间的功能,只有在用户需要校准时间或者设置闹钟时,用户可通过按键输入对时钟的相应时间进行修改、设置闹钟等操作,此外用户需要进行12与24小时切换显示的时候也只需通过按键操作即可,其他功能不需用户设置。 输入输出 输入:由按键进行输入,需要对按键输入进行延时消抖处理,以便确保用户确实按下了按键。 输出:输出数据必须确保在正确的范围之内,年的范围在00-99之间,月的范围在1-12之间

4、,日的范围在1-31之间,时的范围在0-23之间,分和秒的范围在0-59之间,精度均为整数且必须要求准确无误。 时间特性 响应时间:数字时钟要求响应的实时性强,用户操作后数码管显示能立即进行响应,响应时间应该在1秒之内,即毫秒级的。 准确性:闹钟报时、整点报时和作息时间报时的时刻必须准确无误,不能有时间误差。2.概要设计方案 通过STC89C52芯片P2口控制数码管的位选通,P0口输出控制数码管的段显示。P口输出高低电平驱动蜂鸣器演奏音乐。通过读取DS1302芯片来获得要显示的时间。 用8位数码管动态扫描显示时分秒年月日,其中时分秒和年月日不能同时显示,需要通过按键K1键切换进行显示。时分秒之

5、间用“-”分隔从左到右显示,年月日以“.”分隔从左到右显示。 采用多任务编程实现,首先创建一个主任务,在主任务中主要完成如下功能:(1)时间显示,通过调用函数来读取DS1302获取时间,然后将获取的时间送给数码管显示函数进行处理显示相应的时间。(2)键盘扫描,主要判断用户是否进行调时、切换显示和闹钟设置等。若用户不进行设置,则正常走时。若用户按下K1键,则进行时分秒与年月日的切换显示。若用户按下K5键,则进行12与24小时的切换显示。若用户按下K2键,则进行调时位的选择,每按下一次选择要调整的位右移一位,即第一次按下选择的是调整时,下次按下时选择的是调整分,再下次按下时选择的是调整秒,再次按下

6、时又选择调整时,年月日的调整位选择类似;选择要调整的位后按下K3键一次对要调整的位进行加1操作,按下K4键对要调整的位进行减1操作;调整完毕后再次按下K2键或K5键退出调时状态。若用户按下K6键,则进入闹钟设置状态,设置闹钟时按K2键进行调整位的选择,按K3键和K4键分别进行加1调整和减1调整,闹钟设置完毕,再次按下K6键退出闹钟设置状态。若果是闹钟正在鸣响的状态,则按下K6键可停止闹钟。 (3)判断时间是否到了闹钟时间,如果到了闹钟时间,则创建一个闹钟报时任务,在该任务中通过定时器1中断和蜂鸣器来播放一段歌曲音乐。(4)判断时间是否到了整点时刻,如果到了整点时刻,则创建一个整点报时任务,在该

7、任务中通过定时器1中断和蜂鸣器来播放一段音乐模拟报时。(5)判断时间是否到了作息时间表中的时刻,如果到了相应的时刻,则创建一个按作息时间表报时的任务,在该任务中通过定时器1中断和蜂鸣器来播放一段音乐模拟上下课打铃。设计的硬件部分主要采用基于51单片机的开发板来实现,其电路原理图如下:设计的主要总体流程图如下:3.详细设计在本部分设计中主要采用了多任务的设计方法来实现,采用的是RTX51Tiny版的多任务实时操作系统,RTX51专门针对51设计,小巧紧凑,代码开放,使用起来较灵活。 设计方案: 初始任务的设计比较简单,主要完成以下几项功能:初始化DS1302的时间,设定时器的工作方式,开中断,最

8、后创建主任务,然后再将初始任务删除。 设计源代码:void sys_init()_task_ 0 /任务0:进行初始化 Init_1302(time); TMOD=0x10; /设置定时器1为工作方式1 EA=1; /开总中断 ET1=1; /开定时器1中断 os_create_task(1); /激活主任务 os_delete_task(0); /撤销任务0设计方案: 在主任务中主要进行时钟的显示,并且不断循环调用检测函数判断是否有按键按下。如果按下调时按键,则暂停从1302读取时间,在检测函数里设置时间,待时间设置完毕后重新写入1302再启动1302进行读取时间;如果按下闹钟设置按键,则调

9、用闹钟设置函数进行闹钟设置;如果在闹钟已响的时候按下闹钟停止按键,则将闹钟停止的标志位置1。如果没有按键按下,则判断是否到达闹钟时刻,如果到达闹钟时刻,并且此时与整点报时任务以及作息时间报时任务不冲突,则将闹钟响的标志位置1并创建闹钟报时任务;接着再判断闹钟停止标志位是否为1,若为1则立即停止定时器并立即撤销闹钟报时任务已到达立刻停止闹钟的功能;接着再判断是否到达整点时刻,若达到整点时刻并且此时不与闹钟报时任务冲突也不是正在设置闹钟的状态,则将整点报时的标志位置1并创建整点报时任务;接着再判断是否到达作息时刻,若到达作息时刻并且与闹钟报时任务以及整点报时任务不冲突同时也必是正在设置闹钟的状态,

10、则创建作息时间报时任务。设计源代码:void dis_serv()_task_ 1 /任务1:主任务函数,主要进行时间显示,键盘检测,报时任务的创建 while(1) set_1302(); if(setalarm) setAlarmclock(); if(p) get_1302(a); display(); if(a2=alarmtime2&a1=alarmtime1&a0=alarmtime0 &a6=alarmtime6&a4=alarmtime4&a3=alarmtime3) if(!inter&!worktime)/非整点报时、非作息时间报时状态 ring=1; os_create_

11、task(2);/闹钟时间到,创建闹钟任务 if(del_alarm) TR1=0; del_alarm=0; os_delete_task(2);/如果按下了停止闹钟键,则删除闹钟任务 if(!ring&!setalarm)/非闹钟响状态 for(k=0;k24;k+) if(a0=0x55&a1=0x59&a2=intertimek) inter=1; os_create_task(3); /整点报时,创建整点报时任务 break; if(!inter)/非整点报时状态 classtime(); if(worktime) os_create_task(4);/作息时刻到,创建作息时间任务

12、os_wait(K_IVL,1,0); 设计方案:报时任务包括三个,分别是闹钟报时任务、整点报时任务和作息时间报时任务。这3个任务功能相似,都是让蜂鸣器演奏音乐报时,在此一并考虑。在这三个任务里都是到预先定义的相应歌曲音乐乐谱数组和频率参数数组中取相应的音高参数,由于在初始任务中将定时器1设定为工作方式1,所以这里通过取得的音高参数计算定时器1的高8位和低8位,然后分别送定时器1的TH1和TL1,最后让TR1=1启动定时器,并延时指定的时间以达到音乐节拍的效果,然后蜂鸣器就可以播放相应的音乐。其中闹钟报时任务是循环播放的,需要用户按键手动停止闹钟,整点报时任务和作息时间报时任务在播放完毕后,分

13、别将整点报时的标志位和作息时间报时的标志位置1,最后删除任务自身。设计源代码:void music()_task_ 2 /任务2:闹钟任务while(1) i=0; while(notetabi.delay) /音符的持续时间不为0 if(!notetabi.tone) TR1=0; /音符为0,关闭定时器0 else th1=tonetab_Enotetabi.tone-1/256; TH1=th1; /音符参数送TH1高8位 tl1=tonetab_Enotetabi.tone-1%256; TL1=tl1; /音符参数送TL1低8位 TR1=1; /启动定时器0 for(j=0;jnot

14、etabi.delay;j+) /音符的持续时间 delay10ms(5); i+; void music2()_task_ 3 /任务3:整点报时任务 i=0; while(notetab3i.delay) if(!notetab3i.tone) TR1=0; else th1=tonetabnotetab3i.tone-1/256; TH1=th1; /音符参数送TH1高8位 tl1=tonetabnotetab3i.tone-1%256; TL1=tl1; /音符参数送TL1低8位 TR1=1; /启动定时器1 for(j=0;jnotetab3i.delay;j+) /音符的持续时间

15、delay10ms(2); i+; i=0; while(notetab2i.delay) if(!notetab2i.tone) TR1=0; else th1=tonetab_Dnotetab2i.tone-1/256; TH1=th1; /音符参数送TH1高8位 tl1=tonetab_Dnotetab2i.tone-1%256; TL1=tl1; /音符参数送TL1低8位 TR1=1; /启动定时器0 for(j=0;jnotetab2i.delay;j+) /音符的持续时间 delay10ms(3); /与1/4拍对应的持续时间 i+; TR1=0; inter=0; os_dele

16、te_task(3);/删除任务void music3()_task_ 4 /任务4:作息时间报时任务 uchar count; for(k=0;k26;k+) i=0; while(notetab1i.delay) if(!notetab1i.tone) TR1=0; else th1=tonetabnotetab1i.tone-1/256; TH1=th1; /音符参数送TH1高8位 tl1=tonetabnotetab1i.tone-1%256; TL1=tl1; /音符参数送TL1低8位 TR1=1; /启动定时器0 for(j=0;jnotetab1i.delay;j+) /音符的持

17、续时间 delayms(4); i+; count+; if(count=10) break; if(count=10) break; TR1=0; worktime=0; os_delete_task(4);/删除任务设计方案:数码管显示程序通过对8位数码管动态扫描并利用人眼视觉暂留效应来显示时间,即通过对单片机的P0口和P2口的循环赋值并延时较短的时间来实现。在显示相应的时间之前,首先调用处理函数对从1302读取获得的时间进行处理,在处理之前也要判断是否是正在设置闹钟,如果正在设置闹钟则处理设置的闹钟时间在数码管上实时的显示出来,否则就处理从1302获得的时间进行显示。在处理函数中,首先判

18、断有关年月日与时分秒切换显示的标志位是否为1,如果为1则处理年月日的数据进行年月日的显示,否则如果为0则处理时分秒的数据进行时分秒的显示,此时还要判断12与24小时的切换显示的标志位是否为1,如果为1则进行12小时模式下的数据处理,否则进行正常24小时模式下的数据处理,数据具体的处理方法主要是分离BCD码然后送显示缓冲区数组。设计源代码:void display() /数码管显示函数 uchar i; P2=0xff; P0=0; if(!setalarm) dealNumber(a); if(setalarm) dealNumber(alarmtime); for(i=0;i8;i+) P0

19、=display_buffi; P2=weii; delayms(1); P2=0xff; P0=0; void dealNumber(uchar *t) switch(flg1) /根据flg1值判断显示时分秒还是年月日 case 0: /显示时分秒 if(q) /显示12小时模式用 t2=3; display_buff0=display_codet2/16;/分离BCD码,以显示BCD码的十位与个位 display_buff1=display_codet2%16; display_buff2=0x40; display_buff3=display_codet1/16; display_bu

20、ff4=display_codet1%16; display_buff5=0x40; display_buff6=display_codet0/16; display_buff7=display_codet0%16; break; case 1: / 显示年月日 display_buff0=display_code2; display_buff1=display_code0; display_buff2=display_codet6/16; display_buff3=display_codet6%16+0x80; display_buff4=display_codet4/16; displa

21、y_buff5=display_codet4%16+0x80; display_buff6=display_codet3/16; display_buff7=display_codet3%16; break; 设计方案:在闹钟设置程序里首先判断是否进行加操作,即判断K3键按下的标志位是否为1,如果为1则要进行加1操作,此时接着判断K1键按下的标志位的值,若为1则说明当前显示的是年月日状态,再判断K2键按下的标志位的值,根据该值选择是对年还是月还是日进行加1,如果K1键按下的标志位为0,则说明当前显示的是时分秒状态,再判断K2键按下的标志位的值,根据该值选择是对时还是分还是秒进行加1。接着再判断

22、是否进行减操作,即判断K4键按下的标志位是否为1,如果为1则要进行减1操作,此时接着判断K1键按下的标志位的值,若为1则说明当前显示的是年月日状态,再判断K2键按下的标志位的值,根据该值选择是对年还是月还是日进行减1,如果K1键按下的标志位为0,则说明当前显示的是时分秒状态,再判断K2键按下的标志位的值,根据该值选择是对时还是分还是秒进行减1。其中在对日进行加减操作时要判断当前年份是否是闰年,如果是闰年,则2月的日期范围在1-29之间,否则范围在1-28之间,对其他月份的日期进行加减操作时要保证范围符合大小月的日期范围。设计源代码:void setAlarmclock() /设置闹钟时间函数

23、int i; for(i=0;i7;i+) alarmtimei=BCD_to_Dec(alarmtimei); if(flg3) flg3=0; if(flg1=0) switch(flg2) case 1:alarmtime2+; /时加1 if(alarmtime2=24) alarmtime2=0; break; case 2:alarmtime1+; /分加1 if(alarmtime1=60) alarmtime1=0; break; case 3:alarmtime0+; /秒加1 if(alarmtime0=60) alarmtime0=0; break; default:br

24、eak; if(flg1=1) switch(flg2) case 1:alarmtime6+; /年加1 if(alarmtime6=100) alarmtime6=0; break; case 2:alarmtime4+; /月加1 if(alarmtime4=13) alarmtime4=1; break; case 3:alarmtime3+; /日加1 if(alarmtime4=2) leapyear(alarmtime6); if(leap)/润年 if(alarmtime3=30) alarmtime3=1; else if(alarmtime3=29) alarmtime3=

25、1; else switch(alarmtime4) case 1: case 3: case 5: case 7: case 8: case 10: case 12: if(alarmtime3=32) alarmtime3=1; break; case 4: case 6: case 9: case 11: if(alarmtime3=31) alarmtime3=1; break; break; default:break; if(flg4) flg4=0; if(flg1=0) switch(flg2) case 1:if(alarmtime2=0) alarmtime2=24; /时

26、减1 alarmtime2-; break; case 2:if(alarmtime1=0) alarmtime1=60; /分减1 alarmtime1-; break; case 3:if(alarmtime0=0) alarmtime0=60; /分减1 alarmtime0-; break; default:break; if(flg1=1) switch(flg2) case 1:if(alarmtime6=0) alarmtime6=100; /年减1 alarmtime6-; break; case 2:if(alarmtime4=0|alarmtime4=1) alarmtim

27、e4=13;/月减1 alarmtime4-; break; case 3:if(alarmtime4=2) leapyear(alarmtime6); if(leap)/润年 if(alarmtime3=0|alarmtime3=1) alarmtime3=30; else if(alarmtime3=0|alarmtime3=1) alarmtime3=29; else switch(alarmtime4) case 1: case 3: case 5: case 7: case 8: case 10: case 12: if(alarmtime3=0|alarmtime3=1) alarmtime3=32; break; case 4: case 6: case 9: case 11: if(alarmtime3=0|alarmtime3=1) alarmtime3=31; break; alarmtime3-; break; for(i=0;i7;i+)alarmtimei=Dec_to_BCD(alarmtimei);3.6键盘扫描和调时程序设计设计方案:在键盘扫描程序里进行切换显示和时间设置。如果按下K1键则进行切换显示,如果此时处于非调时状态,则对年月日与时分秒的切换显示标

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2