续上一篇文章在0-99自动计数中再加入程序复位功能(汇编语言,proteus,AT89C51中断的使用)

  • Post author:
  • Post category:其他


1.电路原理图(Proteus仿真)

2.中断按钮

之前的电路采用复位电路用于是实现复位功能,现在在原来的电路原理图中新增了一颗按钮BUTTON-2用于编程实现复位功能

按钮BUTTON-2采用中断方式实现复位,其与 外部中断0(P3.2接口)引脚接通

按钮BUTTON-1采用中断方式实现0-99计数器的开始与暂停

3.复位按钮思想

(1) 如何在自动计数期间用查询实现复位

此效果为复位后重新计数不会和复位电路一样暂停计数

因为0-99自动计数的主程序放在了中断程序(外部中断1)里面,所以想要在自动计数时实现复位可以采用查询中断标志位的方式实现如下图:

LOP:		  ;自动计数主程序
	MOV A,R4	 ;用减法判断个位计数是否满9 
	SUBB A,#09H
………………

TIME:	
	JB IE0,CLRS	  ;判断中断0标志位用于复位

………………

CLRS:			   ;计数器未暂停时的复位程序
	MOV R4,#00	   ;个位计数器清零
	MOV R3,#00	   ;十位计数器清零
	CLR IE0		   ;中断0标志位释放
	MOV P0,#3FH	   ;十位晶体管初始化
	LJMP LOP

………………

JB IE0  判断外部中断0是否发出中断请求(置1), 是则执行CLRS清零否则继续计数

之所以采用查询方式其一是因为计数程序本身在中断程序内,不会响应同级中断,要使用中断嵌套中断就只能修改中断优先级,难度较大。其二:不采用查询接布尔值方式,是因为其响应不灵敏,采用查询中断标志位响应速度快

(2) 如何在暂停计数时实现复位

主程序在暂停计数后会跳出中断继续等待中断指令

此时上阶段的中断已经结束,可以使用中断方式实现暂停时的复位功能, 基本就结构如下:

………………
	
ORG 0003H	;中断方式0起始地址
	LJMP INT_0

………………

INT_0:	;在自动计数器暂停时实现复位的中断程序
	MOV R4,#00 ;计数器清零
	MOV R3,#00
	MOV P0,#3FH	 ;数码管初始化
	MOV P2,#3FH
RETI			 ;中断返回

4.汇编语言代码及注释

	ORG 0000H	
	LJMP MAIN
	ORG 0003H	;中断方式0起始地址
	LJMP INT_0
	ORG 0013H	;中断方式1起始地址
	LJMP INT_1 
	ORG 0100H	
MAIN:	
	MOV DPTR,#TAP  ;赋值DPTR查表首地址
	MOV P0,#03FH	   ;数码管初始化
	MOV P2,#03FH	   ;数码管初始化
	MOV R4,#00H	   ;计数初始化
	MOV R3,#00H	   ;计数初始化
	MOV R1,#200	   ;计时器初始化
	SETB IT1	 ;开中断1
	SETB EA		 ;开总中断
	SETB EX1	 ;设置中断0触发方式
	SETB IT0	 ;开中断0
	SETB EX0	 ;设置中断0触发方式
	MOV SP,#60H	  ;堆栈初始化
	SJMP $	  	;等待中断
INT_1:			  ;中断主程序
	CLR IE1	  ;清楚中断INT_1标志位为暂停计数做准备
LOP:		  ;自动计数主程序
	MOV A,R4	 ;用减法判断个位计数是否满9 
	SUBB A,#09H	  
	JZ LOOP		 ;个位计数满9跳转清零程序
	MOV A,R4  ;个位查表赋值
	MOVC A,@A+DPTR
	MOV P2,A  ;个位数码管赋值
	INC R4	  ;个位计数+1
TIME:	
	JB IE0,CLRS	  ;判断中断0标志位用于复位
	JB IE1,LMP	  ;判断中断1标志位用于暂停计数
    MOV R2,#250	  ;延时程序0.3S左右
    DJNZ R2,$
    MOV R2,#250
    DJNZ R2,$
    DJNZ R1,TIME 

	LJMP LUP	  ;跳转LUP	  
LOOP:
	MOV R4,#00H	  ;个位计数器清零	   				   
	INC R3		  ;十位计数器+1	  
	MOV A,R3	  ;用减法判断十位计数是否满10	  
	SUBB A,#0AH
	JZ LUU		  ;满10跳转请零程序	 	  
	MOV A,R3	  ;否则查表赋值十位数码管
	MOVC A,@A+DPTR
	MOV P0,A
	LJMP LUP	  ;跳转LUP
LUU:
	MOV R3,#00H	   ;十位计数器清零	  
	MOV A,R3	   ;重新查表赋值十位数码管
	MOVC A,@A+DPTR
	MOV P0,A
	SJMP LUP		 			
LUP:
	LJMP LOP	   ;跳转主程序继续计数
CLRS:			   ;计数器未暂停时的复位程序
	MOV R4,#00	   ;个位计数器清零
	MOV R3,#00	   ;十位计数器清零
	CLR IE0		   ;中断0标志位释放
	MOV P0,#3FH	   ;十位晶体管初始化
	LJMP LOP
LMP:
	CLR IE1		   
	NOP
RETI
INT_0:	;在自动计数器暂停时实现复位的中断程序
	MOV R4,#00 ;计数器清零
	MOV R3,#00
	MOV P0,#3FH	 ;数码管初始化
	MOV P2,#3FH
RETI			 ;中断返回
	TAP:DB	3FH,6H,5BH,4FH,66H,6DH,7DH,7H,7FH,6FH;晶体管编码表
END



版权声明:本文为weixin_63132747原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。