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