因為器材都放在學校,所以就沒法做這個實驗,不過,這是我曾經做過的實驗。
本次主要兩種串轉并的器件(74hc164,74hc595)實驗io拓展的功能,可能網上也有歷程,不過這是我自己編寫,所以記憶猶深。
在學習數電的過程中有學習這兩種器件,但我不知道為什么我買來的開發板都沒有用這個器件,所以很納悶,就在百度在搜了下74hc595的資料。
74HC595是硅結構的CMOS器件, 兼容低電壓TTL電路,遵守JEDEC NO.7A標準。
74HC595具有8位移位寄存器和一個存儲器,三態輸出功能。 移位寄存器和存儲器有相互獨立的時鐘。
數據在SH_cp(移位寄存器時鐘輸入)的上升沿輸入到移位寄存器中,在ST_cp(存儲器時鐘輸入)的上升沿輸入到存儲寄存器中去。如果兩個時鐘連在一起,則移位寄存器總是比存儲寄存器早一個脈沖。
移位寄存器有一個串行移位輸入(Ds),和一個串行輸出(Q7’),和一個異步的低電平復位,存儲寄存器有一個并行8位的,具備三態的總線輸出,當使能OE時(為低電平),存儲寄存器的數據輸出到總線。
8位串行輸入/輸出或者并行輸出移位寄存器,具有高阻關斷狀態。三態。
將串行輸入的8位數字,轉變為并行輸出的8位數字,例如控制一個8位數碼管,將不會有閃爍。
中文名74HC595類 別存儲器功 能數據存儲結 構硅結構的CMOS器件
特點 8位串行輸入 /8位串行或并行輸出 存儲狀態寄存器,三種狀態
輸出寄存器(三態輸出:就是具有高電平、低電平和高阻抗三種輸出狀態的門電路。)可以直接清除 100MHz的移位頻率
輸出能力 并行輸出,總線驅動; 串行輸入;標準中等規模集成電路
595移位寄存器有一個串行移位輸入(Ds),和一個串行輸出(Q7’),和一個異步的低電平復位,存儲寄存器有一個并行8位的,具備三態的總線輸出,當使能OE時(為低電平),存儲寄存器的數據輸出到總線。
參考數據
Cpd決定動態的能耗,
Pd=Cpd×VCC×f1+∑(CL×VCC^2×f0)
F1=輸入頻率,CL=輸出電容 f0=輸出頻率(MHz) Vcc=電源電壓
引腳說明
74HC595
符號
| 引腳
| 描述
| Q0--Q7
| 第15腳,第1-7腳
| 8位并行數據輸出,
| GND
| 第8腳
| 地
| Q7’
| 第9腳
| 串行數據輸出
| MR
| 第10腳
| 主復位(低電平)
| SHCP
| 第11腳
| 移位寄存器時鐘輸入
| STCP
| 第12腳
| 存儲寄存器時鐘輸入
| OE
| 第13腳
| 輸出有效(低電平)
| DS
| 第14腳 | 串行數據輸入
| VCC
| 第16腳
| 電源
|
使用方法 74595的數據端:
Q0--Q7: 八位并行輸出端,可以直接控制數碼管的8個段。
Q7': 級聯輸出端。將它接下一個595的SI端。
DS: 串行數據輸入端。
74595的控制端說明:
/MR(10腳): 低電平時將移位寄存器的數據清零。通常我將它接Vcc。
SH_CP(11腳):上升沿時數據寄存器的數據移位。Q1->Q2-->Q3-->...-->Q7;下降沿移位寄存器數據不變。(脈沖寬度:5V時,大于幾十納秒就行了。我通常都選微秒級)
ST_CP(12腳):上升沿時移位寄存器的數據進入數據存儲寄存器,下降沿時存儲寄存器數據不變。通常我將ST_CP置為低點平,當移位結束后,在ST_CP端產生一個正脈沖(5V時,大于幾十納秒就行了。我通常都選微秒級),更新顯示數據。
/OE(13腳): 高電平時禁止輸出(高阻態)。如果單片機的引腳不緊張,用一個引腳控制它,可以方便地產生閃爍和熄滅效果。比通過數據端移位控制要省時省力。
注1)74164和74595功能相仿,都是8位串行輸入轉并行輸出移位寄存器。74164的驅動電流(25mA)比74595(35mA)的要小,14腳封裝,體積也小一些。
2)74595的主要優點是具有數據存儲寄存器,在移位的過程中,輸出端的數據可以保持不變。這在串行速度慢的場合很有用處,數碼管沒有閃爍感。
3)595是串入并出帶有鎖存功能移位寄存器,它的使用方法很簡單,在正常使用時ST_CP為低電平, /OE為低電平。595是串入并出帶有鎖存功能移位寄存器,它的使用方法很簡單,如下面的真值表,在正常使用時ST_CP為低電平, /OE為低電平。從DS每輸入一位數據,串行輸入時鐘SH_CP上升沿有效一次,直到八位數據輸入完畢,輸出時鐘ST_CP上升沿有效一次,此時,輸入的數據就被送到了輸出端。
595具體使用的步驟:
第一步:目的:將要準備輸入的位數據移入74HC595數據輸入端上。
方法:送位數據到_595。
第二步:目的:將位數據逐位移入74HC595,即數據串入
方法:SH_CP產生一上升沿,將DS上的數據移入74HC595中.從低到高
第三步:目的:并行輸出數據。即數據并出
方法:ST_CP產生一上升沿,將由DS上已移入數據寄存器中的數據
送入到輸出鎖存器。
說明: 從上可分析:從SH_CP產生一上升沿(移入數據)和ST_CP產生一上升沿(輸出數據)是二個獨立過程,實際應用時互不干擾。即可輸出數據的 同時移入數據。[1]
相關注釋
H=高電平狀態
L=低電平狀態
↑=上升沿
↓=下降沿
Z=高阻態
NC=無變化
×=無關系
當MR為高電平,數據在SHCP上升沿進入移位寄存器,在STCP上升沿輸出到并行端口,OE為使能端,低電平有效,當OE為低時,輸出使能,為高關閉使能,并不影響其他輸入端。
真值表
程序樣例 DS接MOSI,OE/GND接GND,SH_CP接SCLK,ST_CP接使能信號BIT0@P1,MR/VCC接POWER,如果不需要16位,改US16B,不使用H寄存器即可,還有SPI工作期間可以進入低功耗,也可以執行指令.
補充內容:
論壇不知道怎么的,剛寫了一半就發表了,好吧,那就從新在寫下。 74hc595,在我眼中,有點像spi的樣子,不過,他只出不進,也沒有什么協議。就是用的很普遍的移位寄存器及鎖存器。只不過,由于現在一一些器件都集成了spi或者iic等協議,不需要串轉并的接口,但一般場合下,用下也無傷大雅,所以我就摳門的想到了用這款芯片。 我選用的一款stm32f0開發板,一個74hc595芯片,一個一段共陰數碼管。借鑒青風電子的庫函數,寫了下自己的串轉并的程序。 不知道為什么無法上傳文件壓縮包,那我就在在此貼上我的程序唄。
led.c
- /******************** (C) COPYRIGHT 2011 青風電子 ********************
- * 文件名 :led.c
- * 描述 :
- * 實驗平臺:青風stm32f051開發板
- * 描述 :led驅動函數
- * 作者 :青風
- * 店鋪 :qfv5.taobao.com
- **********************************************************************************/
- #include "led.h"
- /**********************************************/
- /* 函數功能; led燈 初始化 */
- /* 入口參數:無 */
- /**********************************************/
- unsigned char code_hex[]={
- 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,
- 0x7c,0x39,0x5e,0x79,0x71,0x76,0x73,0x3e,0x00
- };
- void LED_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct;
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
- GPIO_InitStruct.GPIO_Pin = SDATA_595 |SCLK_595| RCK_595 ;
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
- GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStruct.GPIO_Speed =GPIO_Speed_Level_3;
- GPIO_Init(RCK_PORT, &GPIO_InitStruct);
- GPIO_SetBits(RCK_PORT, SDATA_595 |SCLK_595| RCK_595 );
- }
- void delay(u8 i)
- {
- while(i--);
- }
- /**********************************************/
- /* 函數功能;打開led燈 */
- /* 入口參數:無 */
- /**********************************************/
- void SDATA_0(void)
- {
- GPIO_ResetBits(RCK_PORT, SDATA_595 );
- }
- /**********************************************/
- /* 函數功能; 關掉led燈 */
- /* 入口參數:無 */
- /**********************************************/
- void SDATA_1(void)
- {
- GPIO_SetBits(RCK_PORT, SDATA_595);
- }
- /**********************************************/
- /* 函數功能;led翻轉 */
- /* 入口參數:無 */
- /**********************************************/
- void SCLK_0(void)
- {
- GPIO_ResetBits(RCK_PORT, SCLK_595 );
- }
- void SCLK_1(void)
- {
- GPIO_SetBits(RCK_PORT, SCLK_595 );
- }
- void RCK_0(void)
- {
- GPIO_ResetBits(RCK_PORT, RCK_595 );
- }
- void RCK_1(void)
- {
- GPIO_SetBits(RCK_PORT, RCK_595 );
- }
- void write_595(u8 temp) //上升沿將數據寫入寄存器
- {
- u8 i,temp0;
- SCLK_0();
- for(i=0;i<8;i++)
- {
- temp0=temp<<i ;
- if(temp0&0x80)
- SDATA_1();
- else SDATA_0();
- SCLK_1();
- // delay(100);
- SCLK_0();
- }
-
- }
- void out_595(void)//上升沿輸出數據
- {
- RCK_0();
- // delay(100);
- RCK_1();
- RCK_0();
- }
- void buffer_595(u8 temp)
- {
- write_595(temp);
- out_595();
- }
復制代碼
下載(此代碼年代久遠,采用的老版本的庫和老版本Keil編寫的):
代碼.7z
(737.65 KB, 下載次數: 49)
2022-11-22 03:10 上傳
點擊文件名下載附件
|