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

📄 t0.asm

📁 压缩包中包括多个常用的汇编
💻 ASM
字号:
/****************************************************************************/
/*                                                                          */
/*                Copyright (c) 2005, 老树工作室                            */
/*                     All rights reserved.                                 */
/*                                                                          */
/*      Email:laoshu0902@163.com                                            */
/*      www.laoshu0902.bokee.com                                            */
/*                                                                          */
/****************************************************************************/
;+============================================================================+
;|  8051 伪指令定义                                          		      |
;+============================================================================+

	WDI     EQU     085H	;定义看门狗的清除标志
	T0_Stat EQU	00H	;定义外部中断数量到时的标志
;+============================================================================+
;|  8051 中断处理程序入口                                    		      |
;+============================================================================+

	ORG     0000H		;程序开始
	LJMP    main		;跳转主程序

	ORG	0003H		;外部中断int0的中断入口地址
	LJMP	EI0_ISR		;跳转定时器INT0中断服务子程序
				;通常子程序的长度要大于2个中断之间的空间
				;所以放到子程序中执行

	ORG     000BH		;定时器t0的中断入口地址
	LJMP    T0INT		;跳转定时器0中断服务子程序

	ORG	0013H		;外部中断int1的中断入口地址
	LJMP	EI1_ISR		;跳转定时器INT1中断服务子程序

	
	ORG	0023H
	LJMP    INTERS		;跳转串口中断服务子程序

;+============================================================================+
;|  8051 主程序                                                               |
;+============================================================================+


        ORG     100H		;主程序从地址100H开始执行
				;是为了避开以上这些中断
				;当然程序可以从30H开始
				;从这个地址开始主要是为了HEX文件的好阅读
				;阅读HEX文件,使用ultraedit的最新中文版本

;+============================================================================+
;|  8051 定时器、外部中断、串口配置                                           |
;+============================================================================+

main:   MOV     SP,#70H		;设置堆栈,以下是单片机初始化
        MOV     TMOD,#21H	;设置定时器1和串行接口参数9600波特率,时钟11.0592MHz
        MOV     TL1,#0FDH	;定时器1参数的设置
        MOV     TH1,#0FDH
        SETB    TR1		;启动定时器1中断
        MOV     SCON,#50H	;启动串口控制寄存器
        SETB 	ES		;启动串口中断
        SETB    ET0		;启动定时器t0中断
        CLR	IT0		;选择外部中断0为低电平触发
        CLR	IT1		;选择外部中断1为低电平触发
	SETB	EX0		;启动外部中断0
;	SETB	EX1		;启动外部中断1
        MOV     TH0,#0B1H	;设置定时器0参数,定时器0的中断周期大约为2ms	
        MOV     TL0,#0E0H
        CLR     RS0		;设置寄存器区基本参数
        CLR     RS1
        SETB    TR0		;启动定时器0中断
        SETB    IP.4		;设置中断优先级,串口中断为最高
        CLR     IP.1		;设置定时器0优先级,低于串口中断	
	SETB    EA		;启动全部中断
	SETB	T0_Stat
	MOV	A,#01		;初始化A,为输出到P1做准备
	MOV	R0,#250		;重新装数250

        MOV	A,#11111110B	;对A初始化,准备把A的数字送到P1

;+============================================================================+
;|  8051 主流程                                            		           		   |
;+============================================================================+

L01:    MOV     P1,A
        CPL	WDI		;对看门狗取反
	JB 	T0_Stat ,L01	;判断EIO_STAT是否为0,如果为0,表示1s的定时时间到,进入移位操作,否则返回循环
L02:	MOV	P1,A
	RL	A
	MOV	R0,#25		;重新装数250
	SETB	T0_Stat   	;重新设置定时器中断满标志位
	SJMP	L01		

;+============================================================================+
;|  定时器0中断服务子程序                                      		      |
;+============================================================================+
T0INT:  ;CPL	P1.0		;对P1.0取反,设置定时器中断到的标志,在示波器上可以看到方波
	MOV     TH0,#0B1H	;重新设置定时器0定时参数
        MOV     TL0,#0E0H
        DJNZ	R0,L03
	CLR	T0_Stat		;定时器0中断满250次了吗?满了则清标志位
L03:	SETB    ET0		;允许定时器0中断
        SETB    TR0		;启动定时器0
        RETI			;中断服务子程序返回,RETI是中断子程序返回的命令代码,与RET子程序不同

;+============================================================================+
;|  串口接收中断服务子程序                                     		      |
;+============================================================================+

INTERS:	CLR     ES		;禁止串行中断
	JBC     RI,RECINT	;判断接收标志为有接收数据吗?有则将接收标志置0,准备接收下一条数据,跳转到接收程序
	SETB	ES		;允许串口中断
        RETI			;如果接收标志为没有数据,则中断返回

RECINT:	MOV 	A,SBUF		;发送数据
	INC	ACC		;将接收的数加1
	LCALL 	SENT		;将数发出,回应收到的数
	CPL	p1.1		;做可以看到接收到数据的标志			
	SETB	ES		;允许串口中断
	RETI

;+============================================================================+
;|  外部中断0服务子程序                                     		      |
;+============================================================================+

EI0_ISR:CLR	EX0		;禁止外部中断0
	CPL 	P1.2
	LCALL	DLY4MS		;延时
	SETB	EX0		;启动外部中断0
	RETI

;+============================================================================+
;|  外部中断1服务子程序                                     		      |
;+============================================================================+
EI1_ISR:CLR	EX1		;禁止外部中断1
	CPL 	P1.3
	LCALL	DLY4MS		;延时消抖动
	SETB	EX1		;启动外部中断1
	RETI

;+============================================================================+
;|  串口发送数据子程序                                         		      |
;+============================================================================+

SENT:   MOV     SBUF,A		;发送数据
W1:     JBC     TI,CON1	;判断发送成功吗? (TI=1?),成功了则清楚除TI	
        SJMP    W1		;没有发送成功则继续判断
CON1:   CPL	P1.4		;发送一个数据,就对P1.4取反操作
	CPL     WDI		;发送数据成功,对看门狗取反操作
        RET			;子程序返回

;+============================================================================+
;|  延时子程序        	                                 		      |
;+============================================================================+

DLY4MS: MOV     R6,#1FH
DLAY1:  MOV     R7,#0FFH
SDY:    NOP
        DJNZ    R7,SDY
        DJNZ    R6,DLAY1
        RET
        END

⌨️ 快捷键说明

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