📄 com8123.asm
字号:
;-----------------------------------------------------------------------------
; 检测 GM8123 的通讯功能
; CPU时钟为 22.1184MHZ。
;-----------------------------------------------------------------------------
RESET EQU P1.5
MS EQU P1.0
STADD0 EQU P1.1
STADD1 EQU P1.2
SRADD0 EQU P1.3
SRADD1 EQU P1.4
ORG 0000H
LJMP START
ORG 0023H
LJMP SERIAL_INT
ORG 0100H
START:
MOV SP,#40H
MOV TMOD,#20H ;定时器1工作在方式2。
MOV IE,#080H ;开串行口中断。
MOV SCON,#0c0H ;串行口工作在方式3。9位。
MOV TH1,#0e8H ;E8;给定时器1装入初值。设置主机工作波特率为4800bps
MOV TL1,#0e8H ;E8;
MOV PCON,#080H ;
CLR RESET ;复位 GM8123。
LCALL DELAY
LCALL DELAY
LCALL DELAY ;延时。
; SETB RESET ;
lcall delay
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY ;延时。
; SETB RESET ;
lcall delay
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY ;延时。
SETB RESET ;
lcall delay
LCALL DELAY
LCALL DELAY
SETB TR1 ;启动定时器1。
CLR MS ;GM8123工作在写命令字方式下。
clr stadd0 ;将 STADD1-0 设置成 00.
clr stadd1
CLR MS ;GM8123工作在写命令字方式下。
LCALL DELAY
MOV SBUF,#0F3H ;F8H ;命令字。子串口波特率=1200,母串口波特率=4800。11位。=====
JNB TI,$ ;等待发送完毕。
CLR TI ;清除TI标志位。
clr tr1
MOV TH1,#0fdH ;E8;给定时器1装入初值。设置主机工作波特率为4800bps
MOV TL1,#0fdH ;E8;
MOV SCON,#040H
setb tr1
;--------------------------------------------------------------------------------------
; 读命令字
;--------------------------------------------------------------------------------------
; LCALL DELAY ;这个延迟很重要!!没有它,命令字读不对。
; setb ren ;允许CPU接收串行数据。
; SETB MS ;读命令字。
; lcall delay
; CLR SRADD0
; CLR SRADD1
; CLR STADD0
; CLR STADD1
; JNB RI,$ ;等待接收完毕。(这几句让我折腾了一天!!!!!)
; CLR RI ;清除RI标志位。
; MOV A,SBUF ;命令字在A中。
;-------------------------------------------------------------------------------------
; CLR REN ;禁止CPU接收串行数据。
; CLR TR1 ;停止定时器1。
; MOV SCON,#040H ;050H ;串行口工作在方式1。(10位,可变)
; MOV TH1,#0e9H ;E8;装入定时器1初值。将MCU主控波特率设置成4800bps.
; MOV TL1,#0e9H ;E8;
; MOV PCON,#080H
; SETB TR1 ;启动定时器1。
; clr ms
; lcall delay
; SETB REN ;允许接收。
; clr ea
setb ms
setb stadd0
setb stadd1
clr ms
lcall delay
lcall delay
;lll:
; JNB RI,$ ;等待接收完毕。(这几句让我折腾了一天!!!!!)
; CLR RI ;清除RI标志位。
; MOV A,SBUF ;读出的数据在A中。检查A的内容可以知道读出的数据是否正确。
;
; ljmp lll
;-------------------------------------------------------------------------------
; 主控MCU发送/接收程序
;-------------------------------------------------------------------------------
SEND:
clr STADD0 ;选择子通道1发送。
CLR STADD1
MOV SBUF,#00H ;子通道1发送0AAH。
JNB TI,$ ;等待发送完成。
CLR TI
SETB STADD0 ;选择子通道1发送。
CLR STADD1
MOV SBUF,#0aaH ;子通道1发送0AAH。
JNB TI,$ ;等待发送完成。
CLR TI
clr STADD0 ;选择子通道1发送。
CLR STADD1
MOV SBUF,#00H ;子通道1发送0AAH。
JNB TI,$ ;等待发送完成。
CLR TI
SETB STADD1
CLR STADD0 ;将STADD1-0设置成10H,选子通道2。
MOV SBUF,#055H ;
JNB TI,$ ;等待发送完成。
CLR TI
clr STADD0 ;选择子通道1发送。
CLR STADD1
MOV SBUF,#00H ;子通道1发送0AAH。
JNB TI,$ ;等待发送完成。
CLR TI
SETB STADD0 ;将STADD1-0设置成11H,选子通道3。
SETB STADD1
MOV SBUF,#33H ;
JNB TI,$ ;等待发送完成。
CLR TI
; clr STADD0 ;选择子通道1发送。
; CLR STADD1
; nop
; MOV SBUF,#00H ;子通道1发送0AAH。
; JNB TI,$ ;等待发送完成。
; CLR TI
SJMP SEND
delay:
mov r4,#0FFh
del:
nop
nop
djnz r4,del
ret
;--------------------------------------------------------------------------------
; 中断处理程序
;--------------------------------------------------------------------------------
SERIAL_INT:
reti
PUSH PSW
CLR EA ;关中断。
JNB RI,NOO ;要不是接收中断,转。
MOV A,P1 ;
ANL A,#18H ;取出 SRADD1-0。
JZ COMMAND ;SRADD1-0=0,转接收命令字。
CJNE A,#08H,NCHANNAL ;不是子通道1,转。
MOV R1,SBUF ;把子通道1来的数据放到R1中。
CLR RI
LJMP NOCHN
NCHANNAL:
CJNE A,#10H,MCHANNAL ;不是子通道2,转。
MOV R2,SBUF ;把子通道1来的数据放到R2中。
CLR RI
LJMP NOCHN
MCHANNAL:
CJNE A,#18H,NOCHN ;也不是子通道3,说明是出错了。
MOV R3,SBUF ;把子通道1来的数据放到R3中。
CLR RI
LJMP NOCHN
NOCHN:
SETB EA ;开中断。
POP PSW
RETI
NOO:
JNB TI,NOCHN ;既不是接收中断,也不是发送中断,是错误
;(发送中断处理)
; CLR TI
LJMP NOCHN
COMMAND:
MOV R0,SBUF ;把子接收到的命令字放到R0中。
CLR RI
LJMP NOCHN
END
;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -