多功能数字钟设计报告Word格式文档下载.docx
《多功能数字钟设计报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《多功能数字钟设计报告Word格式文档下载.docx(20页珍藏版)》请在冰豆网上搜索。
5电路的仿真9
6电路板的焊接10
7心得体会10
附录12
1设计目的
通过设计与实践,制作出具有准确显示小时、分、秒的数字钟,且可以校时和实现闹铃功能。
2功能要求
①自动计时,有两个四位LED数码管显示时分秒
②具备调整功能,可以直接由0~9数字键设置当前时间
③具备定时闹钟功能
3所需器件及其功能
下面对本次操作所涉及到的器件及其功能做简要的介绍。
3.1所用元件名称、型号、数量
3.2四位数码管引脚图以及封装尺寸
3.389c51引脚图及8155引脚图
89c51引脚图
8155引脚图
3.4其它工具
需要用到的工具:
剥线钳,电烙铁,烙铁架,焊锡,万用表,电源,小刀。
4设计步骤
数字钟电路由单片机、键盘输入模块、时钟显示模块及闹铃设置模块组成。
程序结构设计如下
1主程序。
实现初始化与键盘监控
2定时器T0中断服务程序。
利用T0进行中断定时,T0工作在1,初值为3CB0H,每隔100ms益处中断一次,实现时、分、秒的计时功能,同时刷新计时缓冲区,小时计时24次则时间重新回到00:
00:
00.
3时间设置和闹钟设置子程序。
实现当前时间及定时启闹时间的键盘输入设置。
其功能是用键盘设置子程序将键入的6位时间值送入键盘设置缓冲区,用合子程序压成BCD码,若输入的小时打入23或分和秒大于59,则不合法,清0重新开始计时。
4键盘扫描子程序。
判断是否有键按下,有则求其建号后返回,无键按下则循环等待
5显示子程序。
实现缓冲区的6位BCD码的动态方式显示,并用到拆字子程序将BCD码送到缓冲区
6定时比较子程序。
实现当前时间与预设的启闹时间的比较,二者相同则启动蜂鸣器鸣叫并置位闹钟标志位,重新按下ALM键时,停闹并清0闹钟标志。
7其它辅助功能子程序。
①键盘设置子程序
②拆字子程序
③合字子程序
主程序流程图
定时比较流程图(左)键盘设置子程序流程图(右)
时间设置键盘扫描
88155地址分配如下:
控制寄存器:
8000H,定义为PORT
A口:
8001H,定义为PORTA
B口:
8002H定义为PORTB
C口:
8003H定义为PORTC
9片内RAM及标志位的分配:
5电路的仿真
熟悉了各部分的原理就是连接电路图,参照各芯片的引脚图在proteus的仿真软件上开始连接电路图。
通过自己的努力、同学的帮助和在网上查找的资料,终于在仿真软件上实现了设计所要求的内容。
电路图如下图所示:
仿真电路图
6电路板的焊接
在仿真成功后,我们终于开始了电路板的焊接。
本以为焊接只要按照图焊好就行了,应该很容易。
但是焊了一会儿之后就知道这不是一件轻松的活。
因为我没有做一部分就检查一部分,我花了很久的时间一次性把所有的连线都焊好了。
焊好之后,我兴致勃勃拿去接通电源,接通之后发现根本不是那么回事。
我自己又检查了几遍发现没什么问题,我就有点为难了,不知道怎么办。
我找了一个以前焊接过这电路板的同学帮我检查了一遍,他说我的最严重的问题就是存在很多的虚焊,他说这是焊接中很容易出现的问题,特别是我们这些以前没焊过的。
老师在我们焊电路板之前也提醒我们要注意虚焊,但是我没怎么注意。
那同学帮我指出那些应该重新焊的地方后,我有重新好好的焊接了一遍。
焊好之后我又拿去接电源,但是还是失败了。
那同学又要我检查一下地线和电源线是否接好,我一检查才知道我有几根地线没接。
我接好之后,再拿去接电源,发现我的电路板能按照要求的跳动了。
我心情很高兴。
因为我接线接的比较快,所以我的线接的比较乱。
我稍微把线整理了一下,又拿去试验,结果又坏了。
我又开始检查,但是检查了几遍还是那个结果。
我又找同学帮我检查,他检查了好久也没发现,后来他说应该是我的线不稳定,他帮我动了一下线,我的终于又好了。
在他检查的过程中我也学到了好多检查电路的方法。
经过几天的努力,我终于把电路板也焊好了。
7心得体会
通过这次数字钟的设计与制作,让我了解了设计电路的程序,也让我了解了关于数字钟的原理和设计理念,加强了问你动手、思考和解决问题的能力。
在此次的数字钟设计过程中,我更进一步的熟悉了芯片的结构及掌握了各芯片的工作原理和其具体的使用方法,巩固和加强了课本知识。
认识来源于实践,实践是认识的动力和最终目的,实践是检验真理的唯一标准。
通过课程设计,我真正领悟到了“苦中作乐”这词的真正含义,设计焊接确实有些辛苦,但是还是很有乐趣的。
通过这次课程设计还要我知道了,理论与实际相结合是和重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来才能更好的提高我们的能力。
参考文献
[1]倪志莲主编.《单片机应用技术》北京理工大学出版社;
[2]李全利主编.《单片机原理及接口技术》高等教育出版社;
[3]宋跃主编.《单片机原理及接口技术》电子工业出版社;
[4]阎石主编.《数字电子技术基础》(第五版)高等教育出版社;
附录
课程设计中的程序如下:
#include<
REG2051.H>
codesenen_seg[10]={0x81,0xe7,0x92,0xa2,0xe4,0xa8,0x88,0xe3,0x80,0xa0};
//P1.7(冒号)口高电平
bitkey1_enter=0,key2_enter=0,key3_enter=0,countdown_mark=0,stopwatch_mark=0,count_mark=0,bell_mark=0;
//状态标志
unsignedcharprogram=0,program_variable=0,count_bit=0,count=0;
unsignedcharhour=10,minute=10,second=0;
//时间变量
unsignedchardelayed_hour=22,delayed_minute=10,delayed_second=0;
//定时变量
unsignedcharcount_hour=0,count_minute=0,count_second=0;
//计时计数变量
unsignedcharcount_time=0,count_count=0;
voiddelay(unsignedintt)//延时子程序
{unsignedinti,j;
for(i=0;
i<
t;
i++)
for(j=0;
j<
10;
j++)
;
}
count_time++;
if(count_time>
=199){
count_time=0;
second++;
if(second>
=60){
second=0;
minute++;
if(minute>
minute=0;
hour++;
if(hour>
=24)hour=0;
}
}
if(delayed_hour==hour&
&
delayed_minute==minute&
second<
4)P3_7=0;
elseP3_7=1;
if(countdown_mark==1){//倒计时程序
count_count++;
if(count_count>
=199&
(count_second!
=0|count_minute!
=0|count_hour!
=0)){
count_count=0;
count_second--;
if(count_second>
count_second=59;
count_minute--;
if(count_minute>
count_minute=59;
count_hour--;
if(count_hour>
=100)count_hour=99;
if(count_second==0&
count_minute==0&
count_hour==0&
count_count<
=12000)P3_7=0;
if(count_count>
=15000)count_count=14000;
if(stopwatch_mark==1){//秒表程序
=2){
count_second++;
=100){
count_second=0;
count_minute++;
count_minute=0;
count_hour++;
=60)count_hour=0;
unsignedcharshow_key(void){
unsignedcharx=0,y=0;
switch(program){
case0:
P1&
=senen_seg[second%10];
//时钟秒的个位
break;
case1:
if(count_time>
=90)P1&
//校正秒的个位
case2:
if(delayed_hour==24)P1=0xfe;
//闹钟秒的个位
elseP1&
=senen_seg[delayed_second%10];
break;
case3:
if(count_bit>
=0)P1&
=senen_seg[count_second%10];
//倒计时秒的个位
elseP1=0xff;
case4:
//秒表秒的个位
case5:
//计数器个位
delay(10);
if(P3_5==0){//功能键1识别
key1_enter=1;
if(count<
=254)count++;
if(P3_4==0)key2_enter=1;
//功能键2识别
if(P3_2==0)key3_enter=1;
//功能键3识别
P3_3=1;
P1|=0xff;
switch(program){
=senen_seg[second/10];
//时钟秒的十位
//校正秒的十位
//闹钟秒的十位
=senen_seg[delayed_second/10];
=1)P1&
=senen_seg[count_second/10];
//倒计时秒的十位
elseP1=0xff;
//秒表秒的十位
//计数器十位
}
=senen_seg[minute%10];
//时钟分的个位
//校正分的个位
//闹钟分的个位
=senen_seg[delayed_minute%10];
=2)P1&
=senen_seg[count_minute%10];
//倒计时分的个位
//秒表分的个位
//计数器百位
P3_2=0;
=senen_seg[minute/10];
=senen_seg[delayed_minute/10];
=3)P1&
=senen_seg[count_minute/10];
//计数器千位
=senen_seg[hour%10];
//时钟时的个位
//校正时的个位
//闹钟时的个位
=senen_seg[delayed_hour%10];
=4)P1&
=senen_seg[count_hour%10];
//倒计时时的个位
//秒表时的个位
//计数器万位
if(P3_4==1&
key2_enter==1){
x=3;
//确认功能键2识别,返回3
key2_enter=0;
=senen_seg[hour/10];
=senen_seg[delayed_hour/10];
=5)P1&
=senen_seg[count_hour/10];
//倒计时时的个位
if(P3_5==1&
key1_enter==1){//确认功能键1识别,执行退出或进入下一个功能
if(count>
=127)x=1;
//确认功能键1为长按,返回1
elsex=2;
//确认功能键1为短按,返回2
key1_enter=0;
count=0;
if(P3_2==1&
key3_enter==1){
x=4;
//确认功能键3识别,返回4
key3_enter=0;
if(program<
=1&
count_time>
=100)P1&
=0xff;
//校时和显示功能时钟时冒号闪烁
count_time<
=0x7f;
if(program==2)P1&
//设置闹钟功能时冒号长亮
if(program==3)P1&
//设置倒计时功能时冒号长灭
if(program==4)P1&
//设置秒表功能时冒号长亮
if(program==5)P1&
//设置计数时冒号长灭
y=x;
x=0;
returny;
voidmain(){//主程序
P1=0xff;
P3=0xff;
time0_init();
while
(1){
switch(program){
while(program==0){//时钟菜单
switch(show_key()){
case0:
case1:
program=0;
case2:
program=1;
}
//校时菜单
while(program==1){
switch(show_key()){
program=2;
break;
case3:
if(hour>
case4:
if(minute>
=60)minute=0;
while(program==2){//闹钟菜单
program=3;
delayed_hour++;
if(delayed_hour>
=25)delayed_hour=0;
delayed_minute++;
if(delayed_minute>
=60)delayed_minute=0;
while(program==3){//倒计时菜单
program=4;
count_bit++;
if(count_bit>
=7)count_bit=0;
switch(count_bit){
case0:
count_second+=1;
break;
case1:
count_second+=10;
case2:
count_minute+=1;
case3:
count_minute+=10;
case4:
count_hour+=1;
case5:
count_hour+=10;
case6:
if(count_hour>
=100)count_hour-=100;
if(count_minute>
=60)count_minute-=60;
if(count_second>
=60)count_second-=60;
if(count_bit==6)countdown_mark=1;
elsecountdown_mark=0;
count_hour=0;
//秒表菜单
count_second=0;
while(program==4){
program=5;
stopwatch_mark=~stopwatch_mark;
if(stopwatch_mark==0){