开启外部中断的基本流程

开启外部中断的基本流程,第1张

#include"reg51h"sbita1=P3^2;intXn,SUM;voidtime0_initial()//定时{TMOD=0x01;TH0=(65535-5000)/256;//定时器0定时5msTL0=(65535-5000)%256;EA=1;}voidinterrupt_0_initial(){IT0=0;EX0=1;EA=1;}voidmain(void){interrupt_0_initial();time0_initial();while(1);}voidtime0()interrupt1{TH0=(65535-5000)/256;//定时器0定时5msTL0=(65535-5000)%256;Xn++;}voidinterrupt_0()interrupt0{do{ET0=1;TR0=1;}while(a1==0)ET0=0;TR0=0;SUM=Xn;Xn=0;}

org 00h

sjmp main

org 03h

ljmp int

org 30h

main:mov sp ,#60h    ;初始化

mov ie,#10000001b    ;开中断

mov tcon,#00000000b  ;设置外部中断触发方式(低电平有效)

mov p1,#00h

mov dptr,#100h

sjmp $               ;等待中断

int:jb p10,loop_0   ;执行按键1 *** 作

jb p11,loop_1   ;执行按健2 *** 作

jb p12,loop_2   ;执行按健3 *** 作

jb p13,loop_3   ;执行按健4 *** 作

loop_0:push psw

mov r7,#4

mov a,#00h

movc a,@a+dptr

mov p2,a

acall delay

djnz r7,loop_0

pop psw

reti

loop_1:push psw

mov r7,#4

mov a,#04h

movc a,@a+dptr

mov p2,a

acall delay

djnz r7,loop_1

pop psw

reti

loop_2:push psw

mov r7,#4

mov a,#08h

movc a,@a+dptr

mov p2,a

acall delay

djnz r7,loop_2

pop psw

reti

loop_3:push psw

mov r7,#4

mov a,#0ch

movc a,@a+dptr

mov p2,a

acall delay

djnz r7,loop_3

pop psw

reti

delay:mov r5,#10h

delay_0:mov r6,#255

djnz r6,$

djnz r5,delay_0

ret

org 100h

db 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h

db 41h,42h,43h,44h,45h,46h

end

希望对你有帮助

一、主体不同

1、内部中断:断是一个算法指令,是由软中断指令启动的中断。

2、外部中断:是单片机实时地处理外部事件的一种内部机制。

二、机制不同

1、内部中断:执行除法指令时,出现除数为0或商超过寄存器所能表达的范围,则产生类型为0 的内部中断。是优先级最高的内部中断。

2、外部中断:当某种外部事件发生时,单片机的中断系统将迫使CPU暂停正在执行的程序,转而去进行中断事件的处理;中断处理完毕后.又返回被中断的程序处,继续执行下去。

三、特点不同

1、内部中断:由一条指令INT n产生中断类型码或者由指令规定,或者是预定的。不执行INTA总线周期,CPU也不发出响应信号INTA。

2、外部中断:在实时控制中,现场的各种参数、信息均随时问和现场而变化。这些外界变量可根据要求随时向CPU发出中断申请。请求CPU及时处珲中断请求,如中断条件。

参考资料来源:百度百科-外部中断

参考资料来源:百度百科-内部中断

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

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

程序设计的要求是什么?

说的不太清楚。

简单改了改:

#include<reg52h>

#include<intrinsh>

void delay()

{

    unsigned  int  i, j;

    for(i = 0; i <= 800; i++)    for(j = 0; j <= 200; j++);

}

void delay2()

{

    unsigned  int  i, j;

    for(i = 0; i <= 800; i++)    for(j = 0; j <= 200; j++);

}

void init_tx()

{

    EA = 1;

    EX0 = 1;

    IT0 = 1;

}

void main()

{

    init_tx();

    while(1)  {  P1 = ~P1;  delay(); }

}

    

void tx0() interrupt 0

{

    static unsigned char i = 0xfe;

    P1 = i;  delay2();

    i = _crol_(i, 1); 

    P1 = 0x00;

}

在中断函数中,进行延时,楼主的这个思路,是错误的。

特别是和主函数共用同一个延时函数,更加添乱。

SETB IT0;set INT0 int type (1:Falling 0:Low level)

SETB EX0;enable INT0 interrupt

SETB EA;open global interrupt switch

五个中断有指定的IO口,一般51单片机是P32是INT0,zhiP33是INT1,P34是T0,P35是T1,INT0和INT1是外部中断,T0和T1是定时器,daoES是串行口中断允许位,ET1是定时器1中断允许位,EX1是外部中断允许位,ET0和EX0类似。

扩展资料;

单片机在自主运行时一般是在执行一个死循环程序,在没有外界干预(输入信号)时它基本处于一个封闭状态。比如一个电子时钟,它会按时、分、秒的规律自主运行并通过输出设备(如液晶显示屏)把时间显示出来。

在不需要对它进行调校时它不需要外部干预,自主封闭地运行。如果这个时钟足够准确而又不掉电的话,它可能一直处于这种封闭运行状态。

参考资料来源:百度百科-外部中断

以上就是关于开启外部中断的基本流程全部的内容,包括:开启外部中断的基本流程、C51单片机外部中断扩展程序设计、单片机的内部中断和外部中断有什么区别等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: https://outofmemory.cn/zz/10626295.html

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

发表评论

登录后才能评论

评论列表(0条)

保存