#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单片机外部中断扩展程序设计、单片机的内部中断和外部中断有什么区别等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)