51单片机秒表计时,四位数码管显示。上电前显示00.00,一共2个按键,一个启动停止,另一个清零功能,60秒后自动归零,程序可自行修改。
原理图
程序
#include<89C51.h>
#define uchar unsigned char
#define uint unsigned int
void delay(uint c);
#define dula P22
#define wela P23
void keycan();
void init();
void display();
uchar table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uint num,dis,n;
uint ms=0;
uint sec=0;
void main()
{
init();
TR0=0;
while(1)
{
display();
keycan();
}
}
void init()
{
TMOD=0X01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET0=1;
TR0=1;
EX0=1;
IT0=1;
}
void Time0() interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
ms++;
if(ms==100)
{
ms=0;
sec++;
if(sec==60)
{
sec=0;
TR0=0;
}
}
}
void keycan()
{
if(P10==0)
{
delay(5);
if(P10==0)
{
while(!P10);
TR0=~TR0;
}
}
if(P11==0)
{
delay(5);
if(P11==0)
{
while(!P11);
sec=0;
ms=0;
}
}
}
void display()
{
wela=1;
P0=0xfe;
wela=0;
P0=0;
dula=1;
P0=table[sec/10];
dula=0;
delay(5);
wela=1;
P0=0xfd;
wela=0;
P0=0;
dula=1;
P0=table[sec%10]|0x80;
dula=0;
delay(5);
wela=1;
P0=0xfb;
wela=0;
P0=0;
dula=1;
P0=table[ms/10];
dula=0;
delay(5);
wela=1;
P0=0xf7;
wela=0;
P0=0;
dula=1;
P0=table[ms%10];
dula=0;
delay(5);
}
void delay(uint c)
{
uint a,b;
for(a=c;a >0;a--)
for(b=115;b >0;b--);
}
全部0条评论
快来发表一下你的评论吧 !