单片机多机通信实现
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
主机整体原理图如下:
图3—5主机原理图
两从机的原理图与主机的原理图仅仅的区别就是没有外接矩阵键盘,其他的都一样。
4电源电路设计
本系统主要供电为5V直流电,为了获得5V的直流电压和足够大的电流,并能提供两种接口,交流与直流输入都能通用,将电源电路设计成如下形式。
图3-6电源电路原理图
交流输入用15V的变压器,将变压器通过接口插到板子上。直流输入与交流输入类似,都要经过整流桥,确保电解电容C4不会反接,稳压电路公用,用MC7805实现5V直流稳压,最大可输出1A的电流,足以为整个系统供电。C5与C6用于防止稳压块产生自激振荡。C4用于滤波,使输入纹波很小,输出端接电容C7,用于防止输出电压突变。
{
lcd_wdat(Table1[m]);
delay(4);
unsigned char Table[16]=" ";
unsigned char Table4[]="welcome!";
unsigned char Table1[]="slave is 2";
unsigned char Table2[]="slave is 1";
unsigned char Table3[16]="send:";
图3-4 排阻符号
排阻具有九个引脚,一个公共端,另外八个脚分别接到需要接上拉电阻的单片机的P0口。排阻相当于8个大小均为10K的电阻,在电路中主要其电平转化作用,通过的电流很小,每只电阻的功耗也很小。如接5V电源,每只电阻的电流约为0.5mA,很小,但是由于P0口是接液晶,不用接排阻也能实现,本着节约的原则在本设计中没有接排阻。
en=0;
}
void lcd_init()
//1602初始化函数
{
lcd_wcom(0x38);
//8位数据,双列,5*7字形
lcd_wcom(0x0c);
//开启显示屏,关光标,光标不闪烁
lcd_wcom(0x06);
//显示地址递增,即写一个数据后,
显示位置右移一位
lcd_wcom(0x01); //清屏
液晶显示程序只许根据需要调用液晶模块内的函数即可,显示以字符形式输出。输出字符的ASCII码,液晶显示对应的字符。用指向code区的指针访问待显示的字符数据串来显示。
6结论
本设计解决了多单片机的串行通信问题,通信速度较快并具有一定的检错能力。但检错机制不够精确,难以保证很高的正确率,还需进一步完善。扩展功能:平权式多机通信协议,这样就可解决通信过程中,争用主机权问题,采用优先编码器为核心的主机权分配电路,可以使电路工作可靠稳定。
{
SEND_data(Buff);
RI=0;
while(!RI);
temp=SBUF;
RI=0;
}
}
void main()
{
uchar m;
lcd_init();
lcd_wcom(0x80);
//显示地址设为80H(即00H,)上排第一位
for(m=0;m<sizeof(Table4)-1;m++)
3.2矩阵键盘电路设计
图3-2 矩阵键盘电路
P1口接4×4的矩阵键盘,共16个按键,分别为0~C及“开始通信”,“选择从机”和“输入信息”键。P1.0~P1.3接矩阵键盘的行,P1.4~P1.7接矩阵键盘的列。
3.3液晶显示电路设计
液晶显示电路如下图:
图3-3 液晶LCD1602显示电路
P0口上拉10K×8的排阻,自己画的排阻符号如下:
对于1号单片机,还有液晶屏初始化这一步。1号单片机的主程序执行顺序:
图4-51号单片机主程序
定时器初始化使定时器一工作在方式二,波特率设置为9600b/s,并开中断。串口初始化使串口工作在方式三,9位数据位。发送与接收数据区的开始地址被已经被指定,用指针常量表示。发送数据初始化在发送数据区存放待发送的数据串,以空字符作为结束符。全局变量初始化只需根据需要设置即可。
//将table[]中的数据依次写入1602显示
{
lcd_wdat(Table[m]);
delay(4);
}
if(add!=0)
{
lcd_wcom(0x80+40);
//显示地址设为80H(即00H,)上排第一位
for(m=0;m<sizeof(Table1)-1;m++)
//将table[]中的数据依次写入1602显示
[5] 林雪每,彭佳红,姚志成.单片机多机通信协议的设计[J].单片机开发与应用,2006.2.
[6] 戴仙金.51单片机及其C语言程序开发实例[M].北京:清华大学出版社.2008.
7、完成效果
A、系统开始工作时的界面:
B、选择从机1:
传送信息CA6215,结果显示如下:
C、选择从机2:
传送信息CBA62,结果显示如下:
//主机等待从机返回其地址作为应答信号
{
TI=0; //发送从机地址
TB8=1; //发送地址帧
SBUF=addr;
while(!TI);
TI=0;
RI=0;
while(!RI);
temp=SBUF;
RI=0;
}
temp=_ERR_;
//主机等待从机数据接收成功信号
while(temp!=_SUCC_)
D、系统整体图:
程序:
主机
#include<reg51.h>
#include<string.h>
#define uint unsigned int
#define uchar unsigned char
#define _SUCC_ 0x0f//数据传送成功
#define _ERR_ 0xf0//数据传送失败
check=check^Buff[i];
TB8=0;
SBUF=Buff[i];
while(!TI);
TI=0;
}
TB8=0; //发送校验字节
SBUF=check;
while(!TI);
TI=0;
}
//向指定从机地址发送数据
void ADDR_data(unsigned addr)
{
while(temp!=addr)
按键处理为多分支结构,每个分支完成一种功能。具体流程如下:
图4-1按键处理流程图
通信方向设置流程如下:
图4-2通信方向设置流程图
从机选择流程如下:
图4-3从机选择流程图
5.3系统初始化程序设计
系统初始化程序包括定时器初始化、串口初始化、发送数据初始化和全局变量初始化。初始化步骤如下:
图4-4系统初始化步骤
//使能线电平变化,命令送入1602的8位数据口
en=0;
}
void lcd_wdat(uchar daΒιβλιοθήκη Baidu) //1602写数据函数
{
rs=1; //选择数据寄存器
rw=0; //选择写
P0=dat; //把要显示的数据送入P2
delay(5);
//延时一小会儿,让1602准备接收数据
en=1;
//使能线电平变化,数据送入1602的8位数据口
sbit KEY1=P3^2;
sbit KEY2=P3^3;
uchar start,add;
void delay_1ms(unsigned int t);
void jian() ;
//unsigned char addr;
//延时1ms函数
void delay_1ms(unsigned int t)
for(x=n;x>0;x--)
for(y=110;y>0;y--);
}
void lcd_wcom(uchar com) //1602写命令函数
{
rs=0; //选择指令寄存器
rw=0; //选择写
P0=com; //把命令字送入P2
delay(5);
//延时一小会儿,让1602准备接收数据
en=1;
5多机通信协议的算法设计
5.1主从机程序设计
主机模式流程如下:
图3-7 主机模式通信流程图
从机模式通信流程如下:
图3-8从机模式通信流程图
5.2键盘程序设计
1号单片机的按键采用矩阵形式,4×4的行列矩阵,共16个按键,可以完成多种控制功能。1号单片机的键盘程序包括:按键扫描、获取键值与按键处理几部分。按键处理又包括实现各种功能的函数。由键盘程序负责调度。键盘控制流程如下:
}
//缓冲区初始化
void Buff_init()
{
unsigned char i;
//将Table里的数据放到缓冲区里
for(i=0;i<9;i++)
{
Buff[i]= Table[i];
delay_1ms(100);
}
}
//串口初始化函数
void serial_init()
{
TMOD=0x20; //定时器1工作于方式2
unsigned char Buff[20]; //数据缓冲区
unsigned char temp=0xff;
sbit rs=P2^6; //1602的数据/指令选择控制线
sbit rw=P2^5; //1602的读写控制线
sbit en=P2^7; //1602的使能控制线
//void jian()
unsigned char check;
lenth=strlen(Buff); //计算数据长度
check=lenth;
TI=0; //发送数据长度
TB8=0; //发送数据帧
SBUF=lenth; //发送长度
while(!TI);
TI=0;
for(i=0;i<lenth;i++) //发送数据
{
{
unsigned int x,y;
for(x=t;x>0;x--)
for(y=110;y>0;y--);
}
void delay11()//延时程序
{
uint i,j;
for(i=0;i<=2;i++)
for(j=0;j<=200;j++);
}
void delay(uint n) //延时函数
{
uint x,y;
参考文献
[1] 吕汉兴,祁志勇.MCS—51系列单片机多机通信的实现[J].仪表技术,1999.3
[2]郭天祥,51单片机C语言教程——入门,提高,开发,拓展全攻略,2011.5
[3] 叶佩.MCS_51单片机的多机通信方式研究[J].计算技术与信息发展,2009.12.
[4] 杨玉军.单片机多机通信系统可靠性的研究[J].河南科学,2002.6.
单片机多机通信实现
1、设计要求
三片单片机利用串行口进行串行通信:串行通信的波特率为9600bit/s。串行口工作方式为方式1的单工串行通信。
2、设计方案
一个主机和两个从机,主机通过按键选择要通信的从机,按键确认后通过矩阵键盘输入要传输的信息,从机接收主机发送的信息并发回长度校验码给主机,主机确认校验信息是否正确,若正确,主机液晶显示“send:信息”和从机数,从机液晶显示所接收的信息;若错误则主机从发信息,重复前面的步骤。
图3-9按键控制流程图
按键扫描采用行扫描法,先输出全零行,再读看是否有按键按下,如有按键,则先消抖动,然后再次确认是否有按键,如果确有按键,再逐行置低电平扫描按下的键的行列位置,最后将按键对应位置的8位二进制码(即低四位表示行号,高四位表示列号)返回;若无按键,则返回0。
获取键值函数为Switch结构的散转程序,根据按键的行与列得到按键的键值,这里预先定义按键的键值为字符‘0’~‘C’、‘E’,‘C’’S’。以字符形式表示键值利于液晶直接显示。
//将table[]中的数据依次写入1602显示
{
lcd_wdat(Table4[m]);
delay(4);
}
delay_1ms(3000);
serial_init();
while(1)
{
jian();
lcd_wcom(0x80);
//显示地址设为80H(即00H,)上排第一位
for(m=0;m<sizeof(Table)-1;m++)
TH1=0xfd;
TL1=0xfd; //波特率为9600
PCON=0;
SCON=0xd0; //串口工作于方式3
TR1=1; //开启定时器
TI=0;
RI=0;
}
//发送数据函数
void SEND_data(unsigned char *Buff)
{
unsigned char i;
unsigned char lenth;
复位电路也可以换成看门狗电路实现,可使单片机可靠的复位。为了简化电路设计,本系统采用简单方法,可使单片机上电复位,此外可以通过按键手动复位。单片机上电即可复位,R1与C3的充电时间大于两倍的机器周期,使RST引脚有足够长的时间保存高电平,使单片机可靠的复位。正常工作时,按下按键SW1就可以使单片机复位。
3、硬件电路设计
3.1单片机最小系统的设计
本系统共用三块单片机,每块单片机均选用AT89S52,最小系统也都一样。由于三块单片机的主要任务是通信,为了得到准确的波特率,采用振荡频率为11.0592MHz的晶振,再接两个30pF的瓷片电容即可构成单片机的时钟电路。
单片机最小系统电路如下:
图3-1单片机最小系统电路
图3—5主机原理图
两从机的原理图与主机的原理图仅仅的区别就是没有外接矩阵键盘,其他的都一样。
4电源电路设计
本系统主要供电为5V直流电,为了获得5V的直流电压和足够大的电流,并能提供两种接口,交流与直流输入都能通用,将电源电路设计成如下形式。
图3-6电源电路原理图
交流输入用15V的变压器,将变压器通过接口插到板子上。直流输入与交流输入类似,都要经过整流桥,确保电解电容C4不会反接,稳压电路公用,用MC7805实现5V直流稳压,最大可输出1A的电流,足以为整个系统供电。C5与C6用于防止稳压块产生自激振荡。C4用于滤波,使输入纹波很小,输出端接电容C7,用于防止输出电压突变。
{
lcd_wdat(Table1[m]);
delay(4);
unsigned char Table[16]=" ";
unsigned char Table4[]="welcome!";
unsigned char Table1[]="slave is 2";
unsigned char Table2[]="slave is 1";
unsigned char Table3[16]="send:";
图3-4 排阻符号
排阻具有九个引脚,一个公共端,另外八个脚分别接到需要接上拉电阻的单片机的P0口。排阻相当于8个大小均为10K的电阻,在电路中主要其电平转化作用,通过的电流很小,每只电阻的功耗也很小。如接5V电源,每只电阻的电流约为0.5mA,很小,但是由于P0口是接液晶,不用接排阻也能实现,本着节约的原则在本设计中没有接排阻。
en=0;
}
void lcd_init()
//1602初始化函数
{
lcd_wcom(0x38);
//8位数据,双列,5*7字形
lcd_wcom(0x0c);
//开启显示屏,关光标,光标不闪烁
lcd_wcom(0x06);
//显示地址递增,即写一个数据后,
显示位置右移一位
lcd_wcom(0x01); //清屏
液晶显示程序只许根据需要调用液晶模块内的函数即可,显示以字符形式输出。输出字符的ASCII码,液晶显示对应的字符。用指向code区的指针访问待显示的字符数据串来显示。
6结论
本设计解决了多单片机的串行通信问题,通信速度较快并具有一定的检错能力。但检错机制不够精确,难以保证很高的正确率,还需进一步完善。扩展功能:平权式多机通信协议,这样就可解决通信过程中,争用主机权问题,采用优先编码器为核心的主机权分配电路,可以使电路工作可靠稳定。
{
SEND_data(Buff);
RI=0;
while(!RI);
temp=SBUF;
RI=0;
}
}
void main()
{
uchar m;
lcd_init();
lcd_wcom(0x80);
//显示地址设为80H(即00H,)上排第一位
for(m=0;m<sizeof(Table4)-1;m++)
3.2矩阵键盘电路设计
图3-2 矩阵键盘电路
P1口接4×4的矩阵键盘,共16个按键,分别为0~C及“开始通信”,“选择从机”和“输入信息”键。P1.0~P1.3接矩阵键盘的行,P1.4~P1.7接矩阵键盘的列。
3.3液晶显示电路设计
液晶显示电路如下图:
图3-3 液晶LCD1602显示电路
P0口上拉10K×8的排阻,自己画的排阻符号如下:
对于1号单片机,还有液晶屏初始化这一步。1号单片机的主程序执行顺序:
图4-51号单片机主程序
定时器初始化使定时器一工作在方式二,波特率设置为9600b/s,并开中断。串口初始化使串口工作在方式三,9位数据位。发送与接收数据区的开始地址被已经被指定,用指针常量表示。发送数据初始化在发送数据区存放待发送的数据串,以空字符作为结束符。全局变量初始化只需根据需要设置即可。
//将table[]中的数据依次写入1602显示
{
lcd_wdat(Table[m]);
delay(4);
}
if(add!=0)
{
lcd_wcom(0x80+40);
//显示地址设为80H(即00H,)上排第一位
for(m=0;m<sizeof(Table1)-1;m++)
//将table[]中的数据依次写入1602显示
[5] 林雪每,彭佳红,姚志成.单片机多机通信协议的设计[J].单片机开发与应用,2006.2.
[6] 戴仙金.51单片机及其C语言程序开发实例[M].北京:清华大学出版社.2008.
7、完成效果
A、系统开始工作时的界面:
B、选择从机1:
传送信息CA6215,结果显示如下:
C、选择从机2:
传送信息CBA62,结果显示如下:
//主机等待从机返回其地址作为应答信号
{
TI=0; //发送从机地址
TB8=1; //发送地址帧
SBUF=addr;
while(!TI);
TI=0;
RI=0;
while(!RI);
temp=SBUF;
RI=0;
}
temp=_ERR_;
//主机等待从机数据接收成功信号
while(temp!=_SUCC_)
D、系统整体图:
程序:
主机
#include<reg51.h>
#include<string.h>
#define uint unsigned int
#define uchar unsigned char
#define _SUCC_ 0x0f//数据传送成功
#define _ERR_ 0xf0//数据传送失败
check=check^Buff[i];
TB8=0;
SBUF=Buff[i];
while(!TI);
TI=0;
}
TB8=0; //发送校验字节
SBUF=check;
while(!TI);
TI=0;
}
//向指定从机地址发送数据
void ADDR_data(unsigned addr)
{
while(temp!=addr)
按键处理为多分支结构,每个分支完成一种功能。具体流程如下:
图4-1按键处理流程图
通信方向设置流程如下:
图4-2通信方向设置流程图
从机选择流程如下:
图4-3从机选择流程图
5.3系统初始化程序设计
系统初始化程序包括定时器初始化、串口初始化、发送数据初始化和全局变量初始化。初始化步骤如下:
图4-4系统初始化步骤
//使能线电平变化,命令送入1602的8位数据口
en=0;
}
void lcd_wdat(uchar daΒιβλιοθήκη Baidu) //1602写数据函数
{
rs=1; //选择数据寄存器
rw=0; //选择写
P0=dat; //把要显示的数据送入P2
delay(5);
//延时一小会儿,让1602准备接收数据
en=1;
//使能线电平变化,数据送入1602的8位数据口
sbit KEY1=P3^2;
sbit KEY2=P3^3;
uchar start,add;
void delay_1ms(unsigned int t);
void jian() ;
//unsigned char addr;
//延时1ms函数
void delay_1ms(unsigned int t)
for(x=n;x>0;x--)
for(y=110;y>0;y--);
}
void lcd_wcom(uchar com) //1602写命令函数
{
rs=0; //选择指令寄存器
rw=0; //选择写
P0=com; //把命令字送入P2
delay(5);
//延时一小会儿,让1602准备接收数据
en=1;
5多机通信协议的算法设计
5.1主从机程序设计
主机模式流程如下:
图3-7 主机模式通信流程图
从机模式通信流程如下:
图3-8从机模式通信流程图
5.2键盘程序设计
1号单片机的按键采用矩阵形式,4×4的行列矩阵,共16个按键,可以完成多种控制功能。1号单片机的键盘程序包括:按键扫描、获取键值与按键处理几部分。按键处理又包括实现各种功能的函数。由键盘程序负责调度。键盘控制流程如下:
}
//缓冲区初始化
void Buff_init()
{
unsigned char i;
//将Table里的数据放到缓冲区里
for(i=0;i<9;i++)
{
Buff[i]= Table[i];
delay_1ms(100);
}
}
//串口初始化函数
void serial_init()
{
TMOD=0x20; //定时器1工作于方式2
unsigned char Buff[20]; //数据缓冲区
unsigned char temp=0xff;
sbit rs=P2^6; //1602的数据/指令选择控制线
sbit rw=P2^5; //1602的读写控制线
sbit en=P2^7; //1602的使能控制线
//void jian()
unsigned char check;
lenth=strlen(Buff); //计算数据长度
check=lenth;
TI=0; //发送数据长度
TB8=0; //发送数据帧
SBUF=lenth; //发送长度
while(!TI);
TI=0;
for(i=0;i<lenth;i++) //发送数据
{
{
unsigned int x,y;
for(x=t;x>0;x--)
for(y=110;y>0;y--);
}
void delay11()//延时程序
{
uint i,j;
for(i=0;i<=2;i++)
for(j=0;j<=200;j++);
}
void delay(uint n) //延时函数
{
uint x,y;
参考文献
[1] 吕汉兴,祁志勇.MCS—51系列单片机多机通信的实现[J].仪表技术,1999.3
[2]郭天祥,51单片机C语言教程——入门,提高,开发,拓展全攻略,2011.5
[3] 叶佩.MCS_51单片机的多机通信方式研究[J].计算技术与信息发展,2009.12.
[4] 杨玉军.单片机多机通信系统可靠性的研究[J].河南科学,2002.6.
单片机多机通信实现
1、设计要求
三片单片机利用串行口进行串行通信:串行通信的波特率为9600bit/s。串行口工作方式为方式1的单工串行通信。
2、设计方案
一个主机和两个从机,主机通过按键选择要通信的从机,按键确认后通过矩阵键盘输入要传输的信息,从机接收主机发送的信息并发回长度校验码给主机,主机确认校验信息是否正确,若正确,主机液晶显示“send:信息”和从机数,从机液晶显示所接收的信息;若错误则主机从发信息,重复前面的步骤。
图3-9按键控制流程图
按键扫描采用行扫描法,先输出全零行,再读看是否有按键按下,如有按键,则先消抖动,然后再次确认是否有按键,如果确有按键,再逐行置低电平扫描按下的键的行列位置,最后将按键对应位置的8位二进制码(即低四位表示行号,高四位表示列号)返回;若无按键,则返回0。
获取键值函数为Switch结构的散转程序,根据按键的行与列得到按键的键值,这里预先定义按键的键值为字符‘0’~‘C’、‘E’,‘C’’S’。以字符形式表示键值利于液晶直接显示。
//将table[]中的数据依次写入1602显示
{
lcd_wdat(Table4[m]);
delay(4);
}
delay_1ms(3000);
serial_init();
while(1)
{
jian();
lcd_wcom(0x80);
//显示地址设为80H(即00H,)上排第一位
for(m=0;m<sizeof(Table)-1;m++)
TH1=0xfd;
TL1=0xfd; //波特率为9600
PCON=0;
SCON=0xd0; //串口工作于方式3
TR1=1; //开启定时器
TI=0;
RI=0;
}
//发送数据函数
void SEND_data(unsigned char *Buff)
{
unsigned char i;
unsigned char lenth;
复位电路也可以换成看门狗电路实现,可使单片机可靠的复位。为了简化电路设计,本系统采用简单方法,可使单片机上电复位,此外可以通过按键手动复位。单片机上电即可复位,R1与C3的充电时间大于两倍的机器周期,使RST引脚有足够长的时间保存高电平,使单片机可靠的复位。正常工作时,按下按键SW1就可以使单片机复位。
3、硬件电路设计
3.1单片机最小系统的设计
本系统共用三块单片机,每块单片机均选用AT89S52,最小系统也都一样。由于三块单片机的主要任务是通信,为了得到准确的波特率,采用振荡频率为11.0592MHz的晶振,再接两个30pF的瓷片电容即可构成单片机的时钟电路。
单片机最小系统电路如下:
图3-1单片机最小系统电路