一、编程实现秒表
实现功能:利用定时器T0、数码管模块和2个独立按键(J5的2-3短接),设计一个秒表,具有清零、暂停、启动功能。
1.显示格式为:分-秒-0.05秒(即50ms)
08-26-18表示:8分26秒900毫秒
独立按键S4为:暂停/启动
独立按键S5为:清零
按键均为按下有效
#include <reg51.h>
sbit S4=P3^3;
sbit S5=P3^2;
unsigned char fen=0;//分
unsigned char s=0;//秒
unsigned char ms=0;//毫秒
unsigned char code duanma[18]=
{ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0x7f};
//用数组保存0~F的16个数值的编码,方便通过调用数组使用其值
void SMG_dispay(unsigned char i,unsigned char dat)
{
P2=0xC0;P0=0x01<<i;
P2=0xE0;P0=dat;
}
void delaysmg(unsigned int t)
{
while(t--);
}
void InitT0()
{
TMOD=0x01;
TH0=(65536-50000)/256;//定时50ms
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void service_T0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ms++;
if(ms==20)//1秒=1000ms
{
s++;
ms=0;
if(s==60)
{
fen++;
s=0;
}
if(fen==99)
{
fen=0;
}
}
}
void timeshow()
{
SMG_dispay(7,duanma[ms%10]);//显示毫秒
delaysmg(500);
SMG_dispay(6,duanma[ms/10]);
delaysmg(500);
SMG_dispay(5,duanma[16]);//分隔符
delaysmg(500);
SMG_dispay(4,duanma[s%10]);//显示秒
delaysmg(500);
SMG_dispay(3,duanma[s/10]);
delaysmg(500);
SMG_dispay(2,duanma[16]);
delaysmg(500);
SMG_dispay(1,duanma[fen%10]);//显示分
delaysmg(500);
SMG_dispay(0,duanma[fen/10]);
delaysmg(500);
}
void delaykey(unsigned char t)
{
while(t--);
}
void key()
{
if(S4==0)//秒表启动/暂停
{
delaykey(100);
if(S4==0)
{
TR0=~TR0;
while(S4==0)//避免误操作
{
timeshow();
}
}
}
if(S5==0)//秒表清零
{
delaykey(100);
if(S5==0)
{
fen=0;
s=0;
ms=0;
while(S4==0)
{
timeshow();
}
}
}
}
void main()
{
P2=0xA0;P0=0x00;P2=0x80;P0=0xFF;//关闭外设
InitT0();
while(1)
{
timeshow();
key();
}
}