📄 uart0rf.asm
字号:
;UART0RF.ASM ;C8051F UART0 方式0 发送、接收实验
$include (c8051f020.inc) ; SFR declaration
MTD EQU 40H ;设接收缓冲首地址为40H
MRD EQU 40H ;设发送缓冲首地址为40H
ORG 0
AJMP MAIN
ORG 100H
MAIN:
MOV WDTCN, #0DEh ;关看门狗定时器
MOV WDTCN, #0ADh
LCALL UARTINT
SETB P1.2 ;P1.2=1,实验电路处于接收串行数据输入的状态
MOV R2,#2 ;R2,连续传送两个字节
CLR P1.1 ;置数,将16位并口状态数据置入74LS165內的寄存器
SETB P1.1
LCALL VUARTNI ;归一化子程序,读入74LS165发来的串行数据,并存入40H,41H中去
CLR P1.2 ;P1.2=0,实验电路处于串行数据输出的状态
ACALL DELAY
CLR P1.0 ;清除74LS164的输出口
SETB P1.0
MOV R2,#2 ;R=2,连续传送两个字节
LCALL VUARTNO ;归一化子程序,将40H,41H內的数据从串行发送到74LS164去
AJMP MAIN
;UART方式0状态下,发送N个字节的归一化子程序。
VUARTNO:MOV R0,#MTD ;送缓冲区首地址入R0
MOV SCON0,#0 ;UART方式0设定
SOUT:MOV A,@R0 ;发送数据入A中
CLR TI ;发送标志清零
MOV SBUF0,A ;启动发送
WAIO:JNB TI,WAIO ;发送等待
INC R0 ;指向下一个发送数据的地址
DJNZ R2,SOUT ;N个数据发送完否?未完转SOUT
RET ;N个数据发送完,子程序结束
;UART方式0状态下,接收N个字节的归一化子程序
VUARTNI:MOV R0,#MRD ;送缓冲区首地址入R0
SIN: CLR RI ;清除接收结束标志
MOV SCON0,#10H ;UART方式0设定,启动REN=1
WAI: JNB RI,WAI ;接收等待,接收完一帧,数据入SBUF中
MOV A,SBUF0 ;接收到的数据从A转入接收缓冲区中
MOV @R0,A;
INC R0 ;指向下一个接收数据的地址
DJNZ R2,SIN; ;N个数据接收完否? 未完转SIN
RET ;N个数据接收完,子程序结束。
DELAY:MOV R7,#10H ;延时子程序
DY:MOV R6,#0FFH
DJNZ R6,$
DJNZ R7,DY
RET
UARTINT: MOV XBR0,#04 ;选择TX0、RX0连到P0.0,P0.1两个引脚
MOV XBR2,#40H ;允许功能选择开关
MOV P0MDOUT, #01 ;选择P0.0为推拉方式,P0.1为漏极开路
MOV P1MDOUT ,#7H ;选择P1.0,P1.1.P1.2为推拉方式
MOV OSCXCN,#67H ;选择片外晶振频率(11.0592MHZ)
WAIT: MOV A, OSCXCN
JNB ACC.7,WAIT ;等待外部晶体振荡器稳定
MOV OSCICN,#08 ;选择外部晶体振荡器,关闭内部振荡器
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -