51单片机问题,自己弄的一个电子钟,出现数字变化很快(秒变的很快),什么原因,求解释

代码
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar code xunhuan[]={0x20,0x10 ,0x08,0x04,0x02,0x01}; /*循环显示*/
uchar weitable[6];//申明六位数码管
unsigned char jishu;
unsigned char second;
unsigned char minite;
unsigned char hour;
unsigned int mstcnt; /*临时变量0.25*4000=1s*/
unsigned char tcnt; /*临时变量用来2ms循环显示*/
uchar i,j;
uchar code duanxuan[]={

0xC0, //"0"
0xF9, //"1"
0xA4, //"2"
0xB0, //"3"
0x99, //"4"
0x92, //"5"
0x82, //"6"
0xF8, //"7"
0x80, //"8"
0x90, //"9"
0x88, //"A"
0x83, //"B"
0xC6, //"C"
0xA1, //"D"
0x86, //"E"
0x8E, //"F"
0x89, //"H"
0xC7, //"L"
0xC8, //"n"
0xC1, //"u"
0x8C, //"P"
0xA3, //"o"
0xBF, //"-"
0xFF, //熄灭
0xFF //自定义

};
/*void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}*/
/*void chushihua_T0()
{
TMOD=0x01;
TH0=(65536-250)/256;
TL0=(65536-250)%256;
EA=1;
ET0=1;
TR0=1;
}*/
void chushihua()
{
P2=0xff;
P0=0xc0;
}
void main()
{
chushihua();
TMOD=0x01;
TH0=(65536-250)/256;
TL0=(65536-250)%256;
EA=1;
ET0=1;
TR0=1;
while(1);
}
void timer0() interrupt 1
{
TH0=(65536-250)/256;
TL0=(65536-250)%256;
tcnt++;
mstcnt++;
if(tcnt==8)//2毫秒定时,2毫秒刷新一次数码管
{
tcnt=0;
P0=duanxuan[weitable[jishu]];
// delay(1);
P2=xunhuan[jishu];
for(i=248;i>0;i--) //*2ms延迟
for(j=8;j>0;j--);
//delay(10);
P2=0;
jishu++;
if(jishu==6)
jishu=0;
}
if(mstcnt==40000);//1s时
{
mstcnt=0;
second++;//秒加1
if(second==60)
{
second=0;//秒清零
minite++;//分加1
if(minite==60)
{
minite=0;
hour++;
if(hour==24)
{
hour=0;
}
}

}
}
weitable[0]=second%10;
weitable[1]=second/10;
weitable[2]=minite%10;
weitable[3]=minite/10;
weitable[4]=hour%10;
weitable[5]=hour/10;
}

试试下列修改:
void timer0() interrupt 1
{
TH0 = (65536 - 250) / 256;
TL0 = (65536 - 250) % 256;
tcnt++;
mstcnt++;
if(tcnt == 8) { //2毫秒定时,2毫秒刷新一次数码管.
tcnt = 0;
P0 = duanxuan[weitable[jishu]];
P2 = xunhuan[jishu];
jishu++;
if(jishu == 6) jishu = 0;
}
if(mstcnt == 40000) { //1s时.
mstcnt = 0;
second++; //秒加1
if(second == 60) {
second = 0; //秒清零.
minite++; //分加1
if(minite == 60) {
minite = 0;
hour++;
if(hour == 24) hour = 0;
}
}
weitable[0] = second % 10;
weitable[1] = second / 10;
weitable[2] = minite % 10;
weitable[3] = minite / 10;
weitable[4] = hour % 10;
weitable[5] = hour / 10;
}
}
//===============
你关键性的错误在于下一条:
if(mstcnt==40000);//1s时
注意到了吗?末尾,多了一个分号。追问

谢谢哈,这个问题解决了,不过改了后为什么,数字不是按照1s每次加的呢,晶振是12MHZ,我改的是if(mstcnt==4000),0.25X4000=1s是对的,不知道为什么,求解答,谢谢

追答

在12MHz时,4000,是对的。应该按照每秒加一。

追问

理论该对的,就是实际加的时候不是啊,怎么回事呢

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-06-05
应该是你的timer0太快,看看是不是时钟太快了,根据你设置的timer0的值来看,如果你的晶振得设置为10MHz,你再试试
第2个回答  2011-06-05
延时不够。要详细计算一下晶振到最后执行的之间之间的关系。不过多试试延时函数也可以凑出来。只是比较慢。(其实也不慢,总比找手册然后计算时间要来的实际一些。)
第3个回答  2011-06-05
时钟频率太高了吧