74HC595 芯片介紹文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-756630.html
74HC595 是一個(gè) 8 位串行輸入、并行輸出的位移緩存器,其中并行輸出為三 態(tài)輸出(即高電平、低電平和高阻抗)。芯片管腳及功能說(shuō)明如下:圖1文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-756630.html

15 和 1 到 7 腳 QA--QH:并行數(shù)據(jù)輸出9 腳 QH 非:串行數(shù)據(jù)輸出10 腳 SCLK 非( MR) : 低電平復(fù)位引腳11 腳 SCK( SHCP) : 移位寄存器時(shí)鐘輸入12 腳 RCK( STCP) : 存儲(chǔ)寄存器時(shí)鐘輸入13 腳 G 非( OE) : 輸出有效14 腳 SER( DS) : 串行數(shù)據(jù)輸入

- 小白學(xué)習(xí)小計(jì):
- 1,圖2先刨開(kāi)點(diǎn)陣的圖不管,只看74HC595圖,從圖1我們得知,15 和 1 到 7 腳 QA--QH:并行數(shù)據(jù)輸出,對(duì)應(yīng)圖2的5 和 1 到 7 腳,就是QA---AH是并行輸出數(shù)據(jù),
- 2,對(duì)應(yīng)圖1我們就可以知道:11 腳 SRCLK?: 移位寄存器時(shí)鐘輸入。12 腳 RCLK?: 存儲(chǔ)? ?????寄?存器時(shí)鐘輸入 。13 腳 G 非( OE) : 輸出有效? 。14 腳 SER( DS):?串行數(shù)據(jù)輸入
- 3,此時(shí)得知14 腳 SER( DS) : 串行數(shù)據(jù)輸入,7/Q7(QH)是一個(gè)串行輸出。意思就是從? ? ? ?14 腳輸入,到1腳輸出.
- 4,SER輸入的數(shù)據(jù)在 SHCP 上升沿進(jìn)入移位寄存器,在 STCP 上升沿才能輸出輸出到并行? ??????端口7腳(QH)。
- 5,輸入輸出邏輯就是,從14 腳 SER輸入數(shù)據(jù),儲(chǔ)存到移位寄存器11 腳 SRCLK?,在通過(guò)移位寄存器傳輸?shù)酱鎯?chǔ)寄存器12 腳 RCLK,在通過(guò)存儲(chǔ)寄存器傳輸給QH
- 6,從圖2,15 和 1 到 7 腳連接到LED的DPa--DPh,所用通過(guò)控制15 和 1 到 7 腳就可以控制LED燈
- 7,這里把QA--QH看成一個(gè)字節(jié)八位的二進(jìn)制(0000 0000),芯片工作時(shí)候通過(guò)向SER傳入這個(gè)二進(jìn)制數(shù)據(jù)來(lái)控制QA--QH,QA到QH輸出SER的八位。QA為最低位,QH為最高位,例如我們給QH傳入高電平就是10000000(0x80)、SER數(shù)據(jù)的每一位在SRCLK的時(shí)鐘脈沖上升沿每上升一次存儲(chǔ)一位數(shù)據(jù)在寄存器SCK中,在RCLK上升沿時(shí)一次性傳輸?shù)酱鎯?chǔ)器RCK中(這里怎么看QA為最低位,QH為最高位,我還不知道,哪位知道怎么看留言哈)
/********************************************************************
****************** 實(shí)驗(yàn)名稱:IO 擴(kuò)展(串轉(zhuǎn)并)實(shí)驗(yàn)-74HC595
接線說(shuō)明
實(shí)驗(yàn)現(xiàn)象:下載程序后,8*8LED 點(diǎn)陣以一行循環(huán)滾動(dòng)顯示
注意事項(xiàng):LED 點(diǎn)陣旁的 J24 黃色跳線帽短接到 GND 一端
*********************************************************************
******************/
#include "reg52.h"
typedef unsigned int u16; //對(duì)系統(tǒng)默認(rèn)數(shù)據(jù)類型進(jìn)行重定義
typedef unsigned char u8;
//定義 74HC595 控制管腳
sbit SRCLK=P3^6; //移位寄存器時(shí)鐘輸入
sbit rCLK=P3^5; //存儲(chǔ)寄存器時(shí)鐘輸入
sbit SER=P3^4; //串行數(shù)據(jù)輸入
#define LEDDZ_COL_PORT P0 //宏定義LED點(diǎn)陣列控制端口
//定義ghc595_buf[]數(shù)組把每次輸出的數(shù)據(jù)儲(chǔ)存在里面,傳入到hc595_write_data函數(shù)
u8 ghc595_buf[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
/********************************************************************
***********
* 函 數(shù) 名 : delay_10us
* 函數(shù)功能 : 延時(shí)函數(shù),ten_us=1 時(shí),大約延時(shí) 10us
* 輸 入 : ten_us
* 輸 出 : 無(wú)
*********************************************************************
**********/
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
/********************************************************************
***********
* 函 數(shù) 名 : delay_ms
* 函數(shù)功能 : ms 延時(shí)函數(shù),ms=1 時(shí),大約延時(shí) 1ms
* 輸 入 : ten_us
* 輸 出 : 無(wú)
* for(j=110;j>0;j--)在for(i=ms;i>0;i--)嵌套這,delay_ms(500),
* 時(shí)候ms=500,i=ms 所以i=500,進(jìn)入for(i=ms;i>0;i--),
* 然后在執(zhí)行for(j=110;j>0;j--),進(jìn)行循環(huán)110次一直到j(luò)=0,
* 在退出for(j=110;j>0;j--),
* 在重新執(zhí)行for(i=ms;i>0;i--),一直到到i=0時(shí)候,退出for(i=ms;i>0;i--)
*********************************************************************
**********/
void delay_ms(u16 ms)
{
u16 i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
/********************************************************************
***********
* 函 數(shù) 名 : hc595_write_data(u8 dat)
* 函數(shù)功能 : 向 74HC595 寫(xiě)入一個(gè)字節(jié)的數(shù)據(jù)
* 輸 入 : dat:數(shù)據(jù)
* 輸 出 : 無(wú)
*********************************************************************
**********/
/********************************************************************
*******************SER=dat>>7(dat向右移7位后賦值給SER)詳解*************
dat是后面要輸入的一個(gè)字節(jié)的數(shù)據(jù),hc595_write_data(0x00)如后面的
hc595_write_data(0x01),這時(shí)候dat就是(0x01)當(dāng)dat=00000001(0x01)時(shí)候,
高位是0,低位是1 ,對(duì)應(yīng)按照QH-QA,就是QH低電平,QA高電平,但是74HC595的傳輸
規(guī)律是先從高位在到低位的傳輸,左移1就傳給了QH,這樣QH高電平,QA為低電平,我們
想要QH輸入低電平怎么辦呢?就用把dat>>7,按照右移的規(guī)則(對(duì)于不帶字符的數(shù)值,
向右移位時(shí),會(huì)在左邊的空位填充0。)那(0x01)就變成0(0X00)一個(gè)字節(jié)八位都是0
這樣傳輸給QH就是低電平,
*********************************************************************
**********/
/********************************************************************
*******************dat<<=1(dat向左移一位后在賦值給dat)詳解*************
但是for(i=0;i<8;i++)循環(huán)8次,八位就都是0,QH-QA都是低電平,這樣是不對(duì)的,
我們是要QA輸入高電平,這時(shí)候就需要每次循環(huán)的時(shí)候dat<<=1,每次SER=dat>>7;
執(zhí)行完dat<<=1,例如開(kāi)始dat=(0x01),執(zhí)行完SER=dat>>7后,在把dat<<=1(dat向
左移一位后在賦值給dat),這樣下次在進(jìn)入SER=dat>>7時(shí)候,dat就是dat<<=1(0X02)
一直倒循環(huán)到第7次時(shí)候dat也左移了7位,dat變成了10000000(0x80),這時(shí)候在進(jìn)入
SER=dat>>7時(shí)候,SER就等于1,對(duì)應(yīng)QA傳輸,就按照hc595_write_data(0x01)的一樣
低位1,其余都是0的輸入。
*********************************************************************
**********/
/********************************************************************
*******************SRCLK=0,SRCLK=1詳解*******************************
74HC595芯片的傳輸規(guī)則,SER寫(xiě)入數(shù)據(jù)后,要移位寄存器(SRCLK)時(shí)鐘上升沿,才能把
數(shù)據(jù)送到存儲(chǔ)寄存器進(jìn)行輸出,所有我們要先給SRCLK一個(gè)低電平,在給一個(gè)高電平,就產(chǎn)
生了上升沿,那我們就先SRCLK=0送入低電平;中間延時(shí)下,在SRCLK=1送入高電平,
一低一高,這樣就產(chǎn)生時(shí)鐘上升沿,就把數(shù)據(jù)送入到存儲(chǔ)寄存器,每次循環(huán)都送入存儲(chǔ)寄存器,
循環(huán)8次,就把8位的數(shù)據(jù)都送到存儲(chǔ)寄存器中了。
中間的delay_10us(1);這里的延時(shí),不要也可以,但是以防出錯(cuò)這里延時(shí)下
*********************************************************************
**********/
/********************************************************************
*******************rCLK=0,rCLK=1詳解*******************************
74HC595芯片的傳輸規(guī)則,如果將前面寫(xiě)入存儲(chǔ)寄存器數(shù)據(jù)輸出,那存儲(chǔ)寄存器時(shí)鐘要
上升沿才能輸出,那我們就先rCLK=0送入低電平;中間延時(shí)下,在rCLK=1送入高電平,
一低一高,這樣產(chǎn)生時(shí)鐘上升沿,就將前面寫(xiě)入到寄存器的數(shù)據(jù)輸出了。
中間的delay_10us(1);這里的延時(shí),不要也可以,但是以防出錯(cuò)這里延時(shí)下
*********************************************************************
**********/
void hc595_write_data(u8 dat)
{
u8 i=0;
for(i=0;i<8;i++)//循環(huán) 8 次即可將一個(gè)字節(jié)寫(xiě)入寄存器中
{
SER=dat>>7;//優(yōu)先傳輸一個(gè)字節(jié)中的高位
dat<<=1;//將低位移動(dòng)到高位
SRCLK=0;
delay_10us(1);
SRCLK=1;
delay_10us(1);//移位寄存器時(shí)鐘上升沿將端口數(shù)據(jù)送入寄存器中
}
rCLK=0;
delay_10us(1);
rCLK=1;//存儲(chǔ)寄存器時(shí)鐘上升沿將前面寫(xiě)入到寄存器的數(shù)據(jù)輸出
}
/********************************************************************
***********
* 函 數(shù) 名 : main
* 函數(shù)功能 : 主函數(shù)
* 輸 入 : 無(wú)
* 輸 出 : 無(wú)
*********************************************************************
**********/
/********************************************************************
*******************LEDDZ_COL_PORT=0x00詳解*******************************
我們?cè)贒Pa---DPh輸入的是高電平,如果我們要將LED燈點(diǎn)亮,我們要把P0端口全部設(shè)為低電
平,即 LED 陰極為低電平,前面我們宏定義了P0端口,所以這里L(fēng)EDDZ_COL_PORT=0x00就可以
*********************************************************************
**********/
/********************************************************************
*******************hc595_write_data(ghc595_buf[i])詳解***************
我們定義了,數(shù)組ghc595_buf[],把每次輸出的數(shù)據(jù)儲(chǔ)存在里面,通過(guò)for循環(huán),依次
輸出,每次寫(xiě)入新數(shù)據(jù)之前,要先消除前面輸出數(shù)據(jù)點(diǎn)亮LED進(jìn)行消影,所以每次在輸入
數(shù)據(jù)之前,我們先把所有DPa---DPh輸入低電平,來(lái)消除前面寄存器緩存數(shù)據(jù),之后在
在寫(xiě)入新的數(shù)據(jù):這樣就產(chǎn)生了,LED點(diǎn)陣,從下到上,每行依次點(diǎn)亮
*********************************************************************
**********/
void main()
{
u8 i=0;
LEDDZ_COL_PORT=0x00;//將 LED 點(diǎn)陣列全部設(shè)置為 0,即 LED 陰極為低電平
while(1)
{
for(i=0;i<8;i++)
{
hc595_write_data(0x00);//消除前面寄存器緩存數(shù)據(jù)
hc595_write_data(ghc595_buf[i]);//寫(xiě)入新的數(shù)據(jù)
delay_ms(500);//延時(shí) 500ms
}
}
}
到了這里,關(guān)于51單片機(jī)——IO拓展(串轉(zhuǎn)并)-74HC595 小白詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!