打印

单片机驱动数码管问题,求大神指导啊

[复制链接]
599|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yes19891989|  楼主 | 2016-4-26 13:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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++;


}



相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

122

主题

952

帖子

6

粉丝