1. 程式人生 > >51微控制器 74hc595使用用法(利用proteus模擬)

51微控制器 74hc595使用用法(利用proteus模擬)

文章為原創文章,轉載註明源地址。

一、介紹

百度百科介紹:

74HC595是一個8位序列輸入、並行輸出的位移快取器:並行輸出為三態輸出。在SCK 的上升沿,序列資料由SDL輸入到內部的8位位移快取器,並由Q7'輸出,而並行輸出則是在LCK的上升沿將在8位位移快取器的資料存入到8位並行輸出快取器。當序列資料輸入端OE的控制訊號為低使能時,並行輸出端的輸出值等於並行輸出快取器所儲存的值。而當OE為高電位,也就是輸出關閉時,並行輸出端會維持在高阻抗狀態。

自我理解:一個口序列輸入,然後八個口並行輸出,減少佔用管腳的數目。

二、管腳說明

管腳編號:缺口左邊為1號角,然後按照逆時針編號。

1~7腳 ,15腳(Q n):並行輸出腳

8腳(GND):接地

9腳(SOUT也稱Q7'):用於級聯,移位暫存器中資料多於八位時,就會這八位資料送到下一個595

10腳(MR):低電平時觸發,清空移位暫存器中已有資料,接高電平即可。

11腳(SH_CP):移位暫存器時鐘,每一次上升沿(低電平到高電平)暫存器做一次移位,接受一位資料

12腳(ST_CP):儲存暫存器時鐘。上升沿時,資料從移位暫存器轉存帶儲存暫存器

13腳(OE):595使能管腳,接低電平即可以讓595輸出資料

14腳(DS):輸入序列資料

16腳(VCC):電源腳

三、使用方法

如果DS序列輸入的資料為0111 1111 則可以用下圖表示

注意:最先輸入的資料由Q7輸出

此過程為:序列資料輸入時鐘(11腳 SH_CP)暫存器時鐘(12腳 ST_CP)為低電平,DS輸入資料0;然後SH_CP變為高電平(上升沿觸發),DS資料進入Q0中,緊接著SH_CP變成0,來為下一次資料輸入準備。然後DS得到資料1,SH_CP再次變為高電平,Q0中的0進入Q1,1進入Q0。等八位資料進入暫存器後,SH_CP變為高電平,則可以輸出資料。然後變為低電平,為下一次資料輸出做準備。

從這個過程中就了一知道11腳與12腳的作用,SH_CP就好比一個開門的,有人在門口等著(DS得到資料),看門人(SH_CP)得到開門指令(上升沿指令),然後人就出去了,看門人在關上門,等待下一個人來。ST_CP也是類似的道理

四、程式碼及proteus模擬

我們通過595控制8個led燈的亮滅,輸入的資料為0101 0101

proteus中接線方法:

14腳DS 接 微控制器P3.4

11腳SH_CP 接微控制器P3.6

12腳ST_CP 接微控制器P3.5

13腳OE接GND

10腳MR接VCC

注意:proteus中595VCC與GND已預設連線。

#include<reg52.h>
#include<intrins.h>
//intrins.h函式,一般出現在C51微控制器程式設計中,一般程式中需要使用到空指令_nop_();字元迴圈移位指令_crol_等時使用


typedef unsigned char uchar;
typedef unsigned int uint;

/**********函式宣告********************/
void SendTo595(uchar byteData);
/***********************************/

sbit DS = P3^4;    //p3.4序列資料輸入   DS
sbit SH_CP = P3^6;    //序列輸入時鐘,上升沿有效
sbit ST_CP = P3^5;    //序列暫存器時鐘,上升沿有效

void main()
{
			 ST_CP = 0;
       SendTo595(0x55);  //二進位制:0101 0101
       while(1);
}

//傳送一個位元組資料給595再並行輸出
void SendTo595(uchar Data)
{
   char i=0;
   for(i;i<8;i++)
   {
		    SH_CP = 0; 
		 
        DS=0x80&Data;//&為按位運算子,即全1為1,有0為0,上式也就是 (1000 0000)&(1111 1111)=1000 0000,若高位為1則是1高位為0則這個式子為0
		 
        Data=_crol_(Data,1); //左移一位 將高位補給低位,如果二進位制數為01010101 那麼_crol_(1) 為10101010

        SH_CP = 1;          //上升沿讓序列輸入時鐘變成高電平 並延時一個時鐘週期
        _nop_();

   }  
   
   /*位移暫存器完畢,轉移到儲存暫存器*/
   ST_CP = 1;         //上升沿,儲存暫存器變為高電平 延遲兩個時鐘週期
   _nop_();
   _nop_();

}