求助:频率计为什么不能正常工作


按书上抄的一个频率计实验.

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=posi0=temp & 0xbf;}}
                      else { for(j=0;j<200;j++) {P2=posi0=temp;}}
                      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)

    楼主别急,会搞好的,我就一个最小系统,使用24M晶振可以侧到七八百KHz,不过误差有点大,我先下载看看你的,要是能搞好了再来这里结贴^_^
  • asxxxx (2008-8-30 15:14:28)

    谢谢大家了,我搞明白了,书上有误.

    因为T1已经归零好多次,所以...
  • yanwuxu (2008-8-31 11:09:42)

    先声明我不是大侠,只是老一点的菜鸟^_^
    首先你的理论计算有误,按你的晶振值理论最高应该能是11059200/24=460.8kHz,不是你的912.6kHz;
    其次你的T1计数器如果没有外扩的话最高只能到64k,超过就溢出了;
    最后不明白楼主为什么采用10ms定时,个人觉得这个值应该是越长计数越准确吧?

    虽然发迟了还是要来发一下结贴!
    本来是昨天回复的,结果死活发不了,所以再试试,不行明天再试^_^