標(biāo)題: 51單片機(jī)中,這個SFR定義的是啥意思? [打印本頁]

作者: 憶1709    時間: 2021-5-17 12:23
標(biāo)題: 51單片機(jī)中,這個SFR定義的是啥意思?
本帖最后由 憶1709 于 2021-5-17 12:35 編輯

在STC單片機(jī)的頭文中看到如下定義:
sfr P0          =   0x80;
① sfr是特殊功能寄存器的意思,以上P0不是端口號嗎,為何變成了特殊功能寄存器了呢? IO口跟特殊功能寄存器的關(guān)系是什么?

② 以上語句,寫在頭文件里,它有什么用處嗎?不這樣定義會出什么問題?

③ 能否把sfr換成#define?










作者: munuc_w    時間: 2021-5-17 13:40
1. SFR是關(guān)鍵字,用來定義特殊功能寄存器。在51系列單片機(jī)中,IO口的地址是映射到寄存器上的,即IO口的地址就是對應(yīng)特殊功能寄存器的地址。P0是PORT0的名字,0x80是P0口對應(yīng)的內(nèi)部特殊功能寄存器的地址。
2. 將這個語句放到頭文件中,是便于使用,在應(yīng)用程序中只要包含這個頭文件,就不用再定義特殊功能寄存器了,直接使用其名字即可。
3. 如果用 #define 定義,語句是這樣的:#define P0 (BYTE *)0X80; 這樣定義后,在匯編語言中就不能使用 P0 這個名字了。
作者: npn    時間: 2021-5-17 14:15
P0口對應(yīng)的0x80數(shù)字,就和地鐵幾號線一樣,不同號線去了不同的地方,不同地址都去控制了不同的特殊功能寄存器。
作者: game灬boy    時間: 2021-5-17 15:21
sfr 定義了 P0 端口對應(yīng)的物理地址為0x80 ,相當(dāng)于給0x80地址的內(nèi)存區(qū)域(寄存器)取別名P0
#define  是  把P0 定義為常量0x80;
P0 =  0x00  是給P0對應(yīng)的寄存器賦值,就是把 0x00寫到對應(yīng)的物理地址的0x80處;
作者: 憶1709    時間: 2021-5-17 16:30
game灬boy 發(fā)表于 2021-5-17 15:21
sfr 定義了 P0 端口對應(yīng)的物理地址為0x80 ,相當(dāng)于給0x80地址的內(nèi)存區(qū)域(寄存器)取別名P0
#define  是   ...

如果不取別名,能直接尋址0x80進(jìn)行讀寫嗎?
作者: tyrl800    時間: 2021-5-17 17:39
憶1709 發(fā)表于 2021-5-17 16:30
如果不取別名,能直接尋址0x80進(jìn)行讀寫嗎?

不能直接對0X80讀寫
作者: tyrl800    時間: 2021-5-17 19:33
憶1709 發(fā)表于 2021-5-17 16:30
如果不取別名,能直接尋址0x80進(jìn)行讀寫嗎?

如果你用匯編語言就可以
作者: munuc_w    時間: 2021-5-18 08:29
憶1709 發(fā)表于 2021-5-17 16:30
如果不取別名,能直接尋址0x80進(jìn)行讀寫嗎?

可以上的,但在操作前要把數(shù)字0X80轉(zhuǎn)換成地址。(U8 *)0X80.
作者: tyrl800    時間: 2021-5-18 09:20
munuc_w 發(fā)表于 2021-5-18 08:29
可以上的,但在操作前要把數(shù)字0X80轉(zhuǎn)換成地址。(U8 *)0X80.

強(qiáng)制轉(zhuǎn)換成地址好像不行
作者: eb900001    時間: 2021-5-18 17:40
SFR是關(guān)鍵字,用來定義特殊功能寄存器。在51系列單片機(jī)中,IO口的地址是映射到寄存器上的,即IO口的地址就是對應(yīng)特殊功能寄存器的地址。P0是PORT0的名字,0x80是P0口對應(yīng)的內(nèi)部特殊功能寄存器的地址。
作者: 漠城    時間: 2021-5-18 18:02
個人認(rèn)為,51單片機(jī)是直接對寄存器操作,定義管腳就是對寄存器進(jìn)行定義。定義51單片機(jī)的IO口是需要使用特定寄存器定義的
作者: dzc3458    時間: 2021-10-30 13:35
定義P0這個東西指向p0端口寄存器,你往里面寫什么,p0端口就輸出什么
作者: dzc3458    時間: 2021-10-30 13:38
不這樣定義你就沒辦法用有關(guān)于和P0端口的所有操作,必須定義一個名稱指向p0端口寄存器才能操作p0端口。sfr是指向寄存器的,define只是定義一個名稱,代表的是把后面的字符和這個名稱替換,不能替代sfr
作者: 188610329    時間: 2021-10-30 13:47
憶1709 發(fā)表于 2021-5-17 16:30
如果不取別名,能直接尋址0x80進(jìn)行讀寫嗎?

可以, 用匯編就可以了。
MOV  80H,A

就就可以把累加器A的內(nèi)容復(fù)制到P0了。
作者: Hephaestus    時間: 2021-11-26 14:35
本帖最后由 Hephaestus 于 2021-11-26 16:28 編輯

看來真懂51體系的人還是太少了。80H這個地址有兩個東西!直接訪問是P0,用地址間接訪問是RAM。
MOV R0,#80H
MOV A,@R0
上句是把80H地址的RAM內(nèi)容送到ACC里面。

用地址訪問會混淆這兩個東西,用SFR限制一下,不就清爽多了?
作者: 188610329    時間: 2021-11-26 15:47
Hephaestus 發(fā)表于 2021-11-26 14:35
看來真懂51體系的人還是太少了。80H這個地址有兩個東西!直接訪問是P0,用地址間接訪問是RAM。
MOV R0,8 ...

把80H地址的RAM內(nèi)容送到ACC里面,一般要這么寫:
MOV R0,#80H
MOV A,@R0






歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1