📄 uart.asm
字号:
/*
**********************************************************************************************
* Project: TK7821
* File: uart.asm
* Contents: The serial communication
* 程序描述:把收到的数据发送回去
* 硬 件:福华公司提供的51系列开发板
* 目 的:Motorola 08 系列 子程序移植到51系列MCU
* $Date: 09/13/2006
* Writen by xudong EMail:xudongjhdd@sohu.com
***********************************************************************************************
*/
;#include "SCIInit.ASM"
/*********************************************************************************************
*轮询方式
*主程序
***********************************************************************************************
*/
SerialBuff EQU 32H ;内存中接收或发送数据的地址
SerialCount EQU 01H ;传送的字节数
ORG 0000H
LJMP START
START:
ACALL SCIInit ;调用串行口初始化子程序
MAIN:
/*MOV A,#SerialCount
MOV R1,#SerialBuff
ACALL SCIReN
RET_ReN:
JC MAIN
MOV A,#SerialCount
MOV R1,#SerialBuff
ACALL SCISendN
*/
ACALL SCIRe1
JC MAIN
ACALL SCISend1
;mov p3,#0xa4
AJMP MAIN
/*
********************************************************
*SCIInit:串行口初始化子程序----------------------------*
*功 能:对串行口进行初始化,允许SCI,正常码输出,10位数据, *
* 无校验等,允许发送器允许接收器。查询方式收发, *
* 波特率为4800 *
*入 口:无 *
*出 口:无 *
********************************************************
*/
SCIInit:
ANL TMOD,#0FH
ORL TMOD,#20H ;定时器1 定时方式2
MOV TH1,#0F8H
MOV TL1,#0F8H ;4800 15MHz fosc
MOV SCON,#50H ;串行方式1 允许接收
MOV PCON,#00H
SETB TR1 ;启动定时器1
RET
/*
********************************************************
;SCISend1:串行发送A中的1个字节-------------------------*
;功能描述:串行口发送A中的1个字节数据 *
;入 口:A=待发送的数据 *
;出 口:无 *
; *
********************************************************
*/
SCISend1: MOV SBUF,A ;待发送的数据放到发送缓冲中
JNB TI, $ ;判断TI位是否为1,是1就清0
CLR TI ;TI清0
RET
/*
********************************************************
*SCISendN:串行发送N个字节------------------------------*
*功能描述:串行发送以R1为首地址的N个字节数据 *
*入 口:A=字节个数 R1=首地址 *
*出 口:无 *
*
********************************************************
*/
SCISendN:
JZ SCISendN_EXIT ;A中数据为0转
SCISendN_1:
PUSH ACC
MOV A,@R1 ;从存储器中取出待发送的数据
ACALL SCISend1
INC R1 ;R1加1(待发送下一单元的数据)
POP ACC
DEC A ;字节个数减1
JNZ SCISendN_1 ;A中数据不等于0转
SCISendN_EXIT:
RET ;子程序返回
/*
********************************************************
*SCIRe1:串行接收一个字节->A----------------------------*
*功能描述:(1) 串行接收1个字节的数据放在A中 *
* (2) 约655350时钟周期内收不到数返回 *
* *
*入 口:无 *
*出 口:A=接收的数据 C=是否收到数据标志 0收到 1未收到*
* *
********************************************************
*/
SCIRe1:
;等待接收一个字节数据
MOV R2,#0FFH ;R2,R3拼成一个16位的寄存器使用(用双重循环实现)
MOV R3,#0FFH ;R2,R3放入循环次数(R3相当于高8位,R2相当于低8位)
SCIRe1_1:
JNB RI,LOOP2 ;RI为0转(代表没有可接收数据)
;JNB RI,$
MOV A,SBUF ;收到的数据放入A中
CLR RI ;RI清0
CLR C ;C 清0代表收到数据
AJMP SCIRe1_3 ;收到数据,退出
LOOP1: ;相当于C语言中第二层循环
CJNE R3,#00H,R2_R3_OPER ;R3不为0转
SETB C ;C置1
;MOV A,#0FFH ;等待时间到,未收到数据,令c=1,A=FF,返回
AJMP SCIRe1_3 ;未收到数据,C置1并退出
R2_R3_OPER:
MOV R2,#0FFH ;R2置0FFH进入下一轮循环
DEC R3 ;R3减1
AJMP SCIRe1_1 ;跳转继续执行判断RI是否为1(是否有可接收数据)
LOOP2: ;相当于C语言中第一层循环
DEC R2 ;R2减1
CJNE R2,#00H,SCIRe1_1 ;R2不为0转SCIRe1_1处
AJMP LOOP1 ;R2为0转LOOP1处
SCIRe1_3:
RET
/*
********************************************************
*SCIReN:串行接收N个字节--------------------------------*
*功能描述:串行接收N个字节放在以R1为首地址的内存中 *
*入 口:A=待接收数据的字节数N,R1=接收数据存放的首地址*
*出 口:C=是否收到数据标志 0收到 1未收到 *
*内部调用:SCIRe1 *
********************************************************
*/
SCIReN:
JZ SCIReN_EXIT ;A中数据为0转
SCIReN_1:
PUSH ACC
ACALL SCIRe1 ;调用接收1个字节的子程序
JB CY,SCIReN_EXIT ;C=1未收到数据,退出
MOV @R1,A ;收到数据,放入内存
INC R1 ;R1+1->R1
POP ACC
DEC A ;A中数据减1
JNZ SCIReN_1 ;A中数据不为0转
SCIReN_EXIT:
; AJMP RET_ReN
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;未调用SCIRe1子程序的SCIReN
SCIReNN:
JZ SCIReNN_EXIT
SCIReN_11:
MOV R0,#0FFH
NOP
;JNB RI,$
JNB RI,SCIReN_22
MOV @R1,SBUF
CLR RI
NOP
CLR CY
INC R1
DEC A
NOP
JNZ SCIReN_11
AJMP SCIReNN_EXIT
SCIReN_22:
NOP
DEC R0
CJNE R0,#00H,SCIReN_11
SETB CY
SCIReNN_EXIT:
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -