本帖最后由 yes19891989 于 2016-4-26 14:01 编辑
用单片机频率测量的程序,频率值用4位共阳极的数码管显示,但是在数码管显示的时候,频率值总是跳变,第二个数码管(也就是频率的十位总是突然一下全部点亮,然后在现实正常值,过一会又全部点亮),第三位也会发生跳变为别的数字,求大神指导一下,看看下面的程序有什么问题啊,求知道
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned long
#define N 10
uchar code table[12] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x71,0X40};//0,1,2,3,4,5,6,7,8,9,H,-
uint pulse=0;
uint freq=0;
uchar flag;
uchar temp=0;
uint a=0,b=0;
uint count[N];
uint ture_hz;
uint temp_hz;
uint now_hz;
void delay_1ms(uint i) //延时1ms
{
uint x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
void Time0_Init()//中断与定时器初始化
{
EA=1;
TMOD = 0x01;
EX1=1;
IT1=1;
TH0 = 0x00;
TL0 = 0x00;
ET0=1;
}
uint paixu()//将频率值进行排序
{
int i,j;
int temp,temp1;
for(i=0;i<N;i++)
{
for(j=(1+i);j<(N-j);j++)
{
if(count>count[j])
{
temp=count;
count=count[j];
count[j]=temp;
}
}
}
temp1=count[(N-1)/2];
return temp1;;
}
void main()
{
Time0_Init();
while(1)
{
P2=0X01;
P0=~table[10];//数码管第一位显示F
delay_1ms(1);
P0=0XFF;//ÊýÂë¹ÜÇåÁã
P2=0X02;
P0=~table[ture_hz/100];//数码管第二位显示频率的十位
delay_1ms(1);
P0=0XFF;
P2=0X04;
P0=(~table[ture_hz%100/10])&0x7f;//显示频率值的个位
delay_1ms(1);
P0=0XFF;
P2=0X08;
P0=~table[ture_hz%100%10];//显示频率值的小数点后一位
delay_1ms(1);
P0=0XFF;
}
}
void init_1(void) interrupt 2//外部中断函数
{
if(pulse==0)//pulse为变量值
{
TH0=0;
TL0=0;
TR0=1;//开启定时器
pulse++;
}
else
{
TR0=0;//关闭定时器
pulse=0;
freq=(flag*65536+TH0*256+TL0);//算出一个脉冲宽度的时间
temp_hz=10000000/freq;//通过一个周期时间算出频率值
if(temp_hz>200)//当频率值大于20HZ
{
count[a]=temp_hz;
if(a>(N-1))
{
a=0;
ture_hz=paixu();//将排序后的值(中间值)赋予给最终频率
}
else a++;
flag=0;
}
else//频率小于20HZ
{
ture_hz=temp_hz;
flag=0;
a=0;
}
}
}
void time0() interrupt 1
{
flag++;
}
|