找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2218|回复: 5
收起左侧

10个74HC595级联 单片机程序请教

[复制链接]
ID:284050 发表于 2020-9-5 13:08 | 显示全部楼层 |阅读模式
下面的程序可以发送10个8位二进制代码给级联的10个74HC595吗?我仿真的时候只显示2个74HC595收到正确数据,不知道是什么原因。

这个代码我是拿CSDN上的代码改的。是不是还需控制10脚MR和13脚OE呢?如果是,该怎么改程序呢?

目前的电路解法如下:
已确认各74HC595的14脚SER与9脚Q7S

14脚SER 接 单片机P3.4

11脚SCK 接 单片机P3.6

12脚RCK接  单片机P3.5

13脚OE接GND

10脚MR接VCC


程序代码如下:
#include<reg51.h>
#include<intrins.h>

typedef unsigned char uchar;
typedef unsigned int uint;

/**********函数声明********************/
void SendTo595(uchar byteData);
/***********************************/

sbit SER = P3^4;    //p3.4脚控制串行数据输入
sbit SCK = P3^6;    //串行输入时钟
sbit RCK = P3^5;    //存储寄存器时钟


void main()
{
charcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};  

      SendTo595(table[0]);  
      SendTo595(table[1]);         
      SendTo595(table[2]);  
      SendTo595(table[3]);
      SendTo595(table[4]);  
      SendTo595(table[5]);         
      SendTo595(table[6]);  
      SendTo595(table[7]);
      SendTo595(table[8]);         
      SendTo595(table[9]);  



   /*位移寄存器数据准备完毕,转移到存储寄存器*/
  RCK = 1;         //上升沿,让存储寄存器时钟变为高电平,并延时2个时钟周期
  _nop_();
  _nop_();
  RCK = 0;
       while(1);

}

//功能:发送一个字节的数据给595,再并行输出
void SendTo595(uchar byteData)
{
  char i=0;
   for(;i<8;i++)
   {
          SER = byteData>>7;         
       byteData= byteData<<1;      

         SCK = 1;          //上升沿,让串行输入时钟变为高电平,并延时2个时钟周期
       _nop_();
       _nop_();

       SCK = 0;          //变为低电平,为下次准备
  }  
   
}


回复

使用道具 举报

ID:284050 发表于 2020-9-5 20:36 | 显示全部楼层
原理图(只截2个595)
595.png
at89c52.png
回复

使用道具 举报

ID:213173 发表于 2020-9-5 20:38 | 显示全部楼层
缺少 SCK = 0; RCK = 0; 初始化设置,其它没有问题。

#include<reg51.h>
#include<intrins.h>

typedef unsigned char uchar;
typedef unsigned int uint;

/**********函数声明********************/
void SendTo595(uchar byteData);
/***********************************/

sbit SER = P3^4;    //p3.4脚控制串行数据输入
sbit SCK = P3^6;    //串行输入时钟
sbit RCK = P3^5;    //存储寄存器时钟

void main()
{
        char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};  
        SCK = 0;
        RCK = 0;
        SendTo595(table[0]);  
        SendTo595(table[1]);         
        SendTo595(table[2]);  
        SendTo595(table[3]);
        SendTo595(table[4]);  
        SendTo595(table[5]);         
        SendTo595(table[6]);  
        SendTo595(table[7]);
        SendTo595(table[8]);         
        SendTo595(table[9]);  
        /*位移寄存器数据准备完毕,转移到存储寄存器*/
        RCK = 1;         //上升沿,让存储寄存器时钟变为高电平,并延时2个时钟周期
        _nop_();
        _nop_();
        RCK = 0;
        while(1);
}
//功能:发送一个字节的数据给595,再并行输出
void SendTo595(uchar byteData)
{
        char i=0;
        for(;i<8;i++)
        {
                SER = byteData>>7;         
                byteData= byteData<<1;      
                SCK = 1;          //上升沿,让串行输入时钟变为高电平,并延时2个时钟周期
                _nop_();
                _nop_();
                SCK = 0;          //变为低电平,为下次准备
        }  
}

回复

使用道具 举报

ID:284050 发表于 2020-9-5 21:07 | 显示全部楼层
感谢。
回复

使用道具 举报

ID:284050 发表于 2020-9-5 21:16 | 显示全部楼层
wulin 发表于 2020-9-5 20:38
缺少 SCK = 0; RCK = 0; 初始化设置,其它没有问题。

#include

十分感谢!加了初始化以后,完全避免了输出不是想要输出的问题了
回复

使用道具 举报

ID:230975 发表于 2020-9-5 22:01 | 显示全部楼层
wulin 发表于 2020-9-5 20:38
缺少 SCK = 0; RCK = 0; 初始化设置,其它没有问题。

#include

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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