⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 exandtimerint.asm

📁 十五个关于AT89S51的源代码
💻 ASM
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;实例十五:外部中断与Timer中断同时存在实验  external and timer interrupts  (《51单片机应用从零开始》 11.5小节实例)
;
;现象:当外部中断模拟开关INT1(模拟外部中断INT1)向系统产生外部中断(边沿触发),单片机将优先服务外部中断1--闪烁5次
;,从而打断用于流水灯的延时控制的Timer 0中断
;
;作者:杨欣,刘长焕,张延强  电路飞翔网    eedesign@163.com
;
;				http://www.circuitfly.com
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


			ORG		00H				; 起始地址00H
			JMP		MAIN				; 跳转到MAIN
			ORG		0BH				; Timer 0中断向量地址
			JMP		TIM0				; 跳转到TIM0
			ORG		13H				; 外部中断1向量地址
			JMP		EXT1				; 跳转到EXT1

			; 这里是主程序段,使能中断、中断优先级、装载计数初始值等
	MAIN:
			MOV		IE, #86H			; 使能Timer 0中断和外部中断1
			SETB		TCON.2				; 设置 中断的边沿触发方式          
		        MOV		IP, #04H			; 设置外部中断1优先级较高                 
			MOV		TMOD, #01H			; 使用Timer 0工作在模式1下
			MOV		TH0, #0D8H			; 装载计数初始值,10000?s延时
			MOV		TL0, #0F0H			; 
			MOV		R1, #100			; Timer 0中断次数为100次,即延时1秒
			MOV		R2, #0FEH			; 流水灯初始值
			SETB		TR0				; 启动Timer 0
	LOOP:
									; 这里可放置主程序的执行功能
			JMP		LOOP				; 循环

			; 这里是Timer 0中断服务子程序
	TIM0:	
			MOV		TH0, #0D8H			; 重新装载计数初始值
			MOV		TL0, #0F0H			; 
			DJNZ		R1, WAIT_SEC			; 如果中断没到100次,则跳到WAIT_SEC返回
			MOV		R1, #100			; 如果到达100次,重新设置中断次数为100次
			MOV		A, R2				; 流水灯初始值载入ACC
			MOV		P1, A				; 从P0口输出显示
			RL		A				; 向左流动一位
			MOV		R2, A				; 将流水灯值保存在R2中
	WAIT_SEC:
			RETI						; 返回主程序

			; 这里是外部中断1服务子程序
	EXT1:
			MOV		A, #00H				; ACC=00H
			MOV		R3, #10				; 亮+灭共10次
	FLASH:
			MOV		P1, A				; P0=00H,全亮
			CALL		DELAY				; 调延时子程序
			CPL		A				; ACC反相
			DJNZ		R3, FLASH			; 如果R3=0,闪烁完成,否则循环
			RETI						; 返回主程序

	DELAY:		MOV		R4, #20				; 延时200ms子程序
	D1:		MOV		R5, #20
	D2:		MOV		R6, #248
			DJNZ		R6, $
			DJNZ		R5, D2
			DJNZ		R4, D1
			RET
	
			END						; 程序结束

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -