我是靠谱客的博主 执着篮球,最近开发中收集的这篇文章主要介绍51汇编(八):外部中断中断中断源中断寄存器中断地址外部中断,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

中断

中断是一种计算机内部机制,常用于处理突发事件(优先级高的事件)。
在这里插入图片描述
下图是中断机制的原理图,计算机自动检测五个中断标志,判断是否有中断请求,再判断是否允许响应该中断请求,最后去执行中断响应函数。
我们可以把中断机制理解为一间房子,首先我们需要记住两道门:小门和大门。小门有五扇,指的是5个源允许位;大门只有一扇,指的是总允许位。大门不开,谁都进不来,大门开了,小门锁上,对应的房间也进不去;因此只有当大门和小门同时打开,才能完成一次中断响应(中断允许)。其次这房子还有一个特点,就是同一个时间只能进去一个人,因此如果有两个人(两个中断请求)同时要求进入,且两扇门都是打开的,这时管家(单片机)就会把这两人分为等级,等级高的先进入,我们也可以不按照管家的分级(默认优先级),自己为五个人分级(优先级控制器)。至此,中断机制就差不多了。
在这里插入图片描述

中断源

中断机制由中断源中断响应函数组成,AT89C52单片机的中断源有两个外部中断三个内部中断

中断源(默认优先级):

  • 外部中断0 (外部中断) 最高优先级
  • 定时器0中断 (内部中断)
  • 外部中断1 (外部中断)
  • 定时器1中断 (内部中断)
  • 串口中断 (内部中断) 最低优先级

本篇主要讲外部中断,不考虑自定优先级,不考虑同时发生。

中断寄存器

  • 中断控制寄存器
    在这里插入图片描述
    外部中断0/1:

    • IE0/1:外部中断0/1请求标志位,如果出现中断信号,该位由硬件置1。
    • IT0/1:外部中断0/1触发方式控制位,0为低电平触发,1为高电平触发。

    定时器0/1:

    • TF0/1:定时器0/1溢出标志位,计数器溢出则该位由硬件置1.
    • TR0/1:定时器0/1启动位,0不允许运行,1允许运行。
      在这里插入图片描述

    串口中断:

    • RI:接收中断
    • TI:发送中断
  1. 中断允许控制寄存器
    在这里插入图片描述
  • EA:中断总允许
  • EX0:外部中断0中断允许位
  • ET0:定时器0中断允许位
  • EX1:外部中断1中断允许位
  • ET1:定时器1中断允许位
  • ES:串口中断允许位
    以上各位置1为允许
  1. 中断优先级控制寄存器(本篇不讲)

中断地址

一旦触发了中断,单片机就会到指定的地点去寻找中断响应函数,这个固定的地方就叫做中断地址。

地址功能
0003H—000AH外部中断0
000BH—0012H定时/计数器0中断
0013H—001AH外部中断1
001BH—0022H定时/计数器1中断
0023H—002AH串行中断
002BH—0032H定时/计数器2中断

外部中断

外部中断有两种触发方式,分别为低电平触发下降沿触发(我们通常使用下降沿触发),具体到单片机就是P3.2(外部中断0)P3.3(外部中断1)
在这里插入图片描述
配置外部中断0:

  1. 设置下降沿触发,打开两扇门(允许位置1)
SETB	IT0
SETB	EX0
SETB	EA
  1. 中断响应函数
ORG		03H
AJMP	EX0_INTERRUPT
……
……
EX0_INTERRUPT:
PUSH	ACC
PUSH	PSW
……
……
POP		PSW
POP		ACC
RETI

例程:

ORG		0000H
AJMP	START
ORG		0003H					;外部中断0中断地址
AJMP	EX0_INTERRUPT			;外部中断0响应函数
ORG		0013H					;外部中断1中断地址
AJMP	EX1_INTERRUPT			;外部中断1响应函数

;MAIN-------------------------------------------------
ORG		0030H
START:
;VIDEO MEMORY-----------------------------------------
MOV		30H, #1
MOV		31H, #2
MOV		32H, #3
MOV		33H, #4
ACALL	EX_INIT
MIANLOOP:
ACALL	DISPLAY
AJMP	MIANLOOP
	
;EX INIT---------------------------------------------
EX_INIT:
SETB	IT0
SETB	IT1

SETB	EX0
SETB	EX1
SETB	EA
RET

;EX0_INTERRUPT----------------------------------------
EX0_INTERRUPT:
PUSH	ACC
PUSH	PSW
INC		33H
MOV		A, 33H
CJNE	A, #10, EX0_EXIT
MOV		33H, #0
INC		32H
MOV		A, 32H
CJNE	A, #10, EX0_EXIT
MOV		32H, #0
EX0_EXIT:
POP		PSW
POP		ACC
RETI

;EX1_INTERRUPT----------------------------------------
EX1_INTERRUPT:
PUSH	ACC
PUSH	PSW
DEC		33H
MOV		A, 33H
CJNE	A, #0, EX0_EXIT
MOV		33H, #9;
DEC		32H
MOV		A, 32H
CJNE	A, #0, EX0_EXIT
MOV		32H, #0
EX1_EXIT:
POP		PSW
POP		ACC
RETI

;显示函数---------------------------------------------------------
;段选:P0.0->P0.7
;位选:P2.0->P2.3
DISPLAY:
MOV		DPTR, #1000H			;码表起始地址
MOV		R0, #30H				;显存起始地址
MOV		R1, #01H				;位选码 P2.7-> 0 0 0 0 0 0 0 1 ->P2.0

;四位循环----------------------------------------------------------
DISPLAYLOOP:
MOV		P0, #0FFH				;消影

;查表,将显存中的数字映射到段码
MOV		A, @R0				
MOVC	A, @A+DPTR

MOV		P0, A					;段选赋值
MOV		P2, R1					;位选赋值
ACALL	DELAY					;延时
INC		R0						;显存自加,切换到下一位数字的显存

;位选左移切换
MOV		A, R1
RL		A
MOV		R1, A

CJNE	R1, #10H, DISPLAYLOOP	;根据位选码,判断是否完成四位切换
RET

;延时函数----------------------------------------------------------
DELAY:
MOV		R7, #2
DELAYLOOP1:
MOV		R6, #2
DELAYLOOP2:
MOV		R5, #10
DELAYLOOP3:
NOP
DJNZ	R5, DELAYLOOP3
DJNZ	R6, DELAYLOOP2
DJNZ	R7, DELAYLOOP1
RET

;码表-------------------------------------------------------------
ORG		1000H
DB		0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90
	
END

最后

以上就是执着篮球为你收集整理的51汇编(八):外部中断中断中断源中断寄存器中断地址外部中断的全部内容,希望文章能够帮你解决51汇编(八):外部中断中断中断源中断寄存器中断地址外部中断所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部