74HC595和74hc164一樣是在單片機系統中常用的晶片之一他的作用就是把串行的信號轉為並行的信號,常用在各種數碼管以及點陣屏的驅動晶片, 使用74HC595可以節約單片機mcu的io口資源,用3個io就可以控制8個數碼管的引腳,他還具有一定的驅動能力,可以免掉三極體等放大電路,所以這塊晶片是驅動數碼管的神器.應用非常廣泛,點這裡可以下載完整的74HC595中文資料:http://www.51hei.com/f/74HC595中文資料.pdf
74HC595引腳圖
74HC595管腳功能
下面我來介紹一下 74HC595工作原理:
74HC595的數據端:
QA--QH: 八位並行輸出端,可以直接控制數碼管的8個段。
QH': 級聯輸出端。我將它接下一個595的SI端。
SI: 串行數據輸入端。
74hc595的控制端說明:
/SCLR(10腳): 低電平時將移位寄存器的數據清零。通常我將它接Vcc。
SCK(11腳):上升沿時數據寄存器的數據移位。QA-->QB-->QC-->...-->QH;下降沿移位寄存器數據不變。(脈衝寬度:5V時,大於幾十納秒就行了。我通常都選微秒級)
控制移位寄存器
SCK 上升沿 數據 移位 SCK 下降沿 數據 保持
RCK(12腳):上升沿時移位寄存器的數據進入存儲寄存器,下降沿時存儲寄存器數據不變。通常我將RCK置為低電平,當移位結束後,在RCK端產生一個正脈衝(5V時,大於幾十納秒就行了。我通常都選微秒級),更新顯示數據。
控制存儲寄存器
RCK 上升沿 移位寄存器 的 數據進入 存儲寄存器 RCK 下降沿 存儲寄存器數據不變
/G(13腳): 高電平時禁止輸出(高阻態)。如果單片機的引腳不緊張,用一個引腳控制它,可以方便地產生閃爍和熄滅效果。比通過數據端移位控制要省時省力。
註:74164和74595功能相仿,都是8位串行輸入轉並行輸出移位寄存器。74164的驅動電流(25mA)比74595(35mA)的要小,14腳封裝,體積也小一些。
74595的主要優點是具有數據存儲寄存器,在移位的過程中,輸出端的數據可以保持不變。這在串行速度慢的場合很有用處,數碼管沒有閃爍感。
與74hc164隻有數據清零端相比,74hc595還多有輸出端時能/禁止控制端oe,可以使輸出為高阻態。所以是用這塊晶片會更方便
74HC595是具有8位移位寄存器和一個存儲器,三態輸出功能。 移位寄存器和存儲器是分別的時鐘。數據在SHcp(見時序圖)的上升沿輸入,在STcp(見時序圖)的上升沿進入的存儲寄存器中去。如果兩個時鐘連在一起,則移位
寄存器總是比存儲寄存器早一個脈衝。移位寄存器有一個串行移位輸入(Ds),和一個串行輸出
(Q7』),和一個異步的低電平復位,存儲寄存器有一個並行8位的,具備三態的總線輸出,當使
能 OE時(為低電平),存儲寄存器的數據輸出到總線。
這裡有單片機驅動74hc595的方法:http://www.51hei.com/chip/1799.html
74HC595真值表
74hc595最高電壓和最低電壓
74HC595時序圖
74HC595邏輯圖
74HC595和74HC164的區別主要有:
1、74HC595有鎖存器,所以在移位過程中輸出可以保持不變;而74HC164沒有鎖存器,所以每產生一個移位時鐘輸出就改變一次。這是二者的最大區別
2、74HC595使用專門的Q7'引腳實現多片級聯;74HC164直接使用輸出引腳Q7級聯
3、74HC595有使能OE,OE無效時輸出引腳為高阻態;而74HC164沒有使能引腳
4、74HC595的復位是針對移位寄存器的,想要復位LATCH寄存器還須ST_CP上升沿將移位寄存器內容加載到鎖存寄存器;也就是說:74HC595的復位是同步的,74HC164的復位是異步的,所以74HC164的復位更簡單
5、74HC164有對應的74HC165並轉串晶片
74HC595.c
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "74HC595.h"
/* 延時模塊82615468 sp-320-12
* */
static void delay(u32 t)
{
u32 i;
while(t--)
for (i = 0; i < 1; i++);
}
void HC595Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(HC595_CLK_GPIO_CLK | HC595_DATA_GPIO_CLK | HC595_CS_GPIO_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = HC595_CLK_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(HC595_CLK_GPIO, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = HC595_DATA_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(HC595_DATA_GPIO, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = HC595_CS_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(HC595_CS_GPIO, &GPIO_InitStructure);
HC595_CLK_H();
HC595_DATA_H();
HC595_CS_H();
}
void HC595Send(u8 data)
{
u8 j;
for (j = 8; j > 0; j--)
{
if(data & 0x80)
HC595_DATA_H();
else
HC595_DATA_L();
HC595_CLK_L(); //上升沿發生移位
delay(1);
data <<= 1;
HC595_CLK_H();
delay(1);
}
//HC595Load();
}
void HC595Load(void)
{
HC595_CS_L();
HC595_CS_H();
}
/*
void LedRowOn(u8 Row7_0, u8 Row15_8, u8 Row16_23,u8 Row31_24)
{
HC595Send(Row15_8);
HC595Send(Row7_0);
HC595Send(Row31_24);
HC595Send(Row16_23);
HC595Load();
}
*/
void LedRowOut(u32 Data)
{
HC595Send(Data >> 24);
HC595Send(Data >> 16);
HC595Send(Data >> 8);
HC595Send(Data >> 0);
HC595Load();
}
//end of file
74HC595.h
#ifndef __74HC595_H__
#define __74HC595_H__
#define HC595_CLK_PIN GPIO_Pin_6
#define HC595_CLK_GPIO GPIOA
#define HC595_CLK_GPIO_CLK RCC_APB2Periph_GPIOA
#define HC595_CLK_H() GPIOA->BSRR = HC595_CLK_PIN
#define HC595_CLK_L() GPIOA->BRR = HC595_CLK_PIN
#define HC595_CS_PIN GPIO_Pin_7
#define HC595_CS_GPIO GPIOA
#define HC595_CS_GPIO_CLK RCC_APB2Periph_GPIOA
#define HC595_CS_H() GPIOA->BSRR = HC595_CS_PIN
#define HC595_CS_L() GPIOA->BRR = HC595_CS_PIN
#define HC595_DATA_PIN GPIO_Pin_10
#define HC595_DATA_GPIO GPIOE
#define HC595_DATA_GPIO_CLK RCC_APB2Periph_GPIOE
#define HC595_DATA_H() GPIOE->BSRR = HC595_DATA_PIN
#define HC595_DATA_L() GPIOE->BRR = HC595_DATA_PIN
void HC595Send(u8 data);
void HC595Init(void);
void HC595Load(void);
void LedRowOn(u8 Row7_0, u8 Row15_8, u8 Row16_23,u8 Row31_24);
void LedRowOut(u32 Data);
#endif
推薦閱讀
本文將根據ST官方Flashprogramming manual,文檔編號:PM0059,講解STM32F207內部Flash編程。01、概述這裡的flash是指STM32F207內部集成的FlashFlash存儲器有以下特點最大1M字節的能力128位,也就是16位元組寬度的數據讀取字節,半字,字和雙字寫入扇區擦除和批量擦除存儲器的構成主要存儲區塊包含4個16K字節扇區,1個64K字節扇區和7個128K字節扇區。系統存儲器是用於在系統boot模式啟動設備的。這一塊是預留給ST的。包括bootloader程序,boot程序用於通過以下接口對Flash進行編程。USART1、USART3、CAN2、USB OTG FS設備模式(DFU
發表於 2020-12-25
本文是根據STM32F207的用戶手冊翻譯整理而來1、綜述DMA(Direct memory access)直接內存訪問,被用於內存和內存之間或內存和外設之間的高速數據傳輸。數據傳輸可以在沒有CPU的幹預下快速移動,這樣可以保持CPU資源處理其他事情DMA 控制器基於複雜的總線矩陣架構,將功能強大的雙 AHB 主總線架構與獨立的 FIFO 結合在一起,優化了系統帶寬,下圖①處,可以看出雙 AHB 主總線架構與獨立的 FIFO的結構注意看英文備註:DMA1控制器AHB外設埠沒有像DMA2一樣連接到總線矩陣,所以只有DMA2數據流可以執行存儲器到存儲器的傳輸我們對上圖的②處,(DMA1和DMA2結構一樣,我們就選擇DMA1)詳細
發表於 2020-12-25
1、IWDG1.1 獨立看門狗簡介IWDG(Independent watchdog)獨立看門狗,可以用來檢測並解決由於軟體錯誤導致的故障,當計數器到達給定的超時值時,會觸發一個中斷或產生系統復位獨立看門狗的時鐘是它專用的低速時鐘(LSI),所以它能保持工作及時主時鐘出現問題。窗口看門狗的時鐘是有APB1時鐘分頻得到得到,通過可配置的時間窗口來檢測應用程式非正常的過遲或過早的操作。IWDG 最適合應用於那些需要看門狗作為一個在主程序之外,能夠完全獨立工作,並且對時間精度要求較低的場合。 WWDG 最適合那些要求看門狗在精確計時窗口起作用的應用程式。1.2 獨立看門狗的特點①自由運行遞減計數器②時鐘來自通過獨立的RC振蕩器(可以工作在
發表於 2020-12-25
,需要看具體的應用場景。下文主要講解定時器的基礎定時功能,選擇定時器3。其他定時器原理是相同的,理解定時器3的定時功能,其他定時器也就能理解了。對於STM32系列的單片機,外設基本都是一致的,並且其他家的MCU也是類似的,國內的有兆易創新、新唐科技、上海靈動微電子等等。02、時鐘源定時器基本定時功能框圖。①CK_PSC是定時器時鐘TIMxCLK,經APB1預分頻器後分頻提供。②定時器時鐘經過PSC 預分頻器之後,即CK_CNT,用來驅動計數器計數。③計數器CNT 是一個16 位的計數器,向上,向下,向上/下計數模式,最大計數值為65535。當計數達到自動重裝載寄存器的時候產生更新事件,並清零從頭開始計數
發表於 2020-12-25
controlled through a 16-bit register(in the TIMx_PSC register).It can be changed on the fly as thiscontrol register is buffered. The new prescaler ratio is taken intoaccount at the next update event.節選自STM32F207 Reference manual手冊由於該控制寄存器具有緩衝功能,因此可對預分頻器進行實時更改。而新的預分頻比將在下一更新事件發生時被採用。預分頻器分頻由1 變為2 時的計數器時序圖在這裡看到預分頻器寄存器存在
發表於 2020-12-25
01、STM32捕獲功能從STM32的定時器框圖中看①部分基礎定時器模塊,已經在《STM32基礎定時器詳解》講解過了。②部分捕獲/對比通道模塊,已經在《定時器的PWM功能》講解過了。③部分是本文的重點,輸入捕獲模塊。從上圖可以看出定時器1共有4個輸入捕獲通道。 下文以定時器1的捕獲通道2為例講解。首先確定下對應的GPIO,從STM32F207數據手冊的Alternatefunction mapping看出,定時器1通道2對應的GPIO有PA9和PE11,下文將使用PE11。02、輸入捕獲過程輸入階段採樣對應的對輸入TIx,去產生濾波後的信號TIxF。然後極性選擇邊沿檢測器產生一個信號(TIxFPx),這個信號可以被用於
發表於 2020-12-25