基于52单片机的数字秒表设计

                                  摘要

在单片机技术日趋成熟的今天,其灵活的硬件电路的设计和软件的设计,使单片机得到了广泛的应用,从小的电子产品到大型的工业控制,单片机都起到了举足轻重的作用。单片机小的系统结构可谓是具有可编程硬件的一个缩影,对我们学习和研究微机系统具有重大意义。

    本文对当前数字秒表开发与设计进行比较和分析最终确定采用AT89S52单片机实现数字秒表的设计。本设计以AT89S52单片机为核心,采用7LED数码管显示以及外部中断电路来实现数字秒表的基本功能。本文简单介绍了其系统组成,重点讨论了其硬软件的实现过程,并对其计时精度进行了确定,使其达到0.01秒,并能实现0~99.99秒的计时。最后通过对硬件系统的仿真观察其实际运行情况,给我们以直观的认识。

关键字:单片机   数字秒表   中断  定时

                               目录

第一章硬件设计------------------------------------------------------

1.1 总体方案的设计----------------------------------------------

1.2 单片机的选择-------------------------------------------------

1.3 显示电路的设计----------------------------------------------

1.4 系统总体电路的设计----------------------------------------

第二章软件设计-------------------------------------------------------

   2.1 主程序设计-----------------------------------------------------

   2.2 中断程序设计--------------------------------------------------

   2.3 程序清单--------------------------------------------------------

第三章系统调试-------------------------------------------------------

   3.1 程序编译--------------------------------------------------------

   3.2 程序仿真--------------------------------------------------------

第四章结束语----------------------------------------------------------

参考文献------------------------------------------------------------------

               

第一章   硬件设计

                   

 1.1   总体方案的设计

硬件电路的设计要遵循以下原则:

(1)在性价比满足应用系统要求的基础上,选择更可靠、更熟悉的单片机,缩短研制周期。

(2)尽可能选择较成熟的典型应用电路,以提高系统的可靠性。

(3)单片机内部的资源与外部扩展资源应在满足应用系统设计要求的基础上留有余地,为进一步升级和扩展其功能提供方便。

(4)应充分结合软件方案统筹考虑硬件结构,通常硬件功能较完善,其相应的软件就简单,但硬件成本较高;而硬件功能略低,其相应的软件就复杂。实际中应尽量以软件替代硬件来降低成本。

(5)整个系统的相关器件应尽可能做到性能匹配,如电平、速度的匹配等。

(6)充分考虑整个系统的抗干扰设计,如选择具有抗干扰设计的单片机并充分筛选芯片与器件,在电路中采取隔离和屏蔽措施等。

根据以上原则,通过分析与比对,我们选用较熟悉的具有内部程序存储器的AT89S52单片机作为主控电路,选用四位共阴极的7段数码管作为显示电路来组成硬件电路。其基本原理图如下所示

在硬件电路中,利用AT89S52单片机的定时器作精确的定时,利用数码管对其进行显示;控制按钮利用外部中断0使其实现启动、外部中断1使其实现暂停的功能,设置中断为边沿触发方式,P0口输出段码数据,P2.0~P2.1连上译码器作为位选;计时器采用T0中断实现,定时溢出中断周期为1ms,当溢出中断后向CPU发出溢出中断请求,每发出10次中断请求就对10ms位(即最后一位)加一,达到100次就对100ms位加一,以此类推,直到99.99s为止。

1.2 单片机的选择

    本设计在选取单片机时,在充分查阅资料并对各种单片机有一个初步了解的基础上选用了ATMEL公司的AT89S52

    AT89S52是一种低功耗、高性能CMOS8位微控制器,具有 8K在系统可编程Flash存储器。与工业80C51产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 CPU 和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。AT89S52具有以下标准功能:8k字节Flash256字节RAM32 I/O 口线,看门狗定时器,2 个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,它支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。AT89S52单片机采用40脚的DIP封装,其引脚图如下所示。

1.3 显示电路的设计

对于数字显示电路而言,通常采用LCD显示或LED显示。对于一般的段式LCD,需要专门的驱动电路,而且可视性差;对于具有驱动电路和单片机接口的LCD显示模块,一般多采用并行接口,对单片机的接口要求较高,占用资源多;另外,AT89S52单片机本身没有专门的LCD驱动接口。而LED数码管作为一种主动显示器件,具有结构简单、亮度高、响应速度快、价格便宜、易于购买等优点,而且有远距离视觉效果,很适合夜间或者远距离操作。因此在本设计中,我们采用7段数码管作为显示介质。

数码管显示可以分为静态显示和动态显示两种。由于本设计需要采用四位数码管显示时间,如果静态显示则占用的口线多,硬件电路复杂,所以采用动态显示。

动态显示是一位一位地轮流点亮各位数码管,这种逐位点亮显示器的方式称为位扫描。通常各位数码管的段选线相应并联在一起,由一个8位的I/O口控制;各位的公共阴极位选线由另外的I/O口线控制。动态方式显示时,各数码管轮流选通,要使其稳定显示必须采用扫描方式,即在某一时刻只选通一位数码管并送出相应的段码,在另一时刻选通另一数码管,并送出相应的段码,依次规律循环,即可以使各位数码管显示将要显示的字符,虽然这些字符是在不同时刻分别显示,但由于人眼存在视觉暂留效应,只要每位显示间隔足够短就可以给人同时显示的感觉。显示电路如下图所示

1.4系统总体电路的设计

系统采用AT89S52单片机为主电路的核心部分,各个电路均与单片机相连,由单片机统筹协调各个电路的运行工作。

开始键和暂停键使用了外部中断,所以需要连到单片机的P3.2P3.3引脚上,这两个I/O口的第二功能是单片机的外部中断0端口和外部中断1端口。

显示电路由四位数码管组成,采用动态显示方式,因此有8位段控制和4位位控制,8位段接控制接P0口,P0.0~P0.7分别控制数码管的a b c d e f g dp显示,位控制接在P2.0P2.1两个口,在通过一个2—4译码器实现位控制。

系统总体电路如下图所示

第二章  软件设计

待硬件电路接线完成后,通常可先编写简单的测试程序对硬件电路进行测试,排除硬件电路设计中存在的错误。然后根据设计任务的要求确定系统程序的整体结构,尽可能采用模块化程序设计的方法,将任务划分为相对独立的功能模块,明确各模块的功能、时间顺序和相互关系,并画出各程序模块的流程图,根据流程图逐一编写程序,最后将各个模块连接成完整的程序

2.1主程序设计

本系统程序主要模块由主程序、定时中断服务程序、外部中断0服务程序和外部中断1服务程序组成。其中主程序是整个程序的主体。可以对各个中断程序进行调用。协调各个子程序之间的关系。

主程序主要是设置定时器的工作模式,对定时器赋初值,开总中断、两个外部中断以及定时器溢出中断。并设置外部中断为脉冲边沿触发方式。

2.2中断程序设计

中断是通过硬件来改变CPU的运行方向的。计算机在执行程序的过程中,当出现CPU以外的某种情况时,由服务对象向CPU发出中断请求信号,要求CPU暂时中断当前程序的执行而转去执行相应的处理程序,待处理程序执行完毕后,再继续执行原来被中断的程序。中断之后所执行的相应的处理程序通常称之为中断服务或中断处理子程序,原来正常运行的程序称为主程序。调用中断服务程序的过程类似于调用子程序,其区别在于调用子程序在程序中是事先安排好的,而何时调用中断服务程序事先却无法确定,因为中断的发生是由外部因素决定的,程序中无法事先安排调用指令,因此,调用中断服务程序的过程是由硬件自动完成的。本方案中用到了三个中断:外部中断0、外部中断1和定时器T0溢出中断。按CPU在响应中断时的处理顺序,先处理高级中断,后处理低级中断,若有多个同级中断时,则应按自然优先顺序处理。

1)外部中断0服务程序

外部中断0服务程序结合外部P3.2键实现数字秒表的启动功能。流程如下图所示。

2)外部中断1服务程序

外部中断1服务程序结合外部P3.3键实现数字秒表的停止功能。

流程图如下所示。

3)定时器T0中断服务程序

T0溢出后,向CPU发出中断请求信号。CPU跳转到定时中断程序执行,具体流程图如下。

2.3程序清单

#include<reg52.h>

unsigned int data table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};   //显示码值

unsigned int i,j,k,l,count;

void delay(unsigned int z)                                                //延时程序

{

       unsigned int x,y;

       for(x=z;x!=0;x--)

              for(y=110;y!=0;y--);

}

void main()

{

       TMOD=0x01;                                             //设置定时器为模式1

       TH0=(65536-1000)/256;                                   //给定时器赋定时初值

       TL0=(65536-1000)%256;                              

       EA=1;                                                              //开中断

       EX0=1;

       EX1=1;

       ET0=1;

       IT0=1;                                      //设置外部中断为脉冲边沿触发方式

    IT1=1;

       while(1)                                                          // 数码显示

       {

              P2=0x03;

              P0=table[i];

              delay(1);

              P2=0x02;

              P0=table[j];

              delay(1);       

              P2=0x01;

              P0=(table[k]+0x80);

              delay(1);

              P2=0x00;

              P0=table[l];

              delay(1);

       };

}

void ex0() interrupt 0                                                  //外部中断0

{

              TR0=1;                                           //开定时器,开始计数

}

void ex1() interrupt 2                                                  //外部中断1

{

       TR0=0;                                                           //停止计数

}

void timer0() interrupt 1                                         //定时器T0溢出中断

{

       TH0=(65536-1000)/256;                                         //重装计数初值

       TL0=(65536-1000)%256;

       count++;                                              //溢出中断次数加一

       if(count==10)

       {

              count=0;

              i++;                                          //溢出10次,0.01s位加一

              if(i==10)

              {

                     i=0;                               //0.01s位到10了,清零,0.1s位加一

                     j++;

                     if(j==10)

                     {

                            j=0;                              //0.1s位到10了,清零,1s位加一

                            k++;

                            if(k==10)

                            {

                                   k=0;                          //1s位到10了,清零,10s位加一

                                   l++;

                                  

                            }

                     }

              }

       }

}

第三章  系统调试

3.1程序编译

1)输入源程序

打开keil软件,输入源程序,输入时应以西文方式输入字母和符号,且中文注释前要加分号。

2)对源程序进行编译和纠错

根据自动编译提供的错误信息逐条纠正错误,直至编译信息提示错误(0)”,编译结束。

3)确定调试方案

在调试程序前一定要认真分析源程序,明确各功能程序运行的预期结果。然后结合源程序应达到的结果,确定出如何通过某些关键参数和实验现象检验程序运行结果正确与否。

4)调试程序

调试程序时首先要明确程序的具体功能,对程序做认真分析。程序运行后,观察有无显示,时钟是否工作,运行结果是否正确。若运行结果不正确,首先应根据程序运行的实际现象分析判断哪些因素可引起相关故障,再通过调试方法逐一认证和排除。通过反复调试,发现并排除软件与硬件存在的各类问题,以满足系统设计的预期目的。在编译调试通过以后,生成hex文件以待仿真之用。

3.2程序仿真

对程序的仿真我们采用英国Labcenter公司开发的电路分析与实物仿真软件Proteus进行,它可以仿真、分析各种模拟器件和集成电路。在仿真时,我们首先打开已经画好的Proteus DSN文件,右键点击图中的AT89S52芯片,就弹出一个菜单,选择添加文件,查找已经生成的hex文件并添加进去,这样仿真图中的AT89S52芯片就已经读取了本设计中的hex文件,然后进行仿真,仿真图如下所示。

第四章   结束语

本次设计的数字秒表其预期目的基本达到,各项测试结果还比较令人满意,系统设计注重基础,系统的阐述了设计过程。以单片机为核心对硬件和软件的设计做了深入的探索,各部分都实现了其功能。通过本次课程设计,我从中学习到许多知识,也对以前所学知识进行了巩固,并成功使用了keilProteus两款软件,使理论知识系统化、实用化。同时也认识到,作为新时代的大学生,在竞争如此激烈的社会环境里,动手实践和创新能力显得尤为重要,通过这次课程设计我还发现自己还存在诸多方面的不足。理论知识终究不是实践能力,在实践面前一系列问题就会突然被发现,但是没有扎实的理论知识实践能力就大大削弱,二者可谓缺一不可,要注重理论与实践相结合,并且要认认真真去做每一件事,不要怕麻烦,遇到不懂的问题,就应该积极主动的向老师同学请教,不断提高自己的能力。

参考文献

李朝青. 单片机原理及接口技术(第3版). 北京:北京航空航天大学出版社,20##

赵建领. 51系列单片机开发宝典. 北京:电子工业出版社,20##

 3  朱清慧,张凤蕊,翟天嵩,王志奎. Proteus教程——电子线路设计、制版与仿真. 北京:清华大学出版社,20##

耿永刚,陶国正. 单片机与接口应用技术. 上海:华东师范大学出版社,2008

   孙惠芹. 单片机项目设计教程. 北京:电子工业出版社,20##

  6  杨欣,王玉凤,刘湘黔. 电子设计从零开始. 北京:清华大学出版社,20##

  7  余永权. ATMEL89系列单片机应用技术. 北京:北京航空航天大学出版社,20##

相关推荐