找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2254|回复: 8
收起左侧

STC8G单片机自动进入外部中断是怎么回事?附程序

[复制链接]
ID:909797 发表于 2021-4-21 18:35 | 显示全部楼层 |阅读模式
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);
}


回复

使用道具 举报

ID:87000 发表于 2023-5-18 11:44 | 显示全部楼层
解决了没有了?我也遇到这个问题
回复

使用道具 举报

ID:213173 发表于 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)
        {
回复

使用道具 举报

ID:1034262 发表于 2023-5-18 17:36 | 显示全部楼层
外中断是硬件在每个时钟检测边沿,需要有边沿出现才会设置中断标志,没有边沿出现是不会触发中断的。
楼主所谓自动进入中断,则肯定检测到了边沿,以下情况要注意:
1、上电时,有上升沿动作,所以会有中断标志。允许中断前,先清除标志,至少3个时钟周期后再允许外中断。
2、IO设置为高阻,并且悬空,则IO浮动,就会检测到边沿,触发中断。
回复

使用道具 举报

ID:87000 发表于 2023-5-23 09:29 | 显示全部楼层
coody_sz 发表于 2023-5-18 17:36
外中断是硬件在每个时钟检测边沿,需要有边沿出现才会设置中断标志,没有边沿出现是不会触发中断的。
楼主 ...

这算不算STC的一个小BUG了?毕竟,上电延时后,再开启外部中断也会产生这个现象。
回复

使用道具 举报

ID:879348 发表于 2023-5-23 10:34 | 显示全部楼层
初始化以后要清除中断标志位,基本所有单片机都有这个要求
回复

使用道具 举报

ID:526543 发表于 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引脚检测到下降沿时才会触发中断。
回复

使用道具 举报

ID:1034262 发表于 2023-5-23 10:50 | 显示全部楼层
西点钟灵毓秀 发表于 2023-5-23 09:29
这算不算STC的一个小BUG了?毕竟,上电延时后,再开启外部中断也会产生这个现象。

不是BUG。不管什么时候开启哪个中断,都要先清除中断标志。
回复

使用道具 举报

ID:1095571 发表于 2023-10-10 13:36 来自手机 | 显示全部楼层
今天测试了下,开启外部中断0,使用准双向口模式下,外部中断0管脚上接了一个电解质电容,正极接管脚,负极接地,可以解决抗干扰性差的问题呦,你试试呢,我测试了,必须拉低管脚,才能触发中断,不过还有个问题,电容大小的选择,影响外部中断的采集频率。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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