出的校验和进行比较,向甲机发送一个状态字,表示正确(00H)或出错(0FFH),出错则要求甲机重发。甲机收到收到乙机发送的接收正确应答信号(00H)后,即结束发送,否则,就重发一次数据。
甲机采用查询方式进行数据发送,乙机采用中断方式进行数据接收。双方约定传输波特率为2400bps,两机主频均为11.059MHz,双机串行口都工作于方式1,查表6-2可知SMOD=0,定时器T1采用工作模式2,初值为F4H。 甲机发送子程序:
ORG 2000H
SEND: MOV TMOD, #20H ; 定时器1设为模式2
MOV TL1, #0F4H MOV TH1, #0F4H ; 置定时器初值 SETB TR1 ; 启动T1 MOV SCON, #50H ; 设串行口为方式2 MOV PCON, #00H ; SMOD=0
TLLS: MOV SBUF, #0AAH ; 发送请求接收信号 WFS1: JBC TI, RYD1 ; 等待发送
SJMP WFS1
RYD1: JBC RI, RYD2 ; 等待乙机回答
SJMP RYD1 RYD2: MOV A, SBUF ; 接收应答信号
XRL A, #0BBH
JNZ TLLS ; 乙机未准备好,继续联络
SDD1: MOV R0, #40H ; 首地址40H→R0
MOV R1, #10H ; 数据个数→R1 MOV R2, #00H ; 清校验和寄存器
SDD2: MOV SBUF, @R0 ; 发送一个数据
MOV A, R2 ADD A, @R0 ; 求校验和 MOV R2, A ; 保存校验和 INC R0
WFS2: JBC TI, SDD3 ; 等待发送
SJMP WFS2
SDD3: DJNZ R1, SDD2 ; 数据块是否发送完
MOV SBUF, R2 ; 发送校验和
WFS3: JBC TI, RYD3
SJMP WFS3
RYD3: JBC RI, RYD4 ; 等待乙机回答
SJMP RYD3
RYD4: MOV A, SBUF
JNZ SDD1 ; 回答出错则重发
RET
乙机接收子程序:
ORG 2000H
RECV:
MOV TMOD, #20H MOV TL1, #0F4H MOV TH1, #0F4H SETB TR1 MOV SCON, #50H MOV PCON, #00H MOV R0, #40H MOV R1, #10H MOV 50H, #00H SETB 7FH SETB 7EH SETB ES SETB EA LOOP:
SJMP
LOOP 中断服务子程序:
CLR
EA
CLR RI JB 7FH, RCMD JB 7EH, DATA MOV A, SBUF CJNE A, 50H, ERR MOV A, #00H MOV
SBUF, A WFS1: JNB
TI, WFS1 CLR TI SJMP
RETN ERR: MOV
A, #0FFH MOV
SBUF, A WFS2: JNB
TI, WFS2 CLR TI SJMP
AGAN
RCMD: MOV
A, SBUF XRL A, #0AAH JZ TYDX SJMP
RETN TYDX: MOV SBUF, #0BBH WFS3: JNB
TI, WFS3 CLR TI CLR 7FH SJMP
RETN
; 定时器1设为模式2 ; 置定时器初值 ; 启动T1 ; 设串行口为方式2 ; SMOD=0 ; 首地址40H→R0 ; 数据个数→R1 ; 清校验和寄存器 ; 标志位初始置1 ; 允许接收中断 ; 开中断 ; 等待中断
; 清中断 ; 是请求接收信号吗 ; 是数据块吗 ; 接收校验和 ; 判断发送是否正确 ; 正确,发00H ; 等待发送 ; 出错,发0FFH ; 等待发送 ; 接收甲机请求信号 ; 发送应答信号0BBH ; 等待发送
DATA: MOV
MOV INC ADD MOV DJNZ CLR SJMP
AGAN: SETB
SETB MOV MOV MOV
RETN: SETB
RETI
A, SBUF ; 接收数据 R0, A DPTR A, 50H ; 求校验和 50H, A ; 保存校验和 R1, RETN
7EH ; 数据接收完后清数据标志位 RETN 7FH 7EH ; 恢复标志位 DPTR, #2000H ; 首地址2000H→DPTR R1, #10 ; 数据个数→R1 50H, #00H ; 清校验和寄存器 EA ; 开中断
9.8051以方式2进行串行通信,假定波特率为1200bps,第9位作奇偶校验位,以中断方式发送。请编写程序。 答案: 主程序:
ORG
MAIN: MOV
MOV MOV MOV MOV SETB SETB
LOOP: SJMP
2000H
SCON, #80H PCON, #00H R0, #30H R1, #50H R2, #20 ES EA LOOP
; 将串行口设置为方式2,REN=1 ; SMOD=0
; 发送数据区首地址→R0 ; 接收数据区首地址→R1 ; 置发送数据个数→R2 ; 开中断 ; 等待中断
中断服务子程序:
ORG 0023H AJMP SOUT ; 转至中断服务程序 ORG 0200H
SOUT: CLR TI ; 清发送中断标志
DJNZ R2, LOOP1 ; 数据未发送完,继续发送 SJMP RR1 ; 发送完返回
LOOP1: MOV A, @R0 ; 取发送数据到A
MOV C, PSW.0 MOV TB8, C MOV SBUF, A ; 发送数据 INC R0 ; 指向下一个数据
RR1: RETI
10.8051以方式3进行串行通信,假定波特率为1200bps,第9位作奇偶验位,以查询方式接收。请编写程序。
答案:
ORG 2000H
RECV: MOV TMOD, #20H ; 定时器1设为模式2
MOV TL1, #0E8H MOV TH1, #0E8H ; 置定时器初值 SETB TR1 ; 启动T1 MOV SCON, #0D0H ; 将串行口设置为方式3,REN=1 MOV PCON, #00H ; SMOD=0 MOV R1, #20H ; 接收数据区首地址→R1 MOV R2, #16 ; 置发送数据个数→R2
WAIT: JBC RI, PRI ; 等待接收到数据
SJMP WAIT
PRI: MOV A, SBUF ; 读接收数据
JNB PSW.0, PZEO ; P=0则跳转
JNB RB8, ERR ; P=1,RB8=0转至出错 SJMP RIGHT ; P=1,RB8=1转至正确
PZEO: JB RB8, ERR ; P=0,RB8=1转至出错 RIGHT: MOV @R1, A ; 存放数据
INC R1 ; 指向下一个存储单元 DJNZ R2, WAIT ; 未接收完则继续接收 CLR F0 ; F0=0
RET
ERR: CLR REN
SETB F0 ; 置F0=1 RET
11.RS-232C总线标准是如何定义其逻辑电平的?实际应用中可以将MCS-51单片机串行口和PC机的串行口直接相连吗?为什么? 答案:
RS-232C采用负逻辑,即逻辑1用-5V~-15V表示,逻辑0用+5V~+15V表示。 PC机配置的是RS-232C标准接口,与MCS-51单片机输入、输出电平不兼容。因此实际应用中
相关推荐: