当前位置:文档之家› 倒计时器课程设计(带程序版)

倒计时器课程设计(带程序版)

湖南科技大学课程设计报告课程名称:单片机原理及应用课程设计设计题目:电阻测量院系:通信与控制工程系专业:通信工程班级:学生姓名:学号: ******** ********起止日期:2010年12月20日~ 2010年12月31日指导教师:教研室主任:基于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软件,可通过仿真显示出所设计系统的功能,对于程序的调试等有很大的帮助。

系统仿真时首先在使用Keil C 译码器,把所写的程序进行编译,同时在仿真器里设置生成HEX文件,编译无错误进行Proteus仿真。

等所有的原件都连接完成后可以把Keil C编译生成的无错误文件加载到AT89C52中,方法是,右键点中器件然后再用左键点击,出来一个对话框在program file后选择要添加的文件,文件要求必须是HEX文件。

然后可以点击运行观察现象,看与自己设置的是否符合,如果不相符再查找错误进行修改,一般的错误都是程序中的,所以要认真的读取程序的每一个部分。

启动Proteus软件的play按钮,出现如上图13所示,以上矩阵键盘设定倒计时初值和倒计时最大初值范围选择。

按下相应的键,数码管上显示相应的计数范围开始计时,当定时中断到时,数码管上的数值减1,也就是1S计时时间到了当全为0时,数码管上的数值自动加载为最大计数范围的值。

从仿真图可知,本系统的程序已达到要求。

5.3 软件调试用到了Keil C软件,集成调试环境,集成了编辑器、译码器、调试器,支持软件模拟,支持项目管理功能强大的观察窗口,支持所有的数据类型。

树状结构显示,一目了然,支持ASM(汇编)、C语言多模块源程序混合调试,在直接修改、编译、调试源程序,错误指令定位。

功能很强大,用于对程序的调试和编辑。

本系统的程序的编写就是在Keil C软件中完成的,在程序中用到了两个定时器,为了使倒计时的时间准确,必须计算对定时器的初值,当程序完成之后,生成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<reg52.h>#include <absacc.h>#define PA XBYTE[0xD1FF] /*PA口地址*/#define PB XBYTE[0xD2FF] /*PB口地址*/#define PC XBYTE[0xD5FF] /*PC口地址*/#define CON XBYTE[0xD7FF] /*控制字地址*/#define uint unsigned int#define uchar unsigned char//*******************数码管段******************//uchar code TAB_CODE[]={0XA0,0XBB,0X62,0X2A,0X39,0X2C,0X24,0XBA,0X20,0X28,0X30,0X25,0XE4,0X23,0X64,0X74};uchar t,mode=6,mode1=1,m=0,s=0; //mode1为0表示为设定初始值过程中uint max,co=9999;//**小延时函数**//void delay(uint a){while(a--);}void Time();void Start();void keyscan();void main(){//uchar A;TMOD=0x01;TH0=(65535-50000)/256;TL0=(65535-50000)%256;EA=1;ET0=1;//TR0=1;CON=0x81;while(1){keyscan();Time();Start();}}//**数码管显示函数***//void Start(){// 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);}//****键盘扫描函数******//void keyscan(){uchar k,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){case 5:{mode1=0;TR0=0;co=0;};break;case 4:co=9999;break;case 3:co=999;break;case 2:co=99;break;case 1: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;}else TR0=0; //mode1为1表示输入初始值完成}if(k==0x11){s++;if(s==10) s=0;max=m*10+s;}P1=PC;}}//***时间控制函数***//void Time(){if(t==20){t=0;if(max==0)max=co;max--;}}//***定时器中断***//void Ser0() interrupt 1{TH0=(65535-50000)/256;TL0=(65535-50000)%256;t++;}附录三:原件清单。

相关主题