• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

简易单片机频率的相关问题 无法显示频率值

ca0043d2abcf26e0 2020-06-27 浏览量:524
下面这个程序我编译的时候没问题,但仿真时频率值(仿真结果在下面)无法显示出来,希望有哪位大佬能帮我解答一下。
#include <AT89X51.H> 
unsigned char code dispbit[]={0xfe0xfd0xfb0xf70xef0xdf0xbf0x7f};     //P2的扫描位
unsigned char code dispcode[]={0x3f0x060x5b0x4f0x66 
                               0x6d0x7d0x070x7f0x6f0x000x40};    //数码管的字形编码
unsigned char dispbuf[8]={0000001010}; //初始化显示值
unsigned char temp[8];     //存放显示的数据
unsigned char dispcount;   //显示计数器值
unsigned char T0count;     //T0的计数器值
unsigned char timecount;   //计时计数器值
unsigned int geshibaiqianwanswbwqw;//声明数码管个位变量、数码管十位变量、数码管百位变量、数码管千位变量...
bit flag;                  //标志位
unsigned long x;           //频率值
//频率计算函数
void HzCal(void)
{
  unsigned char i; 
  x=T0count*65536+TH0*256+TL0; //得到T0的16位计数器值
  for(i=0;i<8;i++) 
  { 
    temp[i]=0; 
  } 
         i=0; 
         while(x/10)         //拆分
           { 
             temp[i]=x%10; 
             x=x/10; 
             i++; 
           } 
         temp[i]=x; 
         for(i=0;i<6;i++)    //换算为显示数据
           { 
             dispbuf[i]=temp[i]; 
           } 

         T0count=0; 
}
void main(void) 
{

  TMOD=0x15;              //设置定时器工作方式
  TH0=0; 
  TL0=0; 
  TH1=(65536-1000)/256; 
  TL1=(65536-1000)%256;       //初始化T1
  TR1=1; 
  TR0=1; 
  ET0=1; 
  ET1=1; 
  EA=1;                     //开中断

  while(1) 
   { 
     if(flag==1) 
       { 
         flag=0; 
         HzCal();   //频率计算函数
         TH0=0; 
         TL0=0; 
         TR0=0;                   
       } 
    if(timecount>=1000)//判断定时器1中断次数变量是否大于等于1000,即1s。
   {
     TR0=1; 
     timecount=0;//定时器1中断次数变量置0
     flag=1;//数码管初始化标志位变量置1
     ge=dispcode[dispbuf[0]];//数码管个位变量
     shi=dispcode[dispbuf[1]];//数码管十位变量
     bai=dispcode[dispbuf[2]];//数码管百位变量
     qian=dispcode[dispbuf[3]];//数码管千位变量
     wan=dispcode[dispbuf[4]];
         sw=dispcode[dispbuf[5]];
         bw=dispcode[dispbuf[6]];
         qw=dispcode[dispbuf[7]];
    }
         if(timecount<1000&&flag==0)//判断定时器1中断次数变量是否小于1000和数码管初始化标志位变量是否等于0
    {
     ge=dispcode[0];//数码管个位变量为0
     shi=dispcode[0];//数码管十位变量为0
     bai=dispcode[0];//数码管百位变量为0
     qian=dispcode[0];//数码管千位变量为0
         wan=dispcode[0];
         sw=dispcode[0];
         bw=dispcode[0];
         qw=dispcode[0];
    }        
   } 


//定时器T0中断服务子函数
void t0(void) interrupt 1 using 0 

  T0count++; 

//定时器T1中断服务子函数  
void t1(void) interrupt 3 using 0 

  unsigned char i; 
  TH1=(65536-1000)/256; 
  TL1=(65536-1000)%256;          //初始化T1预装值,1ms定时
  timecount++;                   //扫描
  P2=0xff;
   switch(i)//让8位数码管以1ms间隔轮流刷新
{

    case 0:  
           P0=ge;//数码管个位数值显示
           P2=0xfe;//数码管个位显示位 
           i++;//选位变量先赋值再加加 
           break;
    case 1: 
           P0=shi;//数码管十位数值显示
           P2=0xfd;//数码管十位显示位    
           i++;//选位变量先赋值再加加 
           break;
    case 2: 
           P0=bai;//数码管百位数值显示 
           P2=0xfb;//数码管百位显示位 
           i++;//选位变量先赋值再加加 
           break;
    case 3: 
           P0=qian;//数码管千位数值显示 
           P2=0xf7;//数码管千位变量显示位 
           i++;//选位变量置0
           break;
    case 4: 
           P0=wan;//数码管千位数值显示 
           P2=0xef;//数码管千位变量显示位 
           i++;//选位变量置0
           break;
    case 5: 
           P0=sw;//数码管千位数值显示 
           P2=0xdf;//数码管千位变量显示位 
           i++;//选位变量置0
           break;
    case 6: 
           P0=bw;//数码管千位数值显示 
           P2=0xdf;//数码管千位变量显示位 
           i++;//选位变量置0
           break;
    case 7: 
           P0=qw;//数码管千位数值显示 
           P2=0xdf;//数码管千位变量显示位 
           i=0;//选位变量置0
           break;

    default : break;//自定义 
}
}

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
所有亮答 数量:1
  • 定时器T1中断服务子函数部分的具体逻辑你可能要捋一捋啊,从现在的代码看,中断调用后i一直是0的。

    估计你应该让i变量变为静态变量。

相关问题

问题达人换一批

简易单片机频率的相关问题 无法显示频率值