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

📄 main.asm

📁 周立功单片机上的源程序
💻 ASM
字号:
;*************************************************************************
;	main.asm
;	串行口通信方式3例程
;*************************************************************************


;*************************************************************************
;定义全局变量
;*************************************************************************
SIZE	EQU	40		;定义接收缓冲区大小
UartBuf	DATA	0x30		;定时接收缓冲区
BufP1	DATA	0x30+SIZE	;定义接收缓冲区下标变量
BufP2	DATA	0x30+SIZE+1
_TI_	BIT	0x20.0		;定义发送辅助标志


;*************************************************************************
;复位入口
;*************************************************************************
	ORG	0x0000
	LJMP	PreMain


;*************************************************************************
;串行口中断入口
;*************************************************************************
	ORG	0x0023
	LJMP	UartINTSVC


;*************************************************************************
;进入主程序之前的初始化
;*************************************************************************
PreMain:
	MOV	SP, #(0x2F+SIZE+2)	;设置堆栈起始位置
	LJMP	main


;*************************************************************************
;函数:void UartInit()
;功能:串行口初始化
;*************************************************************************
UartInit:
	PUSH	0x02
	CLR	EA
	CLR	A
	MOV	BufP1, A
	MOV	BufP2, A
	MOV	R2, A
	MOV	R0, #UartBuf
UartInit_for:
	MOV	@R0, A
	INC	R0
	INC	R2
	CJNE	R2, #SIZE, UartInit_for
	CLR	TR1
	SETB	RXD
	SETB	TXD
	SETB	_TI_
	MOV	SCON, #0xD0	;串行口方式3(9位Uart),允许接收
	ORL	PCON, #0x80	;波特率加倍
	ANL	TMOD, #0x0F
	ORL	TMOD, #0x20	;设置T1为8位自动重装定时器
	MOV	A, #0xFA
	MOV	TH1, A
	MOV	TL1, A		;设置波特率为9600
	SETB	TR1		;启动定时器T1
	SETB	ES		;使能串行口中断
	SETB	EA
	POP	0x02
	RET


;*************************************************************************
;函数:void UartINTSVC() interrupt 4
;功能:串行口中断服务函数
;*************************************************************************
UartINTSVC:
	;保护寄存器
	PUSH	ACC
	PUSH	PSW
	PUSH	0x00
	PUSH	0x02
	;处理接收中断
	JNB	RI, UartINTSVC_TI
	MOV	R2, SBUF
	CLR	RI
	MOV	A, R2		;开始判断校验位
	MOV	C, P
	JNB	RB8, UartINTSVC_next
	CPL	C
UartINTSVC_next:
	JC	UartINTSVC_TI
	MOV	A, #UartBuf	;校验通过,保存数据
	ADD	A, BufP1
	INC	BufP1
	MOV	R0, A
	MOV	A, R2
	MOV	@R0, A
	MOV	A, BufP1
	CLR	C
	SUBB	A, #SIZE
	JC	UartINTSVC_TI
	MOV	BufP1, #0
	;处理发送中断
UartINTSVC_TI:
	JNB	TI, UartINTSVC_end
	CLR	TI
	SETB	_TI_
	;恢复寄存器
UartINTSVC_end:
	POP	0x02
	POP	0x00
	POP	PSW
	POP	ACC
	;中断返回
	RETI


;*************************************************************************
;函数:void UartSendChar(unsigned char c)
;功能:通过串行口发送单个字节
;参数:
;	c:被发送的字节数据,取值0x00~0xFF
;*************************************************************************
;c = R7
UartSendChar:
	JNB	_TI_, $
	CLR	_TI_
	MOV	A, R7
	MOV	C, P
	MOV	TB8, C
	MOV	SBUF, A
	RET


;*************************************************************************
;函数:void main()
;功能:主函数
;*************************************************************************
main:
;	UartInit();
	LCALL	UartInit
;	for (;;)
main_for:
;	{
;		if ( BufP2 != BufP1 )
		MOV	A, BufP2
		XRL	A, BufP1
		JZ	main_endif
;		{
;			UartSendChar(UartBuf[BufP2++]);
			MOV	A, #UartBuf
			ADD	A, BufP2
			INC	BufP2
			MOV	R0, A
			MOV	A, @R0
			MOV	R7, A
			LCALL	UartSendChar
;			if ( BufP2 >= SIZE )
			MOV	A, BufP2
			CLR	C
			SUBB	A, #SIZE
			JC	main_endif
;			{
;				BufP2 = 0;
				MOV	BufP2, #0
;			}
;		}
main_endif:
;	}
	SJMP	main_for


;*************************************************************************
;程序结束
;*************************************************************************
	END

⌨️ 快捷键说明

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