很困惑的一个问题——数码管秒表
时间:10-02
整理:3721RD
点击:
以下这段程序时间走的比实际的快很多,不像是误差造成的。如在while(1)主循环里面随便加条语句后就正常了,不知道是什么原因求解!
-----------------------------------------------------------------
#include<reg51.h>
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
unsigned char code LedChar[] = {0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
unsigned char LedBuff[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
unsigned int cnt = 0;
unsigned long sec = 0;
void main()
{
EA = 1;
TMOD = 0x01;
TH0 = 0xFC;
TL0 = 0x67;
TR0 = 1;
ET0 = 1;
while(1)
{
if(cnt >= 1000)
{
cnt = 0;
sec++;
LedBuff[0] = LedChar[sec%10];
LedBuff[1] = LedChar[sec/10%10];
LedBuff[2] = LedChar[sec/100%10];
LedBuff[3] = LedChar[sec/1000%10];
LedBuff[4] = LedChar[sec/10000%10];
LedBuff[5] = LedChar[sec/100000%10];
}
**如果在这个位置随便加条语句后就正常了**
}
}
void InterruptTimer0() interrupt 1
{
static unsigned char i = 0;
TH0 = 0xFC;
TL0 = 0x67;
cnt++;
P0 = 0x00;
switch(i)
{
case 0: ADDR0 = 1; ADDR1 = 1; ADDR2 = 1; i++; P0 = LedBuff[0]; break;
case 1: ADDR0 = 1; ADDR1 = 1; ADDR2 = 0; i++; P0 = LedBuff[1]; break;
case 2: ADDR0 = 1; ADDR1 = 0; ADDR2 = 1; i++; P0 = LedBuff[2]; break;
case 3: ADDR0 = 1; ADDR1 = 0; ADDR2 = 0; i++; P0 = LedBuff[3]; break;
case 4: ADDR0 = 0; ADDR1 = 1; ADDR2 = 1; i++; P0 = LedBuff[4]; break;
case 5: ADDR0 = 0; ADDR1 = 1; ADDR2 = 0; i=0; P0 = LedBuff[5]; break;
default : break;
}
}
-----------------------------------------------------------------
#include<reg51.h>
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
unsigned char code LedChar[] = {0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
unsigned char LedBuff[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
unsigned int cnt = 0;
unsigned long sec = 0;
void main()
{
EA = 1;
TMOD = 0x01;
TH0 = 0xFC;
TL0 = 0x67;
TR0 = 1;
ET0 = 1;
while(1)
{
if(cnt >= 1000)
{
cnt = 0;
sec++;
LedBuff[0] = LedChar[sec%10];
LedBuff[1] = LedChar[sec/10%10];
LedBuff[2] = LedChar[sec/100%10];
LedBuff[3] = LedChar[sec/1000%10];
LedBuff[4] = LedChar[sec/10000%10];
LedBuff[5] = LedChar[sec/100000%10];
}
**如果在这个位置随便加条语句后就正常了**
}
}
void InterruptTimer0() interrupt 1
{
static unsigned char i = 0;
TH0 = 0xFC;
TL0 = 0x67;
cnt++;
P0 = 0x00;
switch(i)
{
case 0: ADDR0 = 1; ADDR1 = 1; ADDR2 = 1; i++; P0 = LedBuff[0]; break;
case 1: ADDR0 = 1; ADDR1 = 1; ADDR2 = 0; i++; P0 = LedBuff[1]; break;
case 2: ADDR0 = 1; ADDR1 = 0; ADDR2 = 1; i++; P0 = LedBuff[2]; break;
case 3: ADDR0 = 1; ADDR1 = 0; ADDR2 = 0; i++; P0 = LedBuff[3]; break;
case 4: ADDR0 = 0; ADDR1 = 1; ADDR2 = 1; i++; P0 = LedBuff[4]; break;
case 5: ADDR0 = 0; ADDR1 = 1; ADDR2 = 0; i=0; P0 = LedBuff[5]; break;
default : break;
}
}
你的晶振频率与人家的频率一样吗?
你的这个数应该是根据11.0592Mhz的晶振算出来的
对啊,我的晶振是11.0592
你的代码跟 手把手教你学 51 单片机-C 语言版 这本书上的极其相似。
要不你再看看。
http://pan.baidu.com/s/1c0zkWIc
竟然将计时与LED驱动写在同一个定时器
本人初学,就是看那教程来的,试了就是很奇怪。
初学者,还望大家多多指点迷津
不错的文档,值得收藏
先看看你使用的晶振频率,STC有个计算表,算一下时间,或者就是用keil测试运行那条语句实际运行时间
