电子设计报告.docx
- 文档编号:20267197
- 上传时间:2023-04-25
- 格式:DOCX
- 页数:31
- 大小:220.24KB
电子设计报告.docx
《电子设计报告.docx》由会员分享,可在线阅读,更多相关《电子设计报告.docx(31页珍藏版)》请在冰豆网上搜索。
电子设计报告
电子设计报告
题目多功能数字时钟
专业电子信息科学与技术
班级
姓名
学号
中国矿业大学计算机科学与技术学院
2012年5月
1.2任务概述3
1.3功能需求规定3
1.4性能需求规定…………………………………………………………………………………3
1.………………………………………………………………………………...3
1.………………………………………………………………………………...3
1.需求分析
设计题目:
多功能数字时钟
设计目的:
(1)巩固、加深和扩大单片机应用的知识面,提高综合及灵活运用所学知识解决问题的能力;
(2)培养针对课题需要,选择和查阅有关手册、图表及文献资料的自学能力,提高组成系统、编程、调试的动手能力;
(3)过对课题设计方案的分析、选择、比较、熟悉单片机用系统开发、研制的过程,软硬件设计的方法、内容及步骤。
设计意义:
数字钟已成为人们日常生活中必不可少的必需品,广泛用于个人家庭以及车站、码头、剧场、等公共场合,给人们的生活、学习、工作、娱乐带来了极大的方便。
由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便。
诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。
因此,研究数字钟及扩大其应用,有着非常重要的意义。
概述
利用用51单片机、8位数码管和时钟芯片DS1302制作一个时钟日历,该时钟除了能够显示时、分、秒、年、月、日外,还需实现如下功能:
(1)时分秒年月日都能加减可调,调时能识别平闰年和大小月
(2)12小时与24小时切换显示功能
(3)能设置闹钟,闹钟时间到播放音乐
(4)整点报时功能
(5)模拟作息时间表,实现上课下课打铃功能
功能需求规定
数字时钟的主要功能为显示时间的功能,只有在用户需要校准时间或者设置闹钟时,用户可通过按键输入对时钟的相应时间进行修改、设置闹钟等操作,此外用户需要进行12与24小时切换显示的时候也只需通过按键操作即可,其他功能不需用户设置。
输入输出
输入:
由按键进行输入,需要对按键输入进行延时消抖处理,以便确保用户确实按下了按键。
输出:
输出数据必须确保在正确的范围之内,年的范围在00-99之间,月的范围在1-12之间,日的范围在1-31之间,时的范围在0-23之间,分和秒的范围在0-59之间,精度均为整数且必须要求准确无误。
时间特性
响应时间:
数字时钟要求响应的实时性强,用户操作后数码管显示能立即进行响应,响应时间应该在1秒之内,即毫秒级的。
准确性:
闹钟报时、整点报时和作息时间报时的时刻必须准确无误,不能有时间误差。
2.概要设计
方案
通过STC89C52芯片P2口控制数码管的位选通,P0口输出控制数码管的段显示。
P口输出高低电平驱动蜂鸣器演奏音乐。
通过读取DS1302芯片来获得要显示的时间。
用8位数码管动态扫描显示时分秒年月日,其中时分秒和年月日不能同时显示,需要通过按键K1键切换进行显示。
时分秒之间用“-”分隔从左到右显示,年月日以“.”分隔从左到右显示。
采用多任务编程实现,首先创建一个主任务,在主任务中主要完成如下功能:
(1)时间显示,通过调用函数来读取DS1302获取时间,然后将获取的时间送给数码管显示函数进行处理显示相应的时间。
(2)键盘扫描,主要判断用户是否进行调时、切换显示和闹钟设置等。
若用户不进行设置,则正常走时。
若用户按下K1键,则进行时分秒与年月日的切换显示。
若用户按下K5键,则进行12与24小时的切换显示。
若用户按下K2键,则进行调时位的选择,每按下一次选择要调整的位右移一位,即第一次按下选择的是调整时,下次按下时选择的是调整分,再下次按下时选择的是调整秒,再次按下时又选择调整时,年月日的调整位选择类似;选择要调整的位后按下K3键一次对要调整的位进行加1操作,按下K4键对要调整的位进行减1操作;调整完毕后再次按下K2键或K5键退出调时状态。
若用户按下K6键,则进入闹钟设置状态,设置闹钟时按K2键进行调整位的选择,按K3键和K4键分别进行加1调整和减1调整,闹钟设置完毕,再次按下K6键退出闹钟设置状态。
若果是闹钟正在鸣响的状态,则按下K6键可停止闹钟。
(3)判断时间是否到了闹钟时间,如果到了闹钟时间,则创建一个闹钟报时任务,在该任务中通过定时器1中断和蜂鸣器来播放一段歌曲音乐。
(4)判断时间是否到了整点时刻,如果到了整点时刻,则创建一个整点报时任务,在该任务中通过定时器1中断和蜂鸣器来播放一段音乐模拟报时。
(5)判断时间是否到了作息时间表中的时刻,如果到了相应的时刻,则创建一个按作息时间表报时的任务,在该任务中通过定时器1中断和蜂鸣器来播放一段音乐模拟上下课打铃。
设计的硬件部分主要采用基于51单片机的开发板来实现,其电路原理图如下:
设计的主要总体流程图如下:
3.详细设计
在本部分设计中主要采用了多任务的设计方法来实现,采用的是RTX51Tiny版的多任务实时操作系统,RTX51专门针对51设计,小巧紧凑,代码开放,使用起来较灵活。
设计方案:
初始任务的设计比较简单,主要完成以下几项功能:
初始化DS1302的时间,设定时器的工作方式,开中断,最后创建主任务,然后再将初始任务删除。
设计源代码:
voidsys_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进行读取时间;如果按下闹钟设置按键,则调用闹钟设置函数进行闹钟设置;如果在闹钟已响的时候按下闹钟停止按键,则将闹钟停止的标志位置1。
如果没有按键按下,则判断是否到达闹钟时刻,如果到达闹钟时刻,并且此时与整点报时任务以及作息时间报时任务不冲突,则将闹钟响的标志位置1并创建闹钟报时任务;接着再判断闹钟停止标志位是否为1,若为1则立即停止定时器并立即撤销闹钟报时任务已到达立刻停止闹钟的功能;接着再判断是否到达整点时刻,若达到整点时刻并且此时不与闹钟报时任务冲突也不是正在设置闹钟的状态,则将整点报时的标志位置1并创建整点报时任务;接着再判断是否到达作息时刻,若到达作息时刻并且与闹钟报时任务以及整点报时任务不冲突同时也必是正在设置闹钟的状态,则创建作息时间报时任务。
设计源代码:
voiddis_serv()_task_1//任务1:
主任务函数,主要进行时间显示,键盘检测,报时任务的创建
{
while
(1)
{
set_1302();
if(setalarm)
setAlarmclock();
if(p)
get_1302(a);
display();
if(a[2]==alarmtime[2]&&a[1]==alarmtime[1]&&a[0]==alarmtime[0]
&&a[6]==alarmtime[6]&&a[4]==alarmtime[4]&&a[3]==alarmtime[3])
{
if(!
inter&&!
worktime)//非整点报时、非作息时间报时状态
{
ring=1;
os_create_task
(2);//闹钟时间到,创建闹钟任务
}
}
if(del_alarm)
{
TR1=0;
del_alarm=0;
os_delete_task
(2);//如果按下了停止闹钟键,则删除闹钟任务
}
if(!
ring&&!
setalarm)//非闹钟响状态
{
for(k=0;k<24;k++)
{
if(a[0]==0x55&&a[1]==0x59&&a[2]==intertime[k])
{
inter=1;
os_create_task(3);//整点报时,创建整点报时任务
break;
}
}
if(!
inter)//非整点报时状态
{
classtime();
if(worktime)
{
os_create_task(4);//作息时刻到,创建作息时间任务
}
}
}
os_wait(K_IVL,1,0);
}
}
设计方案:
报时任务包括三个,分别是闹钟报时任务、整点报时任务和作息时间报时任务。
这3个任务功能相似,都是让蜂鸣器演奏音乐报时,在此一并考虑。
在这三个任务里都是到预先定义的相应歌曲音乐乐谱数组和频率参数数组中取相应的音高参数,由于在初始任务中将定时器1设定为工作方式1,所以这里通过取得的音高参数计算定时器1的高8位和低8位,然后分别送定时器1的TH1和TL1,最后让TR1=1启动定时器,并延时指定的时间以达到音乐节拍的效果,然后蜂鸣器就可以播放相应的音乐。
其中闹钟报时任务是循环播放的,需要用户按键手动停止闹钟,整点报时任务和作息时间报时任务在播放完毕后,分别将整点报时的标志位和作息时间报时的标志位置1,最后删除任务自身。
设计源代码:
voidmusic()_task_2//任务2:
闹钟任务
{while
(1)
{i=0;
while(notetab[i].delay)//音符的持续时间不为0
{if(!
notetab[i].tone)TR1=0;//音符为0,关闭定时器0
else
{th1=tonetab_E[notetab[i].tone-1]/256;
TH1=th1;//音符参数送TH1高8位
tl1=tonetab_E[notetab[i].tone-1]%256;
TL1=tl1;//音符参数送TL1低8位
TR1=1;//启动定时器0
}
for(j=0;j {delay10ms(5);} i++; } } } voidmusic2()_task_3//任务3: 整点报时任务 {i=0; while(notetab3[i].delay) {if(! notetab3[i].tone)TR1=0; else {th1=tonetab[notetab3[i].tone-1]/256; TH1=th1;//音符参数送TH1高8位 tl1=tonetab[notetab3[i].tone-1]%256; TL1=tl1;//音符参数送TL1低8位 TR1=1;//启动定时器1 } for(j=0;j {delay10ms (2);} i++;} i=0; while(notetab2[i].delay) {if(! notetab2[i].tone)TR1=0; else {th1=tonetab_D[notetab2[i].tone-1]/256; TH1=th1;//音符参数送TH1高8位 tl1=tonetab_D[notetab2[i].tone-1]%256; TL1=tl1;//音符参数送TL1低8位 TR1=1;//启动定时器0 } for(j=0;j {delay10ms(3);}//与1/4拍对应的持续时间 i++; } TR1=0; inter=0; os_delete_task(3);//删除任务 } voidmusic3()_task_4//任务4: 作息时间报时任务 {ucharcount; for(k=0;k<26;k++) {i=0; while(notetab1[i].delay) {if(! notetab1[i].tone)TR1=0; else {th1=tonetab[notetab1[i].tone-1]/256; TH1=th1;//音符参数送TH1高8位 tl1=tonetab[notetab1[i].tone-1]%256; TL1=tl1;//音符参数送TL1低8位 TR1=1;//启动定时器0 } for(j=0;j {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获得的时间进行显示。 在处理函数中,首先判断有关年月日与时分秒切换显示的标志位是否为1,如果为1则处理年月日的数据进行年月日的显示,否则如果为0则处理时分秒的数据进行时分秒的显示,此时还要判断12与24小时的切换显示的标志位是否为1,如果为1则进行12小时模式下的数据处理,否则进行正常24小时模式下的数据处理,数据具体的处理方法主要是分离BCD码然后送显示缓冲区数组。 设计源代码: voiddisplay()//数码管显示函数 {uchari; P2=0xff; P0=0; if(! setalarm) {dealNumber(a);} if(setalarm) {dealNumber(alarmtime);} for(i=0;i<8;i++) {P0=display_buff[i]; P2=wei[i]; delayms (1); P2=0xff; P0=0;} } voiddealNumber(uchar*t) {switch(flg1)//根据flg1值判断显示时分秒还是年月日 {case0: //显示时分秒 if(q)//显示12小时模式用 {t[2]<<=3; t[2]>>=3; } display_buff[0]=display_code[t[2]/16];//分离BCD码,以显示BCD码的十位与个位 display_buff[1]=display_code[t[2]%16]; display_buff[2]=0x40; display_buff[3]=display_code[t[1]/16]; display_buff[4]=display_code[t[1]%16]; display_buff[5]=0x40; display_buff[6]=display_code[t[0]/16]; display_buff[7]=display_code[t[0]%16]; break; case1: //显示年月日 display_buff[0]=display_code[2]; display_buff[1]=display_code[0]; display_buff[2]=display_code[t[6]/16]; display_buff[3]=display_code[t[6]%16]+0x80; display_buff[4]=display_code[t[4]/16]; display_buff[5]=display_code[t[4]%16]+0x80; display_buff[6]=display_code[t[3]/16]; display_buff[7]=display_code[t[3]%16]; break; } } 设计方案: 在闹钟设置程序里首先判断是否进行加操作,即判断K3键按下的标志位是否为1,如果为1则要进行加1操作,此时接着判断K1键按下的标志位的值,若为1则说明当前显示的是年月日状态,再判断K2键按下的标志位的值,根据该值选择是对年还是月还是日进行加1,如果K1键按下的标志位为0,则说明当前显示的是时分秒状态,再判断K2键按下的标志位的值,根据该值选择是对时还是分还是秒进行加1。 接着再判断是否进行减操作,即判断K4键按下的标志位是否为1,如果为1则要进行减1操作,此时接着判断K1键按下的标志位的值,若为1则说明当前显示的是年月日状态,再判断K2键按下的标志位的值,根据该值选择是对年还是月还是日进行减1,如果K1键按下的标志位为0,则说明当前显示的是时分秒状态,再判断K2键按下的标志位的值,根据该值选择是对时还是分还是秒进行减1。 其中在对日进行加减操作时要判断当前年份是否是闰年,如果是闰年,则2月的日期范围在1-29之间,否则范围在1-28之间,对其他月份的日期进行加减操作时要保证范围符合大小月的日期范围。 设计源代码: voidsetAlarmclock()//设置闹钟时间函数 {inti; for(i=0;i<7;i++) alarmtime[i]=BCD_to_Dec(alarmtime[i]); if(flg3) {flg3=0; if(flg1==0) {switch(flg2) {case1: alarmtime[2]++;//时加1 if(alarmtime[2]==24)alarmtime[2]=0; break; case2: alarmtime[1]++;//分加1 if(alarmtime[1]==60)alarmtime[1]=0; break; case3: alarmtime[0]++;//秒加1 if(alarmtime[0]==60)alarmtime[0]=0; break; default: break; } } if(flg1==1) { switch(flg2) { case1: alarmtime[6]++;//年加1 if(alarmtime[6]==100)alarmtime[6]=0; break; case2: alarmtime[4]++;//月加1 if(alarmtime[4]==13)alarmtime[4]=1; break; case3: alarmtime[3]++;//日加1 if(alarmtime[4]==2) {leapyear(alarmtime[6]); if(leap)//润年 {if(alarmtime[3]==30)alarmtime[3]=1;} else {if(alarmtime[3]==29)alarmtime[3]=1;} } else {switch(alarmtime[4]) {case1: case3: case5: case7: case8: case10: case12: if(alarmtime[3]==32)alarmtime[3]=1;break; case4: case6: case9: case11: if(alarmtime[3]==31)alarmtime[3]=1;break; } }break; default: break; }}} if(flg4) {flg4=0; if(flg1==0) {switch(flg2) {case1: if(alarmtime[2]==0)alarmtime[2]=24;//时减1 alarmtime[2]--; break; case2: if(alarmtime[1]==0)alarmtime[1]=60;//分减1 alarmtime[1]--; break; case3: if(alarmtime[0]==0)alarmtime[0]=60;//分减1 alarmtime[0]--; break; default: break; } } if(flg1==1) {switch(flg2) {case1: if(alarmtime[6]==0)alarmtime[6]=100;//年减1 alarmtime[6]--; break; case2: if(alarmtime[4]==0||alarmtime[4]==1)alarmtime[4]=13;//月减1 alarmtime[4]--; break; case3: if(alarmtime[4]==2) {leapyear(alarmtime[6]); if(leap)//润年 {if(alarmtime[3]==0||alarmtime[3]==1)alarmtime[3]=30;} else {if(alarmtime[3]==0||alarmtime[3]==1)alarmtime[3]=29;} } else {switch(alarmtime[4]) {case1: case3: case5: case7: case8: case10: case12: if(alarmtime[3]==0||alarmtime[3]==1)alarmtime[3]=32;break; case4: case6: case9: case11: if(alarmtime[3]==0||alarmtime[3]==1)alarmtime[3]=31;break; } } alarmtime[3]--;break; }}} for(i=0;i<7;i++) alarmtime[i]=Dec_to_BCD(alarmtime[i]); } 3.6键盘扫描和调时程序设计 设计方案: 在键盘扫描程序里进行切换显示和时间设置。 如果按下K1键则进行切换显示,如果此时处于非调时状态,则对年月日与时分秒的切换显示标
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子设计 报告