#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define ul unsigned long
sbit dula=P2^6;//声明锁存器U1的锁存端
sbit wela=P2^7;//声明锁存器U2的锁存端
sbit beep=P2^3;
uchar code table[]=
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
uchar code tablwe[]=
{
0xdf,0xef,0xf7,0xfb,0xfd,0xfe
};
uint count,min10,min,s10,s,ms100,ms10,shuzi1,shuzi2,wei;
ul num;
void delayms(uint);
void wedu(uint,uint);
void display();
void main()
{
TMOD=0x01; //定时器0工作于方式1
TH0=(65536-4608)/256;//装初值
TL0=(65536-4608)%256;
EA=1;
ET0=1;
TR0=1;
min10=min=s10=s=ms100=ms10=0;
while(1)//程序在此处不停地对数码管进行动态扫描等待中断发生数码管示数发生变化
{
display();
}
}
void display()
{
for(wei=0;wei<6;wei++)
{
switch(wei)
{
case 0: wedu(ms10,wei);break;
case 1: wedu(ms100,wei);break;
case 2: wedu(s,wei);break;
case 3: wedu(s10,wei);break;
case 4: wedu(min,wei);break;
case 5: wedu(min10,wei);break;
}
}
}
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=1;j>0;j--);
}
void wedu(uint shuzi1,uint shuzi2)
{
dula=1;
P0=table[shuzi1];//送入段选数据
dula=0;
P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存器时原来段选数据通过位选锁存器造成混乱
wela=1;
P0=tablwe[shuzi2];//进一步简化
wela=0;
P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存器时原来段选数据通过位选锁存器造成混乱
delayms(150);
}
void T0_time() interrupt 1
{
TH0=(65536-4608)/256;//重装初值
TL0=(65536-4608)%256;
num++;
if(num==2)
{
num=0;
//num++;
/*//另一种方法:但是运算速度比较慢
if(num==360000) num=0;
min10=num/(10*60*100);
min=(num%(10*60*100))/(60*100);
s10=((num%(10*60*100)%(60*100)))/(10*100);
s=(((num%(10*60*100)%(60*100)))%(10*100))/100;
ms100=((((num%(10*60*100)%(60*100)))%(10*100))%100)/10;
ms10=((((num%(10*60*100)%(60*100)))%(10*100))%100)%10;
*/
ms10++;
if(ms10==10)
{
ms10=0;
ms100++;
}
if(ms100==10)
{
ms100=0;
s++;
beep=0;
delayms(5);
beep=1;
delayms(5);
}
if(s==10)
{
s=0;
s10++;
}
if(s10==6)
{
s10=0;
min++;
}
if(min==10)
{
min=0;
min10++;
}
if(min10==6)
{
min10=0;
}
}
}
精确到0.01s的秒分计时器
最新推荐文章于 2023-12-07 09:50:45 发布