51单片机的外部中断0实验(P2.3引脚)

51单片机的外部中断0实验(P2.3引脚),第1张

答:

先看看你的中断程序

void exter0() interrupt 0

{

d1=0;

}

也就是叫d1置零而已。执行完这句就跳出中断了,继续执行主函数。

那么你叫中断一直低电平,是不是就一直触发中断呀?是的。

你认为只要一直触发中断,是不是就应该永远执行中断函数,而不干别的了?

当程序从中断函数跳出时如果又来了中断,单片机会在跳出中断后执行一条指令才进入中断的! 也就是执行RETI这句汇编指令后,接着又执行一条语句,才进入中断函数。跳出后又执行一条语句依此类推

所以你的程序就是这样的情况。你看到的就是跳动的频率变满了。

中断发生时,如果中断是允许的,CPU会到指定的位置取指令并执行。

如果没有写中断服务程序,指定的位置内容就不好说了。则取到的指令就不一定是什么指令,但也会执行。

所以,没有意外,后果就是死机。

如果是下降沿触发(it0=1)就只会执行一次中断程序。电平触发(it0=1)的话每次执行完中断里面的程序(只要不关闭中断)就又跳进中断里去了,不断的循环执行。

循环的频率跟晶振有关,晶振的频率直接关系到单片机执行指令的速度。频率越高速度也就越快。

估计是干扰造成的,一般设置成为下降沿触发比较好,若设置为电平触发需保证中断响应后,中断信号应及时搞撤消,防止一次 *** 作,多次进入中断

具体你的中断程序,不知有什么意义,我看逻辑也有点乱,低电平触发后,关中断,若低电平已撤消,高电平来到,则延时20ms后开中断退出,  若高电平显现后又在20ms内消失,则再延时20ms后,进入反复检测的死循环中, 若低电平未撤消,则也进入反复检测的死循环中,其作用大概就是低电平程序停止,直到出现可靠的高电平后恢复运行,倒不如直接检测低电平,低电平进入中断,然后反复检测是否还是低电平,若一直是低电平,就执行延时,偶尔出现的干扰高电平会被过滤掉,若真正出现高电平,则自动退出 这样程序更简单更容易控制

void counter(void) interrupt 0

{

while(P3_2==0)

 {

delay1ms(20);//延时长则抗高电平干扰能力强

 }

程序抗低电平干扰能力比较弱,但根据你的意图:要可靠的高电平主程序才恢复运行

那么,换名话说,偶尔出现的低电平也会也会使主程序暂时中断,然后自动恢复,也应该是合理的了

使用方法:

单片机的P25,P26,P27口分别接三位动态数码管的位选端,P0口接动态数码管的段选端。然后,P10口接一个电阻串联一个LED灯然后接地,电阻取200~470欧之间就行,是一个限流电阻。

中断用的是外部中断0,要触发中断的时候,就用一根杜邦线一端接地,一端接到单片机的P32口就行,这样,就满足了你的要求了。

外部中断的触发方式有低电平触发和下降沿触发。到底是那种触发方式,要设置中断允许寄存器中IT0的值,如果IT0=0,像我写的程序,就是低电平触发,如果为1,就是下降沿触发。

灯不是一定要接到P32口上的。中断要执行的任务是在中断函数中写代码控制的,就像我写的代码中,你只需要控制LED灯接的那个IO口就行了。

代码如下:

#include

#define uchar unsigned char

sbit led=P1^0;

uchar code duan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

uchar code wei[3]={0x06,0x05,0x03};

void delay(uchar c);

void ini_()            //初始化函数,设置中断触发方式,开中断

{

  EA=1;

  IT0=0;

  EX0=1;

}

void main()

{

uchar i;

  ini_();

led=0;            //由于单片机上电之后,所有的IO口默认是高电平,而要求是开始不亮,所以要将P10口开始设置为低电平。

  while(1)

  {

for(i=0;i<3;i++)            动态数码管闪烁

{

P2=wei[i];

P0=duan[i];

delay(35);

}

}

}

void led_() interrupt 0            //外部中断0函数,中断函数不需要申明

{

uchar i;

led=1;                                    //在中断中让灯亮起来

while(1)

{

for(i=0;i<3;i++)

{

P2=wei[i];

P0=duan[i];

delay(1);

}

}

}

void delay(uchar c)

{

uchar a,b;

for(c;c>0;c--)

for(a=38;a>0;a--)

for(b=80;b>0;b--);

}

以上就是关于51单片机的外部中断0实验(P2.3引脚)全部的内容,包括:51单片机的外部中断0实验(P2.3引脚)、51单片机开外部中断但是不写中断程序会怎样、51单片机外部中断问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9280360.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存