一个秒表程序,新手上路
//功能说明:1.按下按键k4,秒表开始/暂停计时// 2.按下按键k5,秒表清零计时,并等待开始计时
// 3.在等待计时过程中,LED灯闪烁,表示在等待计时
// 4.LED显示器上第一位显示分,第二三位显示秒,第四位显示毫秒中间用小数点隔开
// 5.计时最大长度为10分钟,9分59秒后,自动清零
#include<reg52.h>
#define uchar unsigned char
#define dula P0 //段选信号的锁存器控制
#define wela P2 //位选信号的锁存器控制,这里只用到P2.4~P2.7引脚
sbit k4 = P3^6; //红色按键k4
sbit k5 = P3^7; //红色按键k5
bit stop = 1;
unsigned char j,k,num0,num1,num2,num3,ss,sec,min,count=0;
unsigned char time_count;
unsigned char code weitable[]={0x8f,0x4f,0x2f,0x1f}; //LED显示器各位码表
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //LED显示器各位的码表(带上小点)
unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
void delay(unsigned char i)
{
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void display1(uchar wei,uchar shu) //在任意一位显示任意数字
{
wei=wei-1;
wela|=0xf0; //给P2.4~P2.7引脚置1
if(wei==1) //小数点位次
P0=table1[shu];
else if(wei==3)
P0=table1[shu];
else
P0=table[shu];
wela=wela&weitable[wei];//给P2引脚需要显示的那一位置1,其他清0
delay(5);
}
void display(unsigned char a,unsigned char b,unsigned char c,unsigned char d)//1次显示四个数字,且每位显示数字可自定
{
display1(4,a);
display1(3,b);
display1(2,c);
display1(1,d);
}
void start_timer()
{
ET0=1; //开定时器T0中断
EA=1; //开总中断
TR0=1; //打开定时器
}
void stop_timer()
{
ET0=0; //关定时器T0中断
EA=0; //关总中断
TR0=0; //关闭定时器
}
void main()
{
TMOD=0x01; //模式设置,00000001,可见采用的是定时器T0,工作与模式1(M1=0,M0=1)
TH0=(65536-46080)/256; //由于晶振为11.0592MHZ,故所记次数应该为46080次,计时器每隔50000us发起一次中断。
TL0=(65536-46080)%256; //46080为50000x11.0592所得
while(1)
{
if(k4==0) //判断是否有按下按键的信号
{
delay(10); //延时10ms消抖
if(k4==0) //再次判断是否有按下按键的信号
{
while(k4==0);//直到判断按键松开
{
if(stop)
start_timer();//打开定时器
else
start_timer();//关闭定时器
stop=~stop;
P1=0xff;
}
}
}
else if(k5==0)//判断是否有按下按键的信号
{
delay(10);
if(k5==0)
{
while(k5==0);
{
stop_timer();
stop=1;
P1=0xff;
count=0;
time_count=0;
ss=0;
sec=0;
min=0;
}
}
}
if(stop)
{
count++;
if(count==100)
{
P1=~P1;
count=0;
}
}
else if(time_count==2)//计数2次0.05s为0.1s
{
count=0;
time_count=0;
ss++;
if(ss==10)
{
ss=0;
sec++;
}
if(sec==60)
{
sec=0;
min++;
}
if(min==10)
{
min=0;
stop_timer();
}
delay(20);
}
num0=ss%10;//取出当前描述的个位
num1=sec%10;//取出当前描述的个位
num2=sec/10;//取出当前描述的十位
num3=min%10;//取出当前描述的个位
display(num3,num2,num1,num0);//显示
}
}
void timer0()interrupt 1
{
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
time_count++;
}
[此贴子已经被作者于2018-10-30 12:25编辑过]