找回密码
 立即注册

QQ登录

只需一步,快速开始

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

3片74HC595级联,中间的一片无法存入数据 附单片机程序电路

[复制链接]
跳转到指定楼层
楼主
代码如下:
#include "reg51.h"               
#include "intrins.h"

typedef unsigned int u16;         
typedef unsigned char u8;

sbit sRCLK=P0^0;
sbit rCLK=P0^1;
sbit sER=P0^2;

void delay(u16 i)
{
        while(i--);        
}

void Hc595(u8 dat0,dat1,dat2)  
{
        u8 a;
        for(a=0;a<8;a++)               
        {
                sER = dat2 >> 7;               
                dat2 <<= 1;
                sRCLK = 0;                        
                delay(20);
                sRCLK = 1;        
                delay(20);
        }
                for(a=0;a<8;a++)               
        {
                sER = dat1 >> 7;               
                dat1 <<= 1;
                sRCLK = 0;                        
                delay(20);
                sRCLK = 1;        
                delay(20);
        }
        for(a=0;a<8;a++)               
        {
                sER = dat0 >> 7;               
                dat0 <<= 1;
                sRCLK = 0;                        
                delay(20);
                sRCLK = 1;
                delay(20);
        }
        
        rCLK = 0;
        delay(20);
        rCLK = 1;
        delay(20);
}


void main()
{        
        while(1)
        {
                        Hc595(0,0,0);
                   Hc595(0x6d,0xdb,0x00);//应让最左侧5个RGB亮起
                        delay(1000);
        }
}




1.png (79.37 KB, 下载次数: 71)

protues仿真效果

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

使用道具 举报

沙发
ID:332444 发表于 2023-5-2 10:03 | 只看该作者
看我帖子的办法是发送1个芯片数据,3个级联的话分3次发送。
回复

使用道具 举报

板凳
ID:1016811 发表于 2023-5-2 12:00 | 只看该作者
xianfajushi 发表于 2023-5-2 10:03
看我帖子的办法是发送1个芯片数据,3个级联的话分3次发送。

void main()
{       
        while(1)
        {
                        Hc595(0,0,0);
                   Hc595(0x6d,0x00,0x00);
                   Hc595(0x00,0xdb,0x00);
                   Hc595(0x00,0x00,0x00);
                        delay_ms(500);
        }
}
前辈你好,是这样分成3次发送吗?但是仿真的效果还是一样,我看protues的仿真电路的各个IO电平时发现,只有第一片的595是符合我的数据输入,剩下两片的数据是乱的,

回复

使用道具 举报

地板
ID:1016811 发表于 2023-5-2 12:16 | 只看该作者
xianfajushi 发表于 2023-5-2 10:03
看我帖子的办法是发送1个芯片数据,3个级联的话分3次发送。

#include "reg51.h"               
#include "intrins.h"


typedef unsigned int u16;          
typedef unsigned char u8;

sbit sRCLK=P3^6;
sbit rCLK=P3^5;
sbit sER=P3^4;


void delay_10us(u16 ten_us)
{
        while(ten_us--);       
}

void delay_ms(u16 ms)
{
        u16 i,j;
        for(i=ms;i>0;i--)
                for(j=110;j>0;j--);
}

void Hc595(u8 dat)  
{
        u8 a;

        for(a=0;a<8;a++)               
        {
                sER = dat >> 7;               
                dat <<= 1;
                sRCLK = 0;                       
                delay_10us(1);
                sRCLK = 1;       
                delay_10us(1);
        }
       
        rCLK = 0;
        delay_10us(1);
        rCLK = 1;
        delay_10us(1);
}


void main()
{       

        while(1)
        {
                        Hc595(0);
                   Hc595(0x0f);
                   Hc595(0xff);       
                   Hc595(0xfe);
                delay_ms(500);
               
                        Hc595(0);
                   Hc595(0x00);
                   Hc595(0xdb);       
                   Hc595(0x6d);
                delay_ms(500);

        }
}
前辈你好,我把代码改成您帖子这样单次发送的就可以显示我想要的效果了,但是我还是不理解,为什么不能一次性将数据传到3片级联的595中,它的级联原理不是将新输入的数据代替旧输入数据的595吗?将旧数据向前推送,单次发送的原理和一起发送的原理似乎是一样的吧?但是一次性发送中间那片595就是乱吗了
回复

使用道具 举报

5#
ID:1034262 发表于 2023-5-2 14:29 | 只看该作者
楼主你的用法不建议,我们都是串联在一起的,DATA觉第一片14脚(DS),9脚接下一片的14脚,一直级联下去,最经典的就是LED点阵屏,一般一个单元屏(32*16)有8片595串联(或者分2组,每组4片串联)。
回复

使用道具 举报

6#
ID:213173 发表于 2023-5-2 14:31 | 只看该作者
HC595驱动16位数码管万年历.rar (145.66 KB, 下载次数: 18)
回复

使用道具 举报

7#
ID:384109 发表于 2023-5-2 15:26 | 只看该作者
楼主对595的理解有错误,按楼主的做法应该只有最后一个发送数据的595是正确的,其他两个都是不定的,595要用级联的方法
回复

使用道具 举报

8#
ID:1016811 发表于 2023-5-2 21:42 | 只看该作者

谢谢您,我回去学习一下
回复

使用道具 举报

9#
ID:1016811 发表于 2023-5-2 21:45 | 只看该作者
人中狼 发表于 2023-5-2 15:26
楼主对595的理解有错误,按楼主的做法应该只有最后一个发送数据的595是正确的,其他两个都是不定的,595要 ...

你好,我在protues仿真里用的就是级联方式呀,第一片595的9号脚连接到第二片的14号脚(DS),以此类推。
回复

使用道具 举报

10#
ID:1016811 发表于 2023-5-2 21:46 | 只看该作者
coody_sz 发表于 2023-5-2 14:29
楼主你的用法不建议,我们都是串联在一起的,DATA觉第一片14脚(DS),9脚接下一片的14脚,一直级联下去, ...

是的啊,你可以仔细看一下我发出来的仿真图,就是级联的方式啊
回复

使用道具 举报

11#
ID:332444 发表于 2023-5-3 07:22 | 只看该作者
嘻嘻哈哈东 发表于 2023-5-2 12:16
#include "reg51.h"               
#include "intrins.h"

OE低电平时,移位后的信号从Q0-Q7八个脚并行输出,同时这八个脚上的信号也以串行的方式从Q7S脚依次输出。该脚输出的信号可作为下一个595的输入信号,理论上讲,可实现无限级联。
回复

使用道具 举报

12#
ID:332444 发表于 2023-5-3 07:25 | 只看该作者
嘻嘻哈哈东 发表于 2023-5-2 12:16
#include "reg51.h"               
#include "intrins.h"

虽然也可以一次性写3个循环语句,不过我喜欢简洁,通常把重复代码写为一个,包括数码管驱动,其他芯片驱动都提炼为模块。
回复

使用道具 举报

13#
ID:78835 发表于 2023-5-3 08:18 | 只看该作者
感觉接线有点问题呀,改成这样试试。

参考下这个级联驱动程序:
void HC595_Master_COM1_WR_NByte(uint8_t Len, uint8_t *GPIOValue)
{
        uint8_t i=0,Byte=0;

        HC595_Master_COM1_STCP_RESET();
        while(Len--)
        {
                  Byte=*GPIOValue;
                for(i=0;i<8;i++)
                {               
                        HC595_Master_COM1_SHCP_RESET();
                        if(Byte & 0x80)
                        {
                                HC595_Master_COM1_DS_SET();
                        }
                        else
                        {
                                HC595_Master_COM1_DS_RESET();
                        }
                        HC595_Master_COM1_SHCP_SET();
                        Byte <<= 1;
                }       
                GPIOValue++;
        }
    HC595_Master_COM1_STCP_SET();
}

回复

使用道具 举报

14#
ID:384109 发表于 2023-5-3 08:28 | 只看该作者
嘻嘻哈哈东 发表于 2023-5-2 21:45
你好,我在protues仿真里用的就是级联方式呀,第一片595的9号脚连接到第二片的14号脚(DS),以此类推。

抱歉,看错了,下面是我的做法,参考一下
void HC595_SEND_DATA(void)
{
        u8 i, j, row_value;
       
//        HC595_OUTPUT_ENABLE = 1;
        HC595_STORAGE_CLOCK = 0;
        HC595_SHIFT_CLOCK = 0;
       
        for(j=0; j<8; j++)
        {
                row_value = ~row_data[j];
               
                for(i=0;i<8;i++)
                {
                        if(row_value & 0X80) HC595_SERIAL_DATA = 1;        //ROW_HC595_SERIAL_DATA_ON();
                        else HC595_SERIAL_DATA = 0;                        //ROW_HC595_SERIAL_DATA_OFF();
               
                        row_value = row_value << 1;
                        HC595_SHIFT_CLOCK = 1;
                        HC595_SHIFT_CLOCK = 0;
                }
        }

        HC595_STORAGE_CLOCK = 1;
        HC595_STORAGE_CLOCK = 0;
        HC595_OUTPUT_ENABLE = 0;
}
两个时钟引脚的操作我和你的不同
回复

使用道具 举报

15#
ID:1083221 发表于 2023-6-10 17:02 | 只看该作者
把void hc595(u8 dat0,dat1,dat2)改成void hc595(u8 dat0,u8 dat1,u8 dat2)  传数据 延时改成_nop_()
回复

使用道具 举报

16#
ID:824490 发表于 2023-6-10 17:35 | 只看该作者
void Hc595(u8 dat0,dat1,dat2)  这个函数可以优化一下。一个发送8bit的函数调用3次就可以了,没必要发3个字节就直接写了3次的8bit发送发代码。
595的10脚可以直接接VDD,没必要接开关来复位。无非就是在第一次发真正数据前,先发送3个空的数据。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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