51单片机汇编学习例程(5)——USART串口篇

5.ASM5_USART:    串口发送0-9及换行,接收任意数据并显示

/**
******************************************************************************
* 	@file    	USART.asm
* 	@author  	Alex——小白
* 	@version 	V1.0
* 	@date    	2019.9.1
* 	@brief   	自动发送数据0-9和换行,接收的数据会打印该数据
*	@store   	有家Proteus仿真店子
*	@Link    	https://shop484534014.taobao.com/
*	@Email	 	[email protected]
******************************************************************************
* 	@attention	All Rights Reserved  
**/
	
		ORG 	0000H			;程序执行的起始地址		
		LJMP 	Main			;跳转到main函数	
		ORG 	0023H			;串口中断地址
		LJMP 	UARTInterrupt	;声明UART是中断4函数名称

		ORG     0100H			;程序跳转到0100H开始执行
	Main:
		MOV 	SP,#60H
		LCALL 	InitUART		;初始化串口参数
		MOV 	DPTR,#Num_Tab  	;DPTR指向数组
		MOV 	R0,#00H			;变量清零
	While:
		MOV		A,R0			;变量赋值
		MOVC	A,@A+DPTR		;读取数组数据
		LCALL 	SendOneByte		;串口打印数据
		LCALL	Delay			;延时1s
		INC		R0				;变量自加
		CJNE	R0,#0CH,Next	;判断是否为12,是清零,否则跳转
		MOV 	R0,#00H
	Next:		
		SJMP	While

	InitUART:
		MOV 	TMOD,#20H		;2400bps
		MOV 	SCON,#50H		;设置波特率重装值(256-12000000/12/32/2400)=243=F3
		MOV 	TH1,#0F3H		;赋初值
		MOV 	TL1,TH1
		MOV 	PCON,#00H
		SETB 	EA				;总中断开启
		SETB 	ES				;串口中断开启
		SETB 	TR1				;定时器1中断开启
		RET

	UARTInterrupt:
		PUSH 	ACC				;ACC值押栈,避免主循环使用冲突
		JB 		RI,Is_Receive	;判断是否在接收数据
		CLR 	TI				;否则清除发送标志位
		RETI
	Is_Receive:
		CLR 	RI				;清除接收标志位
		MOV 	A,SBUF			;将获取的数据储存到A
		LCALL 	SendOneByte		;接收数据,再发送出去
		POP 	ACC				;AC值释放
		RETI

	SendOneByte:
		CLR 	ES				;关闭串口中断
		CLR 	TI				;清除发送标志位
		MOV 	SBUF,A			;将数据A发送出去
	SendFinish:
		JNB 	TI,SendFinish	;判断是否发送完毕
		CLR 	TI				;是,则清除标志位
		SETB 	ES				;开启串口中断
		RET	

	Delay:						;t=t1*8=1s,修改R5的值即可更改时间(不精准)
		MOV		R5, #08H		;单周期,8次
	D1:							;t1=t2*250=500*250=125000
		MOV		R6, #0FAH		
	D2:						
		MOV		R7, #0FAH		;t2=250*2=500
	D3:		
		DJNZ	R7, D3			;R7=250自减,直到为0跳出循环,双周期
		DJNZ	R6, D2			;R6=250自减,直到为0跳出循环,双周期
		DJNZ	R5, D1			;R5=100自减,直到为0跳出循环,双周期
		RET
		
	Num_Tab: 					;0-9,0A0D换行
		DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,0AH,0DH	
	END


/*
		MOV		TMOD,#020H			;9600bps				
		MOV   	TL1,#0FDH           ;设置波特率重装值(256-11059200/12/32/9600)=253=FD
		MOV   	TH1,#0FDH
*/

如需其他代码,请联系QQ844545015

发布了14 篇原创文章 · 获赞 1 · 访问量 5005

猜你喜欢

转载自blog.csdn.net/Smile_shao/article/details/103724265
今日推荐