找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2527|回复: 12
收起左侧

单片机74hc595数码管显示程序问题

[复制链接]
ID:635978 发表于 2021-2-2 23:50 | 显示全部楼层 |阅读模式
各位大佬,2个595驱动八位数码管动态显示,为什么不加延时一样可以正常显示呢?用两个573的时候每位之间应该是有5ms的延时,我理解是在程序执行移位等操作的时候消耗了一定时间,已经起到了延时的作用,这样理解正确吗?还是有其它的解释?本人初学,小白都算不上,请各位指导,万分感谢。

1.png

单片机源程序如下:

#include <reg52.h>

#define uchar unsigned char
#define uint unsigned int

unsigned char code fseg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段选码表
unsigned char code segbit[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//位选码表
unsigned char  disbuf[8]={0,0,0,0,0,0,0,0};

sbit Dio=P1^0;
sbit Rclk=P1^1;
sbit Sclk=P1^2;
uint num;
uchar i;

//void delay(uchar z)
//{
//        uchar x,y;
//        for(x=114;x>0;x--)
//                for(y=z;y>0;y--);
//}
//发数据,段8位,位8位
void SendByte(uchar wei,uchar duan)
{
        uchar a,b;
        a=fseg[duan];
        b=segbit[wei-1];
        for(i=0;i<8;i++)
        {
                Sclk=0;
                if(a&0x80)
                        Dio=1;
                else
                        Dio=0;
                Sclk=1;
                a<<=1;
        }
        
        for(i=0;i<8;i++)
        {
                Sclk=0;
                if(b&0x80)
                        Dio=1;
                else
                        Dio=0;
                Sclk=1;
                b<<=1;
        }
        Rclk=0;
        Rclk=1;
}

void main ()
{
        while(1)
        {
                SendByte(1,1);
                SendByte(2,2);
                SendByte(3,3);
                SendByte(4,4);
                SendByte(5,5);
                SendByte(6,6);
                SendByte(7,7);
                SendByte(8,8);
        }
}


回复

使用道具 举报

ID:568565 发表于 2021-2-3 06:33 来自手机 | 显示全部楼层
595数据手册上面写了数据保持时间最小只需要十几ns,所以算下来也就是单片机再执行一条语句的时间,加上延时当然更好,不加的话也能响应的
回复

使用道具 举报

ID:332444 发表于 2021-2-3 08:25 | 显示全部楼层
可以那样理解
回复

使用道具 举报

ID:332444 发表于 2021-2-3 08:27 | 显示全部楼层
操作2片595可以直接写在同一个循环内完成操作,这样延时就会减少,可通过观察引脚察看延时时间.
回复

使用道具 举报

ID:654028 发表于 2021-2-3 09:11 | 显示全部楼层
这东西不是延时越久显示越不正常吗?容易闪。我猜你这是一个函数运行时间可能长点。我自己做过,1ms延时去刷新数据管都闲慢,还会出现闪动
回复

使用道具 举报

ID:320306 发表于 2021-2-3 09:11 | 显示全部楼层
说明单片机的频率比较低,执行一条语句的时间周期比较长,类似有延时的效果了。
回复

使用道具 举报

ID:844772 发表于 2021-2-3 09:23 | 显示全部楼层
你查595手册啊,上面有最大频率限制,一般都4MHz,你要是用12Mhz的晶体,你最快也就1MHz,当然用不着延时了。
回复

使用道具 举报

ID:879809 发表于 2021-2-3 13:06 | 显示全部楼层
本帖最后由 rundstedt 于 2021-2-3 14:05 编辑

你用的是8位单片机,如果用573锁存段码和位码,一定不可能做到完全同步。①输出段码,②锁存,③输出位码,④锁存,可以看到段码和位码之间us级别的不同步,执行②之后,显示的是上一段的位码,是错的!所以要用5ms稳定时间掩盖1us(数量级对,具体时间不争论)的错误输出。5000倍的时间差异是看不出有什么问题的。

对于595来说,OE接地,移位的时候输出毫无变化,都是在内部完成的,只有12脚RCLK给个脉冲才把内部移位的结果发送到输出端,你的原理图上两个RCLK是并联的,那么就是说段码和位码是同步输出的,自然不用考虑掩盖错误的问题,你唯一需要考虑的是,每一个段码有效的时间必须一致,否则每个7段LED的输出亮度会不一致。
回复

使用道具 举报

ID:635978 发表于 2021-2-3 15:53 | 显示全部楼层
chenyinhu 发表于 2021-2-3 06:33
595数据手册上面写了数据保持时间最小只需要十几ns,所以算下来也就是单片机再执行一条语句的时间,加上延 ...

多谢指点
回复

使用道具 举报

ID:635978 发表于 2021-2-3 15:56 | 显示全部楼层
xianfajushi 发表于 2021-2-3 08:27
操作2片595可以直接写在同一个循环内完成操作,这样延时就会减少,可通过观察引脚察看延时时间.

多谢指点
回复

使用道具 举报

ID:635978 发表于 2021-2-3 16:12 | 显示全部楼层
glinfei 发表于 2021-2-3 09:23
你查595手册啊,上面有最大频率限制,一般都4MHz,你要是用12Mhz的晶体,你最快也就1MHz,当然用不着延时了 ...

多谢指点,我认真看一下手册
回复

使用道具 举报

ID:635978 发表于 2021-2-3 16:13 | 显示全部楼层
zsyzdx 发表于 2021-2-3 09:11
说明单片机的频率比较低,执行一条语句的时间周期比较长,类似有延时的效果了。

多谢指点
回复

使用道具 举报

ID:390416 发表于 2021-2-3 21:17 | 显示全部楼层
你好,关于两个595驱动数码管  你可以看看 人人学会单片机的视频教程,用的就是和你一样的电路
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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