按书上抄的一个频率计实验.
T0每2.5ms中断一次(TH0=0xfe),4次即10ms.
T1作为计数器,用来保存10ms内机器周期的个数.并显示出来.
理论分析,10ms内计到的周期数应是10ms/12/11.0592MHz=9216次,所以频率应该是921.6KHz.但程序显示的是115.1KHz.
为什么? 程序如下 proteus仿真图见附件
顺便问一下,在proteus中4060如何使用? 谢谢大侠们的回答
#include <reg51.h>
unsigned char dispbuf[4];
unsigned int period;
unsigned int timecount=0;
unsigned int count_1s;
unsigned char code table[]={0x42,0xee,0x58,0x68,0xe4,0x61,0x41,0xea,0x40,0x60};
HEX_TO_BCD(unsigned int n)
{
dispbuf[3]=n/1000;
dispbuf[2]=(n/100)%10;
dispbuf[1]=(n/10)%10;
dispbuf[0]=n%10;
}
void scandisp(void)
{
unsigned char posi=0x01;
unsigned char i,j,temp;
for(i=0;i<4;i++)
{
temp=dispbuf;
temp=table[temp];
if(i==1) { for(j=0;j<200;j++) {P2=posi;P0=temp & 0xbf;}}
else { for(j=0;j<200;j++) {P2=posi;P0=temp;}}
posi<<=1;
}
}
void INIT_TMR1INT(void)
{
TMOD=0x11;
ET1=1;
ET0=1;
EA=1;
TR0=1;
TR1=1;
}
void timer0(void) interrupt 1
{
TH0=0xf7;
if(++count_1s>4)
{
count_1s=0;
timecount=TH1*256+TL1;
TL1=0x00;
TH1=0x00;
period=timecount/10;
if((timecount%10)>4) period++;
timecount=0;
HEX_TO_BCD(period);
}
}
void main(void)
{
INIT_TMR1INT();
while(1)
{
scandisp();
}
}
proteus.rar
(2008-08-30 01:24:55, Size: 15.1 KB, Downloads: 6)

最新回复
liaoguobao00 (2008-8-30 08:42:49)
#include <reg51.h>
unsigned char dispbuf[4];
unsigned int period;
unsigned int timecount=0;
unsigned char count_1s;
unsigned char code table[]={0x42,0xee,0x58,0x68,0xe4,0x61,0x41,0xea,0x40,0x60};
HEX_TO_BCD(unsigned int n)
{
dispbuf[3]=n/1000;
dispbuf[2]=(n/100)%10;
dispbuf[1]=(n/10)%10;
dispbuf[0]=n%10;
}
void scandisp(void)
{
unsigned char posi=0x01;
unsigned char i,j,temp;
for(i=0;i<4;i++)
{
temp=dispbuf;
temp=table[temp];
if(i==1) { for(j=0;j<200;j++) {P2=posi
else { for(j=0;j<200;j++) {P2=posi
posi<<=1;
}
}
void INIT_TMR1INT(void)
{
TMOD=0x11;
ET1=1;
ET0=1;
EA=1;
TR0=1;
TR1=1;
TH0=63036/256;
TL0=63036%256;
}
void timer0(void) interrupt 1
{
TH0=63036/256;
TL0=63036%256;
count_1s++;
if(count_1s==4)
{
count_1s=0;
timecount=TH1*256+TL1;
TL1=0x00;
TH1=0x00;
period=timecount/10;
if((timecount%10)>4) period++;
timecount=0;
HEX_TO_BCD(period);
}
}
void main(void)
{
INIT_TMR1INT();
while(1){
scandisp(); }
}
asxxxx (2008-8-30 10:18:35)
现在根本不显示了
yanwuxu (2008-8-30 10:52:58)
asxxxx (2008-8-30 15:14:28)
因为T1已经归零好多次,所以...
yanwuxu (2008-8-31 11:09:42)
首先你的理论计算有误,按你的晶振值理论最高应该能是11059200/24=460.8kHz,不是你的912.6kHz;
其次你的T1计数器如果没有外扩的话最高只能到64k,超过就溢出了;
最后不明白楼主为什么采用10ms定时,个人觉得这个值应该是越长计数越准确吧?
虽然发迟了还是要来发一下结贴!
本来是昨天回复的,结果死活发不了,所以再试试,不行明天再试^_^