基于51单片机的99.99秒表设计

1、设计需求

用AT89S51设计一个动态数码显示秒表,显示时间为00.00~99.99秒,个位每秒自动加一。另设计一个按键,一上电动态数码管显示四个0,按一下秒表开始计时,按第二下秒表停止计时保持动态数码管显示的值,按第三下秒表归零。

2、设计思路

该实验要求进行计时并在数码管上显示时间,则可利用单片机微机仿真实验系统中的芯片AT89S51中的P3.2管脚做为外部中断0的入口地址,并实现“开始”、“保持”、“清零”按键的功能;定时器T0作为每秒加一的定时器。其中当按键来第一个拨动信号,开关由1拨向0(由上向下按)时开始计时;当按键来第二个拨动信号,开关由1拨向0(由上向下按)时数码管保持,当按键来第三个拨动信号,开关由1拨向0(由上向下按)时数码管清零,此时若再按按键则又可重新开始计时。

3、设计内容

本设计的数字电子秒表系统采用 AT89S51单片机为中心器件,利用其定时器/计数器定时和记数的原理,结合显示电路、LED数码管以及外部中断电路来设计计时器。将软、硬件有机地结合起来,使得系统能够实现五位LED显示,显示时间为0~99.99秒,计时精度为0.01秒,能正确地进行计时,同时能记录一次时间,并在下一次计时后对上一次计时时间进行查询。硬件仿真电路图如图所示。

4、相关代码主函数

#include    "reg51.h"
#include    "Disp.h"

#define    cFunction_Wait    1
#define    cFunction_Count    2
#define    cFunction_stop    3


sbit    Start    =    P1^0;
sbit    Res    =    P1^3;
char    vState;//状态机必须定义全局变量
char    Value    =    1;
int    i    =    0;


void    Delay(TimeINms)
{
    int    i;
    while(TimeINms)
    {
        for(i=0;i<500;i++);
        TimeINms--;    
    }
}
                                          
void  main(void)
{     
    DISP_Init(); 
    DISP_Integer(11111111,0);
        vState    =    cFunction_Wait;//初始化指定状态   在while(1)前初始化一次
    while(1) 
    {    
         switch(vState)
         {         
             case     cFunction_Wait    :
            {     
                if(Start==0    &&    Value==1)                                             
                {
                    vState    =    cFunction_Count;
                    Value    =    0;     
                }  
                break;        
            }
            case    cFunction_Count:
            {
                if(Start==0    &&    Value==0)
                {    
                    vState    =    cFunction_stop;
                    Value    =    1;
                }                                      
                i++;
                DISP_Integer(i,1);
                break;
            }
            case    cFunction_stop:
            {
                if(Start==0    &&    Value==1)
                {
                    vState    =    cFunction_Count;
                    Value    =    0; 
                    DISP_Integer(i,1);                    
                }
                if(Res==0)
                {
                    vState    =    cFunction_Wait;
                    i    =    0;
                    DISP_Integer(11111111,0);
                }
                break;
             }
        }
        Delay(20);                                         
    }
}

全部资料:

https://market.m.taobao.com/app/idleFish-F2e/widle-taobao-rax/page-detail?wh_weex=true&wx_navbar_transparent=true&id=613988432962&ut_sk=1.WUpxx7gpwUoDAMmnnrBIzAno_12431167_1585195142459.Copy.detail.613988432962.1828622527&forceFlush=1

发布了23 篇原创文章 · 获赞 7 · 访问量 335

猜你喜欢

转载自blog.csdn.net/weixin_41017942/article/details/105114761