📄 tongxin.txt
字号:
DISP1 EQU 38H ;串行显示寄存器1 DISP2 EQU 39H ;串行显示寄存器2 SRDAT EQU 3AH ;收发数寄存器 TCER EQU 40H ;定时中断0定时次数 DIRLOP EQU 5BH ;显示字节数寄存器 CLK EQU P1.1 ;串行显示时钟 DAT EQU P1.0 ;串行显示数据位 ORG 0000H AJMP START ORG 0023H ;串口中断程序 AJMP RECIVE ORG 0030H START: MOV R0,#38H ;初始化程序 MOV A,#0 MAIN0: MOV @R0,A INC R0 CJNE R0,#40H,MAIN0 MOV IE,#10010000B ;开启串口的中断请求 MOV TMOD,#20H ;设定定时器1为方式2(波特率发生器) MOV TH1,#0FAH ;波特率为2.4kbps(6MHz时钟) MOV TL1,#0FAH SETB TR1 MOV SCON,#0D0H ;设置串口 MOV PCON,#00H MAIN: ACALL KEY ;键扫描 ACALL TRANS ;显示拆字 ACALL DISP ;串行显示 ACALL DL10MS ;延时 ACALL DL10MS MOV SCON,#0D0H ;重新设置串口,准备下次通信 SETB ES NOP NOP SJMP MAIN ;串行接收程序 RECIVE: CLR ES ;关闭串行中断 PUSH ACC
PUSH PSW FMT_RAM: MOV R1,#SRDAT //载入接受数据单元 RX_ACK: JBC RI,IF_06H //检查“06H“信号 SJMP RX_ACK IF_06H: MOV A,SBUF CJNE A,#06H,TX_15H TX_00H: MOV A,#00H //发送”00H“应答信号准备接受 MOV SBUF,A WAIT1: JBC TI,RX_BYTES SJMP WAIT1 RX_15H: MOV A,#15H //发送”15H“信号,要求重发信号 MOV SBUF,A WAIT2: JBC TI,HAVE1 SJMP WAIT2 HAVE1: LJMP RX_ACK RX_BYTES: //接受发送字节数 JBC RI,HAVE2 SJMP RX_BYTES HAVE2: MOV A,SBUF JNB PSW.0,LOOP2 //校验 JNB RB8,LOOP3 SJMP LOOP4 LOOP2: JB RB8,LOOP3 LOOP4: MOV R6,A CLR PSW.5 TX_BACK: MOV A,#0FH //接受成功,发回”0FH“信号 MOV SBUF,A TX_YES: JBC TI,RX_NEWS SJMP TX_YES
RX_NEWS: JBC RI,HAVE3 SJMP RX_NEWS HAVE3: MOV A,SBUF //接受数据 JNB PSW.0,LOOPA JNB RB8,LOOP3 SJMP LOOPB LOOPA: JB RB8,LOOP3 LOOPB: MOV @R1,A CLR,PSW.5 TX_BACK1: //接受成功,发回"0FH”信号 MOV A,#0FH MOV SBUF,A TX_YES1: JBC TI,RX_N SJMP TX_YES1 RX_N: INC R1 //判断接受完了没有 DJNZ R6,RX_NEWS TX_RIGHT: //接受成功,发回“0FH"信号,接受完成 MOV A,#0FH MOV SBUF,A
WAIT3: JBC TI,GOOD
SJMP WAIT3
GOOD: POP PSW ;中断返回
POP ACC
RETI
LOOP3: SETB PSW.5 ;接收出错,发"F0"信号,要求重发
MOV A,#0F0H
MOV SBUF,A
WAIT4: JBC TI,AGAIN
SJMP WAIT4
AGAIN: LJMP FMT_RAM
KEY: MOV P2,#0FFH ;检查有否键按下
NOP
NOP
JNB P2.0,K1
JNB P2.1,K2
JNB P2.2,K3
KBACK: RET
K1: ACALL DL10MS ;K1键功能
JB P2.0,KBACK
J1: JNB P2.0,J1
MOV A,SRDAT ;收发数寄存器加1
ANL A,#0FH
CJNE A,#0FH,J11
ANL SRDAT,,#0F0H
RET
J11: MOV A,SRDAT
ADD A,#1
MOV SRDAT,A
RET
K2: ACALL DL10MS ;K2键功能
JB P2.1,KBACK
J2: JNB P2.1,J2
MOV A,SRDAT ;收发数寄存器加1
ANL A,#0F0H
CJNE A,0F0H,J21
ANL SRDAT,#0FH
RET
J21: MOV A,SRDAT ADD A,#10H
MOV SRDAT,A
RET
K3: ACALL DL10MS ;串口发送数据
JB P2.2,KBACK
J3: JNB P2.2,J3
ACALL SEND
RET
DELAY: MOV 70H,#0FFH ;键盘防抖动延时程序
DELAY1: DJNE 70H,DELAY1
RET
DL10MS: MOV 71H,#0AH ;10ms定时程序
DL10MS1: ACALL DELAY
DJNZ 71H,DL10MS1
RET
SEND: CLR ES ;串口发送程序
FMT_RAM1: MOV R0,#SRDAT ;载入发送数据单元
MOV R5,#1 ;发送字节数
TX_ACK1: MOV A,#06H ;发出“06H”初始信号
MOV SBUF,A
WAIT11: JBC TI,RX_YES1
SJMP WAIT11
RX_YES1: JBC RI,NEXT11
SJMP RX_YES1
NEXT11: MOV A,SBUF ;接收判断是否“00H”
CJNE A,#00H,TX_ACK1
TX_BYTES1: MOV A,R5 ;发送发送字节数
MOV C,P
MOV TB8,C ;发送校验位
MOV SBUF,A
WAIT21: JBC TI,TX_NEWS1
SJMP WAIT21
RX_RCE11: JBC RI,RX_YES21
SJMP RX_RCE11
RX_YES21: MOV A,SBUF ;接收判断是否“0FH”接收成功信号,否则重发
CJNE A,#0FH,TX_BYTES1
TX_NEWS1: MOV A,@R0 ;发送数据
MOV C,P
MOV TB8,C
MOV SBUF,A
WAIT31: JBC TI,NEXT21
SJMP WAIT31
RX_RCE21: JBC RI,RX_YES31
SJMP RX_RCE21
RX_YES31: MOV A,SBUF ;判断是否“0FH”接收成功信号,否则重发
CJNE A,#0FH,TX_NEWS1
NEXT21: INC R0
DJNZ R5,TX_NEWS1 ;判断发送完毕没有
RX_OFH1:JBC RI,IF_0FH1
SJMP RX_0FH1
IF_0FH1:MOV A,SBUF
CJNE A,#0FH,FMT_RAM1 //接收完成信号退出发送程序
RET
TRANS:MOV DISP2,SRDAT
TRAN2:MOV A,DISP1 //显示拆字程序
ANL A,#0F0H
SWAP A
MOV 3CH,A
MOV A,DISP1
ANL A,#0FH
MOV 3DH,A
MOV A,DISP2
ANL A,#0F0H
SWAP A
MOV 3EH,A
MOV A,DISP2
ANL A,#0FH
MOV 3FH,A
RET
DISP:MOV DIRLOP,#4 //以P1.0代RXD,P1.1代TXD的串行显示程序
MOV R0,#3CH //3CH到3FH是显示缓冲区
DL0:MOV A,@R0
MOV DPTR,#TAB
MOVC A,@A+DPTR //查得相应的七段代码
ACALL DIRS //调用单字节串行发送程序
INC R0
DJNZ DIRLOP,DL0
RET
TAB: DB 0FCH,60H,0DAH,0F2H,66H,0B6H //共阴七段数码管代码表
DB 0BEH,0E0H,0FEH,0EEH,03EH,9CH
DB 7AH,9EH,8EH
DIRS:SETB CLK //模拟串口发送数据
MOV R7,#8 //8位(一个字节)
DIRS1:CPL CLK //形成脉冲上升沿
RRC A
MOV DAT,C //发送一位数据
CPL CLK
DJNZ R7,DIRS1
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -