找回密码
 立即注册
查看: 56|回复: 5

大家好!我写了一个程序如下,P3.3输不出高 | 已解决

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-10-24 15:17:01
已绑定手机

2

主题

2

回帖

22

积分

新手上路

积分
22
发表于 6 天前 | 显示全部楼层 |阅读模式
#include        "reg51.h"
#include        "intrins.h"

#define CLKSEL          (*(unsigned char volatile xdata *)0xfe00)
#define CLKDIV          (*(unsigned char volatile xdata *)0xfe01)
#define HIRCCR          (*(unsigned char volatile xdata *)0xfe02)
#define XOSCCR          (*(unsigned char volatile xdata *)0xfe03)
#define IRC32KCR        (*(unsigned char volatile xdata *)0xfe04)
#define MCLKOCR         (*(unsigned char volatile xdata *)0xfe05)

//sfr P1 = 0x90;
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6;
sbit P17 = P1^7;

//sfr P3 = 0xB0;
sbit P30 = P3^0;
sbit P31 = P3^1;
sbit P32 = P3^2;
sbit P33 = P3^3;
sbit P34 = P3^4;
sbit P35 = P3^5;
sbit P36 = P3^6;
sbit P37 = P3^7;

sfr P5   = 0xC8;
sbit P50 = P5^0;
sbit P51 = P5^1;
sbit P52 = P5^2;
sbit P53 = P5^3;
sbit P54 = P5^4;
sbit P55 = P5^5;
sbit P56 = P5^6;
sbit P57 = P5^7;

sfr P1M0   = 0x92;
sfr P1M1   = 0x91;

sfr P3M0   = 0xB2;
sfr P3M1   = 0xB1;

sfr P5M0   = 0xCA;
sfr P5M1   = 0xC9;

//准双向口

#define  P1_MODE_IO_PU(Pin)                                P1M1 &= ~(Pin), P1M0 &= ~(Pin);

#define  P3_MODE_IO_PU(Pin)                                P3M1 &= ~(Pin), P3M0 &= ~(Pin);

#define  P5_MODE_IO_PU(Pin)                                P5M1 &= ~(Pin), P5M0 &= ~(Pin);

//高阻输入

#define  P1_MODE_IN_HIZ(Pin)                        P1M1 |= (Pin), P1M0 &= ~(Pin);

#define  P3_MODE_IN_HIZ(Pin)                        P3M1 |= (Pin), P3M0 &= ~(Pin);

#define  P5_MODE_IN_HIZ(Pin)                        P5M1 |= (Pin), P5M0 &= ~(Pin);

//漏极开路

#define  P1_MODE_OUT_OD(Pin)                        P1M1 |= (Pin), P1M0 |= (Pin);

#define  P3_MODE_OUT_OD(Pin)                        P3M1 |= (Pin), P3M0 |= (Pin);

#define  P5_MODE_OUT_OD(Pin)                        P5M1 |= (Pin), P5M0 |= (Pin);

//推挽输出

#define  P1_MODE_OUT_PP(Pin)                        P1M1 &= ~(Pin), P1M0 |= (Pin);

#define  P3_MODE_OUT_PP(Pin)                        P3M1 &= ~(Pin), P3M0 |= (Pin);

#define  P5_MODE_OUT_PP(Pin)                        P5M1 &= ~(Pin), P5M0 |= (Pin);


void main (void)
{
        P3_MODE_OUT_PP(0x00001000);
        P33 = 1;
        while(1)
        {
               
        }
        
}

回复

使用道具 举报 送花

3

主题

1849

回帖

546

积分

等待验证会员

积分
546
发表于 6 天前 | 显示全部楼层
您好!关于您提到的“P33输不出高”的问题,我们从您提供的代码和硬件操作的角度来分析可能的原因,并给出相应的排查建议。

一、问题背景

您使用的是兼容 8051 内核的单片机(从代码中使用了 reg51h 和 intrinsh 头文件可判断),并定义了多个寄存器地址和端口引脚,包括 P1、P3 和 P5 等端口。其中:
  1. c
  2. sbit P33 = P3^3;
复制代码

您尝试通过设置 P33 = 1; 来将 P3.3 引脚置高电平,但实际测试中无法输出高电平。

二、常见原因分析

1. 端口配置问题

在 8051 架构及其衍生芯片中,某些 I/O 引脚具有复用功能(如外部中断、定时器输入/输出、串口通信等)。P3 口的每个引脚通常都有第二功能,例如:
P3.0:RXD(串口接收)
P3.1:TXD(串口发送)
P3.2:INT0(外部中断0)
P3.3:INT1(外部中断1)

如果 P3.3 被配置为中断输入(INT1),则默认情况下该引脚为输入模式,不能直接输出高电平。

建议:

检查芯片数据手册,确认 P3.3 是否被默认配置为中断输入或其他复用功能。如果是,需要通过配置寄存器(如 P3M1、P3M0 或其他端口模式寄存器)将其设置为通用输出模式。

例如,某些芯片中:
  1. c
  2. P3M1 = 0x00;  // 设置 P3 为推挽输出
  3. P3M0 = 0xFF;
复制代码

2. 端口初始状态问题

在上电复位后,8051 系列单片机的 I/O 端口通常被初始化为高电平(“1”),但具体行为取决于芯片设计和复位电路。如果在程序中没有显式地将 P33 设置为高电平,或者在设置之前有其他代码将其拉低,也可能导致输出异常。

建议:

确保在主程序中明确设置:
  1. c
  2. P33 = 1;
复制代码

并在设置后使用示波器或万用表测量该引脚电压,确认是否被拉高。

3. 外部电路影响

如果 P3.3 引脚连接了外部电路(如按键、LED、上拉/下拉电阻、其他芯片等),可能会导致输出电平被拉低。例如:
外部下拉电阻过大,导致输出无法拉高;
LED 没有串接限流电阻,导致输出被拉低;
引脚短接到地或其他信号。

建议:
检查硬件连接;
使用万用表测量 P3.3 引脚对地电阻,确认是否短路或被下拉;
尝试将 P3.3 断开与外部电路连接后再次测试。

4. 编译器或语法问题

虽然您使用的是标准的 sbit 定义方式:
  1. c
  2. sbit P33 = P3^3;
复制代码

但不同编译器(如 Keil、SDCC、IAR 等)对 sbit 的支持略有差异,某些编译器可能对特殊寄存器的访问方式有要求。此外,如果定义冲突(例如多次定义 P3 或 P33),也可能导致行为异常。

建议:
检查编译器是否报错或警告;
确保头文件中没有重复定义;
使用 P3 |= 0x08; 替代 P33 = 1; 测试是否能输出高电平。

5. 芯片型号或兼容性问题

您使用的芯片是否与标准 8051 兼容?是否为增强型 8051(如 STC、Silicon Labs、Nuvoton 等厂商的芯片)?这些芯片通常提供更多寄存器配置选项,但也需要正确初始化。

建议:

查阅芯片数据手册,确认以下内容:
P3.3 的功能复用情况;
是否需要配置端口模式寄存器(如 PnM1/PnM0);
是否存在其他系统时钟或外设配置影响了 I/O 功能。

三、建议的调试步骤

1. 确认 P3.3 是否被复用为其他功能
查阅芯片手册,确认 P3.3 是否默认为中断输入或其他功能;
若是,需配置相关寄存器切换为通用 I/O。

2. 检查端口配置寄存器
如 P3M1、P3M0,确保 P3.3 被配置为输出模式。

3. 测试其他引脚
尝试将 P33 = 1; 改为 P30 = 1; 或 P31 = 1;,看是否能正常输出高电平;
若其他引脚可以输出,则说明 P33 本身配置或硬件存在问题。

4. 使用直接寄存器操作
  
  1. c
  2.    P3 |= 0x08;  // 设置 P3.3 为高电平
复制代码
   如果此方式有效,说明 sbit 定义可能存在兼容性问题。

5. 检查硬件连接
使用万用表测量 P3.3 引脚电压;
检查是否有外部下拉电阻、短路或负载过大。

四、总结

| 可能原因 | 排查建议 |
|----------|----------|
| 引脚复用功能 | 查阅手册,配置为通用 I/O |
| 端口模式配置错误 | 设置 P3M1/P3M0 寄存器 |
| 硬件连接问题 | 检查外部电路、断开测试 |
| 编译器兼容性 | 检查 sbit 定义与编译器支持 |
| 初始化顺序问题 | 明确设置 P33 = 1; 并在主循环中保持输出 |

如果您能提供以下信息,我可以进一步帮助您定位问题:
使用的具体芯片型号;
编译器类型及版本;
是否使用了中断或其他外设;
P3.3 引脚连接的外部电路图(简图);

期待您的回复,祝调试顺利!

如有其他问题,欢迎继续交流。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:594
  • 最近打卡:2025-10-25 18:09:46
已绑定手机

86

主题

6366

回帖

1万

积分

超级版主

积分
11959
发表于 6 天前 | 显示全部楼层
开漏输出高相当于高阻,需要打开内部上拉或设置为推挽才能输出高
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:540
  • 最近打卡:2025-10-25 14:02:09
已绑定手机

48

主题

2295

回帖

8082

积分

论坛元老

积分
8082
发表于 6 天前 | 显示全部楼层
P3_MODE_OUT_PP(0x00001000);  这条指令里面的参数明显不对,你考虑一下 0x1000 是多少。
如果是要设置P33推挽输出模式,应该使用
P3_MODE_OUT_PP(0x08);
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-10-24 15:17:01
已绑定手机

2

主题

2

回帖

22

积分

新手上路

积分
22
发表于 6 天前 | 显示全部楼层
Debu*** 发表于 2025-10-20 13:23
开漏输出高相当于高阻,需要打开内部上拉或设置为推挽才能输出高

谢谢啦!
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-10-24 15:17:01
已绑定手机

2

主题

2

回帖

22

积分

新手上路

积分
22
发表于 6 天前 | 显示全部楼层
谢谢了!
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-10-26 10:49 , Processed in 0.134793 second(s), 82 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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