电子时钟程序(51单片机)
时间:10-02
整理:3721RD
点击:
这程序有两个问题我解决不了,求大神帮助。第一:计时不精确,跑16个小时,快了五分钟,可是我用的是10ms的定时啊,跑100遍,为什么不准确;
第二:数码管有两根比较暗,改变display函数里面控制各管语句的顺序时,变暗的数码管也会改变位置,搞不懂
代码如下:#include<reg52.h>
unsigned char code Tab[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
unsigned char temp,a,b,c,d,e,f,m,n,l,k,j,p;
unsigned long int t;
void delay(unsigned int z )
{
unsigned char j;
while(z--)
{
for(j=0;j<30;j++)
{ ; }
}
}
void display(unsigned long int t)
{
a=t%10;
b=t%100000%10000%1000%100/10;
c=t%100000%10000%1000/100;
d=t%100000%10000/1000;
e=t%100000/10000;
f=t/100000;
P0=Tab[10];
P2=0xdb;
delay(1);
P0=Tab[t/100000];
P2=0xfe;
delay(1);
P0=Tab[t%100000/10000];
P2=0xfd;
delay(1);
P0=Tab[t%100000%10000/1000];
P2=0xf7;
delay(1);
P0=Tab[t%10];
P2=0x7f;
delay(1);
P0=Tab[t%100000%10000%1000%100/10];
P2=0xbf;
delay(1);
P0=Tab[t%100000%10000%1000/100];
P2=0xef;
delay(1);
}
void init()
{ t=0;
temp=0;
EA=1; //开总中断
ET0=1; //定时器T0中断允许
TMOD=0x01; //使用定时器T0的模式1
TH0=(65536-9216)/256; //定时器T0的高8位赋初值
TL0=(65536-9216)%256; //定时器T0的高8位赋初值
TR0=1; //启动定时器T0
}
void Time0(void) interrupt 1 //“interrupt”声明函数为中断服务函数
//其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器
{
TH0=(65536-9216)/256; //定时器T0的高8位重新赋初值
TL0=(65536-9216)%256; //定时器T0的高8位重新赋初值
temp++;
if(temp==10)
{
temp=0;
if(b==5&&a==9)
{
t+=41;
}
else if(d==5&&c==9)
{
t+=4100;
}
else if(f==2&&e==4)
{
e=0;
f=0;
}
else t=t+1;
}
}
void main()
{
init();
while(1)
{
display(t);
}
}
第二:数码管有两根比较暗,改变display函数里面控制各管语句的顺序时,变暗的数码管也会改变位置,搞不懂
代码如下:#include<reg52.h>
unsigned char code Tab[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
unsigned char temp,a,b,c,d,e,f,m,n,l,k,j,p;
unsigned long int t;
void delay(unsigned int z )
{
unsigned char j;
while(z--)
{
for(j=0;j<30;j++)
{ ; }
}
}
void display(unsigned long int t)
{
a=t%10;
b=t%100000%10000%1000%100/10;
c=t%100000%10000%1000/100;
d=t%100000%10000/1000;
e=t%100000/10000;
f=t/100000;
P0=Tab[10];
P2=0xdb;
delay(1);
P0=Tab[t/100000];
P2=0xfe;
delay(1);
P0=Tab[t%100000/10000];
P2=0xfd;
delay(1);
P0=Tab[t%100000%10000/1000];
P2=0xf7;
delay(1);
P0=Tab[t%10];
P2=0x7f;
delay(1);
P0=Tab[t%100000%10000%1000%100/10];
P2=0xbf;
delay(1);
P0=Tab[t%100000%10000%1000/100];
P2=0xef;
delay(1);
}
void init()
{ t=0;
temp=0;
EA=1; //开总中断
ET0=1; //定时器T0中断允许
TMOD=0x01; //使用定时器T0的模式1
TH0=(65536-9216)/256; //定时器T0的高8位赋初值
TL0=(65536-9216)%256; //定时器T0的高8位赋初值
TR0=1; //启动定时器T0
}
void Time0(void) interrupt 1 //“interrupt”声明函数为中断服务函数
//其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器
{
TH0=(65536-9216)/256; //定时器T0的高8位重新赋初值
TL0=(65536-9216)%256; //定时器T0的高8位重新赋初值
temp++;
if(temp==10)
{
temp=0;
if(b==5&&a==9)
{
t+=41;
}
else if(d==5&&c==9)
{
t+=4100;
}
else if(f==2&&e==4)
{
e=0;
f=0;
}
else t=t+1;
}
}
void main()
{
init();
while(1)
{
display(t);
}
}
你那9216是啥啊?那是10ms吗?