找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2620|回复: 19
打印 上一主题 下一主题
收起左侧

各位大神,我又来求助数码管了,感谢

[复制链接]
跳转到指定楼层
楼主
数码管的原理我都懂,另外,重点强调,我这个是用138译码器控制数码管显示的,不是P1口;谢谢;
准备用8个数码管显示二进制累加的过程的,结果程序写下来提示控制数码管显示的代码没意义;不知道问题出在哪了。请大家多多指教,万分感谢;

译码器.png (26.94 KB, 下载次数: 27)

译码器.png

数码管.png (66.92 KB, 下载次数: 32)

数码管.png

代码.png (40.55 KB, 下载次数: 54)

代码.png

代码1.png (10.24 KB, 下载次数: 39)

代码1.png

错误.png (7.25 KB, 下载次数: 40)

错误.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:232280 发表于 2017-9-12 21:47 | 只看该作者
中间的代码,漏发了;

代码0.png (51 KB, 下载次数: 48)

代码0.png
回复

使用道具 举报

板凳
ID:89515 发表于 2017-9-13 01:24 | 只看该作者
#include<reg51.h>
typedef unsigned int uint;
typedef unsigned char uchar;
sbit A1=P1^4;
sbit B1=P1^3;
sbit C1=P1^2;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delayms(uchar x)
{
  uint i,j;
  for(i=x;i>0;i--)
          for(j=120;j>0;j--);
}
/*void display()
{
     uchar X,Y;
     for(X=0;X<16;X++)
             for(Y=0;Y<100;Y++)
             {
     
                     A1=0;B1=0;C1=0;P2=table[X];delayms(3);
                     A1=0;B1=0;C1=1;P2=table[X];delayms(3);
                     A1=0;B1=1;C1=0;P2=table[X];delayms(3);
                     A1=0;B1=1;C1=1;P2=table[X];delayms(3);
                     A1=1;B1=0;C1=0;P2=table[X];delayms(3);
                     A1=1;B1=0;C1=1;P2=table[X];delayms(3);
                     A1=1;B1=1;C1=0;P2=table[X];delayms(3);
                     A1=1;B1=1;C1=1;P2=table[X];delayms(3);
     
             }
} */
void hex()
{
        uchar m,su;
        for(m=0x00;m<0xff;m++)
                for(su=0;su<50;su++)
                {
                        A1=1;B1=1;C1=1;
                                if(m&0x01)P2=table[1];else P2=table[0];delayms(3);
                        A1=1;B1=1;C1=0;
                                if(m&0x02)P2=table[1];else P2=table[0];delayms(3);
                    A1=1;B1=0;C1=1;
                                if(m&0x04)P2=table[1];else P2=table[0];delayms(3);
                    A1=1;B1=0;C1=0;
                                 if(m&0x08)P2=table[1];else P2=table[0];delayms(3);
                    A1=0;B1=1;C1=1;
                                 if(m&0x10)P2=table[1];else P2=table[0];delayms(3);
                    A1=0;B1=1;C1=0;
                                 if(m&0x20)P2=table[1];else P2=table[0];delayms(3);
                    A1=0;B1=0;C1=1;
                                  if(m&0x40)P2=table[1];else P2=table[0];delayms(3);
                        A1=0;B1=0;C1=0;
                                if(m&0x80)P2=table[1];else P2=table[0];delayms(3);
                }
}
void main()
{
     while(1)
     {   
            // display();
                           hex();
     }            
}
16进制输出到一个完整的端口用led亮灭直接就可以表示出二进制状态。你要用数码管0和1表示,只需要判断哪个数码管该显示什么就行。这个由你的累加数决定

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:89515 发表于 2017-9-13 01:25 | 只看该作者
自己改程序匹配你的电路
回复

使用道具 举报

5#
ID:89515 发表于 2017-9-13 01:34 | 只看该作者
注意138的输入端一定要搞对,这个错了真值表就不能按次序排列,数码管显示就乱了。细心!!!

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

6#
ID:193818 发表于 2017-9-13 08:54 | 只看该作者
我个人建议你先让数码管显示一个数字,然后再动态刷新。循序渐进这样比较稳妥。一次性写那么多,出错了你都找不到北。否则也就没有那么多人说模块化了。
回复

使用道具 举报

7#
ID:232280 发表于 2017-9-13 15:20 | 只看该作者
mengzhixinheng 发表于 2017-9-13 01:24
#include
typedef unsigned int uint;
typedef unsigned char uchar;

非常感谢你的帮助,不过你这个代码出来后是不显示1的,只有0或者不显示,应该是该显示1的时候数码管没点亮。看了你的代码才知道我错在哪了,是每一行的table没有赋值给P0;显示才没有意义,现在已经改过来了,并且稍作修改后能正常显示,待会我会放下面,谢谢你了,你这个比较高端一点,我的代码就是最简单的逻辑来写的
回复

使用道具 举报

8#
ID:232280 发表于 2017-9-13 15:23 | 只看该作者
mengzhixinheng 发表于 2017-9-13 01:25
自己改程序匹配你的电路

感谢的你帮助,不是电路问题,犯了一个最基本的错误
回复

使用道具 举报

9#
ID:232280 发表于 2017-9-13 15:32 | 只看该作者
mengzhixinheng 发表于 2017-9-13 01:34
注意138的输入端一定要搞对,这个错了真值表就不能按次序排列,数码管显示就乱了。细心!!!

嗯,多谢提醒。我写的时候是对照真值表写的,所以不会出错
回复

使用道具 举报

10#
ID:232280 发表于 2017-9-13 15:35 | 只看该作者
漫步经心 发表于 2017-9-13 08:54
我个人建议你先让数码管显示一个数字,然后再动态刷新。循序渐进这样比较稳妥。一次性写那么多,出错了你都 ...

那样是好一点,不过我前面按照你这种方式写了一个十进制累加的,发现其实都一样的,因为后面是相同的,错误都是一样的,很方便改
回复

使用道具 举报

11#
ID:232280 发表于 2017-9-13 15:41 | 只看该作者
犯了一个基本错误。每一行的table没有赋值给P0端,只是写出来而已;另外if语句中应该是等于2时为真,还有最后一个if语句内容也稍作修改,才能加满后循环,感谢大家的帮助;下面把代码附上,亲测可用;
#include<reg52.h>
sbit A=P2^2;   //定义控制数码管管脚
sbit C=P2^3;
sbit D=P2^4;
typedef unsigned char u16;
typedef unsigned int u8;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
                                                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,
                                                        0x79,0x71,0x00};
void delay(u16 z)           //延时函数
{
        u16 x,y;
        for(x=z;x>0;x--)
                for(y=100;y>0;y--);
}
void main()                //数码管显示二进制累加函数
{
        u16 k,j,i,g;
        u16 h,f,m,a,l;   //定义变量
        j=0;i=0;g=0;h=0;f=0;m=0;l=0;
        while(1)                //大循环
         { for(k=0;k<3;k++)         //控制1数码管显示
                {
                        for(a=50;a>0;a--)  //使数码管显示时间足够人眼识别
                        {       
                                A=0;C=0;D=0;P0=table[k];delay(3);        //1数码管显示0或1
                                if(k==2){j++;k=0;}                                //当1数码管显示1后,使二数码管显示1;
                                A=1;C=0;D=0;P0=table[j];delay(3);        //控制2数码管显示0或1;
                                if(j==2){i++;j=0;}                                //以下相同;
                                A=0;C=1;D=0;P0=table[i];delay(3);
                                if(i==2){g++;i=0;}
                                A=1;C=1;D=0;P0=table[g];delay(3);
                                if(g==2){h++;g=0;}
                                A=0;C=0;D=1;P0=table[h];delay(3);
                                if(h==2){f++;h=0;}
                                A=1;C=0;D=1;P0=table[f];delay(3);
                                if(f==2){m++;f=0;}
                                A=0;C=1;D=1;P0=table[m];delay(3);
                                if(m==2){l++;m=0;}
                                A=1;C=1;D=1;P0=table[l];delay(3);
                                if(l==2){k=3;l=0;}                                 //退出循环
                        }
                }
        }
}

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

12#
ID:232905 发表于 2017-9-13 16:58 | 只看该作者
不会啊
回复

使用道具 举报

13#
ID:232280 发表于 2017-9-13 18:41 | 只看该作者

我现在会了,代码发在上面,有什么不懂的尽管问
回复

使用道具 举报

14#
ID:215712 发表于 2017-9-13 21:00 | 只看该作者
138译码器对应的程序有问题,数字显示错乱
回复

使用道具 举报

15#
ID:232986 发表于 2017-9-13 22:28 | 只看该作者
看来被人解决了啊
回复

使用道具 举报

16#
ID:232280 发表于 2017-9-13 22:36 | 只看该作者
18707072428 发表于 2017-9-13 21:00
138译码器对应的程序有问题,数字显示错乱

没有问题的!对照真值表写的。
回复

使用道具 举报

17#
ID:89515 发表于 2017-9-14 00:43 | 只看该作者
GOD丿小男孩 发表于 2017-9-13 15:20
非常感谢你的帮助,不过你这个代码出来后是不显示1的,只有0或者不显示,应该是该显示1的时候数码管没点 ...

我仿真了下没问题呀,很完美。可能仿真电路有些差别
回复

使用道具 举报

18#
ID:89515 发表于 2017-9-14 00:46 | 只看该作者
GOD丿小男孩 发表于 2017-9-13 15:20
非常感谢你的帮助,不过你这个代码出来后是不显示1的,只有0或者不显示,应该是该显示1的时候数码管没点 ...

也可能是软件差别,我用protues8.6,keil3.8a没问题
回复

使用道具 举报

19#
ID:226263 发表于 2017-9-17 21:05 | 只看该作者
楼主为什么要用delay呢??这样写的额程序很容易出问题,特别是对时序要求高的地方,建议用查询的方法来控制时序动作。
回复

使用道具 举报

20#
ID:111634 发表于 2017-9-18 19:36 | 只看该作者
主要问题是没理解138译码原理,从上述文字来看,现在可能还理解得不够!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表