节省一点资源,只用一个定时器就够了
而且采用自装入方式定时,可以减少计时误差
试试:
#include
sbit wei=P2^7;
sbit duan=P2^6;
unsigned char times=0,times1=0,s=0,m=0,h=0,shua=0;
unsigned char i_x=0;
unsigned char time[4]={0};
unsigned char code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
unsigned char code tablew[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
void Deplay(unsigned char c); //延迟函数
void XianShi(); //数码管显示函数
void Init(); //初始化函数
void Timing(); //计算分钟 小时 的数值
void main()
{
Init();
while(1)
{
PCON=0x01; //休眠
}
}
void Init()
{
TMOD=0x2; //方式2:8位自装入
TH0=0x6; //基础定时250us
TL0=0x6;
TR0=1;
ET0=1;
EA=1;
}
void Delay(unsigned char c) //延迟函数
{
unsigned char i;
while(c--)
{
for(i=0;i<200;i++);
}
}
void flash() interrupt 1 //计时器 动态刷数码管
{
if(++times>=20) //定时5ms
{
times=0;
if(++times1>=200)//定时1秒
{
times1=0;
Timing();//计时+1秒
}
XianShi();//逐位显示
}
}
void XianShi() //数码管逐位显示
{
unsigned char dis_Num;
if(++i_x>3)
{
i_x=0;
P0=tablew[i_x]; //位选 第几个 数码管亮
wei=1;
wei=0;
dis_Num=time[i_x];
P0=table[dis_Num]; //段选 此数码管该亮什么图案
duan=1;
duan=0;
//Delay(1);
}
}
void Timing()
{
if(++s>=60)
{
s=0;
if(++m>=60)
{
m=0;
if(++h>=24)h=0;
}
}
time[0]=h/10;
time[1]=h%10;
time[2]=m/10;
time[3]=m%10;
}
没有具体实验,只是估计为程序只在忙活T0中断了,顾不上T1了,建议定时器初始化程序中设置下T1中断优先,如果能改善的话就是了,如果影响到显示的扫描,就用延时函数来控制动态扫描