MAX485双机串口通信问题,故障,从机不停的发送数据到主机
主机发送程序
;RS485: E8区-> A3区
; RE/DE-> P3.2(INT0),RS485接收/发送使能端
; RO-> TXD,数据由CPU-> RS485
; DI-> RXD,数据由RS485-> CPU
;按键: G6区-> A3区
; 1号键-> P1.0
; 2号键-> P1.1
; 3号键-> P1.2
; 4号键-> P1.3
;*******************************************************
K1 BIT P1.0 ;按键1
K2 BIT P1.1 ;按键2
K3 BIT P1.2 ;按键3
K4 BIT P1.3 ;按键4
DR BIT P3.2 ;485发送/接收使能
ORG 0000H
LJMP START
ORG 0100H
START: MOV SP,#60H
LCALL RS485INIT ;主程序初始化
MAIN: LCALL KeyScan ;按键扫描
JZ MAIN
LCALL RS485Send ;发送数据,A-键值
LCALL JIESHOU
LCALL SUN
SJMP MAIN
;主程序初始化
RS485INIT: MOV TMOD,#20H ;定时器选用工作模式2
MOV TH1,#0F3H ;设定波特率为4800
MOV TL1,#0F3H
ORL PCON , #80H
MOV SCON,#50H ;串口工作方式1,开允许接收
SETB TR1
RET
;485发送数据,重复发送A中数据两次,用于接收两次比较发送的数据是否正确
RS485Send: PUSH ACC
SETB DR ;发送使能
CLR TI
MOV SBUF,A ;发送数据
JNB TI,$ ;等待发送结束标志
LCALL Delay ;延时
POP ACC
SETB DR ;发送使能
CLR TI
MOV SBUF,A ;发送数据
JNB TI,$
CLR DR
RET
;按键扫描,扫描结果在A中
KeyScan: MOV A,#1 ;按键识别号
JNB K1,KeyScan_1 ;A=1,1号键
INC A
JNB K2,KeyScan_1 ;A=2,2号键
INC A
JNB K3,KeyScan_1 ;A=3,3号键
INC A
JNB K4,KeyScan_1 ;A=4,4号键
MOV A,#0 ;A=0,无按键
RET
KeyScan_1: LCALL Delay20ms ;延时10ms,防抖动
MOV B,A
MOV A,#1 ;按键识别号
JNB K1,KeyScan_2 ;A=1,1号键
INC A
JNB K2,KeyScan_2 ;A=2,2号键
INC A
JNB K3,KeyScan_2 ;A=3,3号键
INC A
JNB K4,KeyScan_2 ;A=4,4号键
MOV A,#0 ;A=0,无按键
RET
KeyScan_2: CJNE A,B,KeyScan_3
RET
KeyScan_3: MOV A,#0 ;A=0,无按键
RET
;延时10ms
Delay20ms: PUSH 06H
PUSH 07H
MOV R6,#50
Delay20ms_1: MOV R7,#100
DJNZ R7,$
DJNZ R6,Delay20ms_1
POP 07H
POP 06H
RET
;延时
Delay: PUSH 06H
PUSH 07H
MOV R6,#10
Delay_1: MOV R7,#200
DJNZ R7,$
DJNZ R6,Delay_1
POP 07H
POP 06H
RET
JIESHOU:
CLR DR ;接收使能
JNB RI,$ ;等待接收
LCALL DELAY
CLR RI
MOV B,SBUF
JNB RI,$ ;等待接收
LCALL DELAY
CLR RI
MOV A,SBUF
CJNE A,B,RS485Rece_1 ;接收发送方的两次数据,比较两数据,判断数据是否正确
RET
RS485Rece_1: MOV A,#0 ;A=0,接收错误
RET
SUN: MOV P2 , A ;接收到是数据送入P2口显示
RET
END
从机接收程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BIAOZHI BIT 20H.1
DR BIT P3.2 ;485发送/接收使能
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN: MOV SP,#60H
CALL RS485INIT ;主程序初始化
CLR BIAOZHI
LCALL RS485Rece ;接收数据
LCALL RUN ;根据接收的数据运行
JNB BIAOZHI , MAIN
LCALL FASONG
SJMP MAIN
;主程序初始化
RS485INIT: MOV P0 , #0FFH
MOV TMOD,#20H ;定时器选用工作模式2
MOV TH1,#0F3H ;设定波特率为4800
MOV TL1,#0F3H
ORL PCON , #80H
MOV SCON,#50H ;串口工作方式1,开允许接收
SETB
RET
;接收数据,A-接收数据
RS485Rece: CLR DR ;接收使能
JNB RI,$ ;等待接收
LCALL DELAY
CLR RI
MOV B,SBUF
JNB RI,$ ;等待接收
LCALL DELAY
CLR RI
MOV A,SBUF
SETB BIAOZHI
CJNE A,B,RS485Rece_1 ;接收发送方的两次数据,比较两数据,判断数据是否正确
RET
RS485Rece_1: MOV A,#0 ;A=0,接收错误
RET
;根据接收的数据运行
RUN: CJNE A , #00000001B, LONG1
CPL P1.0 ;点亮红色发光管,0-亮
MOV P2 , #0FFH
MOV P0 , #03FH
CLR P2.1
RET
LONG1: CJNE A , #00000010B , LONG
CLR P1.1
LONG: RET
Delay: PUSH 06H
PUSH 07H
MOV R6,#10
Delay_1: MOV R7,#200
DJNZ R7,$
DJNZ R6,Delay_1
POP 07H
POP 06H
RET
FASONG: MOV A , #05H
PUSH ACC
JNB BIAOZHI ,NO
SETB DR ;发送使能
CLR TI
MOV SBUF,A ;发送数据
JNB TI,$ ;等待发送结束标志
LCALL Delay ;延时
POP ACC
SETB DR ;发送使能
CLR TI
MOV SBUF,A ;发送数据
JNB TI,$
LCALL DELAY
SETB P3.0
SETB P3.1
CLR P3.2
CLR BIAOZHI
CLR DR
NO: RET
END
发表时间:2007年8月12日10:57:01