找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 10605|回復(fù): 15
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)中,這個(gè)SFR定義的是啥意思?

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:847776 發(fā)表于 2021-5-17 12:23 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本帖最后由 憶1709 于 2021-5-17 12:35 編輯

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

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

③ 能否把sfr換成#define?









分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:752974 發(fā)表于 2021-5-17 13:40 | 只看該作者
1. SFR是關(guān)鍵字,用來定義特殊功能寄存器。在51系列單片機(jī)中,IO口的地址是映射到寄存器上的,即IO口的地址就是對(duì)應(yīng)特殊功能寄存器的地址。P0是PORT0的名字,0x80是P0口對(duì)應(yīng)的內(nèi)部特殊功能寄存器的地址。
2. 將這個(gè)語句放到頭文件中,是便于使用,在應(yīng)用程序中只要包含這個(gè)頭文件,就不用再定義特殊功能寄存器了,直接使用其名字即可。
3. 如果用 #define 定義,語句是這樣的:#define P0 (BYTE *)0X80; 這樣定義后,在匯編語言中就不能使用 P0 這個(gè)名字了。
回復(fù)

使用道具 舉報(bào)

板凳
ID:57657 發(fā)表于 2021-5-17 14:15 | 只看該作者
P0口對(duì)應(yīng)的0x80數(shù)字,就和地鐵幾號(hào)線一樣,不同號(hào)線去了不同的地方,不同地址都去控制了不同的特殊功能寄存器。
回復(fù)

使用道具 舉報(bào)

地板
ID:367369 發(fā)表于 2021-5-17 15:21 | 只看該作者
sfr 定義了 P0 端口對(duì)應(yīng)的物理地址為0x80 ,相當(dāng)于給0x80地址的內(nèi)存區(qū)域(寄存器)取別名P0
#define  是  把P0 定義為常量0x80;
P0 =  0x00  是給P0對(duì)應(yīng)的寄存器賦值,就是把 0x00寫到對(duì)應(yīng)的物理地址的0x80處;
回復(fù)

使用道具 舉報(bào)

5#
ID:847776 發(fā)表于 2021-5-17 16:30 | 只看該作者
game灬boy 發(fā)表于 2021-5-17 15:21
sfr 定義了 P0 端口對(duì)應(yīng)的物理地址為0x80 ,相當(dāng)于給0x80地址的內(nèi)存區(qū)域(寄存器)取別名P0
#define  是   ...

如果不取別名,能直接尋址0x80進(jìn)行讀寫嗎?
回復(fù)

使用道具 舉報(bào)

6#
ID:275826 發(fā)表于 2021-5-17 17:39 | 只看該作者
憶1709 發(fā)表于 2021-5-17 16:30
如果不取別名,能直接尋址0x80進(jìn)行讀寫嗎?

不能直接對(duì)0X80讀寫
回復(fù)

使用道具 舉報(bào)

7#
ID:275826 發(fā)表于 2021-5-17 19:33 | 只看該作者
憶1709 發(fā)表于 2021-5-17 16:30
如果不取別名,能直接尋址0x80進(jìn)行讀寫嗎?

如果你用匯編語言就可以
回復(fù)

使用道具 舉報(bào)

8#
ID:752974 發(fā)表于 2021-5-18 08:29 | 只看該作者
憶1709 發(fā)表于 2021-5-17 16:30
如果不取別名,能直接尋址0x80進(jìn)行讀寫嗎?

可以上的,但在操作前要把數(shù)字0X80轉(zhuǎn)換成地址。(U8 *)0X80.
回復(fù)

使用道具 舉報(bào)

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

強(qiáng)制轉(zhuǎn)換成地址好像不行
回復(fù)

使用道具 舉報(bào)

10#
ID:45026 發(fā)表于 2021-5-18 17:40 | 只看該作者
SFR是關(guān)鍵字,用來定義特殊功能寄存器。在51系列單片機(jī)中,IO口的地址是映射到寄存器上的,即IO口的地址就是對(duì)應(yīng)特殊功能寄存器的地址。P0是PORT0的名字,0x80是P0口對(duì)應(yīng)的內(nèi)部特殊功能寄存器的地址。
回復(fù)

使用道具 舉報(bào)

11#
ID:808225 發(fā)表于 2021-5-18 18:02 | 只看該作者
個(gè)人認(rèn)為,51單片機(jī)是直接對(duì)寄存器操作,定義管腳就是對(duì)寄存器進(jìn)行定義。定義51單片機(jī)的IO口是需要使用特定寄存器定義的
回復(fù)

使用道具 舉報(bào)

12#
ID:964308 發(fā)表于 2021-10-30 13:35 來自觸屏版 | 只看該作者
定義P0這個(gè)東西指向p0端口寄存器,你往里面寫什么,p0端口就輸出什么
回復(fù)

使用道具 舉報(bào)

13#
ID:964308 發(fā)表于 2021-10-30 13:38 來自觸屏版 | 只看該作者
不這樣定義你就沒辦法用有關(guān)于和P0端口的所有操作,必須定義一個(gè)名稱指向p0端口寄存器才能操作p0端口。sfr是指向寄存器的,define只是定義一個(gè)名稱,代表的是把后面的字符和這個(gè)名稱替換,不能替代sfr
回復(fù)

使用道具 舉報(bào)

14#
ID:624769 發(fā)表于 2021-10-30 13:47 | 只看該作者
憶1709 發(fā)表于 2021-5-17 16:30
如果不取別名,能直接尋址0x80進(jìn)行讀寫嗎?

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

就就可以把累加器A的內(nèi)容復(fù)制到P0了。
回復(fù)

使用道具 舉報(bào)

15#
ID:883242 發(fā)表于 2021-11-26 14:35 | 只看該作者
本帖最后由 Hephaestus 于 2021-11-26 16:28 編輯

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

用地址訪問會(huì)混淆這兩個(gè)東西,用SFR限制一下,不就清爽多了?
回復(fù)

使用道具 舉報(bào)

16#
ID:624769 發(fā)表于 2021-11-26 15:47 | 只看該作者
Hephaestus 發(fā)表于 2021-11-26 14:35
看來真懂51體系的人還是太少了。80H這個(gè)地址有兩個(gè)東西。≈苯釉L問是P0,用地址間接訪問是RAM。
MOV R0,8 ...

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

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表