99秒倒计时

江苏建筑职业技术学院课程设计报告

课程名称:单片机设计与实训

设计题目:秒计时

系别:机电工程学院

班级:电子10-1

学号:1050213105

姓名:顾赟

指导教师: 刘天飞、刘燎原

摘要:本系统讨论了简单的倒计时器的设计与制作,最大倒计时时间是99秒,最小单位精确到秒。是利用定时器和计数器的原理将倒计时过程显示在LED数码管上。此系统是基于AT89S52单片机控制,外加数码管显示倒计时时间,并且利用按键来进行倒计时时间的设定。当倒计时时间倒计时为0时,蜂鸣器就会发出报警声。首先我们先做的是99秒倒计时至0时,在设计的Proteus中进行仿真,数码管显示倒计时,蜂鸣器就会发出声音。其中包括有数码管延时程序,中断定时程序。其次我们设置键盘扫描程序,设置键盘的按键有13,14,15键分别为暂停/开始、设置、重新开始。根据题目要求编写程序,一步步的编写程序。定义13按键用count1来控制是暂停还是开始;14按键在暂停的情况下按下(即falg_zt=1时)才可以设置时间;15按键按下开始重新开始。然后分别在采用软件程序进行译码,在Proteus中仿真实现功能要求。

关键词:单片机(AT89S52);LED数码管显示器;keil C;proteus仿真软件;晶体振荡器

目录

第1节前言 .................................................................................... 第2节方案选择 ................................................................................ 第3节硬件电路 (3)

第4节系统的软件设计 (8)

第5节软硬件联调.................................................. (10)

第6节总结………………………………………………………第7节致谢………………………………………………………

参考文献

附录

第1节前言

在生活和生产的各领域中,凡是有自动控制要求的地方都会有单片机的身影出现;从简单到复杂,从空中、地面到地下,凡是能想像到的地方几乎都有使用单片的需求。现在尽管单片机的应用已经很普遍了,但仍有许多可以用单片机控制而尚未实现的项目,因此,单片机的应用大有想像和拓展空间。

单片机就是微控制器,它是嵌入式系统中的重要且发展迅速的组成部分。单片机接上震荡元件(或震荡源)、复位电路和接口电路,载入软件后,可以构成单片机应用系统。将它嵌入到形形色色的应用系统中,它就成为众多产品、设备的智能化核心。所以,生产企业称单片机为“微电脑”。

单片机的应用有利于产品的小型化、多功能化和智能化,有助于提高劳动效率,减轻劳动强度,提高产品质量,改善劳动环境,减少能源和材料消耗,保证安全等。但是,单片机应用的意义绝不仅限于它的广阔范围以及所带来的经济效益上,更重要的意义还在于:单片机的应用正从根本上改变着传统的控制系统设计思想和设计方法。从前必须有模拟电路或数字电路实现的大部分功能,现在已能使用单片机通过软件(编程序)方法实现了。这种以软件取代硬件并提高系统性能的控制系统“软化”技术,称之为微控制技术。微控制技术是一种全新的概念,是对传统控制技术的一次革命。随着单片机应用的推广普及,微控制技术必将不断发展、日益完善和更加充实。

近年来随着计算机在社会领域的渗透, 单片机的应用正在不断地走向深入,同时带动传统控制检测日新月益更新。在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构,以及针对具体应用对象特点的软件结合,以作完善。模拟多通道压力系统是利用压力传感器采集当前压力并反映在显示器上,它可以分析压力过量程,并发出报警。并采用电子秤原理可根据输入单价准确的计算出物体的金额。

本篇论文讨论了简单的倒计时器的设计与制作,对于倒计时器中的LED数码显示器来说,再加上按键的功能来实现。

第2节方案选择

方案一:该方案采用单片机程序设计制作,它是利用芯片AT89C51的特殊功能,P3口控制按键开关,当按下开关S1,两个数码管将显示99,然后通过P2.0和P2.1对控制数码管的两个三极管进行位选,P1口输出段码经74LS373锁存来驱动数码管进行倒计时,同时能实现复位、暂停、任意调整时间的功能。其系统框图如图1所示

图1 方案一系统框图

方案二:该方案采用数字电路设计,利用555定时器定时1S脉冲控制异步十进制计数器74LS192的CP脉冲,实现倒计时,并利用数码管显示。下图

2为系统框图

图2 方案二系统框图

方案选择

第一种方案的电路结构比较简单,时间精度比较高,而且在软件编程方面相对简单,第二种时间精确度不高并且电路复杂,综合比较,故选择第一种方案。

第3节 硬件电路

LED 数码管倒计时器以AT89S52单片机为核心,起着控制作用。系统包括8位数码管显示电路,按键电路,复位电路,时钟电路以及蜂鸣器电路。倒计时的总体框图如下图1所示:

图1 倒计时的总体框图

图2 复位电路原理图

2.时钟电路

时钟是单片机的心脏,单片机各功能部件的运行都是以时钟频率为基准,有条不紊地一拍一拍地工作。因此,时钟频率直接影响单片机的速度,时钟电路的质量也直接影响单片机系统稳定性。常用的时钟电路有两种方式,一种是内部时

钟方式,另一种是外部时钟方式。选择的方案中采用的是内部振荡方式。采用内部方式时在XTAL1和XTAL2引脚上接石英晶体和微调电容可以构成振荡器,如图5所示。图中C1、C2起稳定振荡频率、快速起振的作用。内部振荡方式所得的时钟信号比较稳定,实用电路中使用较多。振荡频率的选择范围为1MHz~12MHz。

图4 按键电路原理图

4. 蜂鸣器电路。

蜂鸣器电路是由一个有源蜂鸣器、一个电阻和一个三极管组成。此电路的作用是倒计时时间到零时,蜂鸣器发出报警声。在本系统中,是利用单片机的P2^7口来控制,P2^7为低电平时,三极管导通,蜂鸣器报警。电路如下图5所示。

5.数码管显示电路

显示功能与硬件关系极大,当硬件固定后,如何在不引起操作者误解的前提下提供尽可能丰富的信息,全靠软件来解决。

在这里我们使用的是8段数码管显示,通常在显示上我们采用的方法一般包括两种:一种是静态显示,另一种是动态显示。其中静态显示的特点是显示稳定不闪烁,程序编写简单,但占用端口资源多,所耗得电能较大;动态显示的特点是显示稳定性没静态好,程序编写复杂,但是相对静态显示而言占用端口资源少。在本设计中,为了减少端口资源,降低电能消耗,采用的是动态显示方法。

本系统选着了两个2位一体的共阳数码管和一个一位的共阳数码管。数码管有段选和位选控制,在此电路中有9个位选,8个段选(每一个数码管的段选进行并联)。分别用单片机的P3口和P2^0进行9个位的控制。而用单片机的P0口来控制段。电路如下图6所示。

图6 数码管显示电路原理图

6.单片机定时器的使用

本系统所用到的AT89S52有3个16位的定时器,而本系统只用到了定时器0,所使用的工作方式都是定时器工作方式1,方式1时16位计数结构的工作方式,计数器由TH0或TH1的全部8位和TL0或TL1的全部8位构成。使用工作方式1功能时,定时时间计算公式是:

(65536-计数初值)*机器周期机器周期=晶振周期*12

本系统所用到的定时器0的定时时间是1ms;而电路所用的晶振是12MHZ,算得一个机器周期为1us。

第4节系统的软件设计

一、程序流程图

图7 秒计时器主程序流程图

二.单元程序设计

1、扫描键盘的值

void sm(void) {unsignedchar

k,j,n,a,m;

m=0xfe;

P1=0xf0;

k=P1;

k=k&0xf0;

if(k!=0xf0)

{ delay(5);

if(k!=0xf0)

{for(j=0;j<4;j++) { P1=m;n=P1;

for(a=0;a<16;a++) {if(jp[a]==n)

c=a;

while(P1==jp[a]);} m=_crol_(m,1);

}}}}

2、按键

void aj(void)

{if(P1!=0xf0)

{if(c==12)

//按下暂停/开始键

{count++;

if(count==1)

{TR0=0;

zt=1;}

if(count==2)

{TR0=1;

zt=0;

count=0;}}

if(c==13)

{if(zt==1)

{second=00;

sz=1;count2=0;}}

if(c<10)

{if(sz==1)

{ count2++;

if(count2==1)

{a[0]=c;

second=a[0]*10+a[1];}

if(count2==2)

{a[1]=c;

second=a[0]*10+a[1];}

} }

if(c==14)

{second=99;} }

P1=0xf0;}

三、源程序

系统总源程序见附录二

第5节软硬件联调

首先,用烧录器把在Keil C软件下生成的HEX文件烧录到单片机AT89C51芯片中。烧录的步骤如下:选项/串口设置、芯片/选择芯片型号是AT89C51、文件/装载/选择HEX文件、擦除、查空、编程、校验。

其次,根据原理图焊接电路。焊接完后检查电路是否正确、是否有虚焊,确定无误后接到5伏的稳压电源,倒计时开始。

第6节总结

课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握单片机的开发技术是十分重要的。

回顾起此次单片机课程设计,我仍感慨颇多,的确,从理论到实践,在一个多星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。

在设计的过程中遇到问题,可以说得是困难重重,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说不懂一些元器件的使用方法,对单片机汇编语言掌握得不好……通过这次课程设计之后,一定把以前所学过的知识重新温故。

第7节致谢

这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,最后在老师的辛勤指导下,终于完成了设计要求。同时,在老师那里我学得到很多实用的知识,在次我表示感谢!最后,对给过我帮助的所有同学和老师再次表示忠心的感谢!

此外从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,我认为这就是我在这次课程设计中的最大收获。

参考文献

[1]李全利.《单片机原理及应用技术》高等教育出版社。

[2]吴金荣.《8051单片机实践与应用》清华大学出版社。

[3] 张迎辉贡雪梅.《单片机实训教程》北京大学出版社。

[4] 解广润.电力系统接地技术.北京:水利电力出版社.2002.

[5] 李朝清.单片机原理及口技术.北京航空航天大学出版社.2005.

[6] 高卫东.51单片机原理与实践. 北京航空航天大学出版社.2008.

[7] 江志红. 51单片机技术与应用系统开发.青华大学出版社.2008.

[8] 王守中. 51单片机应用开发速查手册.人民邮电出版社.2009.

[9] 徐建民.汇编语言程序设计.电子工业出版社.2007.

#include#i ncludeun signed char code Tab[10]={0xc0,0xf9,

0xa4,0xb0,0x99,0x92

,0x82,0xf8,0x80,0x9 0}; unsigned char codejp[]={0xee,0xde

,0xbe,0x7e,0xed,0xd d,0xbd,0x7d,0xeb,0x db,0xbb,0x7b,0xe7,0 xd7,0xb7,0x77};unsi gned char a[2]={0,0};

unsigned char

int_time;

unsigned char

second=99;

unsigned char c;

bit zt;

bit sz; unsigned char count;

unsigned char y;

unsigned char x;

unsigned char

count2;

//函数功能:数码管动

态扫描延时

void delay(unsigned

char s){unsigned

char i,j;

for(i=0;i

for(j=0;j<125;j++)}

//数码管显示子程序

void

DisplaySecond(unsig

ned char k)

{P2=0xfe;

P0=Tab[k/10];

delay(1);

P2=0xfd;

P0=Tab[k%10];

delay(1);}

//扫描键盘的值

void sm(void)

{ unsigned char

k,j,n,a,m;

m=0xfe;

P1=0xf0;

k=P1;

k=k&0xf0;

if(k!=0xf0)

{ delay(5);

if(k!=0xf0)

{for(j=0;j<4;j++)

{ P1=m;n=P1;

for(a=0;a<16;a++)

{if(jp[a]==n)

c=a;

//键

值保存在C中

while(P1==jp[a]);}

m=_crol_(m,1);}}}}

//按键

void aj(void){

if(P1!=0xf0)

{if(c==12){

count++;

if(count==1){TR0=0;

zt=1;}

if(count==2){

TR0=1;

zt=0;

count=0;}}

if(c==13) { if(zt==1){ second=00;

sz=1;

count2=0;}}

if(c<10){

if(sz==1){

count2++;

if(count2==1){ a[0]=c; second=a[0]*10+a[1}

if(count2==2){

a[1]=c;

second=a[0]*10+a[1;

}}}if(c==14){{

second=99;}}

P1=0xf0;}

//主函数

void main(void){

TMOD=0x01;

TH0=(65536-46083)/2

56;

TL0=(65536-46083)%2

56;

EA=1;

ET0=1;

TR0=1;

while(1){

DisplaySecond(secon

d);sm();

aj();}}

void

interserve(void)int

errupt 1 using 1{

int_time ++;

if(int_time==20){

int_time=0;

second--;

if(second==-1)

{second=00;

P2=0x7f;

delay();

P1=0xff;}}

TH0=(65536-46083)/2

56;

TL0=(65536-46083)%2

56;

相关文档
最新文档