求51单片机外部中断的C语言程序

求51单片机外部中断的C语言程序,第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=zx>0x--)

for

(y=110y>0y--)

}

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边沿触发,下降沿触发

}

#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)

}

你的外部中断应该是属于下降沿触发,当有一个下降沿到来时外部中断请求标志IE0或IE1(外部中断0或外部中断1请求中断标志,下面简称为IEx)就会置1,当进入中断程序后IEx由硬件归零。也就是说单片机当检测到IEx为1的时候就会进入到外部中断程序。\x0d\x0a现在来分析一下为什么你的程序会执行两次中断。\x0d\x0a当单片机外部中断引脚第一次接收到一个下降沿时,IEx被置1,进入中断程序,随即IEx被硬件清零。然而由于你用杜邦线接触P3.2口存在抖动(你感觉不到),外部中断引脚再次接受到一个下降沿,IEx又被置1,单片机又要响应中断,但此时由于上一个中断程序未执行完,单片机将等待外部中断程序执行完(你可以理解为有两个中断事件,但这两个事件优先级相同,所有按顺序响应)。在这个过程中,你的接触仍然会产生很多下降沿,但因为IEx只有响应了中断事件后才会清零,因此IEx一直为1。当第一次的中断程序执行结束后,单片机检测到IEx又是1,马上又再次进入中断。因为你的接触时间远远小于你的中断程序执行时间,因此在第二次执行中断程序前已不存在下降沿,所以进入第二次中断程序后,IEx就被清零了,这样执行完第二次中断程序后就不会再次进入中断了。\x0d\x0a说了那么多希望你能明白吧。不明白可以翻查相关单片机外部中断相关资料。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存