找回密码
 立即注册

QQ登录

只需一步,快速开始

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

74hc595使用方法与单片机驱动源程序

  [复制链接]
跳转到指定楼层
楼主
      
虽然这玩意不复杂,但是在网上看了很多资料还是眼花,简单的说一下工作原理:
      
DS是数据传递数据口,DS传递一次后SH_CP进行一次上升沿串行数据发生位移,ST_CP发生一次上升沿完成数据发送,即串行转并行。下图中的Q7’可以接下一个595的DS口,也可以不接。当完成8次数据传输的话多出的数据就从Q7’就从传入下一个595。MR低电平清除数据,图中接正极。OE相当于开关,低电平输出有效,高电平并行口为高阻态,图中接负极。然后原理图和代码放在旁边,证明一下理论。
      
旁边的是实物图,比原理图多处两个引脚,原理图省略的是电源正负极。
      
上述只是简单的使用方法,详细结构:www.baidu.com
   
   

1.jpg (14.07 KB, 下载次数: 82)

1.jpg

2.jpg (8 KB, 下载次数: 87)

2.jpg

3.jpg (11.2 KB, 下载次数: 79)

3.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:248500 发表于 2018-6-10 22:45 | 只看该作者
  1. #include<reg52.h>
  2. #include<intrins.h>

  3. typedef unsigned char u8;
  4. typedef unsigned int u16;

  5. sbit SH_CP1 = P2^1;
  6. sbit DS = P2^0;
  7. sbit ST_CP1 = P2^2;
  8. sbit SH_CP2 = P2^3;
  9. sbit ST_CP2 = P2^4;

  10. void delay()                                                //延时函数
  11. {
  12.         u8 a, b, c;
  13.         for(a = 0; a < 110; ++a)
  14.                 for(b = 0; b < 110; ++b)
  15.                         for(c = 0; c < 10; ++c);
  16. }

  17. void send_data_74hc595(u16 data_74hc595)                    //传送数据给74hc595
  18. {
  19.         u8 a;
  20.         for(a = 0; a < 8; ++a)
  21.         {
  22.                 DS = (data_74hc595 << a) & 0x80;                    //从高位开始传输
  23.                 SH_CP1 = 0;
  24.                 SH_CP2 = 0;
  25.                 _nop_();
  26.                 _nop_();
  27.                 SH_CP1 = 1;
  28.                 SH_CP2 = 1;
  29.         }
  30. }

  31. void show_74hc595()                                         //数据显示
  32. {
  33.         ST_CP1 = 0;
  34.         ST_CP2 = 0;
  35.         _nop_();
  36.         _nop_();
  37.         ST_CP1 = 1;
  38.         ST_CP2 = 1;
  39. }

  40. void main()
  41. {
  42.         while(1)
  43.         {
  44.                 send_data_74hc595(0x00);                            //依次传输数据,上面的数据传输给第二个595
  45.                 send_data_74hc595(0x01);                            //下面的给第一个·595
  46.                 show_74hc595();                                     //数据显示
  47.                 delay();                                            //延时
  48.                 send_data_74hc595(0x00);
  49.                 send_data_74hc595(0x03);
  50.                 show_74hc595();
  51.                 delay();
  52.                 send_data_74hc595(0x00);
  53.                 send_data_74hc595(0x07);
  54.                 show_74hc595();
  55.                 delay();
  56.                 send_data_74hc595(0x00);
  57.                 send_data_74hc595(0x0f);
  58.                 show_74hc595();
  59.                 delay();
  60.                 send_data_74hc595(0x00);
  61.                 send_data_74hc595(0x1f);
  62.                 show_74hc595();
  63.                 delay();
  64.                 send_data_74hc595(0x00);
  65.                 send_data_74hc595(0x3f);
  66.                 show_74hc595();
  67.                 delay();
  68.                 send_data_74hc595(0x00);
  69.                 send_data_74hc595(0x7f);
  70.                 show_74hc595();
  71.                 delay();
  72.                 send_data_74hc595(0x00);
  73.                 send_data_74hc595(0xff);
  74.                 show_74hc595();
  75.                 delay();

  76.                 send_data_74hc595(0x01);
  77.                 send_data_74hc595(0xff);
  78.                 show_74hc595();
  79.                 delay();
  80.                 send_data_74hc595(0x03);
  81.                 send_data_74hc595(0xff);
  82.                 show_74hc595();
  83.                 delay();
  84.                 send_data_74hc595(0x07);
  85.                 send_data_74hc595(0xff);
  86.                 show_74hc595();
  87.                 delay();
  88.                 send_data_74hc595(0x0f);
  89.                 send_data_74hc595(0xff);
  90.                 show_74hc595();
  91.                 delay();
  92.                 send_data_74hc595(0x1f);
  93.                 send_data_74hc595(0xff);
  94.                 show_74hc595();
  95.                 delay();
  96.                 send_data_74hc595(0x3f);
  97.                 send_data_74hc595(0xff);
  98.                 show_74hc595();
  99.                 delay();
  100.                 send_data_74hc595(0x7f);
  101.                 send_data_74hc595(0xff);
  102.                 show_74hc595();
  103.                 delay();
  104.                 send_data_74hc595(0xff);
  105.                 send_data_74hc595(0xff);
  106.                 show_74hc595();
  107.                 delay();
  108.         }
  109. }
复制代码


74hc595.zip

138.52 KB, 下载次数: 78, 下载积分: 黑币 -5

回复

使用道具 举报

板凳
ID:328014 发表于 2018-6-12 03:58 | 只看该作者
很有用,收藏
回复

使用道具 举报

地板
ID:580181 发表于 2020-3-11 12:43 | 只看该作者
想了很久没想懂为什么上面传给第二个74HC595下面传给第一个
回复

使用道具 举报

5#
ID:126225 发表于 2020-3-12 11:35 | 只看该作者
这个级联仿真是有bug的,比如运行到这一步            
send_data_74hc595(0x00);
send_data_74hc595(0xff);
show_74hc595();
应该是上面八个灯亮下面八个灯全部灭,但仿真的时候却是上面八个亮之外,下面的Q0输出的灯也是亮的。

解决办法
在电路上将
SH_CP1和SH_CP2直接相连
ST_CP1和 ST_CP2 直接相连
程序上
只用SH_CP1和ST_CP1来进行控制


回复

使用道具 举报

6#
ID:607710 发表于 2020-3-14 10:52 | 只看该作者
92pk 发表于 2020-3-12 11:35
这个级联仿真是有bug的,比如运行到这一步            
send_data_74hc595(0x00);
send_data_74hc595(0x ...

赞一个,对头!多动手
回复

使用道具 举报

7#
ID:573252 发表于 2020-10-27 19:17 | 只看该作者
很通俗易懂  ,感谢
回复

使用道具 举报

8#
ID:573252 发表于 2020-10-27 19:18 | 只看该作者
KM民 发表于 2020-3-11 12:43
想了很久没想懂为什么上面传给第二个74HC595下面传给第一个

多级扩展 ,比如LED显示屏
回复

使用道具 举报

9#
ID:837601 发表于 2021-2-19 13:35 | 只看该作者
如果只驱动一个74hc595呢
回复

使用道具 举报

10#
ID:230742 发表于 2021-2-20 15:29 | 只看该作者
驱动一个595?你是要串转并吗?
回复

使用道具 举报

11#
ID:401500 发表于 2021-2-20 19:32 | 只看该作者
有更简洁的代码 
void wttype(u8 v)
{
u8 x;
        CLR=1;
        RCK=0;
        for (x=0x80;x!=0;x>>=1)
          {
     SCK=1;
     SI=(v&x)? 1:0 ;
     SCK=0;
    }       
  RCK=1;       
}
回复

使用道具 举报

12#
ID:854829 发表于 2021-4-26 08:45 | 只看该作者
zhuming 发表于 2021-2-20 19:32
有更简洁的代码 
void wttype(u8 v)
{

不是上升沿有效吗?
回复

使用道具 举报

13#
ID:854829 发表于 2021-4-26 10:58 | 只看该作者
zhuming 发表于 2021-2-20 19:32
有更简洁的代码 
void wttype(u8 v)
{

我想应该是上升沿有效吧?你这个如果我没搞错的话是下降沿哟
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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