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;//自定义 }}