时钟计时器设计报告.docx
《时钟计时器设计报告.docx》由会员分享,可在线阅读,更多相关《时钟计时器设计报告.docx(18页珍藏版)》请在冰豆网上搜索。
时钟计时器设计报告
单片机原理及应用
课程设计报告书
题目:
时钟计时器的设计
姓名:
学号:
专业:
电气工程及其自动化
指导老师:
设计时间:
2011年5月
电子与信息工程学院
目录
1.引言1
1.1设计意义1
1.2设计要求1
2.方案设计2
3.硬件设计2
4.软件设计4
4.1主程序4
4.2显示子程序5
4.3定时器T0中断服务程序6
4.4定时器T1中断服务调试6
4.5调试功能程序7
4.6秒表功能程序7
4.7闹钟时间设定功能程序7
5.系统调试8
5.1硬件调试8
5.2软件调试8
5.3性能分析8
6.设计总结及致谢8
主要参考文献8
附录A作品实物图片9
附录B源程序9
时钟计时器的设计
1.引言
1.1设计意义
时钟作为现代社会应用广泛的计时工具,在航天、电子等科研单位,工厂、医院、学校等企事业单位,各种体育赛事及至我们每个人的日常生活中都发挥着重要的作用。
现今,高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟,石英表,石英钟都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调校,数字式电子钟用集成电路计时时,译码代替机械式传动,用LED显示器代替显示器代替指针显示进而显示时间,减小了计时误差,这种表具有时,分,秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。
本文利用单片机实现数字时钟计时功能的主要内容,采用独立式按键进行时间调整,其中AT89C52是核心元件同时采用数码管动态显示“时”,“分”,“秒”的现代计时装置。
与传统机械表相比,它具有走时精确,显示直观等特点。
它的计时周期为24小时,显满刻度为“23时59分59秒”,另外具有校时功能,断电后有记忆功能,恢复供电时可实现计时同步等特点。
该系统同时具有硬件设计简单、工作稳定性高、价格低廉等优点。
作为本设计核心元件的单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。
单片机体积小、重量轻、抗干扰能力强、环境要求不高、价格低廉、可靠性高、灵活性好、开发较为容易。
由于具有上述优点,在我国,单片机已广泛地应用在工业自动化控制、自动检测、智能仪器仪表、家用电器、电力电子、机电一体化设备等各个方面,而52单片机是各单片机中最为典型和最有代表性的一种。
随着单片机的不断发展其应用的不断扩展,它的作用也越来越重要,时钟是人类日常生活必不可少的工具,其制作也越来越简单,本设计从日常生活中常见的事物入手,通过对时钟计时器的设计,让我们认识到单片机已经深入到我们生活的每个领域,该设计不仅可以锻炼我们的动手能力,而且可以加深我们对单片机的认识和激发我们对未知科学领域的探索。
使的原本枯燥的学习变的更有趣味和更加形象。
1.2设计要求
时钟计时器要求用单片机及6位LED数码管显示时,分,秒,以24<小>时
计时方式运行,能整点提醒(短蜂鸣,次数代表整点时间),使用按键开关可实现
时、分调整,秒表/时钟功能转换,省电(关闭显示)及定时设定提醒(蜂鸣器)等功能。
2.方案设计
方案论证与对比
为了实现LED显示器的数字显示,可以采用静态扫描和动态扫描显示法两种,但由于静态显示法需要数据锁存器的硬件,接口较复杂,且本设计只要求显示6位,系统也没有其他复杂处理任务,所以决定采用动态扫描法莱实现LED的显示。
单片机采用易购的AT89S52系列,这种单片机具有足够的空余硬件资源,可以实现其他的扩充功能。
如果考虑使用电池供电,则可采用LV系列单片机。
时钟计时器电路系统的总体设计框图如图1所示
AT89S52
P0
单片机
控制器
P2
6位LED显示器
按键开关
蜂鸣器
列驱动
图1硬件系统的总体设计框图
3.硬件设计
时钟计时器的硬件电路如图所示。
该电路采用AT89S52单片机最小化应用实际;采用共阳7段LED显示器;P0口输出段码数据;P2.0~P2.5口作列扫描输出;P1.0、P1.1、P1.2、和P1.3口接4个按键开关,用于调时及功能设置;P1.7端口接5v的小蜂鸣器,用于按键发音及定时提醒、整点到时提醒等;为了提供共阳LED数码管的列扫描驱动电压,用三极管9012做电源驱动输出;采用12MHZ晶振,可提高秒计时的精确性。
最小系统及控制原理图如图2所示:
图2最小系统及控制原理图
LED显示及驱动电路如图3所示:
图3LED显示及驱动电路
详细仪器清单
仪器名称
数量
AT89C52单片机芯片
1
7段共阳数码管(连四位)
1
10K电阻
5
510Ω电阻
9
三极管9012
7
4.7KΩ电阻
7
12MHZ晶振
1
蜂鸣器5V
1
30pF电容
2
0.01uF电容
2
按键开关
5
100uF电解电容
1
74LS244芯片
1
7段共阳数码管(单位)
2
10uF电解电容
1
红色发光二极管
1
插座
2(20脚、40脚各一个)
焊锡、导线
若干
电路板
1
贴纸
1
4.软件设计
4.1主程序
本设计中计时采用定时器T0中断完成,秒表使用定时器T1中断完成。
主程序循环调用显示子程序和查键子程序,当端口有开关按下时,转入相应功能程序。
其主程序执行流程如下图4:
Y
N
N
Y
按时间鸣叫次数
图4主程序流程图
4.2显示子程序
时间显示子程序每次显示6个连续内存单元的十进制BCD码数据,首地址在调用显示程序时现指定。
显示时,先取出内存地址中的数据,然后查的对应的显示用段码从P0口输出,P2口将对应段码选中供电,就能显示该地址单元的数据值。
为了显示小数点及“-”“A”等特殊字符,在显示班级和计时时应采用不同的显示子程序。
4.3定时器T0中断服务程序
定时器T0用于时间计时。
定时溢出中断周期设为50ms,中断进入后先进行定时中断初值校正,当中断里累计20次时,对秒计数单元进行加1操作。
时钟计数单元地址分别在70H~71H、76H~77H、78H~79H中,最大计时值为23时59分59秒。
7AH单元内存放“熄灭符“数据(#0A),用于时间调整时的闪烁功能。
在计数单元中,采用十进制BCD码计数,满10进位。
T0中断计时程序流程图如图5所示:
N
Y
图5T0中断计时程序流程图
4.4定时器T1服务中断子程序
T1中断服务程序用于指示调整单元数字的亮闪或秒表计数。
在时间调整状态下,每过0.3s左右,将对应单元的显示数据换成“熄灭符”数据(#0AH)。
这样在调整时间时,对应调整单元的显示数据会间隔闪亮。
在做秒表计时时,每10MS中断一次,计数单元加1,每100次计数单元为1S。
秒表计数单元地址为60H~61H(毫秒),62H~63H(秒),64H~65H(分)中,最大计数值为99分59.99秒。
T1中断服务流程图如下图6所示:
秒表
时钟调时闪烁
图6T1中断服务流程图
4.5调时功能程序
调时功能程序的设计方法时:
按下P1.0口按键,若按下时间短于1s,则进入省电状态(数码管不亮,时钟不停);否则进入调分状态,等待操作,此时计时器停止走动。
当再按下P1.0按钮时,若按下时间短于0.5s,则时间加1分;若按下时间长于0.5s,则进入小时调整状态。
在小时调整状态下,按下P1.1按键是,可进行减1调整,在小时调整状态下,当按键按下的时间长于0.5s,退出调整状态,时钟从0秒开始计时。
4.6秒表功能程序
在正常时钟状态下,若按下P1.1口按键,则进行时钟/秒表功能的转换,秒表中断计时程序启动,显示首址改为60H,LED将显示秒表计时单元60H~65H中的数据。
按下P1.2口的按键开关时,可实现秒表清零,秒表启动,秒表暂停等功能;当按下P1.1口按键时,关闭T1秒表中断计时,显示首址又改为70H,恢复正常的时间显示功能。
4.7闹钟时间设定功能程序
在正常状态下,若按下P1.3口按键开关,则进入设定闹时调分状态,显示首地址该为50H,LED将显示50H~55H中的闹钟设定时间,显示式样为00:
00:
一,其中高2位代表时,低2位代表分。
在定时闹铃时精确到分。
按P1.2键,分加1;按P1.0键,分减1。
若再按P1.3键,则进入调整状态,显示样式为00:
00;一,若按P1.2键,时加1,按P1.0键。
时减1。
按P1.1键,闹铃无效,显示样式变为00:
00:
—,再按P1.1键无效,显示样式又变为00:
00:
—。
再按P1.3键调整闹铃时间结束,恢复正常时间的显示。
在闹铃是,可按一下P1.3口的按键开关使蜂鸣停止,不按则蜂鸣将鸣叫1min后自行停止。
在设定闹铃后,若要取消定时功能,则可按一下P1.3键,当听到“滴”的一声时表明已取消闹铃功能。
5.系统调试
5.1硬件调试
硬件调试时可先检查印制版及焊接的质量情况,在检查无误后可通电检查LED显示器的电亮状况。
若亮度不理想,可以调整P0口的电阻大小一般情况下取200欧电阻即可获得满意的亮度效果。
试验室制作时,可结合示波器测试晶振及P0、P2端口的波形情况进行综合硬件测试分析。
5.2软件调试
软件调时在Wave或KeilC51编译器下进行,源程序编译及仿真调试应分段或以子程序为单位逐个进行,最后可结合硬件实时调试。
5.3性能分析
按照设计程序分析,LED显示器动态扫描的频率为167HZ,实际使用观察时完全没有闪烁。
由于计时中断程序中加了中断延时误差处理,所以实际计时精度非常高,可满足多种场合的应用需要。
另外,上电时具有一个滚动显示子程序,可以方便地显示制作日期等信息。
6.设计总结及致谢
6.1设计总结
这次的单片机课程设计让我更深入的理解了单片机的应用及汇编语言编程,这过程中有很多困难,先是电路元件必须焊接正确,防止有电容正负级焊反了;放置芯片时要注意保护引脚;然后是程序太复杂……有问题也有收获,通过自己设计时钟计时器,把知识运用于实践,锻炼了动手能力,为以后工作奠定坚实的基础。
6.2致谢
在这次课程设计中受到了指导老师与同学的帮助,我们的任课老师们对我们细心教导,耐心讲解,及时解决设计过程中遇到的困难,给我们领器件,讲程序原理。
同学帮忙检查调试板子,老师忙不过来时就问同学,在这过程中互助让我们更加团结。
我要感谢辛苦的老师们,感谢友爱的同学,感谢系里给我们动手实践的机会。
主要参考文献
[1]MarkNelson著.潇湘工作室译.串行通信开发指南[M].中国水利水电出版社,2002.
[2]王宜怀.单片机原理及其嵌入式应用教程[M].北京希望电子出版社,2002.
[3]张毅刚.单片机原理及应用.高等教育出版社,2009
[4]康华光.电子技术基础(模拟部分).高等教育出版社.2006
附录A时钟计时器系统实物图
附录B源程序
/*********************************************************************/
//
//采用8位LED动态扫描时钟演示程序
//LRM2004.03.31
/*********************************************************************/
//使用12MHZ晶振,P0口输出段码,P2口作列扫描,用共阳LED数码管
//
#include"reg51.h"
codechardis_7[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
/*共阳LED段码表"0""1""2""3""4""5""6""7""8""9""不亮"*/
codecharscan_con[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//列扫描控制字
datachardisdata[6]={0x00,0x00,0x00,0x00,0x00,0x00};//计时单元数据初值,共6个
datachardis[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00};//显示单元数据,共6个数据
datacharcon1s=0x00,con04s=0x00,con=0X00;//1秒定时用
sbitkey0=0x90;
sbitkey1=0x91;
sbitkey2=0x92;
//
/****************/
//1毫秒延时程序//
/***************/
delay1ms(intt)
{
inti,j;
for(i=0;ifor(j=0;j<120;j++)
;
}
/****************/
//键扫描子程序//
/****************/
keyscan()
{
EA=0;
if(key0==0)
{
delay1ms(10);
while(key0==0);
if(dis[con]==10)
{dis[7]=dis[con];dis[con]=dis[6];dis[6]=dis[7];}
con++;TR0=0;ET0=0;TR1=1;ET1=1;
if(con>=6)
{con=0;TR1=0;ET1=0;TR0=1;ET0=1;}
}
//
if(con!
=0)
{
if(key1==0)
{
delay1ms(10);
while(key1==0);
disdata[con]++;
if(disdata[con]>=10)
{disdata[con]=0;}
dis[con]=disdata[con];dis[6]=0x0a;
}
}
//
if(con!
=0)
{
if(key2==0)
{
delay1ms(10);
while(key2==0);
if(disdata[con]==0)
{disdata[con]=0x09;}
else{disdata[con]--;}
dis[con]=disdata[con];dis[6]=0x0a;
}
}
EA=1;
}
//
/***********/
//扫描程序//
/**********/
scan()
{
chark;
for(k=0;k<6;k++)
{
P0=dis_7[dis[k]];P2=scan_con[k];delay1ms
(1);P2=0xff;
}
}
/*************/
//初始化程序//
/*************/
clearmen()
{
inti;
for(i=0;i<6;i++)
{
dis[i]=disdata[i];}
TH0=0x3C;TL0=0xB0;//;50MS定时初值(T0计时用)
TH1=0x3C;TL1=0xB0;//;50MS定时初值(T1计时用)
TMOD=0X11;ET0=1;ET1=1;TR1=0;TR0=1;EA=1;//
}
/**********/
//主程序//
/*********/
main()
{
clearmen();
while
(1)
{
scan();
keyscan();
}
}
/********************/
//1秒中断处理程序//
/*******************/
voidtime_intt0(void)interrupt1
{
ET0=0;TR0=0;TH0=0x3C;TL0=0xB0;TR0=1;
con1s++;
if(con1s==20)
{
con1s=0x00;
disdata[0]++;
if(disdata[0]>=10)
{
disdata[0]=0;disdata[1]++;
if(disdata[1]>=6)
{
disdata[1]=0;disdata[2]++;
if(disdata[2]>=10)
{
disdata[2]=0;disdata[3]++;
if(disdata[3]>=6)
{
disdata[3]=0;disdata[4]++;
if(disdata[4]>=10)
{
disdata[4]=0;disdata[5]++;
}
if(disdata[5]==2)
{
if(disdata[4]==4)
{
disdata[4]=0;disdata[5]=0;
}
}
}
}
}
}
dis[0]=disdata[0];dis[1]=disdata[1];dis[2]=disdata[2];
dis[3]=disdata[3];dis[4]=disdata[4];dis[5]=disdata[5];
}
ET0=1;
}
/********************/
//0.4秒闪烁中断程序//
/*******************/
voidtime_intt1(void)interrupt3
{
EA=0;TR1=0;TH1=0x3C;TL1=0xB0;TR1=1;
con04s++;
if(con04s==8)
{
con04s=0x00;
dis[7]=dis[con];dis[con]=dis[6];dis[6]=dis[7];
}
EA=1;
}