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

📄 rs485.asm

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

$include (c8051f020.inc)                 // SFR declarations

//-----------------------------------------------------------------------------
// Global CONSTANTS
//-----------------------------------------------------------------------------

SYSCLK		EQU		11059200          // SYSCLK frequency in Hz
BAUDRATE	EQU     9600              // Baud rate of UART in bps
BUZ			EQU		P3.5
P32			EQU		P3.2			;接收/发送控制
ReceiveBit	EQU		20H.0


	ORG		0
	AJMP	main
	ORG		0A3H
	AJMP	UART1_ISR
	ORG		0100H


;延时子程序
Delay:
    MOV   R7, #08h			
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	UART1_Init				;初始化UART0
	SETB	EA 						;使能总中断标志
	ORL		EIE2,#40H				;使能UART1中断
	CLR		P32						;接收模式
LOOP:
	JNB		ReceiveBit,LOOP			;接收到一个数据
	ANL		EIE2,#0bfH				;无效UART1中断
	CLR		EA						;关总中断
	CLR		ReceiveBit				;清接收位
	SETB	P32						;发送模式
	LCALL	Delay					;延时
	MOV		SBUF1,R1
TINT:
	MOV		A,SCON1
	ANL		A,#02H
	CJNE	A,#02H,TINT				;送中断模式是否产生
	MOV		A,SCON1
	ANL		A,#0FDH
	MOV		SCON1,A					;清发送中断标志
	LCALL	Delay					;延时
	CLR		P32
	CLR		BUZ						;蜂鸣器响
	LCALL	Delay
	LCALL	Delay
	LCALL	Delay
	SETB	BUZ						;蜂鸣器灭
	ORL		EIE2,#40H				;使能UART1中断
	SETB	EA
	NOP
	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:
	ORL		XBR2,#44H					;使能UART1,交叉开关和弱上拉 
										
	ORL		P0MDOUT,#01H				;使能TX1作为推挽输出
	ORL		P1MDOUT,#40H				;使能LED作为推挽输出
	ORL		P3MDOUT,#0dfH
	RET

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

;UART1的中断服务子程序
UART1_ISR:
	MOV		A,SCON1
	ANL		A,#01H
	CJNE	A,#01H,U_I
	ANL		SCON1,#NOT(01H)				;请接收标志位
	MOV		A,SBUF1;					;保存接收数据
	MOV		R1,A
	SETB	ReceiveBit					;置接收位
U_I:
	ANL		SCON1,#NOT(02H)			;清发送标志位
	RETI
	END

⌨️ 快捷键说明

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