找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机proteus仿真中遇到的数码管问题

[复制链接]
跳转到指定楼层
楼主
本菜鸡大三,目前在做单片机设计,三个课题,其中一个是实现路口红绿灯,但是我遇到的问题是我的数码管显示不正常,现象是开始仿真后看不见数码管显示的数字,只有按下暂停才会显示代码我也没找到问题,数码管采用共阳极接法,在proteus中的型号名称为7SEG-MPX8-CA,第一个图片就可以看作是proteus开始仿真的实时效果,,第二个图片是按下暂停时的效果,关于数码管部分我想达到的效果是第三个图里数字时钟的那种显示效果,关于数码管显示的代码如下,求大佬指点一二,
#include <regx52.h>
#include <INTRINS.H>
#include "tim.h"
void delay(uchar xms);
void shumashow(uchar location,uchar number);
void display();
void displays(void);
uchar button=0;
uchar code shuma[10]={0x88,0xbb,0xc1,0x91,0xb2,0x94,0x04,0xb9,0x80,0x90};


void main(){

        while(1){
displays();
        }

}
/*
                数码管显示
*/
void displays(void){
                shumashow(1,1);delay(1);
                shumashow(2,2);delay(1);
                shumashow(3,3);delay(1);
                shumashow(4,4);delay(1);
                shumashow(5,5);delay(1);
                shumashow(6,6);delay(1);
                shumashow(7,7);delay(1);
                shumashow(8,8);delay(1);
}

void shumashow(uchar location,uchar number){
       
                switch(location){
                        case 1:        P1_0=0;        P1_1=0;P1_2=0;break;
                        case 2:        P1_0=0;        P1_1=0;P1_2=1;break;
                        case 3:        P1_0=0;        P1_1=1;P1_2=0;break;
                        case 4:        P1_0=0;        P1_1=1;P1_2=1;break;
                        case 5:        P1_0=1;        P1_1=0;P1_2=0;break;
                        case 6:        P1_0=1;        P1_1=0;P1_2=1;break;
                        case 7:        P1_0=1;        P1_1=1;P1_2=0;break;
                        case 8:        P1_0=1;        P1_1=1;P1_2=1;break;
                }
                P0=shuma[number];
               
}

void delay(uchar xms){
       
                uchar i,j;
                while(xms){
                                i=2;
                                j=239;
                                do{
                                                        while(--j);                               
                                }while(--i);
                                xms--;
                }       
}

屏幕截图 2025-12-28 201548.png (108.35 KB, 下载次数: 0)

数码管显示部分的电路图

数码管显示部分的电路图

屏幕截图 2025-12-28 202016.png (111.67 KB, 下载次数: 0)

仿真运行中按下暂停键

仿真运行中按下暂停键

屏幕截图 2025-12-28 202101.png (55.38 KB, 下载次数: 0)

想达到的效果

想达到的效果
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1114752 发表于 2025-12-28 20:29 | 只看该作者
求大佬,让我康康大佬在哪里
回复

使用道具 举报

板凳
ID:1114752 发表于 2025-12-28 20:36 | 只看该作者
为什么我再24小时必答区找不到我的这个帖子呢?
回复

使用道具 举报

地板
ID:277550 发表于 2025-12-29 08:35 | 只看该作者
显示每一位,在后面添加适当延时。
回复

使用道具 举报

5#
ID:1114752 发表于 2025-12-29 10:31 来自触屏版 | 只看该作者
devcang 发表于 2025-12-29 08:35
显示每一位,在后面添加适当延时。

我在代码里已经加了,在displays函数中,每次显示都加了delay(1),但是没用,我除非是把这个delay时间拉长,但是这样就会看着一闪一闪的,并不能算是动态显示了
回复

使用道具 举报

6#
ID:69038 发表于 2025-12-29 11:55 | 只看该作者
都说写代码的有强迫症,但我在你的代码和图中看不出半点,反而很随意。。
代码中,段驱是P0,偏偏网标是P10~P17,过个电阻又变成P1~P8,
位驱是P1,偏偏网标是P31~P33,过个译码器,又变成P21~P28了。。头疼!

delay(1)是1毫秒吗?那也太小了。
回复

使用道具 举报

7#
ID:349276 发表于 2025-12-29 12:04 | 只看该作者
zhuls 发表于 2025-12-29 11:55
都说写代码的有强迫症,但我在你的代码和图中看不出半点,反而很随意。。
代码中,段驱是P0,偏偏网标是P1 ...

我嫩是没看懂那连线和代码之间有啥关系。
回复

使用道具 举报

8#
ID:1114752 发表于 2025-12-29 12:25 | 只看该作者
zhuls 发表于 2025-12-29 11:55
都说写代码的有强迫症,但我在你的代码和图中看不出半点,反而很随意。。
代码中,段驱是P0,偏偏网标是P1 ...

哈哈哈哈,抱歉了佬,我画电路图的时候没想过这能和代码有什么关系,我就是先把电路图画对,逻辑没问题,单独写代码测试没问题,然后我网络标号我就随意标了,直接写代码了,可能是因为本身这个proetus软件我也不怎么用,只是学单片机的时候简单的学过,佬说的问题我以后一定会注意的,
回复

使用道具 举报

9#
ID:327265 发表于 2025-12-29 12:29 | 只看该作者
他仿真版本封装有一点影响,切换位显示时候缩短时间
回复

使用道具 举报

10#
ID:88256 发表于 2025-12-29 12:33 | 只看该作者
zhuls 发表于 2025-12-29 11:55
都说写代码的有强迫症,但我在你的代码和图中看不出半点,反而很随意。。
代码中,段驱是P0,偏偏网标是P1 ...

看样子是简单的复制,否则也不会把P1.0等标成P31等了
回复

使用道具 举报

11#
ID:1114752 发表于 2025-12-29 13:35 | 只看该作者
hhdsdy 发表于 2025-12-29 12:33
看样子是简单的复制,否则也不会把P1.0等标成P31等了

啊,不是的,从电路到代码都是我自己独立完成的,真的,我是有单片机基础的,大一就学C语言51,32单片机,只是这学期上课才学的proteus,至于这个网络标号我标的时候真没想这么多,只想着对应起来就够了
回复

使用道具 举报

12#
ID:1114752 发表于 2025-12-29 13:39 | 只看该作者
hhdsdy 发表于 2025-12-29 12:33
看样子是简单的复制,否则也不会把P1.0等标成P31等了

我解释一下我的网络标号为什么要这样标,首先我没想着要和单片机的引脚对应,我先标的是数码管的段和电阻,所以我就标了p1-8,然后标的电阻左边和p0引脚,然后我就标称了p11-18,当时真没想过这么多
回复

使用道具 举报

13#
ID:69038 发表于 2025-12-29 15:35 | 只看该作者
YSY521 发表于 2025-12-29 13:39
我解释一下我的网络标号为什么要这样标,首先我没想着要和单片机的引脚对应,我先标的是数码管的段和电阻 ...

这样标也不是不行,就是原则上有点乱。。

强迫症们对于数码管,一般段驱以SEG_0~SEG_7,或SEG_A~SEG_H,位驱以DIG1_DIG8,。。。
对于IO,一般是以其实际标号,如P10,P23,之类的直接标上,或以功能如Dat0,ROM_SCK、FLASH_SDA_IN, SPI1_CS,==.
这样,图和代码的可读性无形间提高了好几档。。
====以上纯属个人观点====



回复

使用道具 举报

14#
ID:1114752 发表于 2025-12-29 16:10 | 只看该作者
zhuls 发表于 2025-12-29 15:35
这样标也不是不行,就是原则上有点乱。。

强迫症们对于数码管,一般段驱以SEG_0~SEG_7,或SEG_A~SEG_H ...

嗯,我知道了,以后会注意的,这要是我没怎么接触过这个proteus软件,只是上课需要,所以就学了学,但是这不是我问的重点啊,我的数码管就是不正常,把延时时间拉长就会变成雷系流水灯的效果,并不是想要的动态显示,在标网络标号的之前我都测试过没问题,每一位都能正常显示,逻辑也没有问题,但是加上循环显示之后就变成上面我所说的情况了
回复

使用道具 举报

15#
ID:69038 发表于 2025-12-29 16:22 | 只看该作者
YSY521 发表于 2025-12-29 16:10
嗯,我知道了,以后会注意的,这要是我没怎么接触过这个proteus软件,只是上课需要,所以就学了学,但是 ...

来自DEEPSEEK的:
关键参数:
‌MCU型号‌:89C52
‌晶振频率‌:12MHz
‌机器周期‌:12个时钟周期(12MHz / 12 = 1MHz)
‌延时循环‌:i=2,j=239
计算过程:
‌内层循环‌:while(--j) 执行 239 次
‌外层循环‌:do{...}while(--i) 执行 2 次
‌每次 delay(1) 的总循环次数‌:239 * 2 = 478 次
‌每次循环的机器周期数‌:478 次循环 * 1 机器周期 = 478 机器周期
‌总延时时间‌:478 机器周期 * 1μs/机器周期 = 478μs
结论:
delay(1) 的延时时间为 ‌478μs‌(微秒)

每位0.5ms的延时,明显不够!
扫描显示,至少一屏(8位)不超20ms,才能视觉不闪,每位显示约2.5ms,时间越长,亮度越高,但可能会有闪烁感,时间越短,显示亮度又可能上不去,你自己平衡一下。。
回复

使用道具 举报

16#
ID:275826 发表于 2025-12-29 17:37 | 只看该作者
程序错的,图也错的,仔细看74LS138的用法
回复

使用道具 举报

17#
ID:1114752 发表于 2025-12-31 13:07 | 只看该作者
zhuls 发表于 2025-12-29 16:22
来自DEEPSEEK的:
关键参数:
‌MCU型号‌:89C52

谢谢佬的帮忙了,我最后发现问题不是138译码器,也不是程序的问题,最后查资料发现是74ls240芯片的电压问题,更换成74hc240后就正常了
回复

使用道具 举报

18#
ID:1114752 发表于 2025-12-31 13:08 | 只看该作者
谢谢各位佬的帮忙了,我最后发现问题不是138译码器,也不是程序的问题,最后查资料发现是74ls240芯片的电压问题,更换成74hc240后就正常了,感谢各位的帮助,至于网络标号我以后会注意的
回复

使用道具 举报

19#
ID:123289 发表于 2026-1-7 10:09 | 只看该作者
不要用delay延时,当你delay时,LED显示就失控了。要用定时器做延时。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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