找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 289|回复: 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 单片机教程网

快速回复 返回顶部 返回列表