标题: 51单片机端口使用问题 [打印本页]

作者: Graves    时间: 2024-11-14 11:06
标题: 51单片机端口使用问题
请教下STC单片机可以用指针变量来控制端口P0、P1这些吗?正常是sfr P0=0x80;P0=0xAA;能不能用变量的方法来控制?可以的话c语言应该怎么写?

作者: lkc8210    时间: 2024-11-14 16:08
STC只接受sfr定义端口,然后控制
作者: xiaobendan001    时间: 2024-11-14 16:49
uchar aaa;
P0 = aaa;这样吗?
uchar *bbb;
bbb = @aaa;
P0 = *bbb;这样?
作者: 飞云居士    时间: 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。

通过这种方法,你可以灵活地使用指针来控制不同的端口。
作者: 188610329    时间: 2024-11-14 19:06
飞云居士 发表于 2024-11-14 17:16
通过改变指针的值来操作不同的IO端口可以实现的。通过修改指针的指向,让它指向不同的端口地址,从而实现控 ...

你是梦里学的 51 么?
你知道51的 高位地址 0x80~0xFF 直接访问 和  间接访问的区别么?
你知道不知道 当 SP = 0x80 的时候,执行入栈 操作不会改变 P0 的值是什么原因么?
作者: lkc8210    时间: 2024-11-14 23:25
188610329 发表于 2024-11-14 19:06
你是梦里学的 51 么?
你知道51的 高位地址 0x80~0xFF 直接访问 和  间接访问的区别么?
你知道不知道  ...

一眼AI回答
作者: Graves    时间: 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是不行的
作者: Graves    时间: 2024-11-15 09:08
lkc8210 发表于 2024-11-14 16:08
STC只接受sfr定义端口,然后控制

所以是不行的吗?是51的都不行还是说STC的不行
作者: xiaobendan001    时间: 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;这样应该可以吧
作者: xiaobendan001    时间: 2024-11-15 12:14
Graves 发表于 2024-11-15 09:07
uchar *bbb;
bbb = &P0;
*bbb = 0xff;

好像PPP = P0不行,=0x80;能编译,但是好像也不起作用。为何要这么用呢?
作者: lkc8210    时间: 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的内存内
作者: lkc8210    时间: 2024-11-15 13:54
Graves 发表于 2024-11-15 09:08
所以是不行的吗?是51的都不行还是说STC的不行

STC的和ATMEL 的51都不行
其他51没用过
作者: coody_sz    时间: 2024-11-15 14:47
传统的51不支持指针访问特殊功能寄存器(0x80~0xff),但STC的扩展在xdata的特殊功能寄存器可以用xdata指针访问的。
作者: Graves    时间: 2024-11-15 16:01
xiaobendan001 发表于 2024-11-15 12:10
&P0是个啥操作?P0本来就是个地址啊
uchar* ppp;
ppp = P0;

不是很理解,P0是地址的话那P0=0xAA是什么操作?
作者: Graves    时间: 2024-11-15 16:07
xiaobendan001 发表于 2024-11-15 12:14
好像PPP = P0不行,=0x80;能编译,但是好像也不起作用。为何要这么用呢?

需要模拟通讯的设备有点多,而且又是同一个协议,但是端口不一样。这时想到几种方法
①模拟通讯代码全部复制粘贴一遍,但是代码量就太大挤不进
②if_else换端口,要加多个参数,也不太好改端口
所以想把端口当参数来传,那模拟的通讯只要一份就行
作者: lkc8210    时间: 2024-11-16 22:18
Graves 发表于 2024-11-15 16:07
需要模拟通讯的设备有点多,而且又是同一个协议,但是端口不一样。这时想到几种方法
①模拟通讯代码全部 ...

没办法,用51就是要这样
只能用方法2




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1