導航:首頁 > 操作系統 > 單片機定義寄存器

單片機定義寄存器

發布時間:2023-01-19 17:36:45

Ⅰ 什麼是單片機的寄存器

寄存器是內存階層中的最頂端,也是系統獲得操作資料的最快速途徑。寄存器通常都是以他們可以保存的位元數量來估量,舉例來說,一個 「8 位元寄存器」或 「32 位元寄存器」。寄存器現在都以寄存器檔案的方式來實作,但是他們也可能使用單獨的正反器、高速的核心內存、薄膜內存以及在數種機器上的其他方式來實作出來。 寄存器通常都用來意指由一個指令之輸出或輸入可以直接索引到的暫存器群組。更適當的是稱他們為 「架構寄存器」。 例如,x86 指令集定義八個 32 位元寄存器的集合,但一個實作 x86 指令集的 CPU 可以包含比八個更多的寄存器。 寄存器是CPU內部的元件,寄存器擁有非常高的讀寫速度,所以在寄存器之間的數據傳送非常快。 http://ke..com/view/6159.htm

Ⅱ 單片機寄存器的定義

寄存器中存放的機器碼是用來控制各個管腳的
因此我們常常要在寄存器中寫入初值或者在程序運行中寫入
寄存器有固定地址的(01代碼)
但是我們在用的時候不用01代碼來寫入
因為我們也記不住
所以單片機事先已經定義好了相應的可讀的代碼供我們使用
比如:在單片機中總中斷為IE中的EA
其實EA是一個寄存器單元或者說它就代表了那個單元
我們如果相對那個寄存器操作只需要對EA就行了
比如EA=1,則總中斷打開
我們不知道原始的地址01代碼究竟是多少
就算知道也沒有用
因為無論C語言還是匯編都不能在01代碼的地址上寫入值的

Ⅲ pic單片機a0以後得寄存器地址怎麼定義

MPLAB開發環境中,包含各種PIC系列單片機的頭文件,我在理解頭文件中關於寄存器位地址定義時繞了些彎路,所以特意寫出來加強記憶。

以LATA寄存器為例:在pic16f1938.h頭文件中,關於LATA寄存器的定義如下

// Register: LATA

volatile unsigned char           LATA                @ 0x10C;

// bit and bitfield definitions

volatile bit LATA0               @ ((unsigned)&LATA*8)+0;

volatile bit LATA1               @ ((unsigned)&LATA*8)+1;

volatile bit LATA2               @ ((unsigned)&LATA*8)+2;

volatile bit LATA3               @ ((unsigned)&LATA*8)+3;

volatile bit LATA4               @ ((unsigned)&LATA*8)+4;

volatile bit LATA5               @ ((unsigned)&LATA*8)+5;

volatile bit LATA6               @ ((unsigned)&LATA*8)+6;

volatile bit LATA7               @ ((unsigned)&LATA*8)+7;

一、代碼解析

1. 「@」符號

    在很多嵌入式編譯環境中,"@"符號表示「將符號左邊的變數鉗制在符號右邊的地址」 。

    C語言中本來是沒有「@」符號的,但在MPLAB編譯環境里,「@」相當於匯編中的「EQU」偽指令,即

    C語言代碼:

    LATA @ 0x10C   

    等價於匯編指令:

    LATA    EQU    0x10C

    用自然語言表述,就是:char型變數LATA的值,存放在位元組地址為「0x10C」的內存空間。 

2. 「LATA0   @ ((unsigned)&LATA*8)+0」語句

    ① 在C語言中,「unsigned」是「unsigned int」的簡寫, 在這句代碼中的作用是強制類型轉換,即:將「&LATA*8」的結果強制類型轉換為無符號整型;

    ② 「&LATA*8」語句,由於取地址符「&」的優先順序高於乘號「*」,所以這句代碼的意思是:取LATA的地址「0x10C」,並將這個值乘以8。從二進制角度來看,就是將「00 0001 0000 1100」左移3位。(其中的二進制數,是由「0x10C」轉換而來,由於PIC16F1938的地址匯流排寬度是14位的,所以該二進制數只能有14位。) 左移之後,結果是「00 1000 0110 0000」(0x860);

    於是,「((unsigned)&LATA*8)+0」語句的運算結果就是「0x860」。

    用自然語言表述該語句的執行結果:bit型變數LATA0的值,存放在位地址為「0x860」的內存空間。

二、驗證

    接下來,就該驗證一下LATA0的位地址是不是「0x860」了。

    既然已經知道了LATA寄存器的位元組地址是0x10C,那隻要計算一下它的位地址就好:

        十六進制(0x10C)—> 十進制(268)

        十進制(268 × 8 = 2144) —> 十六進制(0x860)

    即LATA0的位地址是「0x860」,和代碼的執行結果一致。

至此,位地址定義代碼解析結束,重點是要了解位地址的計算方法。

Ⅳ 單片機寄存器是什麼

寄存器是中央處理器內的其中組成部份。寄存器是有限存貯容量的高速存貯部件,它們可用來暫存指令、數據和位址。在中央處理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序計數器(PC)。在中央處理器的算術及邏輯部件中,包含的寄存器有累加器(ACC)。
寄存器(Register)

寄存器是內存階層 中的最頂端,也是系統操作資料的最快速途徑。寄存器通常都是以他們可以保存的 位元 數量來估量,舉例來說,一個 "8 位元寄存器" 或 "32 位元 寄存器"。寄存器現在都以寄存器檔案 的方式來實作,但是他們也可能使用單獨的正反器、高速的核心內存、薄膜內存 以及在數種機器上的其他方式來實作出來。

寄存器通常都用來意指由一個指令之輸出或輸入可以直接索引到的暫存器群組。更適當的是稱他們為 "架構寄存器"。

例如,x86 指令及定義八個 32 位元寄存器的集合,但一個實作 x86 指令集的 CPU 可以包含比八個更多的寄存器。

寄存器是CPU內部的元件,寄存器擁有非常高的讀寫速度,所以在寄存器之間的數據傳送非常快。

寄存器的用途:

1.可將寄存器內的數據執行算術及邏輯運算。

2.存於寄存器內的地址可用來指向內存的某個位置,即定址。

3.可以用來讀寫數據到電腦的周邊設備。

Ⅳ 51單片機中如何用C語言自定義一個寄存器,求大神幫忙

寄存器是CPU內部重要的數據存儲資源,主要用來保存操作數和運算結果等信息,從而節省讀取操作數所需佔用匯流排和訪問存儲器的時間,也就是說CPU操作寄存器比操作內存快(寄存器是直接存取,而內存是定址存取)。

匯編比C語言效率高,經常操作寄存器也是一個原因吧。

C語言可以把變數定義為寄存器類型的,將數據直接存放在CPU的寄存器中,使用關鍵字register定義變數。

例如register a=123;定義a為寄存器類型變數。
使用register定義的變數盡可能存放到寄存器中,但不絕對。

Ⅵ 單片機中特殊功能寄存器的定義與初始化的區別

這兩者的區別大了呀。。。
SCON寄存器在單片機中的地址是0x98...
sfr
SCON=ox98,是一個特殊寄存器的定義,也就是告訴你SCON的地址是0x98.當然這個是你目前不用考慮的。因為頭文件(reg52.H等,就是在編寫程序開頭寫的那個)都已經寫好了。可以打開keil->c51->ASM->reg52.INC查看。。裡面都是寄存器的定義。
SCON=0x52。。首先SCON寄存器的標志位有:
SM0,SM1,SM2,REN,TB8,RB8,TI,RI.
SCON=0X52,其實就是定好標志位的值。相當於:
SM0=0;
SM1=1;
SM2=1;
REN=0;
TB8=0;
RB8=0;
TI=1;
RI=0;
也可以寫成上述形式,因為SCON地址可以被8整除(凡是地址可以被8整除的都可以位定址),可以位定址(即可以一個個位的賦值)
希望採納,如有不懂,可以HI我。。。

Ⅶ C語言中,如何定義單片機的寄存器

1.
位地址在匯編語言中,只能直接定址,不支持間接定址。那麼,在
C
語言中,也就不能用指針來操作。所以不能定義單片機的寄存器。
2.
訪問寄存器可以通過直接地址引用來完成。
例如52單片機的寄存器有4組,分別為00H-07H,08H-0FH,10H-17H,18H-1FH,各組均8位元組,要結合程序狀態字寄存器PSW(D0H)中的RS0,RS1的組合來確定是哪一組。
可以定義一個訪問Rn的函數
typedef unsigned char uchar;
uchar dacRn(uchar n) //n=[0..7]
{
uchar data *p;
n += (PSW & 0x18); //PSW 7:CY 6:AC 5:F0 4:RS1 3:RS0 2:OV 1:F1 0:P
//本來要右移三位變為0-3,但由於是8個一組要乘以8(左移3位),所以直接加上寄存器編號就可以了
return *(uchar data *)n;
}

Ⅷ 單片機 sfr定義

P0~P3、PSW、ACC等這些寄存器在sfr中的地址,是intel設計MCS-51單片機時就定下的。後來許多廠家生產51單片機時都沿用了這定義,以保證程序的兼容性。 至於如下的寄存器 sfr CLK_DIV = 0x97; //為STC單片機定義,系統時鍾分頻 sfr P0M1 = 0X93; sfr P0M0 = 0X94; sfr P1M1 = 0X91; sfr P1M0 = 0X92; sfrP2M1 = 0X95; sfrP2M0 = 0X96; 是STC生產的單片機,因為加入了自己設計的功能選項,所以就增加了這些寄存器。

Ⅸ C語言中,如何定義單片機的寄存器

  1. 位地址在匯編語言中,只能直接定址,不支持間接定址。那麼,在 C 語言中,也就不能用指針來操作。所以不能定義單片機的寄存器。

  2. 訪問寄存器可以通過直接地址引用來完成。
    例如52單片機的寄存器有4組,分別為00H-07H,08H-0FH,10H-17H,18H-1FH,各組均8位元組,要結合程序狀態字寄存器PSW(D0H)中的RS0,RS1的組合來確定是哪一組。
    可以定義一個訪問Rn的函數

    typedefunsignedcharuchar;
    uchardacRn(ucharn)//n=[0..7]
    {
    uchardata*p;
    n+=(PSW&0x18);//PSW7:CY6:AC5:F04:RS13:RS02:OV1:F10:P
    //本來要右移三位變為0-3,但由於是8個一組要乘以8(左移3位),所以直接加上寄存器編號就可以了
    return*(uchardata*)n;
    }

Ⅹ 單片機中什麼是寄存器

寄存器是指由基本的RS觸發器結構衍生出來的D觸發,
類似於內存,可以存數據,但一般比內存操作更容易,
一般可直接位操作速度更快,而內存追求的是高密度,
低成本低功耗

閱讀全文

與單片機定義寄存器相關的資料

熱點內容
桌面文件全部加密 瀏覽:401
6s怎麼外接u盤需要什麼app 瀏覽:131
linux查看文件許可權命令 瀏覽:685
安卓手游存檔怎麼用 瀏覽:761
linuxyum安裝ftp 瀏覽:690
村委會主任可以推行政命令嗎 瀏覽:102
電腦文件夾封面多張圖片 瀏覽:263
網吧總伺服器叫什麼 瀏覽:922
多個演算法解決同一個問題 瀏覽:455
小車解壓後我的購車發票呢 瀏覽:977
做app開發用什麼雲伺服器 瀏覽:177
linux網卡子介面 瀏覽:985
21歲職高畢業學程序員怎麼學 瀏覽:321
vs如何對單個文件編譯 瀏覽:6
為什麼有的電腦不能安裝python 瀏覽:75
金蝶迷你版加密狗檢測到過期 瀏覽:186
硬體描述語言編譯結果 瀏覽:655
程序員逆天改命 瀏覽:19
金斗雲伺服器 瀏覽:447
港口工程pdf 瀏覽:770