自己做了一个简易时钟,但是为什么数码管走一秒等于现实的三秒?求大神指导
#define uint unsigned int
#define uchar unsigned char
uchar H,M,S,count=0; //时分秒
uchar DAT[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴数码管编码0~9
void delay(unsigned int i)
{
char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}
void judge() //改变时分秒的值,使分秒都为60进制,时为24进制
{
if(S==60)
{
S=0;
M++;
}
if(M==60)
{
M=0;
H++;
}
if(H==24)
H=0;
}
void show() //显示函数,P2为位选,P0为段选
{
P2=0X7F;
P0=DAT[H/10];
delay(50); //第一位选中时,显示时的高位,延时下
P2=0XBF;
P0=DAT[H%10];
delay(50); //第二位选中时,显示时的低位,延时下
P2=0XDF;
P0=0X40;
delay(50); //第三位选中时,显示“-”,延时下
P2=0XEF;
P0=DAT[M/10];
delay(50); //第四位选中时,显示分的高位,延时下
P2=0XF7;
P0=DAT[M%10];
delay(50); //第五位选中时,显示分的低位,延时下
P2=0XFB;
P0=0X40;
delay(50); //第六位选中时,显示“-”,延时下
P2=0XFD;
P0=DAT[S/10];
delay(50); //第七位选中时,显示秒的高位,延时下
P2=0XFE;
P0=DAT[S%10];
delay(50); //第八位选中时,显示秒的低位,延时?
}
void main() //主函数
{
TMOD=0X01; //定时器0工作在方式1
TH0=(65536-50000)%256;
TL0=(65536-50000)/256; //设置定时器的初值,使得定时时间为50ms(晶振为12MHZ时)
EA=1; //开启总中断
ET0=1; //允许定时器0中断
TR0=1; //开启定时器0
while(1){
show(); //一直执行显示函
}
}
void timer0()interrupt 1 //定时器0中断服务程序
{
TH0=(65536-50000)%256;
TL0=(65536-50000)/256; //重新设置初值
count++; //每中断一次,计数寄存器加1
if(count==4) //当定时20次时,即50MS*20=1000ms=1s
{
count==0; //将计数值重新归零
S++;
judge(); //修改时分秒的值
}
隐患:if(count==4) //当定时20次时,即50MS*20=1000ms=1s
错误:count==0; //将计数值重新归零
void timer0()interrupt 1 //定时器0中断服务程序
{
TH0=(65536-50000)%256;
TL0=(65536-50000)/256; //重新设置初值
count++; //每中断一次,计数寄存器加1
if(count>=4) //当定时20次时,即50MS*20=1000ms=1s
{
count=0; //将计数值重新归零
S++;
judge(); //修改时分秒的值
}
}
TH0=(65536-50000)%256;
TL0=(65536-50000)/256; //重新设置初值
这两个写反了吧
void timer0()interrupt 1 //定时器0中断服务程序
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //重新设置初值
count++; //每中断一次,计数寄存器加1
if(count>=20) //当定时20次时,即50MS*20=1000ms=1s
{
count=0; //将计数值重新归零
S++;
judge(); //修改时分秒的值
}
}