Dual_computer_communication

  • 浙江工业大学信息工程学院单片机实验

  • 要求:甲机将内部RAM 30h~4Fh的内容发送给乙机

通讯双方均采用4800bps波特率进行传送(系统时钟频率为11.0592MHz),甲机发送数据,乙机接收数据。双机开始通讯时,甲机发送一个呼叫信号“06H”,询问乙机是否可以接收数据;乙机收到呼叫信号后,若同意接收数据则发回“00H”作为应答,否则发“15H”表示暂不能接收数据,甲机只有收到乙机的应答信号“00H”后才可把存放在内部数据存储器的字节内容发送给乙机,否则继续向乙机呼叫,直到乙机同意接收。呼叫成功后甲机依次发送长度字节(1字节)、数据字节(n字节)和校验和字节(1字节),其中校验和为长度字节和数据字节的“累加和”。乙机在成功收到甲机的数据之后,发送“0FH”作为成功应答,否则发送“F0H”作为失败应答。


发送机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
        ORG     0000H
LJMP START
ORG 1000H

START:
MOV SP,#60H
MOV TMOD,#20H //定时器0,定时器工作模式2工作
MOV TH1,#0FAH //模式2自动重装载的初值
MOV TH1,#0FAH
SETB TR1 //开始计时
MOV SCON,#50H //方式1工作,允许接收-->4.8kbit/s
MOV PCON,#00H //SMOD=0
MOV R0,30H //存放发送的数据块首地址
MOV R7,#20H //存放发送的数据块长度
MOV R6,#00H //校验和,长度字节与数字字节的累加和

TX_ACK:
MOV A,#06H //发送06H询问是否可以接收数据
MOV SBUF,A

WAIT1:
JNB TI,WAIT1 //等待发送完一个字节
CLR TI //清除发送完毕TI标志位

RX_YES:
JNB RI,RX_YES //等待乙机回答是否可以接收
CLR RI //清除接收完毕RI标志位

NEXT1:
MOV A,SBUF //接收到乙机发送过来的ACK
CJNE A,#00H,TX_ACK //若为00H则表示可以接收数据,往下启动发送,否则再次询问

TX_LENGTH:
MOV A,R7 //先发送字节长度数R7
MOV SBUF,A

WAIT2:
JNB TI,WAIT2 //等待数据发送完毕
CLR TI //清除发送完毕TI标志位
MOV R6,A //增加校验和

TX_NEWS: //查询发送数据
MOV A,@R0
MOV SBUF,A

TX_NEWS_WAIT:
JNB TI,TX_NEWS_WAIT
CLR TI //清除发送完毕TI标志位
MOV A,R6
ADD A,@R0
MOV R6,A
INC @R0
DJNZ R7,TX_NEWS //如果没发送完32个数据,继续发送

TX_CHECK:
MOV A,R6
ADD A,@R0
MOV R6,A
MOV A,R6 //发送校验位
MOV SBUF,A

WAIT3: //等待发送完校验位
JNB TI,WAIT3
CLR TI

WAIT4: //等待接收完校验位
JNB RI,WAIT4
CLR RI

IF_0FH:
MOV A,SBUF //将接收到校验是否正确的恢复存到累加器
CJNE A,#0FH,START

HERE:
SJMP HERE

END


接收机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
        ORG     0000H
LJMP START
ORG 0023H
LJMP IF_06H
ORG 1000H

START:
MOV SP,#60H
MOV TMOD,#20H //定时器0,定时器工作模式2工作
MOV TH1,#0FAH //模式2自动重装载的初值
MOV TH1,#0FAH
SETB TR1 //开始计时
MOV SCON,#50H //方式1,允许接收-->4.8kbit/s
MOV PCON,#00H //SMOD=0
MOV IE,#90H
MOV R0,30H //存放发送的数据块首地址
MOV R7,#00H //存放发送的数据块长度
MOV R6,#00H //校验和,长度字节与数字字节的累加和

HERE:
SJMP HERE

IF_06H:
PUSH ACC
PUSH PSW
CLR RI //清除接收完毕RI标志位
MOV A,SBUF //核对握手信号是不是06H
CJNE A,#06H,TX_15H //如果是06H则发送00H应答,否则发送15H拒绝

TX_00H:
MOV A,#00H
MOV SBUF,A //发送出00H表示可以接收数据
LJMP HERE_RE

TX_15H:
MOV A,#15H //发送15H表示不可以接收
MOV SBUF,A
LJMP RETURN

HERE_RE:
JNB TI,HERE_RE //等待发送完毕,发送完毕准备接收
CLR TI

HAVE1:
JNB RI,HAVE1 //等待接收数据长度
CLR RI
MOV A,SBUF
MOV R7,A //R7存数据长度
MOV R6,A //R6存校验和

HAVE2:
JNB RI,HAVE2 //等待接收正式数据
CLR RI
MOV A,SBUF
MOV @R0,A
MOV A,R6
ADD A,@R0
MOV R6,A
INC @R0
DJNZ R7,HAVE2 //如果没接收完完20个数据,继续接收

RX_CHECK: //接收校验和
JNB RI,RX_CHECK
CLR RI
MOV A,SBUF
MOV 39H,A
CJNE A,39H,TX_ERR //如果校验正确,则继续向下ok,错误则发送#F0H

TX_OK: //校验正确,发送0FH
MOV A,#0FH
MOV SBUF,A
LJMP HERE_END

TX_ERR: //校验错误,发送F0H
MOV A,#0F0H
MOV SBUF,A

HERE_END: //等待发送完毕
JNB TI,HERE_END
CLR TI

RETURN:
POP PSW
POP ACC
RETI

END

请我喝杯咖啡吧~