C51 外部中断程序

C51 外部中断程序,第1张

大概是这样的,稍微根据要求改改~(记得给分奥!)

ORG 0000H

LJMP START

ORG 0003H

LJMP INT_0

ORG 0100H

START:

SETB EA ;开总中断

SETB EX0 ;开INT0中断

CLR IT0 ; 设置INT0为电平触发

SP1 EQU P36

MOV A,#00H

MOV R0,#8

SETB C;P10到P17的二极管依次点亮

LOOP1:

RLC A

MOV P1,A

ACALL DELAY

DJNZ R0,LOOP1

MOV A,#00H

MOV R0,#8

SETB C;P17到P10的二极管依次点亮

LOOP2:

RRC A

MOV P1,A

ACALL DELAY

DJNZ R0,LOOP2

AJMP START

;延时1秒子程序

DELAY:

MOV R5,#200

D1: MOV R6,#20

D2:MOV R7,#123

NOP

DJNZ R7,$

DJNZ R6,D2

DJNZ R5,D1

RET

INT_0:

PUSH PSW

PUSH ACC

MOV A,#0FFH

MOV R2,#6

MOV P1,A

L4:

;MOV P1,A

;LCALL DELAY

;CPL A

CPL SP1

LCALL DELAY

DJNZ R2,L4

POP ACC

POP PSW

RETI

END

你的外部中断应该是属于下降沿触发,当有一个下降沿到来时外部中断请求标志IE0或IE1(外部中断0或外部中断1请求中断标志,下面简称为IEx)就会置1,当进入中断程序后IEx由硬件归零。也就是说单片机当检测到IEx为1的时候就会进入到外部中断程序。

现在来分析一下为什么你的程序会执行两次中断。

当单片机外部中断引脚第一次接收到一个下降沿时,IEx被置1,进入中断程序,随即IEx被硬件清零。然而由于你用杜邦线接触P32口存在抖动(你感觉不到),外部中断引脚再次接受到一个下降沿,IEx又被置1,单片机又要响应中断,但此时由于上一个中断程序未执行完,单片机将等待外部中断程序执行完(你可以理解为有两个中断事件,但这两个事件优先级相同,所有按顺序响应)。在这个过程中,你的接触仍然会产生很多下降沿,但因为IEx只有响应了中断事件后才会清零,因此IEx一直为1。当第一次的中断程序执行结束后,单片机检测到IEx又是1,马上又再次进入中断。因为你的接触时间远远小于你的中断程序执行时间,因此在第二次执行中断程序前已不存在下降沿,所以进入第二次中断程序后,IEx就被清零了,这样执行完第二次中断程序后就不会再次进入中断了。

说了那么多希望你能明白吧。不明白可以翻查相关单片机外部中断相关资料。

外部中断0设置为低电平触发,去掉while循环后一直按下按键实际代码为

delay();

p1=0xfe;

delay();

ex0=0;

p1=_crol_(p1,1);

delay();

ex0=1;

p1=0x00;

一直重复

之前的代码进入中断后会一直循环,并不会退出中断。正确做法中断应该改为:

void

tx0()

interrupt

0

using

0

{

unsigned

char

i;

delay();

p1=0xfe;

delay();

ex0=0;

while(1)

{

p1=_crol_(p1,1);

delay();

if(p3&0x04)

//判断是否松开中断0的按键

{

break;

}

}

ex0=1;

p1=0x00;

}

以上就是关于C51 外部中断程序全部的内容,包括:C51 外部中断程序、51单片机外部中断子程序为什么会执行两次呢(我只触发一次) 下面是我的程序代码、C51单片机外部中断扩展程序设计等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存