头像-366509

ca0043d2abcf26e0

个人成就

获得 0 次赞

帮助过0人

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

下面这个程序我编译的时候没问题,但仿真时频率值(仿真结果在下面)无法显示出来,希望有哪位大佬能帮我解答一下。#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;//自定义 }}