📄 rs232.asm
字号:
;******************************************************
; 程序功能描述
; uPSD3251与PC机通过RS232进行全双工通讯。
; uPSD3251每500ms向PC机上发一个字节,利用串口调试
; 软件观察上发的数据,并可同时利用串口调试软件下发
; 数据至uPSD3251。uPSD3251收到下发指令后,根据下发
; 的指令调整步长,指令分别为0,1,2时,步长分别为1,2,4,
; 其它指令无效,默认步长为1。CPU晶振为11.0592MHz
;******************************************************
WDKEY DATA 0AEH
TIMER0_H EQU 0F8H ;TH0=0F8H,TL0=0D5H,定时2毫秒(晶振:11.0592MHz)
TIMER0_L EQU 0D5H
COUNT DATA 38H ;定时器0的计时累计单元
TX_BUFF DATA 39H ;通信发送缓冲单元
_500MS_OK BIT 0 ;定时500ms的标志位
VAL DATA 30H ;串行输出数据的步长存储单元
ORG 0000H
JMP MAIN
ORG 000BH
JMP TIMER0_ISR
ORG 0023H
JMP UART0_RCV
MAIN:
MOV WDKEY,#55H
MOV SP,#7FH
LCALL UART0_INIT ;初始化UART0
LCALL TIMER0_INIT
MOV A,#0 ;初始化A为0
MOV VAL,#1 ;初始化步长为1
UART0XMIT:
JNB TI,UART0XMIT ;等待串行口发送完一个字节
CLR TI
LOOPWAIT:
JNB _500MS_OK,LOOPWAIT ;延时500ms
CLR _500MS_OK
MOV A,TX_BUFF
ADD A,VAL
MOV SBUF,A ;发送一个字节
MOV TX_BUFF,A
JMP UART0XMIT
;******************************************************
;名称: UART0_INIT
;功能: 初始化UART0:9600波特率,方式1,中断允许,高优先级
;入口条件: 无
;出口信息: TI=1
;影响资源: TMOD,TH1,TL1,ET1,TR1,SCON,PCON,PS,IE,TI
;调用程序: 无
;堆栈深度: 0
;******************************************************
UART0_INIT:
ANL TMOD,#0FH ;定时器1方式2
ORL TMOD,#20H
MOV TH1,#0FDH ;9600波特率11.0592MHz
MOV TL1,#0FDH
CLR ET1 ;禁止定时器1中断
SETB TR1 ;启动定时器1
MOV SCON,#50H ;串口方式1,允许接收
MOV PCON,#0
SETB PS ;高优先级
ORL IE,#90H ;允许串行中断
SETB TI ;启动发送
RET
;******************************************************
;名称: UART0_RCV
;功能: UART0的接收中断服务程序
;入口条件: TI=1,RI=1
;出口信息: 步长在VAL中
;影响资源: RI,VAL
;调用程序: 无
;堆栈深度: 2
;******************************************************
UART0_RCV:
PUSH PSW
PUSH ACC
JNB RI,RCV_REC ;接收到一个字节
CLR RI ;RI清零
MOV A,SBUF
CJNE A,#0,CASE0
MOV TX_BUFF,#00H
MOV VAL,#1 ;收到字节为0,则步长等于1
CASE0:
CJNE A,#1,CASE1
MOV TX_BUFF,#00H
MOV VAL,#2 ;收到字节为1,则步长等于2
CASE1:
CJNE A,#2,RCV_REC
MOV TX_BUFF,#00H
MOV VAL,#4 ;收到字节为2,则步长等于4
RCV_REC:
POP ACC
POP PSW
RETI
;******************************************************
;名称: TIMER0_INIT
;功能: 初始化定时器0:2ms的定时中断,低优先级
;入口条件: 无
;出口信息: COUNT=250,_500MS_OK=0
;影响资源: TMOD,TH0,TL0,PT0,ET0,EA,TR0,COUNT,_500MS_OK
;调用程序: 无
;堆栈深度: 0
;******************************************************
TIMER0_INIT:
ANL TMOD,#0F0H ;定时器0,工作方式为方式1
ORL TMOD,#01H
MOV TH0,#TIMER0_H ;置计数初值
MOV TL0,#TIMER0_L
CLR PT0 ;低优先级
SETB ET0 ;使能定时器0中断源
SETB EA ;允许所有中断源
SETB TR0 ;启动定时器0
MOV COUNT,#250
SETB _500MS_OK
RET
;******************************************************
;名称: TIMER0_ISR
;功能: 2ms的定时中断,每500ms置标志位_500MS_OK
;入口条件: TF0=1
;出口信息: _500MS_OK=1
;影响资源: TH0,TL0,COUNT,_500MS_OK
;调用程序: 无
;堆栈深度: 1
;******************************************************
TIMER0_ISR:
PUSH PSW
MOV TH0,#TIMER0_H ;重新装载计数值
MOV TL0,#TIMER0_L
DJNZ COUNT,TIMER0REC
MOV COUNT,#250
SETB _500MS_OK
TIMER0REC:
POP PSW
RETI
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -