找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5372|回复: 19
收起左侧

单片机+74HC595一直输出低电平,求解

  [复制链接]
ID:569561 发表于 2021-7-13 10:13 | 显示全部楼层 |阅读模式
下图是延时很慢的74hc595的仿真图: 图示.gif

如上图显示,在ST_CP 有上升沿后,右边应该有输出才对。这个图片是输入了两组数据。下边附上单片机代码:
  1. #include<reg51.h>
  2. #include "intrins.h"


  3. sbit YA=P2^1;
  4. sbit HUAN=P2^2;
  5. sbit DAT=P2^0;
  6. sbit RE=P2^3;

  7. unsigned char shengduan[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
  8. //unsigned char shengduan[8]={0x7f,0xbf,0xbf,0xef,0xf7,0xfb,0xfd,0xfe};


  9. void delay(unsigned int i)
  10. {
  11.         while(i--);        
  12. }


  13. void HC595SendByte(unsigned char dat)//3入多出,这是串行输入,并行输出的东西
  14. {
  15.         unsigned char a;
  16.         YA=0;
  17.         HUAN=0;
  18.         
  19.         for(a=0;a<8;a++)
  20.         {
  21.                 DAT=dat>>7;
  22.                 dat<<=1;

  23.                 YA=1;
  24.                 _nop_();//对于12mhz的芯片延时1us,包含在intrinsic.h里
  25.                 _nop_();
  26.                 delay(50000);//故意延时
  27.                 YA=0;        
  28.                 delay(50000);//故意延时
  29.         }

  30.         HUAN=1;
  31.         _nop_();
  32.         _nop_();
  33.         delay(50000);//故意延时
  34.         HUAN=0;
  35.         
  36. }

  37. void main(void) //定义函数
  38. {
  39.         
  40.         unsigned char i;
  41.         RE=0;
  42.         delay(50000);//故意延时
  43.         RE=1;
  44.         HC595SendByte(0x00);
  45.         
  46.         for(i=0;i<8;i++)//实现动态扫描
  47.         {
  48.                 HC595SendByte(shengduan[i]);
  49.         
  50.                 delay(50000);//故意延时
  51.                 delay(50000);//故意延时
  52.                
  53.                         
  54.         }        
  55. }
复制代码

回复

使用道具 举报

ID:332444 发表于 2021-7-13 11:07 | 显示全部楼层
注意时序必须符合要求
回复

使用道具 举报

ID:94031 发表于 2021-7-13 11:11 | 显示全部楼层
595输出要加上拉
回复

使用道具 举报

ID:277550 发表于 2021-7-13 11:15 | 显示全部楼层
回复

使用道具 举报

ID:569561 发表于 2021-7-13 12:52 | 显示全部楼层
devcang 发表于 2021-7-13 11:15
直接跳转吧  http://www.51hei.com/bbs/dpj-110372-1.html

您这个是595对的用法,我看了很多资料了,我这个问题还没有解决
回复

使用道具 举报

ID:161164 发表于 2021-7-13 13:24 | 显示全部楼层
Q0~Q7'接的是什么?
回复

使用道具 举报

ID:161164 发表于 2021-7-13 14:03 | 显示全部楼层

我的没问题
ezgif.com-gif-maker.gif

回复

使用道具 举报

ID:934353 发表于 2021-7-13 14:19 | 显示全部楼层
原理图发完整一点,至少74HC595的这些引脚怎么接得发全一点,你这样发我只能看到一半
回复

使用道具 举报

ID:569561 发表于 2021-7-13 14:22 | 显示全部楼层

用的我的程序么
回复

使用道具 举报

ID:592807 发表于 2021-7-13 14:33 | 显示全部楼层
595和595A是不一样的,看下是不是用了595A
回复

使用道具 举报

ID:161164 发表于 2021-7-13 14:33 | 显示全部楼层

对~只是把delay(50000);改delay(3000);
回复

使用道具 举报

ID:934353 发表于 2021-7-13 14:37 | 显示全部楼层
void HC595SendByte(unsigned char dat)//3入多出,这是串行输入,并行输出的东西
{
        unsigned char a;
        HUAN=0;
      
        for(a=0;a<8;a++)
        {                YA=0;   
                DAT=dat>>7;
                dat<<=1;
                YA=1;
                _nop_();//对于12mhz的芯片延时1us,包含在intrinsic.h里
                _nop_();
                delay(50000);//故意延时
        }

        HUAN=1;
        _nop_();
        _nop_();
        delay(50000);//故意延时
        HUAN=0;
        YA=0;
}

我稍改了一下,试一下这个
回复

使用道具 举报

ID:94031 发表于 2021-7-13 17:24 | 显示全部楼层
接线有问题,应该U2-11接P21,U2-14接P20,U2-12接P22.
回复

使用道具 举报

ID:952782 发表于 2021-7-13 21:58 | 显示全部楼层
接线有问题的吧,或者图发完整一点
回复

使用道具 举报

ID:897180 发表于 2021-7-13 23:46 | 显示全部楼层
可以试试把28和29行代码换成dat<<1;DAT=CY;
回复

使用道具 举报

ID:332444 发表于 2021-7-14 08:13 | 显示全部楼层
回复

使用道具 举报

ID:440585 发表于 2022-9-3 15:56 | 显示全部楼层
本帖最后由 wjsyjh 于 2022-9-3 16:21 编辑

void HC595SendByte(unsigned char dat)//3入多出,这是串行输入,并行输出的东西
{
        unsigned char a;
        YA=0;
        HUAN=0;

        for(a=0;a<8;a++)
        {
                DAT=dat>>7;
                dat<<=1;

                YA=1;
                _nop_();//对于12mhz的芯片延时1us,包含在intrinsic.h里
                _nop_();
                delay(1000);//故意延时
                YA=0;        
                delay(1000);//故意延时
        }

        HUAN=1;
        _nop_();
        _nop_();
//        delay(3000);//故意延时
        HUAN=0;

}
子函数延时短一点就可以了     
回复

使用道具 举报

ID:440585 发表于 2022-9-3 16:19 | 显示全部楼层
void HC595SendByte(unsigned char dat)//3入多出,这是串行输入,并行输出的东西 {         unsigned char a;         YA=0;         HUAN=0;                  for(a=0;a<8;a++)         {                 DAT=dat>>7;                 dat<<=1;                  YA=1;                 _nop_();//对于12mhz的芯片延时1us,包含在intrinsic.h里                 _nop_();                 delay(1000);//故意延时                 YA=0;                         delay(1000);//故意延时         }          HUAN=1;         _nop_();         _nop_(); //        delay(3000);//故意延时         HUAN=0;          }
回复

使用道具 举报

ID:440585 发表于 2022-9-3 16:19 | 显示全部楼层
void HC595SendByte(unsigned char dat)//3入多出,这是串行输入,并行输出的东西
{
        unsigned char a;
        YA=0;
        HUAN=0;
        
        for(a=0;a<8;a++)
        {
                DAT=dat>>7;
                dat<<=1;

                YA=1;
                _nop_();//对于12mhz的芯片延时1us,包含在intrinsic.h里
                _nop_();
                delay(1000);//故意延时
                YA=0;        
                delay(1000);//故意延时
        }

        HUAN=1;
        _nop_();
        _nop_();
//        delay(3000);//故意延时
        HUAN=0;
        
}
回复

使用道具 举报

ID:824490 发表于 2022-9-4 13:18 | 显示全部楼层
595这么纯粹的器件,不会很难吧?
1、在SHCP的上升沿,把DS的电平存入595内(共8个位,SHCP需8个时钟),串行
2、在STCP的上升沿,把595内的数据存到输出缓存寄(8位并行),这里只要一个STCP时钟
3、OE低电平时,Q0-Q7的电平等于输出缓存寄(8位并行),OE为高电平时,Q0-Q7为高阻态
注意上升沿和低电平在代码上的区别,基本上就能驱起来了。
595的时钟高达50M,渣渣51单片机的速度对它来说是小CASE,根本不需要什么NOP,即便是M1的内核都不需要NOP!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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