数字钟电子稿.docx
《数字钟电子稿.docx》由会员分享,可在线阅读,更多相关《数字钟电子稿.docx(26页珍藏版)》请在冰豆网上搜索。
![数字钟电子稿.docx](https://file1.bdocx.com/fileroot1/2023-7/22/89203207-5e8d-47df-9c8c-9a517b41d1f2/89203207-5e8d-47df-9c8c-9a517b41d1f21.gif)
数字钟电子稿
摘要:
我们介绍了多功能数字钟的系统设计。
系统具有时间设置及显示、闹钟、温度显示等功能。
系统以AT89C52为核心,主要进行基于AT89C52低功耗MCU的字符型数字钟及其系统的研究。
系统带有数码管显示器,配合按键提供友好的用户界面,操作简单。
该数字钟能长期、连续、可靠、稳定的工作;同时还具有体积小、功耗低等特点,便于携带,使用方便。
系统软件设计包括单片机计算机两部分的编程。
计算机软件编程主要实现参数设置、串行口数据接收、指令发送以及数据的显示和存储,采用汇编语言编程。
单片机软件编程主要实现键盘、数码管显示等各模块的功能,采用汇编语言编程。
该系统通过定时计数器与计算机通信,计算机给单片机发指令实现数据采集及系统控制,并将数据实时地传回计算机。
关键词:
数字钟、数码管显示、定时计数器
Abstract:
Thispaperdescribesthedesignofamulti-functionddigitalclocksystem.Itasdisplayingandsettingtimeforclockandalarm,thissystemhasotherspecialfeaturessuchasdataprotectionatpowerfaillure.ThecorepartofthesystemisbasedonakingofadvancedMCU,AT89C52,thissystemmainlycarriesonlowpowerconsumeMCUthecharacterlisttypetheresearchofthedigitalclockanditssystemaccordingtotheAT89C52.Thesystemtakesliquidcrystaldisplay,matchingwithakeytoprovideamityofcustomerinterface,theoperationissimple,consecution,credibility,stablework;Stillhaveaphysicalvolumeinthemeantimesmall,thepowerconsumealowetc.characteristics,easytotake,theusageconvenience.Thesystemsoftwaredesignincludesasinglesliceaplaitdistancewithtwopartsofmachinecalculator.Thecalculatorsoftwareplaitdistancemainlycarriesoutaparameterconstitution,stringtogoapeople'sdatatoreceive,theinstructionsendoutanddataofmanifestationwithsaving,theadoptionVisualBasic.
Thatsystemgoesandcalculatorcorrespondencethroughastring,thecalculatorgivesingleslicemachinehairtheinstructioncarryoutadatatocollectandthesystemcontrol,andissolidthedatathegroundsendbackacalculator.
Keywords:
digitalclock,LCD,Alarm,
引言
20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
数字钟是采用数字电路实现对.时,分,秒.数字显示的计时装置,广泛用于个人家庭,车站,码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。
诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。
因此,研究数字钟及扩大其应用,有着非常现实的意义。
目录
1方案论证6
1.1方案
(一)6
1.2方案
(二)6
2单片机设计的基本原理6
2.1软件时钟的基本原理6
2.2系统硬件电路的设计7
2.3.1主程序7
2.3.2数码管显示模块9
2.3.3定时计数器中断服务程序9
2.3.4按键处理模块9
3扩展功能9
4程序清单9
5元器件清单及功能介绍14
5.1元器件清单14
5.2元器件介绍15
6过程分析和结果15
6.1软件调试15
6.2硬件调试15
结束语16
1.对本课程的学习体会16
2.学习本课程后,希望增加的内容。
16
3.对代课老师的教学有何评价,并提出教学建议。
16
参考文献17
1方案论证
这次课程设计的题目是数字钟,对于这次课设,根据设计要求我们的方案有:
1.1方案
(一)
通过单片机内部的定时/计数器。
采用软件编程实现时钟计数,这种方法硬件线路简单,系统的功能与软件设计相关,通常用在对时间精度不高的的场合。
1.2方案
(二)
采用时钟芯片,它的功能强大,功能部件集成在芯片内部,自动产生时钟等相关功能。
硬件成本相当较高,软件编程简单。
通常用在对时间精度较高的的场合。
考虑到做出来的东西具有实用性,所用的集成片尽量少,成本尽可能的低,连接线路尽可能的简单,方便好用。
我们做的数字钟是采用方案一,采用C语言编程,主要采用集成片AT89C52和74LS08完成了此次设计。
2单片机设计的基本原理
2.1软件时钟的基本原理
软时钟是利用单片机内部的定时/计数器来实现的,它的处理过程如下:
首先设定单片机内部的一个定时/计数器工作于定时方式,对及其周期计数形成基准时间(若10ms),然后用另一个定时/计数器或软件计数的方法对基准时间计数形成秒(对10ms计数100次),秒计60次形成分,分计60次形成时,时计24次则计满一天。
然后通过数码管把它们的内容在相应的位置显示处理即可。
本设计数码管采用动态显示方法,线路相对简单,但需动态扫描,扫描频率要大于人眼视觉暂留频率(每秒24次),信息看起来才稳定。
译码方式可分为软件译码和硬件译码,软件译码通过译码程序查得显示信息的字段码;硬件译码通过硬件译码器得到显示信息的字段码,实际中通常采用软件译码。
在具体处理时,定时计数器采用中断方式工作,对时钟的形式在中断服务程序中实现。
在主程序中只需对定时计数器初始化、调用显示子程序和控制子程序。
另外,为了使用方便,设计了简单的按键,可以通过按键实现时、分的调整,这样在主程序中就加入了键盘设置子程序。
2.2系统硬件电路的设计
本系统的硬件主要包括单片机芯片、数码管显示、按键开关等电路,他的硬件电路如图2.1所示,单片机采用应用广泛的AT89C52,系统时钟采用12MHZ的晶振,3个数码管显示,采用共阳极七段式数码管,P0口为选码输出端,P2口为位选码输出端,按键开关设定了四个,通过P1口相连。
图2.1
2.3系统软件程序的设计
2.3.1主程序
主程序执行流程如图2.2所示,主程序先对显示单元和定时计数初始化,然后重复调用数码管显示模块和按键处理模块,当有键按下,则转入相应的功能程序。
否
否
是
否
是
否
否是
是
图2.2主程序流程图图2.3定时/计数器T0中断服务程序流程图
2.3.2数码管显示模块
本系统共用6个数码管,从右到左依次显示秒个位,秒十位,分个位,分十位,时个位,时十位。
数码管显示的信息用6个内存单元存放,这6个内存单元称为显示缓冲区,其中秒个位和秒十位,分个位和分十位,时个位和时十位分别由秒数据,分数据和时数据分拆得到。
在本系统中数码管显示采用软件译码动态显示。
2.3.3定时计数器中断服务程序
定时计数器用于时间计时。
选择方式1,重复定时,定时时间设为50ms,定时时间到则中断,在中断服务程序中,用一个定时计数器对50ms进行计数,计20次则对秒单元加一,秒单元加到60则对分单元加一,同时秒单元清零;分单元加为60则对时单元加一,同时分单元清零;时单元加到24则对时单元清零,标志一天时间计满。
在对各单元计数的同时,把他们的值放到存储单元的指定位置。
定时计数器T0中断服务程序如图2.3所示:
2.3.4按键处理模块
按键处理设置为:
没有按键时,时钟正常走时;当按下K0按键时,进入选择状态,时钟停止走时;按K1或K2按键可进行加一或减一操作;继续按K0键可分别进行时、分和秒的调整,最后按K3键将退出调整状态,时钟开始计时运行。
3扩展功能
该数字钟的扩展功能为整点报时,每到59分59秒时开始报时一声。
任意定一时间,到达所定时间发光二极管点亮。
4程序清单
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitP1_0=P1^0;
sbitP1_1=P1^1;
sbitP1_2=P1^2;
sbitP1_3=P1^3;
sbitP1_7=P1^7;
sbitP1_6=P1^6;
typedefstruct
{ucharhour;
ucharminute;
ucharsecond;
}time;
timenow={0,0,0};
timedingshi={0,0,0};
ucharcodenum_tab1[]={0x80,0x40,0x20,0x10,0x08,0x04};
ucharcodenum_tab2[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳极显示
ucharstate=0;
ucharcount=100;
ucharflag=0;//调整时间/定时的标志
ucharrecount=0;
ucharrecount1=0;
voiddelay(uinttime1)//延时子程序
{
inti;
intk;
for(i=0;ifor(k=0;k<100;k++);
}
voiddisplay(timedisnum)//显示子程序
{
inthour_shi,hour_ge,min_shi,min_ge,sec_shi,sec_ge,i;
intnum[6]={0,0,0,0,0,0};
hour_shi=disnum.hour/10;
hour_ge=disnum.hour%10;
min_shi=disnum.minute/10;
min_ge=disnum.minute%10;
sec_shi=disnum.second/10;
sec_ge=disnum.second%10;
num[0]=hour_shi;
num[1]=hour_ge;
num[2]=min_shi;
num[3]=min_ge;
num[4]=sec_shi;
num[5]=sec_ge;
for(i=0;i<6;i++)
{
P2=num_tab1[i];
P0=num_tab2[num[i]];
delay
(1);
}
}
voiddisplay_1(ucharwei,uchark)//显示子程序1
{
ucharwei1,wei2;
wei1=wei/10;
wei2=wei%10;
P2=num_tab1[k];
P0=num_tab2[wei1];
delay
(1);
P2=num_tab1[k+1];
P0=num_tab2[wei2];
delay
(1);
}
voidinterrupt_init(void)
{
EA=0;
TMOD=0x01;
TH0=0xd8;
TL0=0xf0;
IT0=1;
ET0=1;
EX0=1;
EA=1;
TR0=1;
}
voidinterrup0(void)interrupt0using3
{
uchari=0;
delay
(1);
if(P1_0==0)//调时
{
if(flag==1)//定时的调节
{
state++;
if(state==9)
{state=0;}
}
else
{
TR0=0;
state++;
if(state==4)
{
state=0;
TR0=1;
}
}
}
if(P1_1==0)//加
{
switch(state)
{
case0:
break;
case1:
{
now.hour++;
if(now.hour==24)
now.hour=0;
break;
}
case2:
{
now.minute++;
if(now.minute==60)
now.minute=0;
break;
}
case3:
{
now.second++;
if(now.second==60)
now.second=0;
break;
}
case4:
break;
case5:
{
dingshi.hour++;
if(dingshi.hour==60)
dingshi.hour=0;
break;
}
case6:
{
dingshi.minute++;
if(dingshi.minute==60)
now.minute=0;
break;
}
case7:
{
dingshi.second++;
if(dingshi.second==60)
dingshi.second=0;
break;
}
case8:
break;
}
}
if(P1_2==0)//减
{
switch(state)
{
case0:
break;
case1:
{
if(now.hour==0)
now.hour=23;
else
now.hour--;
break;
}
case2:
{
if(now.minute==0)
now.minute=59;
else
now.minute--;
break;
}
case3:
{
if(now.second==0)
now.second=59;
else
now.second--;
break;
}
case4:
break;
case5:
{
if(dingshi.hour==0)
dingshi.hour=23;
else
dingshi.hour--;
break;
}
case6:
{
if(dingshi.minute==0)
now.minute=59;
else
dingshi.minute--;
break;
}
case7:
{
if(dingshi.second==0)
dingshi.second=59;
else
dingshi.second--;
break;
}
case8:
break;
}
}
if(P1_3==0)//定时/取消定时
{
if(flag==0)//定时
{
flag=1;
state=4;
}
else//取消定时
{
flag=0;
state=0;
dingshi.hour=0;
dingshi.minute=0;
dingshi.second=0;
}
}
}
voidinterrup1(void)interrupt1using3
{
TR0=0;
TH0=0xd8;
TL0=0xf0;
TR0=1;
if(count==0)
{
count=100;
now.second++;
if(now.second==60)
{
now.minute++;
now.second=0;
if(now.minute==60)
{
recount=(now.hour+1)*2;//整点提示
now.hour++;
now.minute=0;
if(now.hour==24)
{
now.hour=0;
}
}
}
if(flag==1)
{
if(dingshi.hour==now.hour&&dingshi.minute==now.minute&&dingshi.second==now.second)
recount1=18;
}
if(recount!
=0)
{
P1_7=~P1_7;
recount--;
}
else
{P1_7=0;}
if(recount1!
=0)
{
P1_6=~P1_6;
recount1--;
}
else
{P1_6=0;}
}
else
{
count--;
}
}
voidmain(void)
{
ucharj=0;
flag=0;
interrupt_init();//中断初始化
P1_6=0;
P1_7=0;
while
(1)
{
switch(state)
{
case0:
display(now);break;
case1:
display_1(now.hour,0);break;
case2:
display_1(now.minute,2);break;
case3:
display_1(now.second,4);break;
case4:
display(dingshi);break;//显示定时初值00:
00:
00
case5:
display_1(dingshi.hour,0);break;
case6:
display_1(dingshi.minute,2);break;
case7:
display_1(dingshi.second,4);break;
case8:
display(dingshi);break;//显示定时时间
}
}
}
5元器件清单及功能介绍
5.1元器件清单
序号
名称
数量
元器件说明
1
AT89C52单片机
1个
2
晶振
1个
12MHZ
3
数码管
6个
共阳极
4
电阻
6个
510Ω
5
电容
2个
30pf
6
开关
4个
7
发光二极管
1个
8
三极管
1个
NPN型
9
与门
3个
74LS08
5.2元器件介绍
AT89C52芯片的内部结构及引脚
(1)电源及时钟引脚(4个)
VCC:
电源接入引脚;
VSS:
接地引脚;
XTAL1:
晶体振荡器接入的一个引脚(采用外部振荡时,此引脚接地)
XTAL2:
晶体振荡器接入的另一个引脚(采用外部振荡时,此引脚作为外部振荡信号的输入端)。
(2)控制线引脚(4个)
RST/VPD:
复位信号输入引脚/备用电源输入引脚
ALE/PROG:
地址锁存允许信号输出引脚/编程脉冲输入引脚;
EA/VPP:
内外存储器选择引脚/片内EPROM(或FLASHROM)编程电压输入引脚;
PSEN:
外部程序存储器选通信号输出引脚。
(3)并行I/O引脚(32个,分成4个8位口)
P0.0—P0.7:
一般I/O口引脚或数据/低位地址总线复用引脚;
P1.0—P1.7:
一般I/O口引脚;
P2.0—P2.7:
一般I/O口引脚或高位地址总线引脚;
P3.0—P3.7:
一般I/O口引脚或第二功能引脚。
6过程分析和结果
6.1软件调试
在调试中遇到了很多问题。
刚开始将程序输入后,无法执行。
发现很多处错误,而使程序无法执行。
改正后,重新执行程序。
可以正确的显示时间。
但当达到整点时,时钟不能正常报时。
按Ctrl+C退出后,检查程序。
经仔细分析,发现报时子程序出错;及时修改之后,程序调试正确。
在单片机仿真软件运行后,数码管从左至右按照“时:
分:
秒”的格式显示“XX:
XX:
XX”,并且秒位以每秒递增1的速度变化,即完成数字电子钟的正常显示。
并到达整点时进行长达1秒的报时;到达定时时间后发光二极管点亮。
6.2硬件调试
焊接电路完成后,将程序烧入AT89C52芯片中,插入5V电源后调试,无现象出现。
我们仔细检查电路后发现有几处电路连接错误,经重新接线后再次调试时间正常走时,扩展功能报时不能正常运行。
结束语
1.对本课程的学习体会
通过本次课程设计,我们进一步理解了所学的相关可编程芯片的原理、内部结构、使用方法等,学会了相关可编程芯片实际应用以及编程的方法。
在老师的指导帮助下,顺利完成了该硬件、软件的设计、调试等工作。
通过课程设计,我有了很大的收获。
在调试程序过程中,使我们的编程与调试程序的能力得到了锻炼,同时理解了汇编、计算机所组成原理以及接口技术这三门课程之间的联系与融合渗透,也使我体会到学习计算机接口技术的乐趣。
2.学习本课程后,希望增加的内容。
希望老师能给我们讲解更多有关单片机的知识,对各种片子的功能做更广泛的讲解,不要只讲它的少部分功能,在平时的课堂练习中对片子的功能测试应多样化,不该只测试单一的片子管脚接法。
在课堂上更多的涉及与当今社会有关的知识。
3.对代课老师的教学有何评价,并提出教学建议。
评价:
在平时的课堂上潘老师给了我们一堂又一堂的精彩讲解,不仅教给了我们许多书本上的知识,同时也教会了我们如何做人做事,在我们枯燥无味的学习生活中增添了不少乐趣。
潘老师的耐心也令人感动,一次不会讲两次,两次不会讲三次,从没有厌烦的表情。
教学建议:
建议老师不要太过相信我们的能力,毕竟我们都是刚接触这些实物性的东西,有很多问题都不太了解,希望老师应多指导一下课设类的题目,避免我