第一部部分用於快速查閱使用,詳細的使用見文章第二部分
引腳圖
14腳:DS(SER),串行數據輸入引腳
13腳:OE, 輸出使能控制腳,它是低電才使能輸出,所以接GND
12腳:RCK,存儲寄存器時鍾輸入引腳。上升沿時,數據從移位寄存器轉存帶存儲寄存器。
11腳:SCK,移位寄存器時鍾引腳,上升沿時,移位寄存器中的bit 數據整體后移,並接受新的bit(從SER輸入)。
10腳:MR,低電平時,清空移位寄存器中已有的bit數據,一般不用,接 高電平即可。
9 腳 :串行數據出口引腳。當移位寄存器中的數據多於8bit時,會把已有的bit“擠出去”,就是從這里出去的。用於595的級聯。
Qx:並行輸出引腳
使用參數
VCC:2V~6V,5V最好
I Qn:+- 35mA
注意
始終記住,對595,最先從SER進去的bit,會從Q7(QH)出去,而最后從SER進入的bit,從Q0(QA)出去。
74HC595介紹
一張圖片和一段文字,哪種信息傳遞方式給人的第一視覺沖擊是最大的?我想大家心中都有答案。
這也是我文章標題的來由。廢話就到這里,下面我就用圖片來分析595這個chip。
74HC595的最重要的功能就是:串行輸入,並行輸出。3態高速位移寄存器(好膩害的說)
595里面有2個8位寄存器:移位寄存器、存儲寄存器
移位寄存器
在我看來,74HC595的移位寄存器工作方式就像shou qiang彈夾。但是子彈的發射(移位寄存器中的數據轉儲到存儲寄存器),又像是【散x彈】(因為是並行輸出嘛)
為什么說和彈夾很像呢?
1、串行輸入,已進入的位數據依次下移(所以叫移位寄存器) | 子彈也是一顆一顆上的,先上的子彈,被后上的慢慢往下壓。
2、第一個輸入的位,是並行輸出的最后一個位 | 最先進入彈夾的子彈,最后射出。
74HC595的引腳圖

14腳:DS,又叫SER 英文全稱是:Serial data input ,顧名思義,就是串行數據輸入口。
595的數據來源只有這一個口,一次只能輸入一個位,那么連續輸入8次,就可以積攢為一個字節了。
假如,我們要將二進制數據0111 1111 輸入到595的移位寄存器中,下面來上一張動態圖,模擬了前2個位輸入的情景。

這個圖有7幀,做了很久,畢竟不是做美工的。可謂術業有專攻,聞道有先后啊,還是要虛心學習 :)
0111 1111 這個數據完全輸入后是這樣的

我們還要注意一個腳:11腳,(shift register clock input) 移位寄存器時鍾引腳。上升沿有效。
首先我們要介紹這個引腳的作用。
我們知道51單片機的工作離不開晶振,他使CPU的工作步調穩定有序,就像跑步時喊1,2,1的那個人。
那么這里的位移寄存器時鍾也是同樣的道理,當一個新的位數據要進來時,已經進入的位數據就在移位寄存器時鍾脈沖的控制下,整體后移,讓出位置。
上升沿:電平從低到高的那個過程。移位寄存器時鍾在上升沿這個過程中才起作用。

存儲寄存器
到這里我們已經大致講了怎么上子彈,也把子彈上齊了。下面來將怎么將子彈打出去,也就是怎么將移位寄存器的數據轉移到存儲寄存器
存儲寄存器是直接和8個輸出引腳相通的,將移位寄存器的數據轉移到存儲寄存器后,Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 就可以接受帶到我們
開始輸入的一個字節的數據。所謂存儲寄存器,就是數據可以存在這個寄存器中,並不會隨着一次輸出就消失,只要595不斷電,也沒有新 的
數據從移位寄存器中過來,數據就一直不變且有效。新的數據過來后,存儲寄存器中的數據就會被覆蓋更新。
12腳: (storage register clock input ) 存儲寄存器時鍾
數據從位移寄存器轉移到存儲寄存器,也是需要時鍾脈沖驅動的,這就是12腳的作用。它也是上升沿有效。

自此,我們已經講解了一個595正常情況下的工作流程,下面寫一個程序,讓8個LED保持 亮暗亮暗.... 間隔的效果。
Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 分別接 8個LED正極
14腳SER 接 單片機P3.4
11腳SCK 接 單片機P3.6
12腳RCK接 單片機P3.5
13腳OE接GND
10腳MR接VCC
9腳閑置不接
#include<reg51.h> #include<intrins.h> typedef unsigned char uchar; typedef unsigned int uint; /**********函數聲明********************/ void SendTo595(uchar byteData);
/***********************************/ sbit SER = P3^4; //p3.4腳控制串行數據輸入 sbit SCK = P3^6; //串行輸入時鍾 sbit RCK = P3^5; //存儲寄存器時鍾 void main() { SendTo595(85); //85的二進制:0101 0101 while(1); } //功能:發送一個字節的數據給595,再並行輸出 void SendTo595(uchar byteData) { char i=0;
for(;i<8;i++) { SER = byteData>>7; //大家自己考量這2句 byteData= byteData<<1; SCK = 1; //上升沿,讓串行輸入時鍾變為高電平,並延時2個時鍾周期 _nop_(); _nop_(); SCK = 0; //變為低電平,為下次准備 } /*位移寄存器數據准備完畢,轉移到存儲寄存器*/ RCK = 1; //上升沿,讓存儲寄存器時鍾變為高電平,並延時2個時鍾周期 _nop_(); _nop_(); RCK = 0; }
擴展提升
見識到595的厲害了吧。138譯碼器通過3個輸入口控制8個輸出口,而且還只能是特定的8個輸出值,
而595只用了一個輸入口就可以輸任意的8位數據。可謂短小精悍。
啥?你覺的1位控制8位輸出還不夠?讓你的595串聯起來吧!打造成加特林機關槍。
在上面的程序中用到的9腳,沒用起作用,如果要讓2個595串聯起來的話,就需要它了。
想一下,我們將移位寄存器的8個位填滿后,再往移位寄存器中塞一個會怎么樣?也許你想到了。
對!移位寄存器的最后一個位數據會被擠出去,從哪里出去?就是從9腳輸出的。如果我們把第一個595的
9腳連接到第二個的串行數據輸入腳SER,那么,就形成了595的級聯。這樣,如果我們用2個595組合成了一個新的超級595,
這個草雞595的移位寄存器和存儲寄存器的容量都翻倍了,1口控制16口,有木有!你還可以繼續級聯下去!
最后還遺留2個 595 的腳沒說
13腳OE 輸出使能控制腳,如果它不工作,那么595的輸出就是高阻態,595就不受我們程序控制了,這顯然違背我們的意願。
OE的上面畫了一條線,表示他是低電平有效。於是我們將他接GND。
10腳MR ,位移寄存器清空腳,他的作用就是將位移寄存器中的數據全部清空,這個很少用到,所以我們一般不讓他起作用,他
也是低電平有效,於是我們給他接VCC。
終於寫完了,希望幫到大家。以后還會繼續講解其它的74系列的邏輯芯片,盡請期待!
如有錯誤歡迎指出。 :)
