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

📄 uart0.asm

📁 这是一个有关C8051F020单片机的实验教学材料,相信对于单片机的研究人员会有很大的帮助.
💻 ASM
字号:
//-----------------------------------------------------------------------------
// 版权归新华龙电子公司所有
//-----------------------------------------------------------------------------
//
//文件名:	UART0.ASM
//
//编写人:	LC
//
//编写时间:2005/03/10
//
//目标器件: C8051F02x
//
//编译工具: Silicon Laboratories IDE
//
//程序说明:	此程序用UART0实现RS-232通信,运行前将TX0和P00 短接,RX0和
//			P01短接,当接收到一个数据后,再将接收到的数据送出。


$include (c8051f020.inc)			;SFR declarations
//-----------------------------------------------------------------------------
// Global CONSTANTS
//-----------------------------------------------------------------------------

BAUDRATE	EQU		9600            ;UART0的波特率
SYSCLK		EQU		11059200        ;系统时钟
BUZ			EQU		P3.5
ReceiveBit	EQU		20H.0			;接收标志位

	ORG		0
	LJMP	main
	ORG		23H
	AJMP	UART0_ISR
	ORG		0100H


;延时子程序
Delay:
    MOV   R7, #18h			
Delay1:
    MOV   R6, #80h
Delay0:
    MOV   R5, #00h
    DJNZ  R5, $
    DJNZ  R6, Delay0
    DJNZ  R7, Delay1
	RET
//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------
main:
	MOV		WDTCN,#0deH                 ;关看门狗
	MOV		WDTCN,#0adH
	CLR		ReceiveBit
	LCALL	SYSCLK_Init					;初始化外部晶体
	LCALL	PORT_Init					;初始化交叉开关和I/O口
	LCALL	UART0_Init					;初始化UART0
	SETB	EA
	SETB	ES
LOOP:
	JNB		ReceiveBit,LOOP				;是否接收到一个数据
	CLR		ES							;关串口中断0
	CLR		EA							;关总中断
	CLR		ReceiveBit					;清接收标志位
	LCALL	Delay						;延时
	MOV		A,R1
	MOV		SBUF0,A						;将接收到数据送出
TINT:
	JNB		TI,TINT						;发送标志位是否产生
	CLR		TI							;清发送标志位
	CLR		BUZ							;蜂鸣器响
	LCALL	Delay						;延时
	SETB	BUZ							;蜂鸣器灭
	SETB	ES							;开中断标志
	SETB	EA
	LJMP	LOOP
	RET

//-----------------------------------------------------------------------------
// SYSCLK_Init
//-----------------------------------------------------------------------------
;用外部晶体11.0592MHz作为系统时钟
SYSCLK_Init:
		MOV   OSCXCN, #67h            ;使能外部晶体
                                      
        CLR   A                       ;等待做少1ms 
        DJNZ  acc, $                  ;等待512us
        DJNZ  acc, $                  ;等待512us
osc_wait:                             ;查询XTLVLD-->1
        MOV   a, OSCXCN
        JNB   acc.7, osc_wait
        ORL   OSCICN, #08h            ;选择外部晶体作为系统时钟 
                                    
        RET

//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------
;初始化交叉开关和I/O口
PORT_Init:
	MOV		XBR0,#04H					;使能UART0
	MOV		XBR1,#00H
	MOV		XBR2,#40H					;使能交叉开关和弱上拉
	ORL		P0MDOUT,#01H				;使能TX0作为推挽输出
	ORL		P1MDOUT,#40H				;使能P1.6 (LED)作为推挽输出
	ORL		P3MDOUT,#0dfH
	RET


//-----------------------------------------------------------------------------
// UART0_Init
//-----------------------------------------------------------------------------
//
// Configure the UART0 using Timer1, for <baudrate> and 8-N-1.
//
UART0_Init:
	MOV		SCON0,#50H			;SCON0: 模式1, 8-bit UART, 使能RX
	MOV		TMOD,#20H			;TMOD: 定时器1, 模式2, 8-bit 重载
	MOV		TH1,#0B8H			;设置定时器1作为波特率的重载值
	SETB	TR1					;打开定时器1
	ORL		CKCON,#10H			;定时器1用系统时钟作为它的时基
	ORL		PCON,#80H			;SMOD00 = 1
	RET

;串口中断0子程序
UART0_ISR:
	JB		TI,SENDINT			;是发送中断还是接收中断
	CLR		RI 					;清接收标志位
	MOV		A,SBUF0
	MOV		R1,A				;保存接收到的数据
	SETB	ReceiveBit			;置接收标志
SENDINT:
 	CLR		TI					;清发送标志位
	RETI
	END

⌨️ 快捷键说明

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