打印

数码管显示问题,求指导

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


}


相关帖子

沙发
luofeng2g| | 2016-4-26 14:04 | 只看该作者
                P2=0X01;
                P0=~table[10];//数码管第一位显示F
试试先段选,再位选,也就是上面的先后顺序换一下! 其余几组也是一样的

使用特权

评论回复
板凳
yes19891989|  楼主 | 2016-4-26 14:14 | 只看该作者
luofeng2g 发表于 2016-4-26 14:04
P2=0X01;
                P0=~table[10];//数码管第一位显示F
试试先段选,再位选,也就 ...

无论是线段选还是先位选,数码管后三位总是发生跳变,发生跳变是指数码管的a,b,c,d,e,f,g,dp全都亮(持续时间很短,但是总是周期性的发生,比如几秒钟就会出现一次),这问题烦死我了,一直没找到原因

使用特权

评论回复
地板
nethopper| | 2016-4-26 15:06 | 只看该作者
给“ture_hz/100”, “ture_hz%100/10”, “ture_hz%100%10”整个范围限制,估计在某种情况下,飞出数组table的范围了

使用特权

评论回复
5
cnb12345| | 2016-4-26 16:17 | 只看该作者

使用特权

评论回复
6
cjseng| | 2016-4-26 16:48 | 只看该作者
主函数里数码管显示的时候,ture_hz有可能会发生改变的,甚至在ture%100的过程中也可能会改变了,因为中断随时会打断你的显示程序。

使用特权

评论回复
7
yes19891989|  楼主 | 2016-4-26 17:04 | 只看该作者
cjseng 发表于 2016-4-26 16:48
主函数里数码管显示的时候,ture_hz有可能会发生改变的,甚至在ture%100的过程中也可能会改变了,因为中断 ...

那要如何解决呢?跪求解决方法

使用特权

评论回复
8
cjseng| | 2016-4-26 17:24 | 只看该作者
加个缓存,在主函数里每次显示之前,刷新缓存,显示数据只从缓存里读取

使用特权

评论回复
9
rankey| | 2016-5-5 13:41 | 只看该作者
yes19891989 发表于 2016-4-26 17:04
那要如何解决呢?跪求解决方法

把显示部分的程序在中断服务程序里试试。。

使用特权

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

本版积分规则

122

主题

952

帖子

6

粉丝