多台单片机间网络的实现
一、功能
主体功能:三台单片机之间两两互相通信,为此,我们将其拟人化,以三个主人公 Jack、
Carl、Lily 之间的交流来演示。具体过程如下:
①初始状态(从上至下分别为 Jack、Lily、Carl):
②Lily 编辑“HELLO!”的字符串准备发送给 Jack:
③Lily 按下发送后 Jack 的接收结果:
④Carl 编辑“Hi!”发送给 Lily 同时 Lily 接收:
⑤Jack 编辑“HOW ARE U”发送给 Carl 同时 Carl 接收:
⑥特殊情况:当传送过来的数据经奇偶校验出错后给出报错提示:
二、网络的设计
物理层:
传输介质:
采用两条杜邦线连接单片机的两个 io 口,一个 io 口定时变换高低电平输出数据,另一
个 io 口定时检测电平高低来读取数据,实现了全双工通讯。
每台单片机都有 2 对(4 个)io 口可以发送接受数据,这为多台机器组成网络提供了基
础。
多台单片机连接方式:
我们用 3 台单片机组成了一条线似的结构,实际上这个网络还可以在边上扩展延长,这
个网络中不存在主机,每台机器都是平等的。
每台单片机收到信息后,都会将信息从另一对 io 口发出。每台单片机发送给信息时候,
也会将信息从两对 io 口同时发出,因此一旦有信息发送,信息会传播到整个网络。
编码技术:采用不归零电平编码方式(NRZ-L),高电平代表 1,低电平代表 0,每一 bit 数据的
持续时间是 31.108ms。由于每 bit 的持续时间决定了传输速率,因此传输数据可以通过简单
修改宏定义来实现,不过随着传输速率的提高,出错率会增加。
单片机 1
单片机 2
单片机 3
传输协议:采用异步传输方式,每次传输一个 bit。传输数据的格式如下
0
X
X
X
X
X
X
X
X
P
起始位
数据位
奇偶校验
数据链路层:
成帧技术采用的是字符计数成帧技术,首部的高 4 位代表接下来要发送的字符数
3(高四位)
1
3
2
1(高四位)
7
2(高四位)
8
4
计数首部
数据部分
数据部分
数据部分
计数首部
数据部分
计数首部
数据部分
数据部分
数据是由谁发出,数据发给谁:
这部分功能也是由字符首部来完成,首部的结构如下:
0
0
1
0
0
0
0
1
计数
目标地址
源地址
如上图所示,这个首部代表接下来还要发送 2 个字符,目标地址是 0,源地址是 1。
三、部分代码
3 台单片机的代码都是相同的,连接外部按键和显示器的引脚差别可以通过修改宏定义
来适配。因此只列出一台单片机的代码
1. main.h
#ifndef _main_h_
#define _main_h_
#define MYNAME "Jack"
#define NAME_NUM 2
#define BUTTON_IO P3
#define PRESS_LEFT 0x0E//k30
#define PRESS_RIGHT 0x0D //k31
#define CHANGE 0x0B //k32
#define SEND 0x07 //k33
#define PRESS_TIME 5000//按键消去抖动时间
#define ASCII 32
#define GPIO_KEY P3 //独立键盘用 P1 口
//carl Lily Jack Lisa