欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機端口使用問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:192020 發表于 2024-11-14 11:06 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
請教下STC單片機可以用指針變量來控制端口P0、P1這些嗎?正常是sfr P0=0x80;P0=0xAA;能不能用變量的方法來控制?可以的話c語言應該怎么寫?
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:161164 發表于 2024-11-14 16:08 | 只看該作者
STC只接受sfr定義端口,然后控制
回復

使用道具 舉報

板凳
ID:1109793 發表于 2024-11-14 16:49 | 只看該作者
uchar aaa;
P0 = aaa;這樣嗎?
uchar *bbb;
bbb = @aaa;
P0 = *bbb;這樣?
回復

使用道具 舉報

地板
ID:404160 發表于 2024-11-14 17:16 | 只看該作者
通過改變指針的值來操作不同的IO端口可以實現的。通過修改指針的指向,讓它指向不同的端口地址,從而實現控制不同的端口。以下是一個示例,展示通過改變指針的值來控制不同的端口:

c
#include <reg51.h>

// 定義端口地址
#define P0_ADDRESS 0x80
#define P1_ADDRESS 0x90

void main() {
    unsigned char xdata *port;  // 定義指針變量
   
    // 指向P0端口
    port = (unsigned char xdata *)P0_ADDRESS;
    *port = 0xAA;  // 控制P0端口輸出0xAA
   
    // 改變指針指向P1端口
    port = (unsigned char xdata *)P1_ADDRESS;
    *port = 0x55;  // 控制P1端口輸出0x55

    while (1) {
        // 主循環
    }
}
在這個示例中,定義了一個指針port,并通過改變該指針的指向來控制不同的端口。首先,指針指向P0端口,并設置輸出值為0xAA;然后,指針指向P1端口,并設置輸出值為0x55。

通過這種方法,你可以靈活地使用指針來控制不同的端口。
回復

使用道具 舉報

5#
ID:624769 發表于 2024-11-14 19:06 | 只看該作者
飛云居士 發表于 2024-11-14 17:16
通過改變指針的值來操作不同的IO端口可以實現的。通過修改指針的指向,讓它指向不同的端口地址,從而實現控 ...

你是夢里學的 51 么?
你知道51的 高位地址 0x80~0xFF 直接訪問 和  間接訪問的區別么?
你知道不知道 當 SP = 0x80 的時候,執行入棧 操作不會改變 P0 的值是什么原因么?
回復

使用道具 舉報

6#
ID:161164 發表于 2024-11-14 23:25 | 只看該作者
188610329 發表于 2024-11-14 19:06
你是夢里學的 51 么?
你知道51的 高位地址 0x80~0xFF 直接訪問 和  間接訪問的區別么?
你知道不知道  ...

一眼AI回答
回復

使用道具 舉報

7#
ID:192020 發表于 2024-11-15 09:07 | 只看該作者
xiaobendan001 發表于 2024-11-14 16:49
uchar aaa;
P0 = aaa;這樣嗎?
uchar *bbb;

uchar *bbb;
bbb = &P0;
*bbb = 0xff;
差不多這意思,試了下(*(unchar * 0x80)) = 0xff是不行的
回復

使用道具 舉報

8#
ID:192020 發表于 2024-11-15 09:08 | 只看該作者
lkc8210 發表于 2024-11-14 16:08
STC只接受sfr定義端口,然后控制

所以是不行的嗎?是51的都不行還是說STC的不行
回復

使用道具 舉報

9#
ID:1109793 發表于 2024-11-15 12:10 | 只看該作者
Graves 發表于 2024-11-15 09:07
uchar *bbb;
bbb = &P0;
*bbb = 0xff;

&P0是個啥操作?P0本來就是個地址啊
uchar* ppp;
ppp = P0;
*ppp = 0x55;這樣應該可以吧
回復

使用道具 舉報

10#
ID:1109793 發表于 2024-11-15 12:14 | 只看該作者
Graves 發表于 2024-11-15 09:07
uchar *bbb;
bbb = &P0;
*bbb = 0xff;

好像PPP = P0不行,=0x80;能編譯,但是好像也不起作用。為何要這么用呢?
回復

使用道具 舉報

11#
ID:161164 發表于 2024-11-15 13:52 | 只看該作者
xiaobendan001 發表于 2024-11-15 12:10
&P0是個啥操作?P0本來就是個地址啊
uchar* ppp;
ppp = P0;

P0被定義為端口0的寄存器
ppp = P0是把端口0的電平,化為一個地址
如 P0 讀到 1110 1110 (0xEE)
*ppp = 0x55就是把0x55放到地址為0xEE的內存內
回復

使用道具 舉報

12#
ID:161164 發表于 2024-11-15 13:54 | 只看該作者
Graves 發表于 2024-11-15 09:08
所以是不行的嗎?是51的都不行還是說STC的不行

STC的和ATMEL 的51都不行
其他51沒用過

評分

參與人數 1黑幣 +15 收起 理由
Graves + 15 很給力!

查看全部評分

回復

使用道具 舉報

13#
ID:1034262 發表于 2024-11-15 14:47 | 只看該作者
傳統的51不支持指針訪問特殊功能寄存器(0x80~0xff),但STC的擴展在xdata的特殊功能寄存器可以用xdata指針訪問的。
回復

使用道具 舉報

14#
ID:192020 發表于 2024-11-15 16:01 | 只看該作者
xiaobendan001 發表于 2024-11-15 12:10
&P0是個啥操作?P0本來就是個地址啊
uchar* ppp;
ppp = P0;

不是很理解,P0是地址的話那P0=0xAA是什么操作?
回復

使用道具 舉報

15#
ID:192020 發表于 2024-11-15 16:07 | 只看該作者
xiaobendan001 發表于 2024-11-15 12:14
好像PPP = P0不行,=0x80;能編譯,但是好像也不起作用。為何要這么用呢?

需要模擬通訊的設備有點多,而且又是同一個協議,但是端口不一樣。這時想到幾種方法
①模擬通訊代碼全部復制粘貼一遍,但是代碼量就太大擠不進
②if_else換端口,要加多個參數,也不太好改端口
所以想把端口當參數來傳,那模擬的通訊只要一份就行
回復

使用道具 舉報

16#
ID:161164 發表于 2024-11-16 22:18 | 只看該作者
Graves 發表于 2024-11-15 16:07
需要模擬通訊的設備有點多,而且又是同一個協議,但是端口不一樣。這時想到幾種方法
①模擬通訊代碼全部 ...

沒辦法,用51就是要這樣
只能用方法2
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表