数字时钟实验报告.docx
《数字时钟实验报告.docx》由会员分享,可在线阅读,更多相关《数字时钟实验报告.docx(15页珍藏版)》请在冰豆网上搜索。
![数字时钟实验报告.docx](https://file1.bdocx.com/fileroot1/2023-1/4/90ca5212-6631-41f6-9365-0ca4f78c0cc7/90ca5212-6631-41f6-9365-0ca4f78c0cc71.gif)
数字时钟实验报告
物理机电学院课程设计报告
课程名称:
单片机数字时钟设计
专业班级:
学号:
学生姓名
指导教师:
完成时间:
2014.06.13
报告成绩:
评阅意见:
评阅教师日期
数字时钟设计报告
一、设计任务与要求
1、用单片机设计一数字时钟:
设计基本要求:
(1)以24h(小时)计时方式;
(2)分别用四位或六位LED数码管显示时、分、(秒);
(3)使用按键开关可实现时、分调整;
(4)能整点声光提示,能设置闹钟
二、方案设计与论证
根据要求数码管能显示一天的时间和闹铃时分,调整时间和设置闹铃,当时间超过我们设置好的闹铃时间,闹铃铃声响起还有灯光闪烁。
方案一
我们可以用一个四位共阳数码管显示时钟时、分、秒以及闹铃时、分、秒,在调整时间或设置闹铃时间时候数字会闪烁,调试某个时、分就闪烁两个数字。
方案二
我们可以设置四个按键来调整数字时钟。
其中两个按键能实现时、分的加减,一个按键能选择时间显示或是闹铃时间,最后一个按键实现闹铃开启和关闭及查看设定的闹铃时间及监视闹铃是否开启。
3、硬件电路设计
3.1总体描述
(1)单片机采用AT89C51型;
(2)时间显示电路:
采用4个共阳极数码管,P0口驱动显示数字位码控制数码管显示位,P1口作数字段码控制0到9数字的显示;
(3)时间设置电路:
P3.4、P3.5、P3.6、P3.7分别连接4个按键,实现调模式,时间加和时间减;
(4)闹钟:
P1.5口接扬声器。
P0.7口小数点DP
3.2系统总框架图
4、软件设计
4.1程序流程图
4-3时分秒计时流程图如下图
4.2函数模块及功能
(1)intmain()主函数
(2)voiddelay(inttime)延时
(3)voidinit()初始化程序
(4)voidtime0()interrupt1
定时器TO中断,实现时分秒的计时
(5)voidtime1()interrupt3
定时器T1中断,实现时分调整时闪烁
(6)voidshowshi()
四位共阳数码管显示,显示小时、分钟
(7)intGetKey()
获取按键,设定三个按键,赋给第四个按键查看闹铃功能
(8)voidkey(intKeyNum)
按键调整时间功能,实现时间和闹铃时、分的加减
(9)IntNaoZhong()
闹铃,设定时间到就蜂鸣器报警
五、仿真过程与仿真结果
5.1Proteus仿真电路图
5、安装与调试
在KeiluVision4软件中编写数字时钟源程序,进行修改然后进行编译,把编译好的程序通过STC_ISP软件下载进单片机开发板中的AT89C52RC芯片,换到实验焊接的简易单片机电路板中,进行最后调试。
在调试过程中,经常碰到数字时钟数码管没显示数字,原因可能是用了共阴数码管的显示代码,头次就碰到。
其他情况大多是是在位码段码时候设置错位选,还有就是要注意消隐及PI=0XFF。
四个按键实现选择时间和闹铃、加、减、闹铃开关查看设置闹铃。
经常出现按键错乱或者不能用。
主要是因为在设置按键口还有功能时候出现不匹配,还有闹铃没发时间到蜂鸣器报警,反而是灯亮,是因为定义XCLOCK初始化XCLOCK没等于0.
在修改程序时候常常出现修改错地方还有添加错位置,或者掉了一些符号数字。
调试后,实现实验要求:
(1)以24h(小时)计时方式;
(2)分别用四位或六位LED数码管显示时、分、(秒);
(3)使用按键开关可实现时、分调整;
(4)能整点声光提示,能设置闹钟
六、结论与心得
本学期的课程设计巩固了我们上学期单片机所学内容,而且让我们对生活中的常见的单片机开发板以及AT89C52芯片的结构、功能和性能有了更准确地认识。
将生活中的一些用品和书本知识联系在了一起,使我们的书本知识和生活常识方面都有了增长。
在设计之前,我们要对所用单片机的内部结构有一个系统的了解,知道该单片机内有哪些资源;要有一个清晰的思路和一个完整的的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在实习过程中遇到问题是很正常的,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题。
但是从中学到的知识会让我受益终身。
发现、提出、分析、解决问题和实践能力提高都会受益于我在以后的学习、工作和生活中。
七、参考文献
[1]、周润景.基于Proteus的电路及单片机设计以仿真[M].北京.北京航空航天大学出版社,2006.
[2]、谭浩强.C程序设计[M].北京:
清华大学出版社,1991.
[3]、刘守义.单片机应用技术[M]西安:
西安电子科技大学出版社,2002.
[4]孙涵芳2.MCS-51/96系列单片机及应用[M].北京.北京航空航天大学出版社,1988.
[5]51单片机原理与实践(C语言版)[M].北京.北京航空航天大学出版社,2011.
附:
源程序代码
/***************************************
课题:
电子时钟设计(数码管)
数码管:
段码为:
P0接段a-g
位码分别为:
P1
蜂鸣器:
P1.5
***************************************/
#include
#defineduanmaP0
#defineweimaP1
sbitsmg1=P1^0;/sbitsmg2=P1^1;
sbitsmg3=P1^2;
sbitsmg4=P1^3;
sbitdp=P0^7;
sbitBEEP=P1^5;
sbitkey1=P3^7;
sbitkey2=P3^6;
sbitkey3=P3^5;
sbitkey4=P3^4;
intArgTimer[6]={0,0,0,0};
intArgtable[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0~9
intSetTime;
intmiao,fen,shi;
intNmiao,Nfen,Nshi;
inttt;
intshan,tsshan;
intnao;//ling
intclockkg;
intFZWnao;
intxclock;
intseeclock;
intDp;
/***********************************************************
延时
***********************************************************/
voiddelay(inttime)
{intx,y;
for(x=time;x>0;x--)
for(y=110;y>0;y--);
}
/***********************************************************
初始化
***********************************************************/
voidinit()
{nao=0;clockkg=0;FZWnao=0;seeclock=0;xclock=0;
shan=0;tsshan=0;
SetTime=0;
miao=0;shi=13;fen=16;
Nmiao=0;Nshi=7;Nfen=30;
Dp=0;tt=0;
EA=1;
ET0=1;//T0
TMOD=0x11;
TH0=0x03c;
TL0=0x0b0;
TR0=1;
ET1=1;//T1
TH1=0x03c;
TL1=0x0b0;
TR1=0;
}
/***********************************************************
定时器T0中断
***********************************************************/
voidtime0()interrupt1
{
TH0=0x03c;
TL0=0x0b0;
tt++;//50ms*20=1s
if(tt==20)
{
Dp=~Dp;
if(FZWnao!
=0&&clockkg!
=0)BEEP=~BEEP;
tt=0;
miao++;
if(miao>=60)
{
miao=0;
fen++;
if(fen>=60)
{
fen=0;
shi++;
if(shi>=24)
shi=0;
}
}
}
}
/***********************************************************
定时器T1中断
***********************************************************/
voidtime1()interrupt3
{
TH1=0x03c;
TL1=0x0b0;
tsshan++;
if(tsshan==10)
{
shan=~shan;
tsshan=0;}
}
voidshowshi()
{
if(nao==0)
{ArgTimer[0]=shi/10;
ArgTimer[1]=shi%10;
ArgTimer[2]=fen/10;
ArgTimer[3]=fen%10;}
if(nao!
=0||seeclock!
=0)
{
ArgTimer[0]=Nshi/10;
ArgTimer[1]=Nshi%10;
ArgTimer[2]=Nfen/10;
ArgTimer[3]=Nfen%10;
}
//weima=0x01;//第一位
smg1=0;smg2=1;smg3=1;smg4=1;
if(shan!
=0&&(SetTime==2||SetTime==4))duanma=0xff;//weima=0;
else
duanma=Argtable[ArgTimer[0]];
delay(3);
duanma=0xff;
//weima=0x02;//第二位
smg1=1;smg2=0;smg3=1;smg4=1;
if(shan!
=0&&(SetTime==2||SetTime==4))duanma=0xff;//weima=0;
else
duanma=Argtable[ArgTimer[1]];
if(Dp!
=0)dp=0;
delay(3);
duanma=0xff;
//weima=0x04;//第三位
smg1=1;smg2=1;smg3=0;smg4=1;
if(shan!
=0&&(SetTime==1||SetTime==3))duanma=0xff;//weima=0;
else
duanma=Argtable[ArgTimer[2]];
delay(3);
duanma=0xff;
//weima=0x08;//第四位
smg1=1;smg2=1;smg3=1;smg4=0;
if(shan!
=0&&(SetTime==1||SetTime==3))duanma=0xff;//weima=0;
else
duanma=Argtable[ArgTimer[3]];
if(clockkg!
=0)dp=0;
delay(3);
duanma=0xff;}
//***************************************//
intGetKey()
{
if(key1==0)
{
while(key1==0)showshi();
//if(key1==0)
return1;
}
if(key2==0)
{
while(key2==0)showshi();
//if(key2==0)
return2;
}
if(key3==0)
{
while(key3==0)showshi();
//if(key3==0)
return3;
}
if(key4==0)
{
while(key4==0)
{
seeclock=1;
showshi();
}
seeclock=0;
//if(key4==0)
return4;
}
return0;
}
voidkey(intKeyNum)
{
switch(KeyNum)
{
case0:
break;
case1:
{
SetTime++;
switch(SetTime)
{
case1:
//fen
TR1=1;shan=0;
break;
case2:
//shi
break;
case3:
//Nfen
nao=1;
break;
case4:
//Nshi
break;
case5:
//over
SetTime=0;TR1=0;nao=0;
break;
}
break;
}
case2:
{
switch(SetTime)//JIA
{
case0:
break;
case1:
fen++;if(fen>=60)fen=0;
break;
case2:
shi++;if(shi>=24)shi=0;
break;
case3:
Nfen++;if(Nfen>=60)Nfen=0;
break;
case4:
Nshi++;if(Nshi>=24)Nshi=0;
break;
}
break;
}
case3:
{
switch(SetTime)//JIAN
{
case0:
break;
case1:
fen--;if(fen<=0)fen=59;
break;
case2:
shi--;if(shi<=0)shi=23;
break;
case3:
Nfen--;if(Nfen<=0)Nfen=59;
break;
case4:
Nshi--;if(Nshi<=0)Nshi=23;
break;
}
break;
}
case4:
{
clockkg=~clockkg;
break;
}
}
}
/***********************************************************
闹铃
***********************************************************/
intNaoZhong()
{
if(fen-Nfen<1&&Nshi==shi&&fen>=Nfen)
return1;
elseFZWnao=0;
return0;
}
/***********************************************************
主函数
***********************************************************/
intmain()
{
init();
while
(1)
{
key(GetKey());
if(clockkg!
=0)
{
if(NaoZhong()==1)
FZWnao=1;
elseFZWnao=0;
}
elseBEEP=1;
showshi();
}
return0;
}