中断还是跑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
测过引脚波形没?
没有示波器啊
用的这个外接
屏幕截图 2026-06-15 213046
sclx00 发表于 2026-6-15 21:31
没有示波器啊
用的这个外接
这么说来,你并不能保证外部中断只触发了一次,有可能触发多次。
建议:不要用其它东西,就用IO口输出高低电平来触发外中断。
关于示波器,建议准备一个(正点原子、普源),或用单片机自己造一个。
另外,关于IT0=0,据我所知,STC15、STC8A、STC8G、STC8H、AI8051U都是两个边沿都能触发,不再是低电平触发了;
不过看你给的是1,那应该不影响,只需注意这个特性就行。
lcwswust 发表于 2026-6-16 09:45
这么说来,你并不能保证外部中断只触发了一次,有可能触发多次。
建议:不要用其它东西,就用IO口输出高 ...
单片机怎么自己手搓啊有教程吗
谢谢大师 我的程序按计划跑起来啦不再跑2次了 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]