标题: STC8G单片机自动进入外部中断是怎么回事?附程序 [打印本页]

作者: ENGLEG    时间: 2021-4-21 18:35
标题: STC8G单片机自动进入外部中断是怎么回事?附程序
STC8芯片会自动进入外部中断是怎么回事?P3口外面没接任何东西,还是能自动进入到中断中。  下面是我的代码。哪位大神能帮我解答下呢
void INT0_init()
{
    EA = 0;
    IT1 = 1;
    EX1 = 1;
    EA = 1;
}

void main()
{
    INT0_init();
    P1M0 |=0X1C;
    P1M1 &=0XE3;
//    PCON = 0X02;
    _nop_();
    _nop_();
   
    while(1)
    {
        RED = 0;
        GREEN = BLUE = 1;
//        PCON = 0X02;
        _nop_();
        _nop_();         
    }
}
void Int0_inter() interrupt 2
{
      delay(100);
      RED = GREEN = BLUE = 0;
      delay(3000);
}



作者: 西点钟灵毓秀    时间: 2023-5-18 11:44
解决了没有了?我也遇到这个问题
作者: wulin    时间: 2023-5-18 14:25
西点钟灵毓秀 发表于 2023-5-18 11:44
解决了没有了?我也遇到这个问题

楼主main函数初始化不当。STC8系列速度太快,端口还没有稳定就开中断导致开机外部中断误触发。
启动顺序调整一下,注意要清0中断标志。
void main()
{
        P0M0 = 0x00;
        P0M1 = 0x00;
        P1M0 = 0x00;
        P1M1 = 0x00;
        P2M0 = 0x00;
        P2M1 = 0x00;
        P3M0 = 0x00;
        P3M1 = 0x00;
        P4M0 = 0x00;
        P4M1 = 0x00;
        P5M0 = 0x00;
        P5M1 = 0x00;
        P6M0 = 0x00;
        P6M1 = 0x00;
        P7M0 = 0x00;
        P7M1 = 0x00;
        Delay_ms(100);//长延时100ms               
        IT0 = 1;
        EX0 = 1;
        IE0 = 0;//INT0中断请求标志清0
        EA = 1;
        while(1)
        {
作者: coody_sz    时间: 2023-5-18 17:36
外中断是硬件在每个时钟检测边沿,需要有边沿出现才会设置中断标志,没有边沿出现是不会触发中断的。
楼主所谓自动进入中断,则肯定检测到了边沿,以下情况要注意:
1、上电时,有上升沿动作,所以会有中断标志。允许中断前,先清除标志,至少3个时钟周期后再允许外中断。
2、IO设置为高阻,并且悬空,则IO浮动,就会检测到边沿,触发中断。

作者: 西点钟灵毓秀    时间: 2023-5-23 09:29
coody_sz 发表于 2023-5-18 17:36
外中断是硬件在每个时钟检测边沿,需要有边沿出现才会设置中断标志,没有边沿出现是不会触发中断的。
楼主 ...

这算不算STC的一个小BUG了?毕竟,上电延时后,再开启外部中断也会产生这个现象。
作者: wufa1986    时间: 2023-5-23 10:34
初始化以后要清除中断标志位,基本所有单片机都有这个要求
作者: 123456ZXC1    时间: 2023-5-23 10:38
STC8芯片自动进入外部中断的原因可能是因为存在干扰信号或者噪声,导致中断引脚触发。即使P3口没有连接任何外部设备,但是由于芯片内部的电路特性,可能会引发一些干扰信号。

你的代码中使用了INT0外部中断,但在初始化函数INT0_init()中,只进行了相关的中断配置,没有对中断触发方式进行设置。根据你的代码,INT0的中断触发方式(IT0)并没有设置,默认为电平触发方式。可能会因为外部信号的波动导致中断触发。

为了解决这个问题,你可以在INT0_init()函数中添加设置中断触发方式的代码。例如,如果你希望使用下降沿触发方式,可以修改代码如下:void INT0_init()
{
    EA = 0;
    IT0 = 1;  // 设置INT0为下降沿触发方式
    EX0 = 1;  // 允许INT0中断
    EA = 1;
}
这样设置后,只有当INT0引脚检测到下降沿时才会触发中断。
作者: coody_sz    时间: 2023-5-23 10:50
西点钟灵毓秀 发表于 2023-5-23 09:29
这算不算STC的一个小BUG了?毕竟,上电延时后,再开启外部中断也会产生这个现象。

不是BUG。不管什么时候开启哪个中断,都要先清除中断标志。
作者: 准八戒    时间: 2023-10-10 13:36
今天测试了下,开启外部中断0,使用准双向口模式下,外部中断0管脚上接了一个电解质电容,正极接管脚,负极接地,可以解决抗干扰性差的问题呦,你试试呢,我测试了,必须拉低管脚,才能触发中断,不过还有个问题,电容大小的选择,影响外部中断的采集频率。




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