⑴ 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;
}
⑵ 單片機C語言中SBUF可以直接傳遞數嗎
1. SBUF在單片機C語言中是一個特殊功能寄存器(SFR),它實際上代表兩個物理寄存器,它們共用同一個地址。
2. 當向SBUF寫入數據時,實際上是向串列輸出寄存器寫入數據;而從SBUF讀取數據時,則是從串列輸入寄存器讀取數據。
3. 在寫入SBUF時,需要理解這會導致串口開始發送數據,這是由輸出寄存器的控制邏輯決定的。
4. 因此,在C語言中直接讀寫SBUF是可以的,寫入的任何數據都會被串口發送。
5. 串口的具體行為還取決於串口的配置設置。
⑶ 51單片機可以通過指針訪問寄存器嗎
data:固定指前面0x00-0x7f的128個RAM,可以用acc直接讀寫的,速度最快,生成的代碼也最小。
idata:固定指前面0x00-0xff的256個RAM,其中前128和data的128完全相同,只是因為訪問的方式不同。idata是用類似C中的指針方式 訪問的。匯編中的語句為:mox ACC,@Rx。
xdata:外部擴展RAM,一般指外部0x0000-0xffff空間,用DPTR訪問。
pdata:外部擴展RAM的低256個位元組,地址出現在A0-A7的上時讀寫,用movx ACC,@Rx讀寫。這個比較特殊,對於C51來說好象有BUG, 建議少用。
code:訪問程序存儲器(默認僅限於標准51能夠定址的64kB空間內),生成的代碼主要通過 MOVC@A+DPTR實現。
far:far是Keil 編譯器為了支持新出現的8051家族增強型MCU,這些增強型MCU可能擁有大於64KB的存儲器。使用far可訪問擴展的RAM,使用**const far可訪問擴展的ROM**。NXP 51MX架構51單片機提供通過通用指針訪問多達8MB的code和xdata存儲空間。Dallas 390架構的51單片機通過24位的DPTR寄存器結合傳統MOVX 、MOVC指令來訪問擴展的RAM和ROM。