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