文章目录
- 学习单片机经常忘记所以想记录一下
- 一、74HC595介绍
- 二、实现LED的亮暗亮交替
- 原理图的设计
- 实现代码
- 三、595级联的实现
- 原理图的设计
- 实现代码
- 总结
前言
学习单片机的过程刚好学到了74HC595,就想记录下来以免忘记了。
一、74HC595的简单介绍?
74HC595是什么?
74hc595是具有8位移位寄存器可一个存储器,三态输出功能。移位寄存器和存储器是分别的时钟。
工作原理:
数据在SHcp的上升沿输入,在STcp的上升沿进入的存储器中去,如果两个是中联在一起,则移位寄存器总是比存储器早一个脉冲。
这里用我自己的话再解释一下哈(以下说的数据均是串行输入的值转换成二进制之后的数据)
1.我们给DS引脚一个值,作为输入数据来源
2.串行数据的存入:我们需要利用移位寄存器,将数据一位一位地输入进去,需要知道的是我们需要将SHCP保持在一个处于上升沿状态,否则会存不进去。
对于如何将数据一位一位存进去:这里可能有点难以理解,就是595它的输入和输出的对应有点像数据结构中栈的特点(先进后出,后进先出)。又或者可以理解成一个只有入口的圆筒,我们从最后一位开始依次放进去,全部放进去之后在从圆筒的表面依次拿出。
例如:输入的数据转换成二进制是01010101, 如果按照我们常规的逻辑,输出的并行数据可能是(高到低) 01010101。但是实际上经过处理之后并行输出的数据就是 (低到高) 01010101
74HC595元件图片以及相关引脚显示:
(注:左边的名称从上到下依次对应元件左边的引脚,右边很明显,就用说了嘿嘿)
二、实现LED的亮暗交替
1.原理图的设计
2.实现代码
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//Òý½ÅÉèÖÃ
sbit SHCP=P2^0;
sbit STCP=P2^2;
sbit DS=P2^1;
//595ʵÏÖº¯Êý
void SendBy595(uchar value)
{
uchar i;
SHCP=STCP=0;
for(i=0;i<8;i++)
{
DS=value>>7;
value<<=1;
SHCP=1;
_nop_();
_nop_();
SHCP=0;
}
STCP=1;
_nop_();
_nop_();
STCP=0;
}
void main()
{
P2=0x00;
SendBy595(85);
while(1);
}
三、595级联的实现
1.原理说明:
两个595级联就不只是连接8个LED灯了,而是16个LED灯。但是我们知道的是595输入的串行数据是一个8位的二进制数,那这个要怎么设计呢?
这就不得不将Q7'使用起来,它的作用就是当移位寄存器中的数据多于8位时,我们将多余的数据进行移出。因此在原理图的设计中,我们需要将第一个595的控制移出为引脚与第二个595的串行数据输入引脚进行连接,同时第二个595的SHTP,SCTP依旧和前面一个595的相同引脚连接到单片机上的同一引脚。
2.原理图设计
3.实现代码
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//ÉèÖÃÒý½Å
sbit SHCP=P2^0;
sbit STCP=P2^1;
sbit DS=P2^2;
void SendBy595(uchar value)
{
uchar i;
uchar j=value;
//³õʼSHCP STCPÒý½Å
SHCP=STCP=0;
for(i=0;i<8;i++)
{
DS=value>>7;
value<<=1;
SHCP=1;
_nop_();
_nop_();
SHCP=0;
}
//½øÐÐÏÂÒ»¸ö°Ëλ¶þ½øÖƵĴ®ÐÐÊý¾ÝÊäÈë
for(i=0;i<8;i++)
{
DS=j>>7;
j<<=1;
SHCP=1;
_nop_();
_nop_();
SHCP=0;
}
//²¢ÐÐÊä³öÌõ¼þÉèÖÃ
STCP=1;
_nop_();
_nop_();
STCP=0;
}
void main()
{
P2=0xff;
SendBy595(85);
while(1);
}
总结
以上就是我个人目前对于74HC595的原理及使用方法的一个理解,可能存在一些错误认识,欢迎各位指出。
作者:Vuko-wxh