基本上是把寄存器和函数里是0的改成1
函数名()interrupt 0 {} //对应外部中断0;----》函数名()interrupt 1 {} //对应外部中断1;
EX0---》EX1 等!!
首先两个中断是否都打开了,也就是EX0、EX1是否都等于1;
另外看看触发方式:IT0、IT1是什么置;
再看看你是否真的触发了,硬件上确认没有问题?
第四,你将两个中断函数后面using n ,使n不同,使用不同的工作组试试。
外部中断可以设置为低电平触发和下降沿触发,一旦满足条件,进入中断程序。一般用来检测按键或者一些外部的电平信号
定时器中断是计时进入中断,就是每隔一段时间进一次中断。也可用来检测按键。一个人按键假如最快的速度是05秒一次,你每隔025S进中断判断一下按键是不是被按下了,就永远不会漏掉。如果你一直放在主循环里执行按键检测程序,会造成单片机资源的浪费,也就是阻塞程序。
外部中断执行过程中,只要定时中断能产生并且能进入定时中断子程序,定时器就可以计数,这跟你设置的中断优先级有关系。你的这段程序里好像没有体现中断优先级。如果定时器中断的优先级高于外部中断,这样就可以,否则就不行。
举个简单的例子:执行中断好比一位老师讲课,没有设置中断优先级(默认设置)的犹如两个班的学生,老师讲课当然要按顺序一个一个来讲。但是如果设置了中断优先级,那么优先级高的就会被优先处理,当正在讲课(正在处理优先级低的任务)时突然校长在门外敲门找老师(校长的优先级比较高),所以老师就会停止给学生讲课去处理校长的事情,等处理完了再回来继续给学生讲课。
估计是干扰造成的,一般设置成为下降沿触发比较好,若设置为电平触发需保证中断响应后,中断信号应及时搞撤消,防止一次 *** 作,多次进入中断
具体你的中断程序,不知有什么意义,我看逻辑也有点乱,低电平触发后,关中断,若低电平已撤消,高电平来到,则延时20ms后开中断退出, 若高电平显现后又在20ms内消失,则再延时20ms后,进入反复检测的死循环中, 若低电平未撤消,则也进入反复检测的死循环中,其作用大概就是低电平程序停止,直到出现可靠的高电平后恢复运行,倒不如直接检测低电平,低电平进入中断,然后反复检测是否还是低电平,若一直是低电平,就执行延时,偶尔出现的干扰高电平会被过滤掉,若真正出现高电平,则自动退出 这样程序更简单更容易控制
void counter(void) interrupt 0
{
while(P3_2==0)
{
delay1ms(20);//延时长则抗高电平干扰能力强
}
}
程序抗低电平干扰能力比较弱,但根据你的意图:要可靠的高电平主程序才恢复运行
那么,换名话说,偶尔出现的低电平也会也会使主程序暂时中断,然后自动恢复,也应该是合理的了
的。
一般的单片机触发方式有两种:低电平触发IT0=0(或中断1的IT1=0)和下降沿触发IT1=1。
IT0或IT1不设置也行,默认为0即低电平触发,只要中断IO管脚输入电平为0,即低电平触发进入中断,但前提是EA=1而且ET0=1(EA为打开总中断,ET0是允许进入中断函数),这个时候会停止主函数,转而进入中断函数处理,处理完中断函数后返回原来停止的地址继续执行主函数。
你所说的INTERRUPT 1是中断1,不关IT的事,说明了你同时还打开了ET1=1,自己检查下
方法类似,补写程序如下:
#include
#define
uint
unsigned
int
#define
uchar
unsigned
char
sbit
led=p0^0;
sbit
led1=p0^1;
void
delay1ms
(uint
z)
{
uint
x,y;
for
(x=z;x>0;x--)
for
(y=110;y>0;y--);
}
void
exter()
interrupt
2
{
delay1ms(600);
led=0;
delay1ms(200);
led=1;
}
void
exter0()
interrupt
0
{
delay1ms(600);
led1=1;
delay1ms(200);
led1=0;
}
main()
{
ea=1;
//开总中断
ex1=1;
//开外部中断1
ex0=1;
//开外部中断0
it1=0;
//外部中断边沿触发,下降沿触发
it0=0;
//外部中断0边沿触发,下降沿触发
}
以上就是关于51单片机外部0中断变成外部1中断,程序怎么修改全部的内容,包括:51单片机外部0中断变成外部1中断,程序怎么修改、51单片机,c 语言 为什么写2个外部中断程序,就会有一个不工作呢不是同时按的,不用考虑优先级、大神们,外部中断服务函数,5以上怎么用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)