1、单片机的双机通信有短距离和长距离之分,1m之内的通信称为短距离,100m左右的通信叫长距离。若要更长的距离通信,如几十或几千米,就需要借助其他无线设备方可实现。通常单片机通信可以有以下4种实现方式:TTL电平通信(双机串行口直接互联)、RS-232C通信、RS-422A通信、RS-485通信等,不同的传输方式各有自己的特点。
2、TTL电平通信时,直接将单片机A的TXD端接单片机的RXD端,单片机的RXD端接单片机的TXD端。需要强调的是,两个单片机系统必须共地,即把它们的系统电源地线要连接在一起。
3、RS-232C是EIA(美国电子工业协会)1969年制定的通信标准。RS-232C定义了数据终端(DTE)与数据通信设备(DCE)之间的物理接口标准。
4、RS-232C引脚定义:
引脚号 | 名称 | 名称缩写 | 信号方向 | 说明 |
1 | frame ground | FG | 屏蔽地线 | |
2 | transmitted data | TXD | 从DTE至DCE | 传送数据线 |
3 | received data | RXD | 从DCE至DTE | 接受数据线 |
4 | request to send | RTS | 从DTE至DCE | 请求发送 |
5 | clear to send | CTS | 从DCE至DTE | 允许发送 |
6 | data set ready | DSR | 从DCE至DTE | 数据设备(DCE)准备好 |
7 | signal ground | SG | 信号逻辑地线 | |
8 | data carrier detect | DCD | 从DCE至DTE | 数据载波检测 |
9 | reserved | 备用 | ||
10 | reserved | 备用 | ||
11 | unassigned | 未定义 | ||
12 | secondary data carrier detect | DCD | 从DCE至DTE | 数据载波检测(二次通道) |
13 | secondary clear to send | CTS | 从DCE至DTE | 允许发送(二次通道) |
14 | secondary transmintted data | TXD | 从DTE至DCE | 传送数据(二次通道) |
15 | transmit clock | TXC | 从DCE至DTE | 传送时钟 |
16 | secondary received data | RXD | 从DCE至DTE | 接受数据线(二次通道) |
17 | received clock | RXC | 从DTE至DCE | 接受时钟 |
18 | unassigned | 未定义 | ||
19 | secondary request send | RTS | 从DTE至DCE | 请求发送(二次通道) |
20 | data terminal ready | DTR | 从DTE至DCE | 数据终端准备好 |
21 | signal quality detect | SQD | 从DCE至DTE | 信号质量检测 |
22 | ring indicator | RI | 从DCE至DTE | 振铃指示 |
23 | data rate select | DRS | 从DTE至DCE | 数据速率选择。它是针对21引脚改变的答应 |
24 | external transmit clock | 从DTE至DCE | 外部发送时钟 | |
25 | unassigned | 未定义 |
但我们用RS232C标准进行两个单片机之间通信时,只需要用到三条线:RXD、TXD和GND。
4、RS232C电平传输数据时,相比TTL电平距离要远,RS-232C总线标准电容允许接受电容允许值的约束,使用时传输距离一般不要超过15m(线路好时也不要超过30m)。其最高传输速率为20kbps。RS-232C总线标准要求收、发方必须共地。
5、如果两个单片机通信时都使用串口方式1,需要特别注意,必须保证两单片机系统的通信波特率完全一致,否则必定收不到数据。
6、当写双向数据传输程序时,需要注意一点,在发送数据时一定要把串口中断关闭,否则同样也会进入串口中断服务程序,进而影响程序的正常工作。
7、我写的单片机间的单向传输的程序:
发送:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
void delay(uint del)
{
uint i,j;
for(i=0;i<del;i++)
for(j=0;j<1827;j++)
;
}
void send(uint key_num)
{
SBUF=key_num;
while(!TI);
TI=0;
}
void main()
{
uchar a=87;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
while(1)
{
//发送数字
send(21);
delay(10);
}
}
#define uchar unsigned char
#define uint unsigned int
void delay(uint del)
{
uint i,j;
for(i=0;i<del;i++)
for(j=0;j<1827;j++)
;
}
void send(uint key_num)
{
SBUF=key_num;
while(!TI);
TI=0;
}
void main()
{
uchar a=87;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
while(1)
{
//发送数字
send(21);
delay(10);
}
}
接收:
#include <reg52.h>
#include "lcd12864.h"
#define uchar unsigned char
#define uint unsigned int
uchar shi,ge;
uint temp;
void delay(uint del)
{
uint i,j;
for(i=0;i<del;i++)
for(j=0;j<1827;j++)
;
}
void display_shu(uchar a) //显示数字
{
write_com(0x80);
shi=a/10;
ge=a%10;
write_data(shi+0x30);
write_data(ge+0x30);
delay(1);
}
void display_word(uchar a)//显示字母
{
write_com(0x80);
write_data(a);
delay(1);
}
void main()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
//初始化12864LCD
CH = 0;
LCD12864_delay(1);
lcdinit();
LCD12864_delay(10);
while(1);
}
void ser() interrupt 4
{
uchar a;
RI=0;
a=SBUF;
display_shu(a);
}
#include "lcd12864.h"
#define uchar unsigned char
#define uint unsigned int
uchar shi,ge;
uint temp;
void delay(uint del)
{
uint i,j;
for(i=0;i<del;i++)
for(j=0;j<1827;j++)
;
}
void display_shu(uchar a) //显示数字
{
write_com(0x80);
shi=a/10;
ge=a%10;
write_data(shi+0x30);
write_data(ge+0x30);
delay(1);
}
void display_word(uchar a)//显示字母
{
write_com(0x80);
write_data(a);
delay(1);
}
void main()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
//初始化12864LCD
CH = 0;
LCD12864_delay(1);
lcdinit();
LCD12864_delay(10);
while(1);
}
void ser() interrupt 4
{
uchar a;
RI=0;
a=SBUF;
display_shu(a);
}
我本来想着传送数据,可是到后来才发现,这个串口只能发送8位的数据。还有就是在多次发送时,存在一些问题,不知有没有高手可以指点一下。关于多次发送和发送汉字。
8、单片机构成的多机系统采用总线型主从式结构。所谓主从式,即在数个单片机中,有一个是主机,其余的是从机,从机要服从主机的调度、支配。51单片机的串行口方式2和方式3适用于这种主从式通信结构。当然,采用不同的通信标准时,还需进行相应的点评转换,有时还要对信号进行光电隔离。在实际的多机应用系统中,才有RS-485串行标准总线进行数据传输。