📄 uart0.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 + -