sclx00 发表于 2026-6-15 14:57:55

中断还是跑2次 请大师看看

代码如下,试过上升沿下降沿 高电平依然跑2遍流水灯




#include "config.h"
#include "ai8051u.h"
#define DEBOUNCE_COUNT100   // 连续检测100次(约100ms,取决于主循环速度)

void PORT1_Init(void)                                        //new
{
    SetP1nInitLevelHigh(PIN_ALL);       //设置P1初始化电平
    SetP1nQuasiMode(PIN_ALL);         //设置P1为准双向口模式
    SetP1nManualMode(PIN_ALL);          //设置P1手动配置端口模式

    DisableP1nPullUp(PIN_ALL);          //关闭P1内部上拉电阻
    DisableP1nPullDown(PIN_ALL);      //关闭P1内部下拉电阻
    EnableP1nSchmitt(PIN_ALL);          //使能P1施密特触发
    SetP1nSlewRateNormal(PIN_ALL);      //设置P1一般翻转速度
    SetP1nDrivingNormal(PIN_ALL);       //设置P1一般驱动能力
    SetP1nDigitalInput(PIN_ALL);      //使能P1数字信号输入功能

//    SetP1nRisingInt(PIN_2 | PIN_1);   //设置P1.2,P1.1为上升沿中断

//    EnableP1nInt(PIN_2 | PIN_1);      //使能P1.2,P1.1口中断

    SetP1IntPriority(0);                //设置中断为最低优先级

    //<<AICUBE_USER_PORT1_INITIAL_BEGIN>>
    // 在此添加用户初始化代码
    //<<AICUBE_USER_PORT1_INITIAL_END>>
}


void SYS_Init(void)
{
    EnableAccessXFR();
    AccessCodeFastest();
    AccessIXramFastest();
    IAP_SetTimeBase();
    PORT1_Init();                     //P1口初始化//NEW

    P2M0 = 0x00; P2M1 = 0x00;
}

volatile bit int0_flag = 0;

void EXTI0_ISR(void) interrupt 0
{
    int0_flag = 1;   // 设置标志,立即退出
}

// 项目主函数

void main(void)
{
    // 在此添加用户主函数初始化代码
    WTST = 0;          // 设置程序指令延时参数
    EAXFR = 1;         // 使能访问扩展寄存器区(XFR)
    CKCON = 0;         // 提高访问 XRAM速度       
       
        P3M0 = 0x00;       // P3 准双向口模式(包含输入功能)                        //新改
    P3M1 = 0x00;
        IT0 = 1;   // INT0 下降沿触发(IT0=0 为低电平触发)
        EX0 = 1;   // 使能 INT0 中断
        EA= 1;

    SYS_Init();
    // 在此添加主函数中运行一次的用户代码
                P2 = 0x00;                                        //对P0端口置0,点亮整组LED
                delay_ms(2000);
                P2 = 0xFF;                                        //对P0端口置0,点亮整组LED

    while(1)
    {
      if(int0_flag)
      {
            int0_flag = 0;
                        P21 = 0;
                        delay_ms(800);
                        P22 = 0;
                        delay_ms(800);
                        P23 = 0;
                        delay_ms(800);
                        P24 = 0;
                        delay_ms(800);
                        P20 = 1;
                        delay_ms(800);
                        P21 = 1;
                        delay_ms(800);
                        P22 = 1;
                        delay_ms(800);
                        P23 = 1;
                        delay_ms(800);
                        P24 = 1;
      }
    }
}

////////////////////////////////////////
// 毫秒延时函数
// 入口参数: ms (设置延时的毫秒值)
// 函数返回: 无
////////////////////////////////////////
void delay_ms(uint16_t ms)
{
    uint16_t i;

    do
    {
      i = MAIN_Fosc / 6000;
      while (--i);
    } while (--ms);
}



lcwswust 发表于 2026-6-15 19:51:58

测过引脚波形没?

sclx00 发表于 2026-6-15 21:31:39

lcwswust 发表于 2026-6-15 19:51
测过引脚波形没?
没有示波器啊
用的这个外接
屏幕截图 2026-06-15 213046

神农鼎 发表于 2026-6-15 22:17:37











lcwswust 发表于 2026-6-16 09:45:39

sclx00 发表于 2026-6-15 21:31
没有示波器啊
用的这个外接

这么说来,你并不能保证外部中断只触发了一次,有可能触发多次。

建议:不要用其它东西,就用IO口输出高低电平来触发外中断。
关于示波器,建议准备一个(正点原子、普源),或用单片机自己造一个。
另外,关于IT0=0,据我所知,STC15、STC8A、STC8G、STC8H、AI8051U都是两个边沿都能触发,不再是低电平触发了;
不过看你给的是1,那应该不影响,只需注意这个特性就行。




sclx00 发表于 2026-6-16 23:43:06

lcwswust 发表于 2026-6-16 09:45
这么说来,你并不能保证外部中断只触发了一次,有可能触发多次。

建议:不要用其它东西,就用IO口输出高 ...

单片机怎么自己手搓啊有教程吗
谢谢大师 我的程序按计划跑起来啦不再跑2次了

lcwswust 发表于 2026-6-17 10:02:07

sclx00 发表于 2026-6-16 23:43
单片机怎么自己手搓啊有教程吗
谢谢大师 我的程序按计划跑起来啦不再跑2次了 ...

好些实验箱都提供了示波器的例子:
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=11257
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=1833#pid11845
页: [1]
查看完整版本: 中断还是跑2次 请大师看看