找回密码
 立即注册
查看: 102|回复: 3

请答疑 | STC【AI 助手】不但能自动生成程序,最主要还是【查错高手】

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2026-07-01 22:51:25
已绑定手机

7

主题

8

回帖

55

积分

注册会员

积分
55
发表于 2026-6-24 00:04:31 | 显示全部楼层 |阅读模式
第一个问题,我P2初始化为低电平,为什么启动之后会是高电平?以下代码
  1. volatile bit p1_1_flag = 0; // P1.1中断中置标志
  2. void PORT2_Init(void)
  3. {
  4. SetP2nInitLevelLow(PIN_ALL); //设置P2初始化电平
  5. SetP2nQuasiMode(PIN_ALL); //设置P2为准双向口模式
  6. SetP2nManualMode(PIN_ALL); //设置P2手动配置端口模式
  7. DisableP2nPullUp(PIN_ALL); //关闭P2内部上拉电阻
  8. DisableP2nPullDown(PIN_ALL); //关闭P2内部下拉电阻
  9. EnableP2nSchmitt(PIN_ALL); //使能P2施密特触发
  10. SetP2nSlewRateNormal(PIN_ALL); //设置P2一般翻转速度
  11. SetP2nDrivingNormal(PIN_ALL); //设置P2一般驱动能力
  12. SetP2nDigitalInput(PIN_ALL); //使能P2数字信号输入功能
  13. }
  14. void main(void)
  15. {
  16. WTST = 0; // 设置程序指令延时参数
  17. EAXFR = 1; // 使能访问扩展寄存器区(XFR)
  18. CKCON = 0; // 提高访问 XRAM速度
  19. SYS_Init();
  20. P2 = 0x00; //对P0端口置0,点亮整组LED
  21. delay_ms(2000);
  22. P2 = 0xFF; //对P0端口置0,点亮整组LED
  23. while(1)
  24. {
  25. if(p1_1_flag)
  26. {
  27. p1_1_flag = 1;
  28. delay_ms(50); // 主循环中消抖
  29. if(P11 == 1) // 重新读引脚,确认是真的按下
  30. {
  31. P21 = 0;
  32. delay_ms(500);
  33. P22 = 0;
  34. delay_ms(500);
  35. P23 = 0;
  36. delay_ms(500);
  37. P24 = 0;
复制代码

//主函数部分代码
第二问题
  1.             p1_1_flag = 1;
  2. delay_ms(50); // 主循环中消抖
  3. if(P11 == 1) // 重新读引脚,确认是真的按下
复制代码

代码中把1写成0 灯会连续亮2次 写成1就只亮1次 为什么呢
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:467
  • 最近打卡:2026-07-21 09:31:46

851

主题

1万

回帖

2万

积分

管理员

积分
24394
发表于 2026-6-24 11:43:57 | 显示全部楼层
截图202606241143225290.jpg

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:467
  • 最近打卡:2026-07-21 09:31:46

851

主题

1万

回帖

2万

积分

管理员

积分
24394
发表于 2026-6-24 11:44:15 | 显示全部楼层

这是论坛上 scl* 用户发的求助帖,里面问了两个问题。结合 STC8H 数据手册,我来逐一分析解答。


问题一:P2初始化为低电平,为什么启动之后会是高电平?

根本原因:复位后 I/O 口默认为高阻输入,端口数据寄存器默认为 0xFF(全1),且 SetP2nInitLevelLow() 并不能在代码运行时实时拉低电平。

STC8H 手册 第12章 I/O口相关寄存器 可知:

寄存器 复位值
P2 端口数据寄存器 0xFF(1111,1111)
P2M1(模式配置高字节) 0xFF
P2M0(模式配置低字节) 0x00

复位后 **PnM1=1, PnM0=0** → **高阻输入模式**。此时引脚电平由外部决定,如果外部无下拉,引脚浮空或通过极微弱的上拉呈高电平。

你的代码执行流程导致的问题:

复位 → 默认高阻输入,P2寄存器=0xFF → 输出寄存器为1
   ↓
PORT2_Init() → 设置为准双向口(弱上拉)→ 此时 P2 寄存器仍为 0xFF,引脚输出高电平!
   ↓
P2 = 0x00 → 拉低 ← 但在此之前已有一个"高电平窗口"
   ↓
delay_ms(2000)
   ↓
P2 = 0xFF → 又置高了 ← 如果你在此时观察,自然是高电平

所以有两个原因导致你看到高电平:

  1. 复位后到 P2 = 0x00 之间,P2 数据寄存器为 0xFF,一旦切换到准双向口即输出高电平
  2. P2 = 0xFF 又把电平拉高了

SetP2nInitLevelLow() 是什么?
这是 STC-ISP 下载时设置的硬件选项(在下载软件的"硬件选项"中勾选"上电复位后 P2 口为低电平"),不是在代码中动态执行的函数。如果仅调函数但 ISP 下载时没有勾选对应选项,它不会生效。

要让上电复位时为低电平,STC8H 手册 12.9 节推荐的方法是

在 I/O 口外加一个 10K 左右的下拉电阻。复位后 I/O 口为高阻输入,外部下拉电阻将引脚拉低。需要输出高电平时,将 I/O 口设为强推挽输出即可驱动为高电平。


问题二:p1_1_flag = 1p1_1_flag = 0 为什么效果不同?

先看你的代码逻辑:

if(p1_1_flag)           // 检测标志
{
    p1_1_flag = ???;    // ← 问题就在这一行,写1还是写0
    delay_ms(50);       // 消抖延时
    if(P11 == 1)        // 再次确认
    {
        // 执行灯操作
    }
}

假设 p1_1_flagP1.1 下降沿中断 中被置 1(按键按下触发一次中断)。


情况 ①:p1_1_flag = 1;(保持标志)→ 灯只亮 1 次

  • 按键按下 → 中断触发 → p1_1_flag = 1
  • 主循环进入 if → p1_1_flag = 1(保持为 1)→ 延时 50ms → if(P11 == 1) 成立(按键按下中)→ 执行灯操作 1 次
  • 下次主循环:p1_1_flag 仍为 1,再次进入 if → 再次 p1_1_flag = 1 → 延时 50ms → 此时按键可能已释放(P11=0)→ if(P11 == 1) 不成立不执行灯操作
  • 之后每次进入都因 P11 != 1 而不执行灯操作

所以只亮了 1 次(只有按键刚按下时 P11=1 成立的那一次)


情况 ②:p1_1_flag = 0;(清除标志)→ 灯亮 2 次

  • 按键按下 → 中断触发 → p1_1_flag = 1
  • 主循环进入 if → p1_1_flag = 0(清标志)→ 延时 50ms → if(P11 == 1) 成立 → 执行灯操作第 1 次
  • 下次主循环:p1_1_flag = 0,不进入 if
  • 但是:按键的机械抖动可能产生第二次下降沿中断 → p1_1_flag 再次被置 1
  • 主循环再次进入 if → p1_1_flag = 0 → 延时 50ms → if(P11 == 1) 可能仍成立(按键还没松或抖动中)→ 执行灯操作第 2 次

所以亮了 2 次(第一次是按键按下,第二次是抖动触发的额外中断)


小结

写法 效果 原因
p1_1_flag = 1(保持) 亮 1 次 标志一直为 1,但后续进入时按键已释放(P11≠1),不执行操作
p1_1_flag = 0(清除) 亮 2 次 清除后,按键抖动再次触发中断,再次置标志位,再次进入执行

正确的按键处理方式应该是:

if(p1_1_flag)
{
    p1_1_flag = 0;          // 清标志,只响应一次
    delay_ms(10);           // 短延时消抖
    if(P11 == 1)            // 确认按下(假设高有效)
    {
        // 执行动作
    }
}

同时在中断中只置标志,不要做其他操作,并且最好开启按键引脚的施密特触发输入(你代码中已用 EnableP2nSchmitt 做了,是对的)来增强抗干扰。


参考来源:

  • STC8H 数据手册 第12章 12.1节 I/O口相关寄存器(复位值表)
  • STC8H 数据手册 第12章 12.9节 如何让I/O口上电复位时为低电平

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

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:316
  • 最近打卡:2026-07-22 06:56:11
已绑定手机

70

主题

874

回帖

3225

积分

论坛元老

DIY玩家

积分
3225
发表于 2026-6-24 16:40:45 | 显示全部楼层
会使用AI助手生成部分程序框架
然后完成部分程序再让AI补充和完善
永怀这学徒心
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-7-22 10:31 , Processed in 0.077362 second(s), 59 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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