liuxiaofei126
认证:VIP会员
所在专题目录 查看专题
多功能控制小车
STM32定时器的来龙去脉
底层程序如何在STM32上编译运行
从IIC实测波形入手搞懂IIC通信
实例讲解(一)移位寄存器
单片机之USB 硬件和数据的四种传输方式
作者动态 更多
stm32知识点总结
2021-11-24 23:12
工程师单片机LED项目
2021-11-11 07:46
电容型负载对跟随器的影响
2021-10-28 23:33
图腾柱和互补推挽两个“小冤家”
2021-10-22 23:15
学习单片机的捷径
2021-10-17 23:07

实例讲解(一)移位寄存器

74HC595是一款漏极开路的CMOS移位寄存器,具有可控的三态输出端口,标准SPI串行接口,并且可以串行级联使用。具体电路如下

8位并行数据输出 GND第8脚地 Q7’第9脚串行数据输出 MR第10脚主复位(低电平) SHCP第11脚数据输入时钟线  STCP第12脚输出存储器锁存时钟线  OE第13脚输出有效(低电平) DS第14脚串行数据输入 VCC第16脚电源

74HC595同数据相关的引脚包括:

Q0--Q7: 八位并行输出端,可以直接控制数码管的8个段。

Q7': 级联输出端。将它接下一个595的DS端。

DS: 串行数据输入端,级联的话接上一级的Q7'。

74595的控制端说明:

/MR(10脚): 低电平时将移位寄存器的数据清零。通常我将它接Vcc。

SH_CP(11脚):上升沿时数据寄存器的数据移位。Q0->Q1->Q2-->Q3-->...-->Q7;下降沿移位寄存器数据不变。(脉冲宽度:5V时,大于几十纳秒就行了。我通常都选微秒级)

ST_CP(12脚):上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。通常我将ST_CP置为低电平,当移位结束后,在ST_CP端产生一个正脉冲(5V时,大于几十纳秒就行了。我通常都选微秒级),更新显示数据。

/OE(13脚): 高电平时禁止输出(高阻态)。如果单片机的引脚不紧张,用一个引脚控制它,可以方便地产生闪烁和熄灭效果。比通过数据端移位控制要省时省力。

注:

1) 74164和74595功能相仿,都是8位串行输入转并行输出移位寄存器。74164的驱动电流(25mA)比74595(35mA)的要小,14脚封装,体积也小一些。

2) 74595的主要优点是具有数据存储寄存器,在移位的过程中,输出端的数据可以保持不变。这在串行速度慢的场合很有用处,数码管没有闪烁感。

3) 595是串入并出带有锁存功能移位寄存器,它的使用方法很简单,如下面的真值表,在正常使用时ST_CP为低电平, /OE为低电平。从DS每输入一位数据,串行输入时钟SH_CP上升沿有效一次,直到八位数据输入完毕,输出时钟ST_CP上升沿有效一次,此时,输入的数据就被送到了输出端。

595具体使用的步骤: 第一步:

目的:将要准备输入的位数据移入74HC595数据输入端上。

方法:送位数据到_595。

第二步:

目的:将位数据逐位移入74HC595,即数据串入

方法:SH_CP产生一上升沿,将DS上的数据移入74HC595移位寄存器中,先送高位,后送低位。

第三步:

目的:并行输出数据,即数据并出。

方法:ST_CP产生一上升沿,将由DS上已移入数据寄存器中的数据送入到输出锁存器。

从上可分析: 从SH_CP产生一上升沿(移入数据)和ST_CP产生一上升沿(输出数据)是二个独立过程,实际应用时互不干扰,即可输出数据的同时移入数据。

我们便可以开始写程序了,首先我们需要配置好IO:

void HC595Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(HC595_CLK_GPIO_CLK , ENABLE);
	/*sclk*/
	GPIO_InitStructure.GPIO_Pin = HC595_CLK_PIN;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(HC595_CLK_GPIO, &GPIO_InitStructure);
	/*DS*/
	GPIO_InitStructure.GPIO_Pin = HC595_DATA_PIN;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(HC595_DATA_GPIO, &GPIO_InitStructure);
    /*rclk*/
	GPIO_InitStructure.GPIO_Pin = HC595_CS_PIN;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(HC595_CS_GPIO, &GPIO_InitStructure);
	SCLK_H();
	HC595_DATA_H();
    RCLK_H();
	
}

这是发送代码

void HC595Send(u8 data)
{
  u8 j;
  for (j = 8; j > 0; j--)//将数据从高位到低位依次送到74HC595的数据端口上
  {
        if(data & 0x80)
		   HC595_DATA_H();
		else
			HC595_DATA_L();
   SCLK_L();              //上升沿发生移位
		delay(1);
    data <<= 1;//将数据左移1位
   SCLK_H();
		delay(1);
  }
	//HC595Load();
}

在这里需要注意的是,从原理图中我们可以看到,第一片74HC595控制的是数码管的位码,第二片74HC595控制的是数码管的段码,所以在发送数据的时候,我们先发送段码,然后再填入位码,这样的话段码就自动溢出到第二片74HC595上面了。

HC595Send(0xf9);//向第一片74HC595写入段码
	HC595Send(0x01);	//	片选第一个数码管
	HC595Load(); 
	delay(200);    //    延时2ms
	
	 
	
	HC595Send(0xa4);//向第二片74HC595写入段码
	HC595Send(0x02);	//	片选第二个数码管
	HC595Load(); 
	delay(200);    //    延时2ms
//	 
	
	
	HC595Send(0xb0);
    HC595Send(0x04);	//	片选第三个数码管	
	HC595Load();
	delay(200);    //    延时2ms

这是显示结果

总结

一、74595移存器数据移bai入时,15管脚duzhi---1管脚---2管脚---3管脚---4管脚---5管脚---6管脚---7管脚

二、数dao据输入zhuan时先输入高位shu,后输入低位

三、只有在 11 脚上升脉冲有效后,数据才会输出到 IO 口上,所以移位数据时不用担心在移位的过程中对输出会产生影响

四、12 脚上升脉冲移位数据,每个脉冲移位一次,即每次时钟脉冲后 14 脚的数据移位到 15 脚的缓冲器上,15 脚的数据移位到1脚的缓冲器上,依次移位。。。

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
觉得内容不错的朋友,别忘了一键三连哦!
赞 7
收藏 8
关注 206
成为作者 赚取收益
全部留言
0/200
  • 小董 2021-05-20 09:25
    期待继续
    回复
  • dy-blNlwnWV 2021-02-25 21:45
    感谢分享
    回复
  • keyhei66 2021-01-03 09:25
    佩服楼主
    回复
  • 星球居民-YBPLIKJ1 2020-12-27 08:14
    简单易懂
    回复
  • lihui710884923 2020-12-26 07:33
    较详细?
    回复