📄 uartttt.asm
字号:
K1 EQU P1.4 ; 按键端口
KEY_S EQU 50H ; 当前的按键状态
KEY_V EQU 51H ; 上次的按键状态
T2CON EQU 0C8H ;定义T2控制寄存器地址
RCAP2H EQU 0CBH ;定义T2捕获寄存器高位地址
RCAP2L EQU 0CAH ;定义T2捕获寄存器低位地址
;TR2 EQU 0CAH ;定义T2启动位地址
TR2 EQU 0C8H.2
ORG 0000H
LJMP MAIN
MAIN:
;ORL T2CON, #00110000B ;设定T2工作于波特率发生器方式,设定为定时方式,启动位在后面设定
;MOV RCAP2H, 0FFH ;设定捕获寄存器初值,在11。0592M时,9600bps方式下的
;MOV RCAP2L, 0DCH ;初值
;;SETB TR2 ;启动定时器2
;ORL T2CON, #00000100B
MOV TMOD,#20H ; 定时器1工作于8位自动重载模式,用于产生波特率
MOV TH1,#0FDH
MOV TL1,#0FDH ; 波特率9600
MOV SCON,#50H ; 设定串行口工作方式
;ANL PCON,#0EFH ; 波特率不倍增
ANL PCON,#01111111B
;ORL PCON,#10000000B
SETB TR1 ; 启动定时器1
MOV IE,#0 ; 禁止任何中断
MOV KEY_V,#01H ;
;==================================================
;串口中断服务程序-【接收部分,发送部分采用循环子程序】
ORG 0023H
LJMP sub_UART_Interrupt ;转串口中断服务程序段
;-------------------------------------------------
;UART变量定义
b_Receive_OK EQU 24H.0
b_Send_OK EQU 24H.1
B_Receive_Number EQU 5FH
B_Send_Number EQU 5EH
B_MultiMen EQU 57H
;--------------------------------------------------
sub_UART_Interrupt: ;串口中断服务程序
JB RI, sub_UART_Receive ;判断是接收中断,转接收中断子程序
CLR TI ;清空发送中断标志,发送不使用中断方式,采用查询方式
RETI ;中断程序返回
sub_UART_Receive: ;串口接收子程序
CLR RI ;清空接收中断标志
PUSH ACC ;ACC进栈保护
CLR RS1 ;设置工作寄存器为1组
SETB RS0 ;续上
CJNE R0, #00H, lbl_No_Init_R0
MOV R0, #5FH ;R0 等于0,初始化
MOV B_Receive_Number, #00H ;同上
lbl_No_Init_R0:
JNB b_Receive_OK, lbl_No_OK ;接收好标志为0,不清寄存器,继续接收字串
MOV R0, #5FH ;接收好标志为1,清寄存器,从头开始放字串
MOV B_Receive_Number, #00H ;清接收字符数寄存器
lbl_No_OK:
INC R0 ;R0指向下一个存放地址
INC B_Receive_Number ;接收字数加1
MOV A, SBUF ;取接收到的字节
MOV @R0, A ;保存接收到的字符
CJNE A, #0DH, lbl_NoCR_Char ;判断是否接收到的是回车字符
SETB b_Receive_OK ;收到回车字符,字串接收结束
AJMP lbl_Receive_Exit ;跳转到结束部分,退出
lbl_NoCR_Char:
MOV R7, B_Receive_Number ;已接收字符数送R7,进行判断
CJNE R7, #10H, lbl_Receive_Exit ;判断接收到的字符数是否达到16个,不达到直接结束,继续等待
SETB b_Receive_OK ;收到16个字符,字串接收结束
AJMP lbl_Receive_Exit ;跳转到结束部分,退出
lbl_Receive_Exit:
CLR RS0 ;恢复工作寄存器为0组
POP ACC ;ACC出栈
RETI ;中断程序返回
;------------------------------------------------
;================================================
sub_UART_Send_String:
; 功 能:通过串口发送一个字符串。注意在字符串的结尾处留一个字节放#00H,作为结束的依据
; 传入参数: DPTR(要发送的字串首地址)
; 返 回 值: 无
;MOV DPTR,#XXXXH ;字串表格地址,在调用此子程序前输入
lbl_Send_String:
CLR ES ;禁止串口中断, 目的是禁止串口中断服务程序启动,减少CPU工作
CLR TI ;清标志TI
CLR A ;清空ACC
MOVC A,@A+DPTR ;获得字符值
JZ lbl_Send_Exit ;查到00H时,表示字串结束
ACALL sub_UART_Send_Char
INC DPTR ;指向下一字符
SJMP lbl_Send_String
lbl_Send_Exit:
SETB ES ;允许串口中断
RET
;------------------------------------------------
;================================================
sub_UART_Send_Char:
; 功 能:通过串口发送一个字符
; 传入参数: ACC(要发送的数)
; 返 回 值: 无
MOV SBUF, A ;发送数据
;JNB TI,$ ;等待数据传送完毕
lbl_Wait_Send_Finish:
JNB TI,lbl_Wait_Send_Finish
CLR TI ;清除数据传送完毕标志
RET ;子程序返回
;-------------------------------------------------
;====================================
MAIN_RX:
JNB RI,MAIN_KEY ; 是否有数据到来
CLR RI
MOV A,SBUF ; 暂存接收到的数据
MOV P0,A ; 数据传送到P0口
LCALL SEND_CHAR ; 回传接收到的数据
MAIN_KEY:
LCALL SCAN_KEY ; 扫描按键
JZ MAIN_RX
LCALL DELAY_15MS ; 延时去抖动
LCALL SCAN_KEY
JZ MAIN_RX
MOV KEY_V,KEY_S ; 保存键值
LCALL PROC_KEY ; 键处理
SJMP MAIN_RX
;===============================================================================
SCAN_KEY:
; 扫描按键, (在此实例中仅扫描按键K1)
; 传入参数: 无
; 返回值: 无
CLR A
MOV C,K1
MOV ACC.0, C
MOV KEY_S,A
XRL A,KEY_V ; 检查按键状态是否改变
RET
;===============================================================================
PROC_KEY:
; 按键处理子程序 --- 发送字符串到PC
; 传入参数: KEY_V --- 按键值
; 返回值: 无
JB K1,END_PROC_KEY ; K1未按下时,直接返回
MOV DPTR,#TAB_WWW ; 字串表格地址
SEND_STRING:
CLR A
MOVC A,@A+DPTR
JZ END_PROC_KEY ; 查到00H时,表示字串结束
ACALL SEND_CHAR
INC DPTR ; 下一字符
SJMP SEND_STRING
END_PROC_KEY:
RET
;===============================================================================
SEND_CHAR:
; 传送一个字符
; 传入参数: ACC(要发送的数据)
; 返回值: 无
MOV SBUF,A
JNB TI,$ ; 等特数据传送
CLR TI ; 清除数据传送标志
RET
;===============================================================================
; 扫描按键, (在此实例中仅扫描按键K1)
; 传入参数: 无
; 返回值: 无
DELAY_15MS:
MOV R7,#15
DELAY15MS_1:
MOV R6,#0E8H
DELAY15MS_2:
NOP
NOP
DJNZ R6,DELAY15MS_2
DJNZ R7,DELAY15MS_1
RET
TAB_WWW:
DB "www.saxmcu.com"
DB 0AH,0DH ;换行/回车
DB 00H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -