找回密码
 立即注册
查看: 144|回复: 6

设置为双向口模式,上电后端口默认是低电平吗 | 不可能

[复制链接]
已绑定手机

82

主题

218

回帖

700

积分

高级会员

积分
700
发表于 2026-8-16 11:04:40 | 显示全部楼层 |阅读模式
怎么修改默认电平的高低

  1. #include <AI8051U.H>                         //包含AI8051U的头文件
  2. #include <intrins.H>
  3. #include  "ai_usb.h"        //USB库和USB虚拟设备的头文件
  4. void Timer0_Init(void)                //500毫秒@40.000MHz
  5. {
  6.         TM0PS = 0x19;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
  7.         AUXR &= 0x7F;                        //定时器时钟12T模式
  8.         TMOD &= 0xF0;                        //设置定时器模式
  9.         TL0 = 0x99;                                //设置定时初始值
  10.         TH0 = 0x05;                                //设置定时初始值
  11.         TF0 = 0;                                //清除TF0标志
  12.         TR0 = 1;                                //定时器0开始计时
  13.         ET0 = 1;                                //使能定时器0中断
  14. }
  15. void main(void)
  16. {
  17.     EAXFR = 1;                      //允许访问扩展的特殊寄存器,XFR
  18.                                     //(32 位模式请使用这句,注释下一句)
  19. //  P_SW2 |= 0x80;                  //允许访问扩展的特殊寄存器,XFR
  20.                                     //(8位模式请使用这句,注释上一句)。
  21.     WTST = 0;                       //设置取程序代码等待时间,
  22.                                     //赋值为 0表示不等待,程序以最快速度运行
  23.     CKCON = 0;                      //设置访问片内的 xdata速度,
  24.                                     //赋值为 0表示用最快速度访问,不增加额外的等待时间
  25.                                     
  26.     P2M0 = 0x00; P2M1 = 0x00;       //设置P2口为准双向口模式
  27.     P3M0 = 0x00; P3M1 = 0x00;       //设置P3口为准双向口模式
  28.                 usb_init();
  29.         //初始化USB模块,并且会将【P3.0,P3.1】初始化为高阻输入,不影响USB【D-,D+】通讯
  30.           Timer0_Init();
  31.           EA = 1;                //使能总中断
  32.         
  33.     while(1)                        
  34.     {            
  35.     }
  36. }
  37. void Timer0_Isr(void) interrupt 1
  38. {
  39.         
  40.                            //LED循环自动闪烁部分
  41.         P2 = ~P2;                   //对P0端口取反
  42. //      P00 = ~P00;                //对单个端口取反
  43.         
  44. }
复制代码


回复

使用道具 举报 送花

已绑定手机

52

主题

2863

回帖

3155

积分

荣誉版主

积分
3155
发表于 2026-8-16 11:07:37 | 显示全部楼层
设置准双向口之前对端口赋值“0”就可实现默认低电平
~~~
回复

使用道具 举报 送花

865

主题

1万

回帖

2万

积分

管理员

积分
25122
发表于 2026-8-16 12:09:43 | 显示全部楼层
截图202608161209403520.jpg
回复

使用道具 举报 送花

865

主题

1万

回帖

2万

积分

管理员

积分
25122
发表于 2026-8-16 12:10:03 | 显示全部楼层

我已经获取到了关键信息。现在来分析这个帖子的问题。

关于"双向口模式上电默认电平"的问题

楼主的问题是:设置为双向口(准双向口)模式,上电后端口默认是低电平吗?以及怎么修改默认电平的高低?

首先,关于"上电默认是否低电平"

根据 AI8051U 数据手册《I/O口》 章节的说明,这里需要澄清一个概念——上电后的状态和设置为准双向口后的状态是不同的:

  1. 上电复位瞬间

    • P3.0 和 P3.1 外,其余所有 I/O 口上电后的状态均为高阻输入状态(不是低电平,也不是准双向口模式)。
    • 手册原文:"除P3.0和P3.1外,其余所有I/O口上电后的状态均为高阻输入状态,用户在使用I/O口前必须先设置I/O口模式"
    • 只有 P3.0 和 P3.1 上电后是弱上拉/准双向口模式。
  2. 设置为准双向口之后

    • 当您把 I/O 口配置为准双向口模式(P2M0=0x00; P2M1=0x00)后,默认输出是高电平(弱上拉),因为标准 8051 的准双向口是弱上拉输出,端口默认是高电平状态。并不是低电平。

如果只是执行了 P2M0=0x00; P2M1=0x00; 而没有对端口赋值,那么 P2 口的数据寄存器默认值是 0xFF,所以输出的是高电平。

怎么修改默认电平高低?

方法一:软件方式(在设置端口模式前/后直接对端口赋值)

正如论坛回复"晓***"所说:"设置准双向口之前对端口赋值'0'就可实现默认低电平"。即:

P2M0 = 0x00; P2M1 = 0x00;   //设置P2口为准双向口模式
P2 = 0x00;                   //★ 对P2口赋0,使其默认输出低电平

因为准双向口的输出状态直接由端口数据锁存器控制,写入 0 就输出低电平,写入 1 就输出高电平。

方法二:硬件方式(利用上电高阻特性加下拉电阻)

根据手册"如何让I/O口上电复位时为低电平"的说明:

"Ai8051U/8H/32G系列单片机上电复位后I/O口为高阻输入。如外部加下拉电阻【20K - 50K】,则上电后就是低电平。如外部加上拉电阻【20K - 50K】,则上电后就是高电平。"

这个方法的好处是:在单片机复位瞬间(还没运行用户程序时),端口就已经是确定的低电平/高电平,避免所控制的系统(如马达)在复位瞬间误动作。手册原文特别提到:

"很多实际应用要求上电时某些I/O口为低电平输出,否则所控制的系统(如马达)就会误动作"

回到楼主的代码场景

楼主代码里实际上已经做了:

P2=0;   // 这句就是软件方式,把P2口默认设为低电平

所以,如果想在程序运行后让 P2 口默认输出低电平,直接 P2 = 0; 即可(楼主已经写了这句)。

需要提醒的一句是:楼主在 main()usb_init() 之前就执行了 P2 = 0;,而 LED 是否点亮取决于外部电路接法(是灌电流拉低点亮,还是推电流拉高点亮)。如果您的 LED 是接在 P2 与 VCC 之间(低电平点亮),那么 P2=0 灯就会亮——这正好对应您上一个帖子里"灯一直亮"的现象。

小结

场景 默认状态
上电复位瞬间(P3.0/P3.1除外) 高阻输入(手册原文)
上电复位瞬间(P3.0/P3.1) 弱上拉/准双向口
设置为准双向口后,未赋值 输出高电平(弱上拉)
设置为准双向口后,Px=0 输出低电平(软件方式)
上电加下拉电阻 20K-50K 上电即为低电平(硬件方式)

信息来源:AI8051U 数据手册《I/O口》章节——"关于I/O的注意事项"及"如何让I/O口上电复位时为低电平"部分。

如果您是想在复位瞬间(用户程序尚未运行时)就保证端口为低电平,推荐采用外部下拉电阻的硬件方式;如果只是程序运行后想要低电平,直接对端口赋值 Px = 0 即可。


🔍 搜索 "https://www.stcaimcu.com/thread-25298-1-1.html"

⏱️ 查找用时 5.9s | 总回答用时 15.7s

回复

使用道具 举报 送花

83

主题

8219

回帖

1万

积分

超级版主

积分
17644
发表于 2026-8-16 14:13:35 | 显示全部楼层
IO上电默认高电平。
建议不管默认,自己输出需要的电平,再设置IO。
回复

使用道具 举报 送花

865

主题

1万

回帖

2万

积分

管理员

积分
25122
发表于 2026-8-16 14:27:59 | 显示全部楼层
截图202608161426403186.jpg



截图202608161427024326.jpg

截图202608161427377743.jpg

截图202608161427562149.jpg


回复

使用道具 举报 送花

已绑定手机

82

主题

218

回帖

700

积分

高级会员

积分
700
 楼主| 发表于 2026-8-17 09:39:36 | 显示全部楼层
梁*** 发表于 2026-8-16 14:13
IO上电默认高电平。
建议不管默认,自己输出需要的电平,再设置IO。

好的
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-9-23 15:05 , Processed in 0.077326 second(s), 67 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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