找回密码
 立即注册
查看: 127|回复: 8

STC8G1K08A外部中断求解

[复制链接]
已绑定手机

2

主题

5

回帖

1406

积分

金牌会员

积分
1406
发表于 2026-9-1 01:11:44 | 显示全部楼层 |阅读模式
截图202609010059107163.jpg
P33做过零检测(只测下降沿)
相关代码如下
  1. #include <stc8g.h>
  2. sbit ext = P3^3;
  3. sbit sw = P3^0;
  4. unsigned char cnt = 0;
  5. void INT1_Isr(void) interrupt 2
  6. {
  7.   ++cnt;
  8.   if(cnt > 9)
  9.   {
  10.     sw = 0;//sw是led开关
  11.     EX1 = 0;
  12.     cnt = 0;
  13.   }
  14. }
  15. void main()
  16. {
  17.   P3M0 = (P3M0 & ~0x0e) | 0x01; P3M1 = (P3M1 & ~0x09) | 0x06;
  18.   P5M0 &= ~0x30; P5M1 = (P5M1 & ~0x20) | 0x10;
  19.   sw = 1;
  20.   IT1 = 1;
  21.   EX1 = 1;
  22.   EA = 1;
  23.   while(1);
  24. }
复制代码

实际上电后led常亮,外部中断似乎没生效
回复

使用道具 举报 送花

已绑定手机

10

主题

409

回帖

1119

积分

金牌会员

积分
1119
发表于 2026-9-1 07:59:07 | 显示全部楼层
用示波器看一下P33波形就明白了。这个电路得不到你想要的波形。
回复

使用道具 举报 送花

865

主题

1万

回帖

2万

积分

管理员

积分
25122
发表于 2026-9-1 09:00:35 | 显示全部楼层
截图202609010900327591.jpg
回复

使用道具 举报 送花

865

主题

1万

回帖

2万

积分

管理员

积分
25122
发表于 2026-9-1 09:01:03 | 显示全部楼层

好的,我现在有了足够的信息来全面分析这个问题了。让我综合所有信息给出完整回答。


问题分析

根据论坛帖子内容和电路图,我来分析为什么外部中断 INT1 没有生效

一、电路图分析(核心问题所在)

这个电路是一个市电50Hz过零检测电路,存在问题:

电路结构:

  • 50Hz交流信号源 → 680nF电容耦合 → 1M电阻 + 稳压管(Zener)构成钳位/整形网络 → 二极管整流 → 两个820k电阻串联分压 → 输出到P3.3

问题1:P3.3接入点的直流偏置问题

从图中可以看到,P3.3 旁边标注了 "0 V"。这意味着在这条分压支路上,P3.3 的直流电平被钳位在 0V 附近。

但是关键问题是:两个 820k 电阻的分压点只有通过电容和稳压管网络与市电耦合。这个电路的过零检测点并不是直接产生一个干净的数字方波。当市电过零时,信号变化可能非常缓慢或幅度不足,无法让施密特触发器产生可靠的边沿。

问题2:电路本质是"无隔离"的容性耦合过零检测

这类电路常见的缺陷是:

  • 680nF电容 + 820k+820k分压的高通滤波截止频率设计不当
  • 稳压管钳位电平不合适
  • 信号经过耦合后在P3.3上产生的波形不是干净的50Hz方波,而是类似正弦波被截断后的小幅振荡信号

正如论坛那位工程师所说:"用示波器看一下P33波形就明白了。这个电路得不到你想要的波形。"


二、代码配置问题

P3M0 = (P3M0 & ~0x0e) | 0x01; P3M1 = (P3M1 & ~0x09) | 0x06;

逐位分析:

  • P3M0 = 0x01 → P3.0 推挽输出(LED开关,正确)
  • P3M1 = 0x06 → P3.1、P3.2 高阻输入

**P3.3 的组合是 M1=0、M0=0,即准双向口!** 标准参考例程中,INT1引脚通常也是保持默认为准双向模式(手册示例代码中 P3M0=0x00, P3M1=0x00),所以P3.3准双向配置本身不是致命问题。

但是这里有一个重要的注意点:准双向口读外部状态前要锁存为'1'。如果P3.3的端口锁存器被写为'0',它会有强下拉,外部信号就无法将其拉高,导致中断永远无法触发!

另一个注意点:手册中提到 IT1=1 设置INT1为下降沿触发。过零检测电路输出的是交流信号变换后的波形,P3.3上信号变化本身可能不够陡峭——施密特触发器虽然有干扰抑制,但如果信号变换太慢或不完整,边沿识别会失效


三、建议排查步骤

  1. 用示波器观察P3.3引脚波形
    这是最关键的诊断手段。确认P3.3上是否真的有从高到低的干净边沿信号,并且电平能正常摆动到单片机识别的高/低电平阈值范围。

  2. 确认P3.3端口锁存器为'1'
    在配置前先 P33 = 1;(即写锁存器为1),避免准双向口被内部强下拉拉住。

  3. 将P3.3配置为高阻输入
    建议将P3.3配置为 高阻输入(P3M1.3=1, P3M0.3=0),避免内部上拉/下拉对来自820k分压的弱信号产生影响。

    P3M0 &= ~0x08;  // P3.3 = 高阻输入
    P3M1 |= 0x08;
    
  4. 检查过零检测电路本身
    论坛回复已经指出:"这个电路得不到你想要的波形"。建议:

    • 用示波器确认P3.3上信号是否是一个干净的方波
    • 如果信号幅度不足或边沿不陡,需要重新设计电路(例如使用光耦隔离方案,或采用标准的电阻分压+二极管钳位方案)

四、参考代码修正

#include <stc8g.h>

sbit ext = P3^3;
sbit sw  = P3^0;

unsigned char cnt = 0;

void INT1_Isr(void) interrupt 2
{
    ++cnt;
    if(cnt > 9)
    {
        sw = 0;      // LED开关关闭
        EX1 = 0;     // 关闭INT1中断
        cnt = 0;
    }
}

void main()
{
    // P3.0: 推挽输出(LED)
    P3M0 = (P3M0 & ~0x0e) | 0x01;
    P3M1 = (P3M1 & ~0x09) | 0x06;
    P3M1 |= 0x08;    // P3.3设为高阻输入,确保能正确读取外部信号
    P3M0 &= ~0x08;

    P5M0 &= ~0x30;
    P5M1 = (P5M1 & ~0x20) | 0x10;

    P33 = 1;         // 确保P3.3锁存器为1(高阻输入下也需要)
    sw = 1;

    IT1 = 1;         // 下降沿触发
    EX1 = 1;         // 使能INT1
    EA  = 1;         // 打开总中断

    while(1);
}

五、总结

核心结论: 中断没生效的根本原因是过零检测电路本身输出的波形无法让INT1可靠地检测到下降沿。P3.3上得到的不是一个干净的数字方波信号,可能信号幅度不足、边沿不陡,无法满足施密特触发器对边沿识别的要求。论坛的工程师回复也印证了这一点。

建议优先用示波器确认P3.3上的实际波形,再决定是修改电路还是调整代码。如果确认电路无问题,再按上述代码将P3.3配置为高阻输入以确保接口状态正确。

如果你能提供P3.3用示波器看到的波形截图,我可以帮你进一步分析判断。


🔍 搜索 "STC8H 单片机 例程 下载"

⏱️ 查找用时 36.5s | 总回答用时 50.7s

回复

使用道具 举报 送花

已绑定手机

10

主题

409

回帖

1119

积分

金牌会员

积分
1119
发表于 2026-9-1 12:04:07 | 显示全部楼层
建议用全波整流电路,示意图

无标题.jpg
回复

使用道具 举报 送花

已绑定手机

2

主题

5

回帖

1406

积分

金牌会员

积分
1406
 楼主| 发表于 2026-9-1 13:20:56 | 显示全部楼层
wul*** 发表于 2026-9-1 07:59
用示波器看一下P33波形就明白了。这个电路得不到你想要的波形。

谢谢你,是寄生电容耦合rc低通导致了io无法下降到低电平,我把限流电阻减小到900k后就能按预期工作了
回复

使用道具 举报 送花

9

主题

752

回帖

5185

积分

论坛元老

积分
5185
发表于 2026-9-1 15:06:39 | 显示全部楼层
这个阻容降压供电和过零检测电路没问题,P33脚设置为高阻,配合管脚内部的钳位二极管,可以得到过零脉冲,如果实际电路没搭错,重点检查软件问题.很可能是准双向模式上拉电阻造成波形畸变
1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
回复

使用道具 举报 送花

已绑定手机

2

主题

5

回帖

1406

积分

金牌会员

积分
1406
 楼主| 发表于 2026-9-1 17:35:22 | 显示全部楼层
网*** 发表于 2026-9-1 15:06
这个阻容降压供电和过零检测电路没问题,P33脚设置为高阻,配合管脚内部的钳位二极管,可以得到过零脉冲,如果 ...

一语点醒,重看手册得知弱上拉能提供250uA电流,而1.6M限流电阻的峰值下拉电流只有200uA,在寄生电容的影响下是没法把io拉低的,比从信号角度来看直观多了
回复

使用道具 举报 送花

已绑定手机

9

主题

45

回帖

816

积分

高级会员

积分
816
发表于 2026-9-2 08:24:58 来自手机 | 显示全部楼层
学习了,多谢楼主
回复

使用道具 举报 送花

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

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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