倒计时器课程设计带程序版.docx
- 文档编号:8097597
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:16
- 大小:270.54KB
倒计时器课程设计带程序版.docx
《倒计时器课程设计带程序版.docx》由会员分享,可在线阅读,更多相关《倒计时器课程设计带程序版.docx(16页珍藏版)》请在冰豆网上搜索。
倒计时器课程设计带程序版
湖南科技大学
课程设计报告
课程名称:
单片机原理及应用课程设计
设计题目:
电阻测量
院系:
通信与控制工程系
专业:
通信工程
班级:
学生姓名:
学号:
****************
起止日期:
2010年12月20日~2010年12月31日
指导教师:
教研室主任:
指导教师评语:
指导教师签名:
年月日
成绩评定
项目
权重
成绩
1、设计过程中出勤、学习态度等方面
0.2
2、课程设计质量与答辩
0.5
3、设计报告书写及图纸规范程度
0.3
总成绩
教研室审核意见:
教研室主任签字:
年月日
教学系审核意见:
主任签字:
年月日
基于STC89C52的倒计时器设计
1设计任务与要求
本项目是由单片机执行设定的程序,在数码管显示倒计时的时间,且能由单片机接受矩阵键盘设定的时间。
由4位数码管做显示,能够实现5种倒计时模式,通过控制按键进行选择9999s-0s、999s-0s、99s-0s、9s-0s、开始值由人工输入-0s。
2方案设计与论证
近年来随着计算机在社会领域的渗透,单片机的应用正在不断地走向深入,同时带动传统控制检测日新月益更新。
现在,在许多领域中,定时器得到了广泛的应用,比如在体育比赛中的计时器;安全措施中的定时报警器;游戏中的倒计时;维持秩序的交通信号灯;红路灯,交通控制器,闹钟等等。
可见倒计时器在社会中的重要性。
当然,设计倒计时器的方法很多,以下是两个设计方案。
方案一:
基于AT89S52单片机的LCD液晶显示模块1602显示的倒计时器。
主要是以单片机来控制,用按键来设定倒计时初始时刻的值,用按键来进行倒计时初值的选择,LCD1602液晶作为显示模块来显示倒计时间。
方案二:
基于AT89S52单片机的数码管显示模块显示的倒计时器。
主要是以单片机来控制,用按键来设定倒计时初始时刻的值,按键来进行倒计时初值的选择。
此电路对于倒计时器中的LED数码管示器来说,采用以软件为主的接口方法,即不使用专门的硬件译码器,而采用软件程序进行译码。
方案比较:
通过以上两个方案,我们发现,方案二总体比方案一好。
首先方案一虽然硬件电路简单,但造价较高,且在编写程序实现所要求的功能时较难,而方案二所用的显示模块是比较熟悉的数码管,编写程序是相对容易,且电路造价不高,因此,综合考虑之后决定采用方案二。
3硬件单元电路设计与参数计算
LED数码管倒计时器以AT89C52单片机为核心,起着控制作用,另外系统中使用8255A芯片作为扩展I/O作用。
系统包括四位数码管显示电路,按键电路,复位电路,时钟电路以矩阵键盘电路。
倒计时的总体框图如下图1所示:
图1倒计时的总体框图
3.1时钟电路
单片机必须在时钟的驱动下才能工作。
在单片机内部有一个时钟振荡电路,只要外界一个振荡源就能产生一定的时钟信号送到单片机内部的各个单元,决定单片机的工作速度。
本系统使用的是内部时钟方式。
时钟电路如下图3所示。
一般选用石英晶体振荡器。
此电路在加电大约延迟10ms后振荡器起振,在XTAL2引脚产生幅度为3V左右的正弦波时钟信号,其振荡频率主要由石英晶振的频率确定。
电路中两个电容C1、C2的作用有两个:
一是帮助振荡器起振;二是对振荡器的频率进行微调。
本系统的C1、C2的值为30pf。
3.2矩阵电路
本系统用到的是4*4矩阵键盘,行线由8255A芯片PC端口的低四位控制,而列线是由PC端口的高四位来控制的,键盘的扫描是动态的低电平扫描,当有个键按下时,相应的行线为高电平,扫描的结果由PC口送回8255A.
本系统的矩阵电路的作用是能够设定倒计时的初始值,还可以通过按软件中设定的几个键的功能,来实现倒计时最大初值的选择。
倒计时是按千位,百位,十位,个位的顺序排列显示的,用四个按键来现实显示切换的,所达到的效果是按一下对应的键时,所对应的倒计时最大初值开始倒计时,例如S3键,数码管上显示的是99S开始倒计时。
在程序中按S8键开始初值设定,在按相应的已经编码好的键,这些代表0-9的键来设定四位初值。
设定初值时,每按一个键,就在数码管上显示该键代表的编码。
四位值都设好了,等待按独立键跳出矩阵电路。
按键电路如下图4所示。
图4 按键电路原理图
3.3数码管显示电路
在这里我们使用的是8段数码管显示(包含小数点),通常在显示上我们采用的方法一般包括两种:
一种是静态显示,另一种是动态显示。
其中静态显示的特点是显示稳定不闪烁,程序编写简单,但占用端口资源多,所耗得电能较大;动态显示的特点是显示稳定性没静态好,程序编写复杂,但是相对静态显示而言占用端口资源少。
在本设计中,为了减少端口资源,降低电能消耗,采用的是动态显示方法。
本系统的倒计时时间的最大范围是9999S,要显示出最大范围的值,从而可知数码管显示电路要用到4位数码管。
考虑到到数码管的段和位比较多,本系统用8255A作为扩展端口芯片。
数码管有段选和位选控制,在此电路中有4个位选,8个段选(每一个数码管的段选进行并联)。
分别用8255芯片的PA口和PB口进行四位数码管的控制,而用单片机的PB口来控制段。
电路中用了四个PNP来控制数码管的位选的开关,PNP在这起开关的作用。
电路如下图5所示。
图5 数码管显示电路原理图
4软件设计与流程图
4.1倒计时器主程序流程图
程序的的开始时先设定定时器0,给定时器装初值,定时器0的定时时间是10ms,用作定时器时间的递减。
然后给初始化8255芯片设定PA和PB口为输出端口,PC的低四位为输入端口,而高四位为输出端口。
进入死循环函数,在循环函数中,进入方式9-0s的倒计时,再对矩阵进行扫描,如果有键按下返回按键值,执行判断语句。
若为假则继续按该方式执行程序,若为假则跳出该倒计时方式,进入下一个倒计时方式。
流程图如下图6所示:
图6倒计时器主程序流程图
4.2定时器0的中断程序流程图
定时器0的定时时间是10ms,用作扫描数码管显示,在定时器0开启时,定时器0开始定时,此时主程序正常运行,当定时器0的定时时间到时,主程序不在执行,开始进入中断程序,在中断程序中,若计时了1s就对时间进行处理且计数标志清零,赋值给相应的变量且second减1,若没有则计数标志count就进行加1,若倒计时的时间为零则重新赋值,中断程序执行完后返回主程序。
如图7所示。
图7定时器0的中断程序流程图
5总电路
5.1倒计时器总原理图
倒计时原理图由一块AT89C52单片机器控制作用,还用一块8255A芯片来扩展I/O端口,单片机的P3^2到P3^3分别接的独立按键电路,即2个微动开关。
而8255A芯片的PC口接矩阵键盘,PB口与显示电路的数码管的段选相连,起到控制数码管的段选的的作用,PA口分别对应数码管的4个位选,起到对4个数码管的扫描作用,其中的4个三极管起着开关作用,对应数码管的选通。
图见附录一。
5.2整体电路仿真以及仿真结果分析
系统仿真用的是Proteus软件,可通过仿真显示出所设计系统的功能,对于程序的调试等有很大的帮助。
系统仿真时首先在使用KeilC译码器,把所写的程序进行编译,同时在仿真器里设置生成HEX文件,编译无错误进行Proteus仿真。
等所有的原件都连接完成后可以把KeilC编译生成的无错误文件加载到AT89C52中,方法是,右键点中器件然后再用左键点击,出来一个对话框在programfile后选择要添加的文件,文件要求必须是HEX文件。
然后可以点击运行观察现象,看与自己设置的是否符合,如果不相符再查找错误进行修改,一般的错误都是程序中的,所以要认真的读取程序的每一个部分。
启动Proteus软件的play按钮,出现如上图13所示,以上矩阵键盘设定倒计时初值和倒计时最大初值范围选择。
按下相应的键,数码管上显示相应的计数范围开始计时,当定时中断到时,数码管上的数值减1,也就是1S计时时间到了当全为0时,数码管上的数值自动加载为最大计数范围的值。
从仿真图可知,本系统的程序已达到要求。
5.3软件调试
用到了KeilC软件,集成调试环境,集成了编辑器、译码器、调试器,支持软件模拟,支持项目管理功能强大的观察窗口,支持所有的数据类型。
树状结构显示,一目了然,支持ASM(汇编)、C语言多模块源程序混合调试,在直接修改、编译、调试源程序,错误指令定位。
功能很强大,用于对程序的调试和编辑。
本系统的程序的编写就是在KeilC软件中完成的,在程序中用到了两个定时器,为了使倒计时的时间准确,必须计算对定时器的初值,当程序完成之后,生成HEX文件。
再利用Proteus软件进行仿真。
经过仿真,程序符合题目的要求。
6性能测试与分析
按照设计程序的分析,LED数码管的动态扫描的频率是1000HZ,在实际使用时完全没有闪烁。
在程序中,定时器10ms中断一次,变量count100自增,中断100次时,秒的显示自减,用定时器来定时,准确。
电路中的五个按键可以分别用来设定倒计时的计数范围。
另外,设定外部中断来暂停和重新启动倒计时。
当数码管的显示全0时,系统自动重新载入初值开始倒计时。
系统由5V电源来驱动,经过测是试与分析,此系统稳定可用。
7结论与心得
在设计倒计时器课程设计的过程中,我深切体会到,实践是理论运用的最好检验。
本次设计是对我这一学期所学知识的一次综合性检测和考验,无论是动手能力还是理论知识运用能力都得到了提高,同时加深了我对网络资源认识,大大提高了查阅资料的能力和效率,使我有能有更多的时间去设计软件部分。
本系统要求我们要有丰富的编程经验,还要能会看单片机开发板原理图,能熟悉那些I/O口的作用,且能够准确的运用数电等多方面的知识。
在软件调试过程中,我学会不少的东西,掌握一些调试软件的方法。
在设计仿真图和设计电路图中,对Proteus、Keil和Protel等软件掌握的更加牢固,而且所设计的基于单片机的倒计时器,精确度高,达到了应用要求这次课程设计使我掌握了很多实践知识,在老师和同学的帮助下对单片机有了进一步的了解。
8致谢
这次课程设计对我来说有着深远的意义,让我对未来的路又看得清楚了些。
在此我要深深的感谢那些传授我知识的老师们,是你们无私的奉献,才会有如今掌握一定知识的我们;要感谢父母一直给我的支持,感谢他们的关怀;还要感谢同学对我的鼓励,感谢队友对我的认可,让我能尽情的发挥我的能力,激扬去验证自己的想法。
参考文献
[1]朱定华,戴汝平.单片微机原理与应用.(M)北京:
清华大学出版社,2003
[2]楼然苗,李光飞.单片机课程设计指导.(B).北京航空航天大学出版社,2007
[3]李凤霞,刘桂山,薛庆.C语言程序设计(第二版).北京理工大学出版社,2008
[4]张鑫,华臻,陈书谦.单片机原理及应用(A).北京电子工业出版社,2005
[5]谭浩强著C程序设计(第二版)清华大学出版社1999
附录一:
总原理图
附录二:
程序
#include
#include
#definePAXBYTE[0xD1FF]/*PA口地址*/
#definePBXBYTE[0xD2FF]/*PB口地址*/
#definePCXBYTE[0xD5FF]/*PC口地址*/
#defineCONXBYTE[0xD7FF]/*控制字地址*/
#defineuintunsignedint
#defineucharunsignedchar
//*******************数码管段******************//
ucharcodeTAB_CODE[]={0XA0,0XBB,0X62,0X2A,0X39,0X2C,0X24,0XBA,0X20,
0X28,0X30,0X25,0XE4,0X23,0X64,0X74};
uchart,mode=6,mode1=1,m=0,s=0;//mode1为0表示为设定初始值过程中
uintmax,co=9999;
//**小延时函数**//
voiddelay(uinta)
{
while(a--);
}
voidTime();
voidStart();
voidkeyscan();
voidmain()
{
//ucharA;
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;
//TR0=1;
CON=0x81;
while
(1)
{
keyscan();
Time();
Start();
}
}
//**数码管显示函数***//
voidStart()
{
//RELAY=1;
PB=0xff;//***消影***//
delay(100);
if(max>99999)//初始选择方式
{
PA=0xfe;
PB=TAB_CODE[max/100000];
delay(150);
PB=0xff;
delay(150);
}
if(max>9999)
{
PA=0xfd;
PB=TAB_CODE[(max/10000)%10];//*初始选择方式
delay(150);
PB=0xff;
delay(150);
}
if(max>999)
{
PA=0xfb;//***位选通***//
PB=TAB_CODE[(max/1000)%10];//***分十位显示***//
delay(150);
PB=0xff;
delay(150);
}
if(max>99)
{
PA=0xf7;
PB=TAB_CODE[(max/100)%10];//***分个位显示***//
delay(150);
PB=0xff;
delay(150);
}
if(max>9)
{
PA=0xef;
PB=TAB_CODE[(max/10)%10];//***秒十位显示***//
delay(150);
PB=0xff;
delay(150);
}
PA=0xdf;
PB=TAB_CODE[max%10];//***秒个位显示***//
delay(150);
PB=0xff;
delay(50);
}
//****键盘扫描函数******//
voidkeyscan()
{
uchark,j=0x10;
CON=0x81;//***初始化8255控制器***//
PC=0x10;//*****把PC.4口拉高*****//
k=PC;
k=k&0x0f;//***判断是否有键按下***//
if(k!
=0)
{
delay(50);
Start();
if(k!
=0)
{
while(PC!
=0x10)//******松手检测******//
Start();
}
k=k+j;
if(k==0x18)
{
mode--;
if(mode==0)mode=5;
mode1=1;
s=0;
m=0;
switch(mode)
{
case5:
{mode1=0;TR0=0;co=0;};break;
case4:
co=9999;break;
case3:
co=999;break;
case2:
co=99;break;
case1:
co=9;break;
default:
co=9999;break;
}
max=co;
}
if(k==0x14)
{
m++;
if(m==10)m=0;
max=m*10+s;
}
if(k==0x12)
{
if(mode1==0)if(max>0)mode1=1;
if(mode1==1)
if(TR0==0)
{TR0=1;}
elseTR0=0;//mode1为1表示输入初始值完成
}
if(k==0x11)
{
s++;
if(s==10)s=0;
max=m*10+s;
}
P1=PC;
}
}
//***时间控制函数***//
voidTime()
{
if(t==20)
{
t=0;
if(max==0)max=co;
max--;
}
}
//***定时器中断***//
voidSer0()interrupt1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
t++;
}
附录三:
原件清单
名称
参数和型号
数量
单片机
AT89C52
1块
PNP三极管
S8550
4个
电阻
1K
16个
数码管
共阳数码管器
4个
瓷片电容
30PF
2个
晶振
12M
1个
电解电容
10uf
1个
微动开关
16个
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计时器 课程设计 程序
![提示](https://static.bdocx.com/images/bang_tan.gif)