求单片机实验的外部中断实验的程序

求单片机实验的外部中断实验的程序,第1张

#include<reg51.h>团燃耐

#include<塌春intrins.h>段丛

#define uchar unsigned char

uchar cnt,times

void delay()

{

uchar i

TMOD=0x01

TH0=(65536-50000)/256

TL0=(65536-50000)%256

TR0=1

for(i=0i<timesi++)

{

while(TF0==0)

TH0=(65536-50000)/256

TL0=(65536-50000)%256

TF0=0

}

TR0=0

}

void ext0() interrupt 0

{

uchar i,j

P1=0xfe

times=8

for(i=0i<5i++)

{

for(j=0j<8j++)

{

P1=_crol_(P1,1)

delay()

}

}

}

void ext1() interrupt 2

{

uchar i,j

P1=0x7f

times=12

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

{

for(j=0j<8j++)

{

P1=_cror_(P1,1)

delay()

}

}

}

main()

{

EX0=1

EX1=1

IT0=0

IT1=1

PX0=0

PX1=1

while(1)

}

答:

先看看你的中断程序

void exter0() interrupt 0

{

d1=0

}

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

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

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

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

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

请问你这个触发中断是一个按键?你触发的方式是长时间按下还是瞬间按下?我觉得你应该是长时间按下的。回到正题,你这个中断服务函数里只有一句代码,那么中断服务函数执行的速度会很快的,所以如果你只旁辩吵按了一下的话那么看起来就感觉没有执行一样,更重要的是你这个中断服务函数里没有对按键进行消抖,同时也没有关闭中断,这就可能会引起,当你瞬间按下中断按钮后,其实中断被执行了多次,而当你长时间按下中断按钮后,那么程序会不停的在main和中断服务函数之运侍间快速不停的切换,这就导致了main函数断断续续的运行,看起来就像是main运行变慢了,其实是因为程序需要灶穗不停的进入中断服务函数,所以看起来就像运行变慢一样。

改进建议:在中断服务函数里加入按键消抖的语句,或是直接进入中断后关闭中断,处理完后再开启。而且如果想明显的看到效果的话请在中断服务函数里加一些延时语句。


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

原文地址: http://outofmemory.cn/yw/12449574.html

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

发表评论

登录后才能评论

评论列表(0条)

保存