打印

工业控制,数码管显示问题

[复制链接]
2622|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我是做电镀电源的,今天写了个数码管程序拿到车间测试,当给设备通20A一下的电流时,数码管还能正常显示,当电流达到30A以上,数码管显示就出现问题了,回出现数码管的段选发生偏移,一会又恢复正常显示,造成了一种闪烁感。请问如何在程序里屏蔽这种干扰……
段选偏移,比如说应该显示 却显示成 段选D偏移到H了

相关帖子

沙发
yan2626156|  楼主 | 2011-12-28 14:56 | 只看该作者
问题补充:段选控制用的是164,位选用的是138

使用特权

评论回复
板凳
ayb_ice| | 2011-12-28 15:04 | 只看该作者
首先是不是干扰都难说
软件BUG吧

使用特权

评论回复
地板
NE5532| | 2011-12-28 15:07 | 只看该作者
难说,可能软件BUG,也可能是工作电流大了,单片机的工作电源被拉垮,还可能是电磁干扰问题,楼主想下如何来确定是哪种呢。

使用特权

评论回复
5
yan2626156|  楼主 | 2011-12-28 15:08 | 只看该作者
如果是软件bug,那位什么当电流在20A之内又可以正常显示呢

使用特权

评论回复
6
NE5532| | 2011-12-28 15:11 | 只看该作者
软件不动作,电流怎么会上到30A呢?既然软件动作了,就可能存在内存冲突、变量被修改等问题,为什么不可能是软件呢?

使用特权

评论回复
7
yan2626156|  楼主 | 2011-12-28 15:12 | 只看该作者
#include<c8051F410.h>
#include <intrins.h>
#define  NOP() _nop_()  /* 定义空指令 */

typedef unsigned char uchar;
typedef unsigned int uint;

sbit seg_clk=P0^6;
sbit seg_dat=P0^7;

uchar code seg_data_disp[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};        //共阴数码管段码表0~9
uchar code seg_interface_disp[] = {0x78,0x5c,0x54,0x71,0x39,0x1c,0x50,0x77,0x38,0x76,0x3e,0x6d,0x40,0x73,0x5e,0x00};        //把除换成加,可以扩展人机界面                       
                                                                 //-0:t--1:o--2:n--3:F--4:C--5:u--6:r--7:A--8:L--9:H--10:V-11:S-12:--13:P-14:d-15:

uint voltage=0;        //电压
uint current=0;        //电流
bit V_show_flag=1;        //为0时不显示,为1时显示
bit A_show_flag=1;
bit V_data_flag=1;        //为1时显示数据,为0时显示界面
bit A_data_flag=1;        //为1时显示数据,为0时显示设置参数


//声明外部变量
extern uint idata r_and_d[7];

//段选
void F164SendDat(uchar dat)
{
        uchar i;
        for(i=0;i<8;i++)
        {
                if(0x80 & (dat<<i))
                        seg_dat=1;
                else
                        seg_dat=0;
                seg_clk=0;
                NOP();
                NOP();
                NOP();
                NOP();
                seg_clk=1;
        }
}

//位选
void weixuan(uchar wei)
{
        P1&=0x1f;
        P1|=wei<<5;                         
}

//------通用显示------
void all_display(void)
{
        static uchar chose=0;
        switch(chose)
        {
        //---------前四位-----------
                case 0:
                                if(V_show_flag)
                                {
                                        if(V_data_flag)        //显示数据
                                        {
                                                if(r_and_d[3]==3)
                                                        F164SendDat(seg_data_disp[voltage/1000%10]|0x80);                //送字型                       
                                                else
                                                {
                                                        if(voltage<1000)
                                                                F164SendDat(0x00);
                                                        else
                                                                F164SendDat(seg_data_disp[voltage/1000%10]);                //送字型
                                                }                                       
                                        }
                                        else        //显示界面
                                        {
                                                F164SendDat(seg_interface_disp[voltage/4096]);
                                        }
                                }
                                else       
                                        F164SendDat(0x00);
                                weixuan(0);
                                chose=1;
                                break;
                case 1:
                                if(V_show_flag)
                                {
                                        if(V_data_flag)        //显示数据
                                        {
                                                if(r_and_d[3]==2)
                                                        F164SendDat(seg_data_disp[voltage/100%10]|0x80);                //送字型                       
                                                else
                                                {
                                                        if(voltage<100 && r_and_d[3]<2)
                                                                F164SendDat(0x00);        //关显示
                                                        else
                                                                F164SendDat(seg_data_disp[voltage/100%10]);                //送字型
                                                }                                       
                                        }
                                        else        //显示界面
                                        {
                                                F164SendDat(seg_interface_disp[voltage/256%16]);
                                        }                               
                                }
                                else       
                                        F164SendDat(0x00);
                                weixuan(4);
                                chose=2;
                                break;
                case 2:
                                if(V_show_flag)
                                {
                                        if(V_data_flag)        //显示数据
                                        {
                                                if(r_and_d[3]==1)
                                                        F164SendDat(seg_data_disp[voltage/10%10]|0x80);                //送字型                       
                                                else
                                                {
                                                        if(voltage<10 && r_and_d[3]<1)
                                                                F164SendDat(0x00);
                                                        else
                                                                F164SendDat(seg_data_disp[voltage/10%10]);                //送字型
                                                }                                       
                                        }
                                        else        //显示界面
                                        {
                                                F164SendDat(seg_interface_disp[voltage/16%16]);
                                        }                               
                                }
                                else       
                                        F164SendDat(0x00);
                                weixuan(2);
                                chose=3;
                                break;       
                case 3:
                                if(V_show_flag)
                                {
                                        if(V_data_flag)        //显示数据
                                        {
                                                F164SendDat(seg_data_disp[voltage%10]);                //送字型
                                        }
                                        else        //显示界面
                                        {
                                                F164SendDat(seg_interface_disp[voltage%16]);
                                        }                               
                                }
                                else       
                                        F164SendDat(0x00);
                                weixuan(6);
                                chose=4;
                                break;

                //------------后四位---------------
                case 4:
                                if(A_show_flag)
                                {
                                        if(A_data_flag)        //显示数据
                                        {
                                                if(r_and_d[1]==3)
                                                        F164SendDat(seg_data_disp[current/1000%10]|0x80);                //送字型                       
                                                else
                                                {
                                                        if(current<1000)
                                                                F164SendDat(0x00);
                                                        else
                                                                F164SendDat(seg_data_disp[current/1000%10]);                //送字型
                                                }                                       
                                        }
                                        else        //显示设置参数
                                        {
                                                if(current<1000)
                                                        F164SendDat(0x00);
                                                else
                                                        F164SendDat(seg_data_disp[current/1000%10]);                //送字型                                       
                                        }                               
                                }
                                else       
                                        F164SendDat(0x00);
                                weixuan(1);
                                chose=5;
                                break;
                case 5:
                                if(A_show_flag)
                                {
                                        if(A_data_flag)        //显示数据
                                        {
                                                if(r_and_d[1]==2)
                                                        F164SendDat(seg_data_disp[current/100%10]|0x80);                //送字型                       
                                                else
                                                {
                                                        if(current<100 && r_and_d[1]<2)
                                                                F164SendDat(0x00);
                                                        else
                                                                F164SendDat(seg_data_disp[current/100%10]|0x00);                //送字型
                                                }                                       
                                        }
                                        else        //显示界面
                                        {
                                                if(current<100)
                                                        F164SendDat(0x00);
                                                else
                                                        F164SendDat(seg_data_disp[current/100%10]|0x00);                //送字型                                       
                                        }                               
                                }
                                else       
                                        F164SendDat(0x00);
                                weixuan(5);
                                chose=6;
                                break;
                case 6:
                                if(A_show_flag)
                                {
                                        if(A_data_flag)        //显示数据
                                        {
                                                if(r_and_d[1]==1)
                                                        F164SendDat(seg_data_disp[current/10%10]|0x80);                //送字型                       
                                                else
                                                {
                                                        if(current<10 && r_and_d[1]<1)
                                                                F164SendDat(0x00);
                                                        else
                                                                F164SendDat(seg_data_disp[current/10%10]);                //送字型
                                                }                                       
                                        }
                                        else        //显示界面
                                        {
                                                if(current<10)
                                                        F164SendDat(0x00);
                                                else
                                                        F164SendDat(seg_data_disp[current/10%10]);                //送字型                                       
                                        }                               
                                }
                                else       
                                        F164SendDat(0x00);
                                weixuan(3);
                                chose=7;
                                break;
       
                case 7:       
                                if(A_show_flag)
                                {
                                        F164SendDat(seg_data_disp[current%10]);        //一家亲                               
                                }
                                else       
                                        F164SendDat(0x00);
                                weixuan(7);
                                chose=0;
                                break;               
                default:chose=0;
                                break;                       
        }       
}

为了方便讨论,把程序贴出来了,void all_display(void)是放在定时器里的,大概是2ms中断一次

使用特权

评论回复
8
joyme| | 2011-12-28 15:14 | 只看该作者
每次都是D偏到H吗?还是随机偏移,偏移后会稳定还是会变化,先找出规律再分析问题可能出在哪里,在逐个排除

使用特权

评论回复
9
NE5532| | 2011-12-28 15:15 | 只看该作者
贴软件没用,你想,能当高手的,上班自己已经都忙到要死了,不会有时间来看的,肯定只跟你讨论方法了。想下怎么确定是软件问题还是硬件问题?

使用特权

评论回复
10
yan2626156|  楼主 | 2011-12-28 15:20 | 只看该作者
硬件是没问题的,有个工程师在同样的硬件环境下做的很稳定的,所以说是软件没控制好。偏移是随机偏移的,偏移过后,很快又会恢复正常

使用特权

评论回复
11
NE5532| | 2011-12-28 15:27 | 只看该作者
呵呵,不是这个道理,如果他的硬件一样存在问题,只是没掉进这个陷阱来呢?找问题要刨根问底,他给你说没问题?你找出了问题,你就已经胜过他了
eg.意味着你的工资可能会比他高了,诱惑力还不够大么?

使用特权

评论回复
12
SmartEnergy| | 2011-12-28 17:36 | 只看该作者
大家都没说清楚为什么要,为什么不要。我也不清楚。
对LZ的电镀电源感兴趣。如果能送个电源板样品给我的话,我一定帮你搞定。:lol

使用特权

评论回复
13
yan2626156|  楼主 | 2011-12-28 17:36 | 只看该作者
问题解决了,我给相应的管教加个弱上拉就可以了,谢谢各位了

使用特权

评论回复
14
NE5532| | 2011-12-28 17:53 | 只看该作者
问题解决了,我给相应的管教加个弱上拉就可以了,谢谢各位了
yan2626156 发表于 2011-12-28 17:36


看来大部份分都给偶了,谢谢。不过建议兄弟再想下那个人的程序为啥不出问题,下次就升华了。

使用特权

评论回复
15
谈的元| | 2011-12-28 19:12 | 只看该作者
为何加上拉就好了?

使用特权

评论回复
16
sohowork| | 2011-12-28 19:58 | 只看该作者
搂主,你最好就近找个老手当面帮你分析吧,感觉你不是一个点上有问题,可能整个系统不是很妥当。

使用特权

评论回复
17
chjmacong| | 2012-1-13 17:36 | 只看该作者
估计是电源和数码管及单片机供电问题,自己先排查这方面问题!

使用特权

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

本版积分规则

1

主题

72

帖子

1

粉丝