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

QQ登錄

只需一步,快速開始

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

關(guān)于單片機(jī)P0,P1,P2,P3之間關(guān)系的疑問(wèn)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:703395 發(fā)表于 2020-3-9 09:37 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
50黑幣
昨天我拿到了51單片機(jī)開發(fā)板興沖沖的去點(diǎn)亮了LED和流水燈
興奮之余我打開了 reg52.h 這個(gè)頭文件
我發(fā)現(xiàn)

P0的定義 = 0x80 (1000 0000)

P2的定義 = 0xA0 (1010 0000)

令我困惑的地方是,我對(duì)P2每個(gè)位進(jìn)行操作的時(shí)候。為什么沒(méi)有影響到 P0,P1,P3呢

例如

  1. for(i = 1; i <= max; i++)
  2.         {
  3.                 P2 = (0xff >> i);
  4.                 delay(d);
  5.         }
復(fù)制代碼

如果P2是一個(gè)16位及以上的變量,我還能理解。例如:
1010 0000 xxxx xxxx
利用后面的 xxxx xxxx 來(lái)控制8個(gè)LED燈。前面的 1010 0000 來(lái)說(shuō)明是P2
可現(xiàn)在問(wèn)題就是
我將P2 設(shè)置成 0x80的時(shí)候。它竟然還是在控制著某一個(gè)LED燈。


最佳答案

查看完整內(nèi)容

你提供的 P0的定義 = 0x80 (1000 0000) 0x80是端口P0地址 P2的定義 = 0xA0 (1010 0000) 0xA0是端口P2地址 好象進(jìn)超市購(gòu)物你手提包存放的80號(hào)柜,而 P2 = (0xff >> i);是操作的你的手提包,與柜子編號(hào)80沒(méi)有關(guān)系,只是說(shuō)明你要到手提包里拿錢,必須對(duì)應(yīng)找到80號(hào)柜
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:235200 發(fā)表于 2020-3-9 09:37 | 只看該作者
你提供的
P0的定義 = 0x80 (1000 0000)   0x80是端口P0地址

P2的定義 = 0xA0 (1010 0000)  0xA0是端口P2地址

好象進(jìn)超市購(gòu)物你手提包存放的80號(hào)柜,而
P2 = (0xff >> i);是操作的你的手提包,與柜子編號(hào)80沒(méi)有關(guān)系,只是說(shuō)明你要到手提包里拿錢,必須對(duì)應(yīng)找到80號(hào)柜
回復(fù)

使用道具 舉報(bào)

板凳
ID:691449 發(fā)表于 2020-3-9 12:45 | 只看該作者
本帖最后由 xianming 于 2020-3-9 12:53 編輯

你好。
P0和P2的定義是定義的地址,不是像10000000這樣具體的數(shù)。
在單片機(jī)里,P0,P1,P2,P3是四個(gè)特殊的寄存器。0x80就是P0這個(gè)寄存器的地址。
也就是說(shuō),你往P0里面寫數(shù),相當(dāng)于往0x80這個(gè)存儲(chǔ)單元里面寫數(shù),往P2寫就相當(dāng)于往0xA0這個(gè)存儲(chǔ)單元寫。

而0x80里面的數(shù)是怎么到P0口輸出的,就是單片機(jī)的內(nèi)部電路了。其實(shí)就是你只要往0x80里面寫一個(gè)數(shù),單片機(jī)的內(nèi)部電路就會(huì)把這個(gè)數(shù)送到P0口輸出。
P0口定義的地址是不能變的,P0口就得定義成0x80,因?yàn)閱纹瑱C(jī)只把0x80的數(shù)輸出到P0。

reg52文件應(yīng)該寫的是 sfr P0=0x80;
你在程序里往P0寫,編譯之后就會(huì)往0x80這個(gè)地址寫。

c語(yǔ)言一個(gè)是sfr,一個(gè)是#define,sfr定義的是地址,#define定義的是具體的數(shù)據(jù)。
希望能幫到你。

評(píng)分

參與人數(shù) 1黑幣 +25 收起 理由
錢木頭 + 25 贊一個(gè)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

地板
ID:703395 發(fā)表于 2020-3-9 13:51 | 只看該作者
csmyldl 發(fā)表于 2020-3-9 11:49
你提供的
P0的定義 = 0x80 (1000 0000)   0x80是端口P0地址

正因?yàn)?0x80 是P0的地址(或者叫做端口,請(qǐng)?jiān)徫业牟粚I(yè))
我才會(huì)有一系列的疑惑。
因?yàn)槲覍2 = 0x80的時(shí)候。它也是在控制LED燈
下面是我拿到的單片機(jī)第一節(jié)教程點(diǎn)亮LED燈,這些就比較容易理解。
sbit led1 = P2 ^ 0;  // 我測(cè)試過(guò)直接使用 sbit led1 = 0xA0 ^ 0 - 7,效果相同
sbit led2 = P2 ^ 1;
sbit led3 = P2 ^ 2;
當(dāng) led1 = 0; 的時(shí)候第一個(gè)燈被點(diǎn)亮
通過(guò)搜索 "sbit是什么"  : sbit 位變量名=地址值
我理解為下面的內(nèi)存模型
mem addr  | value
1010 0000 | 1
1010 0001 | 1
1010 0010 | 1
1010 0011 | 1
1010 0100 | 1
1010 0101 | 1
1010 0110 | 1
1010 0111 | 1
上面內(nèi)存模型中的某個(gè)地址的值被設(shè)置為0的時(shí)候(低電平)。LED等則被點(diǎn)亮
可以很清楚的看到 :
P2 = 0xA0
0xA0 ^ 0 = 0xA0 | 1010 0000
0xA0 ^ 1 = 0xA1 | 1010 0001
0xA0 ^ 2 = 0xA2 | 1010 0010
0xA0 ^ 3 = 0xA3 | 1010 0011

0xA0 ^ 4 = 0xA4 | 1010 0100
0xA0 ^ 5 = 0xA5 | 1010 0101
0xA0 ^ 6 = 0xA6 | 1010 0110
0xA0 ^ 7 = 0xA7 | 1010 0111

上面的8個(gè)地址分別代表著8個(gè)LED燈的地址. 但是高位都是 1010 也就是 0xA0 = P2

現(xiàn)在為題來(lái)了 :
如果我將P2的值修改成 0x80 也就是說(shuō) P2 不在等于 1010 0000,而是 1000 000。
地址已經(jīng)發(fā)生了變化為什么還可以控制LED燈呢?
回復(fù)

使用道具 舉報(bào)

5#
ID:691449 發(fā)表于 2020-3-9 14:06 | 只看該作者
錢木頭 發(fā)表于 2020-3-9 13:51
正因?yàn)?0x80 是P0的地址(或者叫做端口,請(qǐng)?jiān)徫业牟粚I(yè))
我才會(huì)有一系列的疑惑。
因?yàn)槲覍2 = 0x80的 ...

你把P2的地址改成了0x80,0x80是P0的地址,你再往P2寫數(shù)就寫到P0了。
回復(fù)

使用道具 舉報(bào)

6#
ID:213173 發(fā)表于 2020-3-9 14:11 | 只看該作者
回復(fù)

使用道具 舉報(bào)

7#
ID:419968 發(fā)表于 2020-3-9 14:12 | 只看該作者
sbit 是51才有的位尋址 對(duì)應(yīng)的地址為 20H~2FH
回復(fù)

使用道具 舉報(bào)

8#
ID:703395 發(fā)表于 2020-3-9 14:15 | 只看該作者
感謝上面兩位大佬的解惑,我明白了
終于想通了,我蠢死了

其實(shí) sfr P2    = 0xA0;
這句我修改成 P2 = 0x80的過(guò)程應(yīng)該是下面這種
*(char*)0xA0 = 0x80;
回復(fù)

使用道具 舉報(bào)

9#
ID:691449 發(fā)表于 2020-3-10 15:34 | 只看該作者
錢木頭 發(fā)表于 2020-3-9 14:15
感謝上面兩位大佬的解惑,我明白了
終于想通了,我蠢死了

你把sfr改成P2 = 0x80,單片機(jī)P2仍然輸出嗎?

其實(shí)代碼里本來(lái)沒(méi)有P0到P3,P0到P0都是sfr定義的。
修改成 P2 = 0x80不應(yīng)該是*(char*)0xA0 = 0x80;,因?yàn)槟惆裀2從A0改成80,你再給 P2賦值,就相當(dāng)于給新的80賦值,沒(méi)有a0的事了。
原來(lái)給P2賦值,數(shù)據(jù)到A0,是因?yàn)橛衧fr P2=0xA0,現(xiàn)在改了,數(shù)據(jù)就到改之后的地方了。
回復(fù)

使用道具 舉報(bào)

10#
ID:703395 發(fā)表于 2020-3-10 17:42 | 只看該作者
xianming 發(fā)表于 2020-3-10 15:34
你把sfr改成P2 = 0x80,單片機(jī)P2仍然輸出嗎?

其實(shí)代碼里本來(lái)沒(méi)有P0到P3,P0到P0都是sfr定義的。

抱歉沒(méi)說(shuō)清楚,我并沒(méi)有在 reg52.h 文件中修改
sfr P2    = 0xA0; 的 定義為 sfr P2    = 0x80;

只是程序運(yùn)行之后在main()函數(shù)當(dāng)中動(dòng)態(tài)設(shè)置為
P2 = 0x80;
是的,還是可以控制LED燈
所以我打個(gè)不形象的比喻
*(char*)0xA0 = 0x80;
回復(fù)

使用道具 舉報(bào)

11#
ID:513213 發(fā)表于 2021-5-11 11:40 | 只看該作者
錢木頭 發(fā)表于 2020-3-9 14:15
感謝上面兩位大佬的解惑,我明白了
終于想通了,我蠢死了

sfr P2    = 0xA0;定義地址,或者理解為給地址起了個(gè)名字
P2 = *****,時(shí)給給這個(gè)變量(名字)對(duì)應(yīng)得地址賦值----把值放進(jìn)這個(gè)地址里。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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