|
50黑币
下面这个程序我编译的时候没问题,但仿真时频率值(仿真结果在下面)无法显示出来,希望有哪位大佬能帮我解答一下。
- #include <AT89X51.H>
- unsigned char code dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //P2的扫描位
- unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
- 0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40}; //数码管的字形编码
- unsigned char dispbuf[8]={0,0,0,0,0,0,10,10}; //初始化显示值
- unsigned char temp[8]; //存放显示的数据
- unsigned char dispcount; //显示计数器值
- unsigned char T0count; //T0的计数器值
- unsigned char timecount; //计时计数器值
- unsigned int ge,shi,bai,qian,wan,sw,bw,qw;//声明数码管个位变量、数码管十位变量、数码管百位变量、数码管千位变量...
- 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;//自定义
- }
- }
复制代码
|
|