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

📄 receive_data.asm

📁 这是一个基于AVR系列单片机的程序
💻 ASM
字号:
;文件名:	receive_data.asm
;功能:		测试串口中断
;开始日期:	2006-08-31
;完成日期:	2006_08-31



.INCLUDE	"m8def.inc"		;器件配置文件

;接收到的一个字节
.DEF		RECEIVE_BYTE		=	R18
;数据接收计数器
.DEF		RECEIVE_COUNTER		=	R17
;接收数据缓冲区
.EQU		RECEIVE_BUFFER		=	$000B

.DEF		RECEIVE_BYTE01		=	R11
.DEF		RECEIVE_BYTE02		=	R12
.DEF		RECEIVE_BYTE03		=	R13
.DEF		RECEIVE_BYTE04		=	R14


.CSEG
.ORG $0000
;中断向量表
	RJMP MAIN				;复位	
.ORG $000B
	RJMP RECEIVE_DATA		;串口接收


;*******************************************************************************
;主程序
;*******************************************************************************
.ORG $0020
MAIN:
	LDI 	R16,LOW(RAMEND)
	OUT		SPL,R16
	LDI		R16,HIGH(RAMEND)
	OUT		SPH,R16
	
	RCALL 	CPU_INIT
	RCALL	USART_INIT
MAIN02:
	SBIS	UCSRA,UDRE
	RJMP	MAIN02
	LDI		R16,$5A
	OUT		UDR,R16
MAIN01:
	RJMP 	MAIN01
	
			

;-------------------------------------------------------------------------------
;类别:宏
;名称:RECEIVE_CHECK
;功能:串口接收中断服务程序
;-------------------------------------------------------------------------------
.MACRO RECEIVE_CHECK
	NOP
	NOP
	NOP
	LDI	R20,$03
.ENDMACRO


;-------------------------------------------------------------------------------
;类别:普通子程序
;名称:USART_INIT:
;功能:对串口进行初始化
;-------------------------------------------------------------------------------
USART_INIT:
	;设定波特率为4800(8M时钟)
	LDI 	R16,$67
	OUT		UBRRL,R16
	LDI		R16,$00
	OUT		UBRRH,R16 
	;允许接收中断,允许接收,允许发送
	LDI		R16,(1<<RXCIE)|(1<<RXEN)|(1<<TXEN)
	OUT		UCSRB,r16
	;无奇偶校验、8位数据、一个停止位
	LDI		R16,(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
	OUT		UCSRC,R16
	RET

;-------------------------------------------------------------------------------
;类别:普通子程序
;名称:USART_INIT:
;功能:对串口进行初始化
;-------------------------------------------------------------------------------
CPU_INIT:
	NOP
	SEI
	RET



;-------------------------------------------------------------------------------
;类别:中断服务程序
;名称:RECEIVE_DATA
;功能:串口接收四个字节数据
;-------------------------------------------------------------------------------
RECEIVE_DATA:
	PUSH 	R16
	IN 		R16,SREG
	PUSH 	R16
	
	IN 		R16,UDR
	CPI		ZL,LOW(RECEIVE_BUFFER)+3
	BREQ	RECEIVE_DATA03
	;判断接收到的一个字节的最高位是否为1
	SBRS 	R16,7
	RJMP 	RECEIVE_DATA01
RECEIVE_DATA03:
	;接收到的数据的最高位为1的操作
	ST 		Z,RECEIVE_BYTE
	RECEIVE_CHECK		;对接收到的数据进行校验
	;初始化接收指针、接收计数器
	LDI		ZL,LOW(RECEIVE_BUFFER)
	LDI		ZH,HIGH(RECEIVE_BUFFER)
	LDI		RECEIVE_COUNTER,$04
	RJMP	RECEIVE_DATA02
RECEIVE_DATA01:
	;接收的数据的最高位为0的操作
	ST 		Z+,R16
RECEIVE_DATA02:
	POP 	R16
	OUT 	SREG,R16
	POP		R16
	RETI


⌨️ 快捷键说明

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