利用单片机内部定时器设计一个秒表,显示最大值为 59.99 秒。

使用 4 位七段显示器来显示现在的时间。显示格式为“秒、毫秒”。
要求能实现秒表的启动、停止和复位。
单片机:STC12C5A08S2
谢谢了
第一次提问这个号也没有钱悬赏。帮忙下小妹在此谢过大神了

#include<reg51.h>
#include<INTRINS.h>
#define u16 unsigned int
#define u8 unsigned char

#define Pin0 0x01
#define Pin1 0x02
#define Pin2 0x04
#define Pin3 0x08
#define Pin4 0x10
#define Pin5 0x20
#define Pin6 0x40
#define Pin7 0x80



sbit k1=P3^3;
sbit k2=P3^4;
sbit k3=P3^5;


#define K1 Pin0
#define K2 Pin1
#define K3 Pin2


u8 key=0xff;//消抖后的有效按键值
u8 key_down=0x00;//按键下降沿扫描结果,1有效
u8 key_up=0x00;  //上升沿扫描结果,1有效
u8 key_sc=0xff;//上次扫描的按键值

//按键扫描程序
void scanKey(){
static u8 temp0;
static u8 ms;
u8 temp=0;
if(k1==1)temp|=K1;
if(k2==1)temp|=K2;
if(k3==1)temp|=K3;
if(temp==temp0){// 按键消抖
if(++ms>=5){//连续5次扫描的值一样,则认为是稳定状态
key=temp;
ms=0;
}
}else {
temp0=temp;
ms=0;
}
key_down=key_sc&(~key);//下降沿扫描
key_up=(~key_sc)&key;//下降沿扫描
key_sc=key;
}
u8 readPIN(u8 port,u8 pin){
    return ((port&pin)==0?0:1);
}


u8 ds[4]; //数码管显示缓存
code u8 w[]={0x01,0x02,0x04,0x08,}; //位码
code u8 d[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};//断码
code u8 dand[]={0xff,0x7f,0xff,0xff};
void dispaly(){//显示函数
static u8 a;
a++;
if(a>3)a=0;
P0=0xff;
P2=w[a];
P0=d[ds[a]]&dand[a];
}


void Timer0Init(void) //1毫秒@11.0592MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x66; //设置定时初值
TH0 = 0xFC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
void init() //初始化函数
{    Timer0Init();

}

u16 js_ms=0;
u8 flag=0;
u16 count=0;
void main()//主函数
{
init();
TR0=1;
while(1){
ds[0]=count/1000%10;//将当前分值送到数码管缓存
ds[1]=count/100%10;
ds[2]=count/10%10;
ds[3]=count%10;
scanKey();//扫描按键
if(readPIN(key_down,K1)==1){//k1,开始
flag=1;
}
if(readPIN(key_down,K2)==1){//k2,停止
flag=0;
}
if(readPIN(key_down,K3)==1){//k3,复位
count=0;
}
}

}



void timer0() interrupt 1//定时器,实现倒计时
{   
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
dispaly();
if(++js_ms>=10&&flag!=0){
js_ms=0;
if(count<5999)count++;
}
}


追问

有点问题 。。板子上蜂鸣器一直再响 数码管上显示不全

追答

你蜂鸣器接哪个脚,数码管共阴共阳有没有接其它芯片
还要把定时器的初始化和重载值换成stc的
void Timer0Init(void) //1毫秒@11.0592MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x66; //设置定时初值
TH0 = 0xFC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}

温馨提示:答案为网友推荐,仅供参考