大家都認為計算機可以做任何事,對我們的生活有巨大的作用,尤其是在學習單片機的過程中。學習計算機可以教會我們分析和解決問題,而學習單片機可以幫助我們更好地理解計算機如何根據我們的想法解決問題。本文帶你了解寄存器,它將伴隨學習單片機的全過程。寄存器是連接硬件和軟件的重要紐帶。計算機的任何功能都離不開寄存器。中央處理器也有寄存器。總線通信、通過注冊、內存分頁等一切都基于寄存器。電子洞和多彩的計算機世界之間有更多的寄存器,如鏈接。它們看起來很復雜,但它們很清楚。即便所有的計算機一夜之間突然消失,人類也可以從電子管和打孔紙帶開始,一層一層地構建計算機世界。我們所知道的只是這個龐大系統中的滄海一粟。
1.什么是寄存器
寄存器是CPU內部的一種存儲器,分為通用寄存器和特殊功能寄存器(8086也細分為特殊功能寄存器)。通用寄存器,顧名思義是通用的。它們可以存儲操作數、運算結果、內存地址等數據,在用C語言編程時,編譯器一般負責安排通用寄存器的使用,無需直接聯系它們。特殊功能寄存器具有特定功能,其中一些作用于CPU,比如PC存放下一條指令的地址,SP記錄棧頂在內存中的位置,其中一些與IO模塊相連,單片機程序通過這些寄存器控制各種外設。
圖1 寄存器
我們通常使用的單片機是atmega324pa,它的封裝種類很多,管腳數量不同,但通用輸入輸出(GPIO)管腳有32個。由于AVR架構是8位字長,因此CPU一次處理1位數據和8位數據所需的時間相同。32個引腳被組織成4個端口,即PA、Pb、PC和PD。在微型和微型微控制器的AVR架構中,每個端口都有三個寄存器來控制數字信號IO,分別是portx、ddrx和PINX。這里的X是a、B、C或D。由于四個端口在數字IO方面是相同的,我們將它們組合起來。因此,對于每個引腳Pxn,有3個位,portxn、ddxn(不帶R)和pinxn,來控制其數字io。
ddxn控制引腳方向:ddxn為1時,輸出Pxn;當ddxn為0時,輸入Pxn。
當輸入Pxn時,如果portxn為1,則該引腳通過上拉電阻連接到VCC;否則,引腳懸空。
輸出Pxn時,若portxn為1,引腳輸出高電平;否則,引腳輸出低電平。
pinxn的值是Pxn引腳的電平。如果將1寫入pinxn,則portxn的值會翻轉。
寄存器還有很多細節,比如MCUCR寄存器中PUD位的作用、復位后寄存器的值、輸入/輸出切換的方法、讀取引腳電平的延遲、未連接引腳的處理方法等。
2.什么是單片機寄存器
寄存器是內存階層中的最頂端,也是系統獲得操作資料的最快速途徑。寄存器通常都是以他們可以保存的位元數量來估量,舉例來說,一個“8位元寄存器”或“32位元寄存器”。寄存器現在都以寄存器檔案的方式來實作,但是他們也可能使用單獨的正反器、高速的核心內存、薄膜內存以及在數種機器上的其他方式來實作出來。寄存器通常都用來意指由一個指令之輸出或輸入可以直接索引到的暫存器群組。更適當的是稱他們為“架構寄存器”。例如,x86指令集定義八個32位元寄存器的集合,但一個實作x86指令集的CPU可以包含比八個更多的寄存器。寄存器是CPU內部的元件,寄存器擁有非常高的讀寫速度,所以在寄存器之間的數據傳送非常快。
圖2 單片機寄存器
3.單片機寄存器的類型
3.1累加器A
累加器A是微處理器中使用最頻繁的寄存器。在算術和邏輯運算時它有雙功能:運算前,用于保存一個操作數;運算后,用于保存所得的和、差或邏輯運算結果。
3.2數據寄存器DR
數據寄存器通過數據總線向存儲器和輸入/輸出設備送(寫)或取(讀)數據的暫存單元。它可以保存一條正在譯碼的指令,也可以保存正在送往存儲器中存儲的一個數據字節等等。
3.3指令寄存器IR和指令譯碼器ID
指令包括操作碼和操作數。指令寄存器是用來保存當前正在執行的一條指令。當執行一條指令時,先把它從內存中取到數據寄存器中,然后再傳送到指令寄存器。當系統執行給定的指令時,必須對操作碼進行譯碼,以確定所要求的操作,指令譯碼器就是負責這項工作的。其中,指令寄存器中操作碼字段的輸出就是指令譯碼器的輸入。
3.4程序計數器PC
PC用于確定下一條指令的地址,以保證程序能夠連續地執行下去,因此通常又被稱為指令地址計數器。在程序開始執行前必須將程序的第一條指令的內存單元地址(即程序的首地址)送入PC,使它總是指向下一條要執行指令的地址。
3.5地址寄存器AR
用來保存當前CPU所訪問的內存單元的地址。由于在內存和CPU之間存在著操作速度上的差別,所以必須使用地址寄存器來保持地址信息,直到內存的讀/寫操作完成為止址寄存器(Address Register,AR)用來保存當前CPU所訪問的內存單元的地址。由于在內存和CPU之間存在著操作速度上的差別,所以必須使用地址寄存器來保持地址信息,直到內存的讀/寫操作完成為止。數據寄存器DR用來暫存微處理器與存儲器或輸人/輸出接口電路之間待傳送的數據。地址寄存器AR和數據寄存器DR在微處理器的內部總線和外部總線之間,還起著隔離和緩沖的作用。
4.單片機寄存器的使用教程
要使用寄存器,需要寫#include,然后就可以使用PORTA、DDRB、PINC等寄存器。它們是宏定義。不必探索它們是如何擴展的。只需要知道這些宏是可以讀、賦值和位操作的,就像uint8_t類型變量一樣。但是像PORTA0SumDDB7宏定義這樣的東西并不代表寄存器上的位。它們實際上是字面常量,比如PORTAx寄存器表示寄存器PORTA的第x位(0為最低位,7為最高位),其值為X。因此,直接復制這些宏是不正確的(不僅意思不對,編譯也不會通過)。
在開發板的庫函數中提供包含多個位操作的宏函數。可以拿出存儲器的手冊來,看看后面是怎么實現的。
讓我們舉個例子,點亮一個LED,首先打開紅色LED。原理圖第2頁左上角紅色LED通過電阻與網絡LED0相連,第1頁LED0與單片機PC4引腳相連,所以我們需要讓PC4腳輸出高電平。回到三個寄存器的功能。輸出高電平要求ddxn和portxn同時為1。我們把X和N分別用C和4取進去,也就是我們希望ddc4和portc4為1。
如果寄存器的一個位置為1,則set_bit實現。它需要兩個參數,要操作的整數變量和表示第一個數字的整數。將ddc4設置為1應該寫入set_bit(DDRC,4);4可以用DDC4替換,就是這樣定義的。同理,portc4可以設置為1。點亮紅色LED的整個過程如下:
接下來是存儲器的數字輸入。使用第一個按鍵相關的例子,保持LED狀態與按鍵一致,即按下點亮。
要讀取寄存器中的一位,可以使用read_bit。如果引腳上的電平為高電平,則read_bit的運算結果不為0(但不一定是布爾值1)。注意按鍵時引腳電平是低的,所以讀取引腳電平的結果是你是否按下該鍵。
原理圖中,key的一端接btn0網絡,再接單片機的PA4引腳。所以按鍵是否按下應該寫成:!read_bit(PINA,4)。
引腳應在讀取前配置為輸入。雖然是reset后默認輸入的,在這個例子中沒有必要給dda4寫0,但是寫清楚是一個好習慣,讓看這段代碼的人(可能是別人也可能是自己)明白PA4是輸入。對于porta4,由于該引腳外接了上拉電阻,因此無需使能內部上拉電阻。
結合按鍵動作的知識,應該知道如何直接通過寄存器操作來判斷按鍵動作。值得注意的是,這些程序都不需要在項目屬性中將libee1庫添加到鏈接器。雖然代碼使用,但它們都是宏定義,獨立于鏈接器。
5.關于單片機寄存器的常見問題
5.1什么是單片機寄存器?
簡單地說,寄存器是一種內存。通常寄存器位于 CPU 或 MCU(微控制器)內,非常靠近算術單元或直接連接到各種 I/O 端口。由于這個位置或特殊設計,與其他類型的存儲器相比,寄存器在讀/寫速度方面要快得多。
5.2單片機寄存器有什么作用?
寄存器的單片機(計算機)的存儲單元,是存取數據較為方便、快速地方寄存器常用于存放使用比較頻繁的數據,再參與運算,都很容易。
5.3哪些計算機使用單芯片處理器?
單芯片云計算機(SCC) 是英特爾實驗室開發的一種實驗性微處理器,SCC 微處理器包括集成在單個硅芯片上的 48 個內核,SCC 具有雙核 SCC 磁貼、內存控制器和 24 路由器網狀網絡。
5.4什么是單芯片CPU?
大部分微機的ALU和控制單元都是在一塊硅片上組合制造的。大多數現代 CPU 都是微處理器,這意味著它們包含在單個集成電路 (IC) 芯片中。
以上就是單片機的寄存器類型及操作教程的介紹了,單片機一種集成電路芯片,廣泛用于各大行業中。單片機寄存器其實就相當于一個變量,只不過這個變量在固定的地址,有一個特殊的名稱(當然也不強制)。初學者對寄存器的操作比較困難的原因不是匯編語言或C語言使用的不熟,而是對寄存器的陌生。單片機中存儲器的資源是非常寶貴和有限的,任何產品都有使用說明書,要想最好的使用一款產品也是去閱讀說明書。單片機或者芯片的說明書就是數據手冊。數據手冊中往往都是對寄存器如何操作的描述,只不過要耐下心來一點一點的去理解去消化手冊所介紹的功能,這樣才能用好。
電話:18923864027(同微信)
QQ:709211280
〈烜芯微/XXW〉專業制造二極管,三極管,MOS管,橋堆等,20年,工廠直銷省20%,上萬家電路電器生產企業選用,專業的工程師幫您穩定好每一批產品,如果您有遇到什么需要幫助解決的,可以直接聯系下方的聯系號碼或加QQ/微信,由我們的銷售經理給您精準的報價以及產品介紹