📄 新建 文本文档.txt
字号:
双机通讯(8032与8032)
第一题:
发送程序
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN: MOV TMOD,#20H
MOV TH1,#0F3H
MOV TL1,#0F3H
MOV SCON,#0C0H
MOV PCON,#80H
SETB TR1
MOV R0,#50H
LOOP1: MOV A,@R0
MOV SBUF,A
WAIT: JBC TI,LOOP2
SJMP WAIT
LOOP2: INC R0
CJNE R0,#60H,LOOP1
SJMP $
END
接收程序
ORG 0000H
AJMP MAIN
ORG 0040H
MAIN: MOV TMOD,#20H
MOV TH1,#0E6H
MOV TL1,#0E6H
MOV SCON,#0D0H
MOV PCON,#80H
SETB TR1
MOV R0,#50H
WAIT: JBC RI,LOOP
SJMP WAIT
LOOP: MOV A,SBUF
MOV @R0,A
INC R0
CJNE R0,#60H,WAIT
SJMP $
END
第二题: 甲机发送程序
ORG 0000H
LJMP MAINT ;跳至主程序入口
ORG 0023H
LJMP INTSE1 ;转至串行中断服务程序
MAINT: MOV SCON,#01000000B ;置串行口工作方式1
MOV TMOD,#20H ;定时器1为工作方式2
MOV TH1,#0D9H ;产生400波特率的时间常数
MOV TL1,#0D9H
SETB TCON.6 ;启动定时器1
SETB EA ;开中断
SETB ES ;串口开中断
MOV DPTR,#ADDRT ;首址送DPTR
MOV R0,#00H ;传送字节数初值
MOVX A,@DPTR ;取第一个发送字节
MOV SBUF,A ;启动串行口发送
SJMP $ ;等待中断
;中断服务子程序
INTSE1: CLR SCON.1 ;清中断标志
CJNE R0,#7FH,LOOP ;判别128个字节都发送完否,若没有完,则转LOOP继续取下一个发送数据
CLR ES ;全部发送完毕,禁止串行口中断
SJMP ENDT ;转中断返回
LOOP: INC R0 ;修改字节数指针
INC DPTR ;修改地址指针
MOVX A,@DPTR ;取发送数据
MOV SBUF,A ;启动串行口
ENDT: RETI ;中断返回
乙机接收程序:
ORG 0000H
LJMP MAINR ;跳至主程序入口
ORG 0023H
LJMP INTSE2 ;转至串行中断服务程序
MAINR: MOV SCON,#01010000B ;置串行为接收口,工作方式1
MOV TMOD,#20H ;定时器1为工作方式2
MOV TH1,#0D9H ;产生400波特率的时间常数
MOV TL1,#0D9H
SETB TCON.6 ;启动定时器1
SETB EA ;开中断
SETB ES ;串口开中断
MOV DPTR,#ADDRR ;首址送DPTR
MOV R0,#00H ;传送字节数初值
SJMP $ ;等待中断
;中断服务子程序
INTSE2: CPL SCON.0 ;清中断标志
MOV A,SBUF ;取接收的断据
MOVX @DPTR,A ;接书的数据送缓冲区
CJNE R0,#7FH,LOOP ;判128个字节接收完否。若没有,转LOOP继续
CLR ET1 ;接收下面的数据。全部接收完毕则关定时器1及关串口中断
CLR ES
SJMP SEND
LOOP: INC R0 ;修改计数指针
INC DPTR ;修改地址指针
SEND: RETI ;中断返回
第三题:
;甲机发送程序
;主程序:
ORG 0000H
LJMP MAINT
ORG 0023H
LJMP INTSE1
MAINT: MOV PCON,#80H
MOV SCON,#10010000B
MOV DPTR,#0200H
MOV R0,#00H
SETB EA
SETB ES
MOVX A,@DPTR
ADD A,#00H
MOV C,P
MOV TB8,C
MOV SBUF,A
SJMP $
;中断服务子程序
INTSE1: JB SCON.0,LOOP
CLR SCON.1
SJMP ENDT
LOOP: CLR SCON.0
MOV A,SBUF
SUBB A,#01H
JC LOOP3
MOVX A,@DPTR
ADD A,#00H
MOV C,P
MOV TR8,C
MOV SBUF,A
SJMP ENDT
LOOP3: INC DPTR
INC R0
MOVX A,@DPTR
ADD A,#00H
MOV C,P
MOV TR8,C
MOV SBUF,A
CJNE R0,#80H,ENDT
CLR ES
ENDT: RETI
;乙机接收程序
;主程序
ORG 0000H
LJMP MAINR
ORG 0023H
LJMP INTSE2
ORG 0100H
MAINR: MOV PCON,#80H ;波特率加倍
MOV SCON,#10010000B ;工作方式2,允许接收
MOV DPTR,#0100H ;数据指针首址
MOV R0,#00H ;接收数据字节数初值
SETB EA ;CPU开中断
SETB ES ;串口开中断
SJMP $ ;等待中断
;串行口中断服务程序
INTSE2:JB SCON.0,LOOP ;检测是否是本机的接收口中断,若SCON.0=1,转入接收程序
CLR SCON.1 ;若SCON.0=0,必若SCON.1=1是本机的发送中断,故应清零
SJMP ENDT ;跳至中断返回程序
LOOP: CLR SCON.0 ;清本机的接收中断标志
MOV A,SBUF ;取接收的数据
ADD A,#00H ;奇偶校验
MOV C,P
JC LOOP1 ;若8位数为奇,则转LOOP1再检测RB8位 ORL C,RB8 ;8位数为偶,再检测RB8位,RB8=1则
JC LOOP2 9位数为奇,补偶错转LOOP2
SJMP LOOP3 ;补偶正确,转LOOP3
LOOP1: ANL C,RB8 ;8位数为奇,再检测RB8位,RB8=1,补偶正确,转LOOP3
JC LOOP3
LOOP2: MOV A,#0FFH ;本机发应答信息(FFH)给甲机,表明数据传送不正确
MOV SBUF,A
SJMP ENDT ;跳至中断返回程序
LOOP3: MOVX @DPTR,A ;将接收的正确数据送数据缓冲区
MOV A,#00H ;本机发应答信息(00H)给甲机,表明数据传送正确,甲机发下一个数据
MOV SBUF,A
INC R0 ;修改指针
INC DPTR
CJNE R0,#80H,ENDT ;判128个字节接收完否
CLR ES ;接收完毕,关串行口中断
ENDT: RETI ;中断返回
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -