久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7282|回復: 10
打印 上一主題 下一主題
收起左側

關于單片機P0,P1,P2,P3之間關系的疑問

[復制鏈接]
跳轉到指定樓層
樓主
ID:703395 發表于 2020-3-9 09:37 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
50黑幣
昨天我拿到了51單片機開發板興沖沖的去點亮了LED和流水燈
興奮之余我打開了 reg52.h 這個頭文件
我發現

P0的定義 = 0x80 (1000 0000)

P2的定義 = 0xA0 (1010 0000)

令我困惑的地方是,我對P2每個位進行操作的時候。為什么沒有影響到 P0,P1,P3呢

例如

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

如果P2是一個16位及以上的變量,我還能理解。例如:
1010 0000 xxxx xxxx
利用后面的 xxxx xxxx 來控制8個LED燈。前面的 1010 0000 來說明是P2
可現在問題就是
我將P2 設置成 0x80的時候。它竟然還是在控制著某一個LED燈。


最佳答案

查看完整內容

你提供的 P0的定義 = 0x80 (1000 0000) 0x80是端口P0地址 P2的定義 = 0xA0 (1010 0000) 0xA0是端口P2地址 好象進超市購物你手提包存放的80號柜,而 P2 = (0xff >> i);是操作的你的手提包,與柜子編號80沒有關系,只是說明你要到手提包里拿錢,必須對應找到80號柜
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

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

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

好象進超市購物你手提包存放的80號柜,而
P2 = (0xff >> i);是操作的你的手提包,與柜子編號80沒有關系,只是說明你要到手提包里拿錢,必須對應找到80號柜
回復

使用道具 舉報

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

你好。
P0和P2的定義是定義的地址,不是像10000000這樣具體的數。
在單片機里,P0,P1,P2,P3是四個特殊的寄存器。0x80就是P0這個寄存器的地址。
也就是說,你往P0里面寫數,相當于往0x80這個存儲單元里面寫數,往P2寫就相當于往0xA0這個存儲單元寫。

而0x80里面的數是怎么到P0口輸出的,就是單片機的內部電路了。其實就是你只要往0x80里面寫一個數,單片機的內部電路就會把這個數送到P0口輸出。
P0口定義的地址是不能變的,P0口就得定義成0x80,因為單片機只把0x80的數輸出到P0。

reg52文件應該寫的是 sfr P0=0x80;
你在程序里往P0寫,編譯之后就會往0x80這個地址寫。

c語言一個是sfr,一個是#define,sfr定義的是地址,#define定義的是具體的數據。
希望能幫到你。

評分

參與人數 1黑幣 +25 收起 理由
錢木頭 + 25 贊一個!

查看全部評分

回復

使用道具 舉報

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

正因為 0x80 是P0的地址(或者叫做端口,請原諒我的不專業)
我才會有一系列的疑惑。
因為我將P2 = 0x80的時候。它也是在控制LED燈
下面是我拿到的單片機第一節教程點亮LED燈,這些就比較容易理解。
sbit led1 = P2 ^ 0;  // 我測試過直接使用 sbit led1 = 0xA0 ^ 0 - 7,效果相同
sbit led2 = P2 ^ 1;
sbit led3 = P2 ^ 2;
當 led1 = 0; 的時候第一個燈被點亮
通過搜索 "sbit是什么"  : sbit 位變量名=地址值
我理解為下面的內存模型
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
上面內存模型中的某個地址的值被設置為0的時候(低電平)。LED等則被點亮
可以很清楚的看到 :
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個地址分別代表著8個LED燈的地址. 但是高位都是 1010 也就是 0xA0 = P2

現在為題來了 :
如果我將P2的值修改成 0x80 也就是說 P2 不在等于 1010 0000,而是 1000 000。
地址已經發生了變化為什么還可以控制LED燈呢?
回復

使用道具 舉報

5#
ID:691449 發表于 2020-3-9 14:06 | 只看該作者
錢木頭 發表于 2020-3-9 13:51
正因為 0x80 是P0的地址(或者叫做端口,請原諒我的不專業)
我才會有一系列的疑惑。
因為我將P2 = 0x80的 ...

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

其實 sfr P2    = 0xA0;
這句我修改成 P2 = 0x80的過程應該是下面這種
*(char*)0xA0 = 0x80;
回復

使用道具 舉報

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

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

其實代碼里本來沒有P0到P3,P0到P0都是sfr定義的。
修改成 P2 = 0x80不應該是*(char*)0xA0 = 0x80;,因為你把P2從A0改成80,你再給 P2賦值,就相當于給新的80賦值,沒有a0的事了。
原來給P2賦值,數據到A0,是因為有sfr P2=0xA0,現在改了,數據就到改之后的地方了。
回復

使用道具 舉報

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

其實代碼里本來沒有P0到P3,P0到P0都是sfr定義的。

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

只是程序運行之后在main()函數當中動態設置為
P2 = 0x80;
是的,還是可以控制LED燈
所以我打個不形象的比喻
*(char*)0xA0 = 0x80;
回復

使用道具 舉報

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

sfr P2    = 0xA0;定義地址,或者理解為給地址起了個名字
P2 = *****,時給給這個變量(名字)對應得地址賦值----把值放進這個地址里。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区在线观看免费视频 | 欧美日韩亚洲一区 | 成人午夜精品 | 亚洲小视频在线播放 | av片免费| 91久久国产综合久久 | 成人国产精品一级毛片视频毛片 | 亚洲精品电影在线观看 | 久久精品久久久久久 | 国产丝袜一区二区三区免费视频 | 成人在线视频网站 | 亚洲精品一区二三区不卡 | 精品伊人| 国产一二三区精品视频 | 欧美一级做性受免费大片免费 | 欧美一级在线 | 国内精品久久久久久 | 在线免费观看a级片 | 欧美黑人体内she精在线观看 | 国产精品福利一区二区三区 | 成人黄视频在线观看 | 在线观看亚洲专区 | 人人爽日日躁夜夜躁尤物 | 亚洲精品一区二区网址 | 国产精品久久久久久久久久三级 | 精品欧美一区二区久久久伦 | 日本三级电影免费观看 | 天天操夜夜爽 | 亚洲精品9999久久久久 | 国产一区91精品张津瑜 | 91国在线 | 欧美1—12sexvideos | 国产91在线视频 | 在线观看亚洲专区 | www狠狠爱com | 国产视频黄色 | 亚洲国产成人精品在线 | 国产91亚洲精品一区二区三区 | 欧美日韩在线一区二区三区 | 日韩免费视频一区二区 | 国产在线二区 |