一、74HC595簡介
74HC595是一個8位串行輸入、平行輸出的位移緩存器:平行輸出為三態(tài)輸出。在SCK的上升沿,單行數(shù)據(jù)由SDL輸人到內(nèi)部的8位位移緩存器,并由Q7‘輸出,而平行輸出則是在LCK的上升沿將在8位位移緩存器的數(shù)據(jù)存人到8位平行輸出緩存器。當串行數(shù)據(jù)輸人端OE的控制信號為低使能時,平行輸出端的輸出值等于平行輸出緩存器所存儲的值。而當OE為高電位,也就是輸出關(guān)閉時,平行輸出端會維持在高阻抗狀態(tài)。
二、74hc595引腳圖及功能
引腳圖:
引腳功能:
三、74HC595工作原理
1、74HC595的數(shù)據(jù)端:
QA--QH:八位并行輸出端,可以直接控制數(shù)碼管的8個段。
QH‘:級聯(lián)輸出端。我將它接下一個595的SI端。
SI:串行數(shù)據(jù)輸入端。
2、74hc595的控制端說明:
/SCLR(10腳):低電平時將移位寄存器的數(shù)據(jù)清零。通常我將它接Vcc。
SCK(11腳):上升沿時數(shù)據(jù)寄存器的數(shù)據(jù)移位。QA--》QB--》QC--》。。。--》QH;下降沿移位寄存器數(shù)據(jù)不變。(脈沖寬度:5V時,大于幾十納秒就行了。我通常都選微秒級)
3、控制移位寄存器
SCK上升沿數(shù)據(jù)移位SCK下降沿數(shù)據(jù)保持
RCK(12腳):上升沿時移位寄存器的數(shù)據(jù)進入存儲寄存器,下降沿時存儲寄存器數(shù)據(jù)不變。通常我將RCK置為低電平,當移位結(jié)束后,在RCK端產(chǎn)生一個正脈沖(5V時,大于幾十納秒就行了。我通常都選微秒級),更新顯示數(shù)據(jù)。
4、控制存儲寄存器
RCK上升沿移位寄存器的數(shù)據(jù)進入存儲寄存器RCK下降沿存儲寄存器數(shù)據(jù)不變
/G(13腳):高電平時禁止輸出(高阻態(tài))。如果單片機的引腳不緊張,用一個引腳控制它,可以方便地產(chǎn)生閃爍和熄滅效果。比通過數(shù)據(jù)端移位控制要省時省力。
注:
1)74164和74595功能相仿,都是8位串行輸入轉(zhuǎn)并行輸出移位寄存器。74164的驅(qū)動電流(25mA)比74595(35mA)的要小,14腳封裝,體積也小一些。
2)74595的主要優(yōu)點是具有數(shù)據(jù)存儲寄存器,在移位的過程中,輸出端的數(shù)據(jù)可以保持不變。這在串行速度慢的場合很有用處,數(shù)碼管沒有閃爍感。
3)與74hc164只有數(shù)據(jù)清零端相比,74hc595還多有輸出端時能/禁止控制端oe,可以使輸出為高阻態(tài)。所以是用這塊芯片會更方便
4)74HC595是具有8位移位寄存器和一個存儲器,三態(tài)輸出功能。移位寄存器和存儲器是分別的時鐘。數(shù)據(jù)在SHcp(見時序圖)的上升沿輸入,在STcp(見時序圖)的上升沿進入的存儲寄存器中去。如果兩個時鐘連在一起,則移位
5)寄存器總是比存儲寄存器早一個脈沖。移位寄存器有一個串行移位輸入(Ds),和一個串行輸出(Q7’),和一個異步的低電平復位,存儲寄存器有一個并行8位的,具備三態(tài)的總線輸出,當使能OE時(為低電平),存儲寄存器的數(shù)據(jù)輸出到總線。
5、74hc595真值表
四、74hc595最高電圧和最低電壓
最高電圧和最低電壓
時序圖:
74HC595邏輯圖
五、典型應用電路
1、74HC595驅(qū)動LED的電路設(shè)計
74HC595內(nèi)含8位串入、串/并出移位寄存器和8位三態(tài)輸出鎖存器。寄存器和鎖存器分別有各自的時鐘輸入(SCLK和SLCK),都是上升沿有效。當SCLK從低到高電平跳變時,串行輸入數(shù)據(jù)(SDA)移入寄存器;當SLCK從低到高電平跳變時,寄存器的數(shù)據(jù)置入鎖存器。清除端(CLR)的低電平只對寄存器復位(QS為低電平),而對鎖存器無影響。當輸出允許控制(EN)為高電平時,并行輸出(Q0~Q7)為高阻態(tài),而串行輸出(QS)不受影響。
74HC595最多需要5根控制線,即SDA、SCLK、SLCK、CLR和EN。其中CLR可以直接接到高電平,用軟件來實現(xiàn)寄存器清零;如果不需要軟件改變亮度,EN可以直接接到低電平,而用硬件來改變亮度。把其余三根線和單片機的I/O口相接,即可實現(xiàn)對LED的控制。
數(shù)據(jù)從SDA口送入74HC595,在每個SCLK的上升沿,SDA口上的數(shù)據(jù)移入寄存器,在SCLK的第9個上升沿,數(shù)據(jù)開始從QS移出。如果把第一個74HC595的QS和第二個74HC595的SDA相接,數(shù)據(jù)即移入第二個74HC595中,照此一個一個接下去,可接任意多個。數(shù)據(jù)全部送完后,給SLCK一個上升沿,寄存器中的數(shù)據(jù)即置入鎖存器。此時如果EN為低電平,數(shù)據(jù)即從并口Q0~Q7輸出,把Q0~Q7與LED的8段相接,LED就可以實現(xiàn)顯示了。要想軟件改變LED的亮度,只需改變EN的占空比就行了。
1)硬件電路
用AT89C2051與74HC595接口設(shè)計的顯示面板電路。
P1口的P115、P116、P117用來控制LED的顯示,分別接到SLCK、SCLK和SDA腳。三個數(shù)碼管用來顯示電壓值的大小。在電路板上,LED3在最左邊,LED1在最右邊,送數(shù)據(jù)時,先送LED3的顯示碼,最后送LED1的顯示碼。LED的亮度用PR1~PR3的阻值來控制。
2)顯示驅(qū)動程序
用DISP1、DISP2、DISP3三個連續(xù)的單元存放顯示數(shù)據(jù),在CPU初始化完成后,調(diào)用LRDISP子程序清除74HC595的寄存器,在以后調(diào)用顯示子程序DISPLAY前就不用再調(diào)用清除子程序了。現(xiàn)將兩個子程序?qū)懗鋈缦拢?/p>
清除子程序:
CLRDISP:
MOVR2,#24; ? ? ? ? 三個數(shù)碼管,一共24位
CLRBIT:
CLRSCLK;寄存器時鐘拉低
CLRC;寄存器清零
MOVSDA,C;送入74HC595
SETBSCLK;時鐘的上升沿送入寄存器
DJNZR2,CLRBIT;送完24位
RET;子程序返回
顯示子程序:
DISPLAY:
CLRSLCK;鎖存器時鐘拉低
MOVR3,#3;三個數(shù)碼管
MOVR0,#DISP3;從第三個開始送
DISP1:
MOVA,@R0;送8位數(shù)到74HC595
MOVR2,#8
DISP2:
CLRSCLK
RLCA
MOVSDA,C
SETBSCLK
DJNZR2,DISP2;送完一個字節(jié)
DECR0;送下一個數(shù)碼管的顯示數(shù)據(jù)
DJNZR3,DISP1;送完三個字節(jié)
SETBSLCK;時鐘的上升沿寄存器數(shù)據(jù)送入鎖存器
RET;子程序返回
2、基于74HC595流水燈設(shè)計
電路原理圖如圖所示,用串入并出驅(qū)動芯片編寫74HC595編寫單項流水燈程序。
圖74HC595流水燈硬件結(jié)構(gòu)圖
74HC595控制端說明:
MR(10腳):低點平時將移位寄存器的數(shù)據(jù)清零。通常我將它接Vcc。
SHCP(11腳):上升沿時數(shù)據(jù)寄存器的數(shù)據(jù)移位。QA--》QB--》QC--》。。。--》QH;下降沿移位寄存器數(shù)據(jù)不變。(脈沖寬度:5V時,大于幾十納秒就行了。我通常都選微秒級)
STCP(12腳):上升沿時移位寄存器的數(shù)據(jù)進入數(shù)據(jù)存儲寄存器,下降沿時存儲寄存器數(shù)據(jù)不變。通常我將STCP置為低點平,當移位結(jié)束后,在STCP端產(chǎn)生一個正脈沖(5V時,大于幾十納秒就行了。我通常都選微秒級),更新顯示數(shù)據(jù)。
OE(13腳):高電平時禁止輸出(高阻態(tài))。如果單片機的引腳不緊張,用一個引腳控制它,可以方便地產(chǎn)生閃爍和熄滅效果。比通過數(shù)據(jù)端移位控制要省時省力。
表74HC595主要參數(shù)
程序流程圖
程序:
#include《at89x52.h》
#include《intrins.h》
voiddelay();
sbitin=P2^1;
sbitout=P2^2;
sbitshuju=P2^0;
voidinout595(unsignedchare);
voidmain()
{
unsignedchara;
a=0xfe;
while(1)
{
inout595(a);
delay();
a=_crol_(a,1);
}
}
voidinout595(unsignedchare)//
向595發(fā)送一個字節(jié)的數(shù)據(jù),然后從595輸出,本函數(shù)具有通用性。
{
unsignedcharf;
in=1;
out=1;
for(f=0;f《8;f++)
{
if((e&0x80)==0x00){shuju=0;}
else{shuju=1;}
in=0;
in=1;
e=e《《1;//
此處可控制先發(fā)低位還是高位,向左移先發(fā)高位,向右移先取低位
}
out=0;
out=1;
}
voiddelay()
{
unsignedintb;
for(b=0;b《40000;b++);
}
評論
查看更多