求单片机c51的双机之间的串行通信设计课程设计程序,学得不精,所以求助
双机之间的串行通信设计1.两片单片机利用串行口进行串行通信:串行通信的波特率可从键盘进行设定,可选的波特率为1200、2400、4800和9600bit/s。串行口工作方...
双机之间的串行通信设计
1.两片单片机利用串行口进行串行通信:串行通信的波特率可从键盘进行设定,可选的波特率为1200、2400、4800和9600bit/s。串行口工作方式为方式1的全双工串行通信。
2. 两个单片机之间进行通讯波特率的设定,最终归结到对定时计数器T1计数初值TH1、TL1进行设定。故本题目本质上是通过键盘扫描得到设定的波特率,从而载入相应的T1计数初值TH1、TL1实现的。
3、要求发送方读入按键值,发送到接收方,接收方接受数据并显示在数码管上。
可以发邮箱 172866386@qq.com 或加q交流 我是想搞懂 展开
1.两片单片机利用串行口进行串行通信:串行通信的波特率可从键盘进行设定,可选的波特率为1200、2400、4800和9600bit/s。串行口工作方式为方式1的全双工串行通信。
2. 两个单片机之间进行通讯波特率的设定,最终归结到对定时计数器T1计数初值TH1、TL1进行设定。故本题目本质上是通过键盘扫描得到设定的波特率,从而载入相应的T1计数初值TH1、TL1实现的。
3、要求发送方读入按键值,发送到接收方,接收方接受数据并显示在数码管上。
可以发邮箱 172866386@qq.com 或加q交流 我是想搞懂 展开
展开全部
以下是一段单片机双机通讯的发送和接收程序,希望对你有帮助,如果有什么地方有疑惑,可以提出来再加QQ聊。
发送程序如下:
ORG 1000H
ASTART: CLR EA
MOV TMOD, #20H ; 定时器1置为方式2
MOV TH1, #0F4H ; 装载定时器初值,波特率2400
MOV TL1, #0F4H
MOV PCON, #00H
SETB TR1 ; 启动定时器
MOV SCON, #50H ; 设定串口方式1,且准备接收应答信号
ALOOP1: MOV SBUF, #0E1H ; 发联络信号
JNB TI, $ ; 等待一帧发送完毕
CLR TI ; 允许再发送
JNB RI, $ ; 等待2号机的应答信号
CLR RI ; 允许再接收
MOV A, SBUF ; 2号机应答后,读至A
XRL A, #0E2H ; 判断2号机是否准备完毕
JNZ ALOOP1 ; 2号机未准备好,继续联络
ALOOP2: MOV R0, #40H ; 2号机准备好,设定数据块地址指针初值
MOV R7, #10H ; 设定数据块长度初值
MOV R6, #00H ; 清校验和单元
ALOOP3: MOV SBUF, @R0 ; 发送一个数据字节
MOV A, R6
ADD A, @R0 ; 求校验和
MOV R6, A ; 保存校验和
INC R0
JNB TI, $
CLR TI
DJNZ R7, ALOOP3 ; 整个数据块是否发送完毕
MOV SBUF, R6 ; 发送校验和
JNB TI, $
CLR TI
JNB RI, $ ; 等待2号机的应答信号
CLR RI
MOV A, SBUF ; 2号机应答,读至A
JNZ ALOOP2 ; 2号机应答“错误”,转重新发送
RET ; 2号机应答“正确”,返回
END
接收程序如下:
ORG 1000H
BSTART: CLR EA
MOV TMOD, #20H
MOV TH1, #0F4H
MO V TL1, #0F4H
MOV PCON, #00H
SETB TR1
MOV SCON, #50H ; 设定串口方式1,且准备接收
BLOOP1: JNB RI, $ ; 等待1号机的联络信号
CLR RI
MOV A, SBUF ; 收到1号机信号
XRL A, #0E1H ; 判断是否为1号机联络信号
JNZ BLOOP1 ; 不是1号机联络信号,再等待
MOV SBUF, #0E2H ; 是1号机联络信号,发应答信号
JNB TI, $
CLR TI
MOV R0, #40H ; 设定数据块地址指针初值
MOV R7, #10H ; 设定数据块长度初值
MOV R6, #00H ; 清校验和单元
BLOOP2: JNB RI, $
CLR RI
MOV A, SBUF
MOV @R0, A ; 接收数据转储
INC R0
ADD A, R6 ; 求校验和
MOV R6, A
DJNZ R7, BLOOP2 ; 判断数据块是否接收完毕
JNB RI, $ ; 完毕,接收1号机发来的校验和
CLR RI
MOV A, SBUF
XRL A, R6 ; 比较校验和
JZ END1 ; 校验和相等,跳至发正确标志
MOV SBUF, #0FFH ; 校验和不相等,发错误标志
JNB TI, $ ; 转重新接收
CLR TI
END1: MOV SBUF, #00H
RET
END
发送程序如下:
ORG 1000H
ASTART: CLR EA
MOV TMOD, #20H ; 定时器1置为方式2
MOV TH1, #0F4H ; 装载定时器初值,波特率2400
MOV TL1, #0F4H
MOV PCON, #00H
SETB TR1 ; 启动定时器
MOV SCON, #50H ; 设定串口方式1,且准备接收应答信号
ALOOP1: MOV SBUF, #0E1H ; 发联络信号
JNB TI, $ ; 等待一帧发送完毕
CLR TI ; 允许再发送
JNB RI, $ ; 等待2号机的应答信号
CLR RI ; 允许再接收
MOV A, SBUF ; 2号机应答后,读至A
XRL A, #0E2H ; 判断2号机是否准备完毕
JNZ ALOOP1 ; 2号机未准备好,继续联络
ALOOP2: MOV R0, #40H ; 2号机准备好,设定数据块地址指针初值
MOV R7, #10H ; 设定数据块长度初值
MOV R6, #00H ; 清校验和单元
ALOOP3: MOV SBUF, @R0 ; 发送一个数据字节
MOV A, R6
ADD A, @R0 ; 求校验和
MOV R6, A ; 保存校验和
INC R0
JNB TI, $
CLR TI
DJNZ R7, ALOOP3 ; 整个数据块是否发送完毕
MOV SBUF, R6 ; 发送校验和
JNB TI, $
CLR TI
JNB RI, $ ; 等待2号机的应答信号
CLR RI
MOV A, SBUF ; 2号机应答,读至A
JNZ ALOOP2 ; 2号机应答“错误”,转重新发送
RET ; 2号机应答“正确”,返回
END
接收程序如下:
ORG 1000H
BSTART: CLR EA
MOV TMOD, #20H
MOV TH1, #0F4H
MO V TL1, #0F4H
MOV PCON, #00H
SETB TR1
MOV SCON, #50H ; 设定串口方式1,且准备接收
BLOOP1: JNB RI, $ ; 等待1号机的联络信号
CLR RI
MOV A, SBUF ; 收到1号机信号
XRL A, #0E1H ; 判断是否为1号机联络信号
JNZ BLOOP1 ; 不是1号机联络信号,再等待
MOV SBUF, #0E2H ; 是1号机联络信号,发应答信号
JNB TI, $
CLR TI
MOV R0, #40H ; 设定数据块地址指针初值
MOV R7, #10H ; 设定数据块长度初值
MOV R6, #00H ; 清校验和单元
BLOOP2: JNB RI, $
CLR RI
MOV A, SBUF
MOV @R0, A ; 接收数据转储
INC R0
ADD A, R6 ; 求校验和
MOV R6, A
DJNZ R7, BLOOP2 ; 判断数据块是否接收完毕
JNB RI, $ ; 完毕,接收1号机发来的校验和
CLR RI
MOV A, SBUF
XRL A, R6 ; 比较校验和
JZ END1 ; 校验和相等,跳至发正确标志
MOV SBUF, #0FFH ; 校验和不相等,发错误标志
JNB TI, $ ; 转重新接收
CLR TI
END1: MOV SBUF, #00H
RET
END
追问
只双机通信的话,我会,但加上键盘和led就有点傻了。。。留下qq
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询