用51单片机模拟时间秒表,数码管显示格式为00-00-00,从最低一位开始计时,当最低两位到59时上一位数码管进1,低两位重新从0开始计时。通过按键控制数码管开始计时、暂停计时、数码管清0。
具体功能如下:
1.独立按键4按下计时(一直按着就是计时)。
2.按键4松手则暂停计时,再长按 按键4可以继续计时。
3.按键3按一下,数码管显示的秒表清0。
代码:
#include <REGX52.H>
#include <intrins.h>
sbit button3=P3^2;
sbit button4=P3^3; //按钮进行位定义
typedef unsigned char uchar;
uchar code leddata[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D, 0x7D,0x07,0x7F,0x6F};
uchar hour=0,minute=0,second=0;
uchar count=0;
void Timer0Init()
{
TMOD &= 0xF0;
TMOD |= 0x01;
TL0 = 0xB0;
TH0 = 0x3C;
TF0 = 0;
TR0 = 1;
ET0=1;
EA=1;
}
void delay(unsigned int ms){
while(ms--){
unsigned char i, j;
_nop_();
i = 2;
j = 199;
do
{
while (--j);
}
while (--i);
}
}
void display(uchar hour,uchar minute,uchar second){
int i;
for(i=1;i<=8;i++){
switch(i){
case 1: P2_4=0;P2_3=0;P2_2=0;P0=leddata[second%10];break;
case 2: P2_4=0;P2_3=0;P2_2=1;P0=leddata[second/10];break;
case 3: P2_4=0;P2_3=1;P2_2=0;P0=0x40;break;
case 4: P2_4=0;P2_3=1;P2_2=1;P0=leddata[minute%10];break;
case 5: P2_4=1;P2_3=0;P2_2=0;P0=leddata[minute/10];break;
case 6: P2_4=1;P2_3=0;P2_2=1;P0=0x40;break;
case 7: P2_4=1;P2_3=1;P2_2=0;P0=leddata[hour%10];break;
case 8: P2_4=1;P2_3=1;P2_2=1;P0=leddata[hour/10];break;
}
delay(1);
P0=0;
}
}
void jia(){
count++;
if(count==20){
count=0;
second++;
if(second==60){
second=0;
minute++;
if(minute==60){
minute=0;
hour++;
if(hour==24)
hour=0;
}
}
}
}
void interrupt_T0()interrupt 1
{
TL0 = 0xB0;
TH0 = 0x3C;
if(button4==0){ //按键按下确定
jia();}
}
void main(){
Timer0Init();
while(1){
display(hour,minute,second);
if(button3==0)
break;
}
}
显示效果如图: