基于单片机的多机通信系统
- 格式:docx
- 大小:25.17 KB
- 文档页数:25
一、多机通信原理在多机通信中,主机必须要能对各个从机进行识别,在51系列单片机中可以通过SCON 寄存器的SM2位来实现。
当串口以方式2或方式3发送数据时,每一帧信息都是11位,第9位是数据可编程位,通过给TB8置1或置0来区别地址帧和数据帧,当该位为1时,发送地址帧;该位为0时,发送数据帧。
在多机通信过程中,主机先发送某一从机的地址,等待从机的应答,所有的从机接收到地址帧后与本机地址进行比较,若相同,则将SM2置0准备接收数据;若不同,则丢弃当前数据,SM2位不变。
二、多机通信电路图此处,U1作为主机,U2为从机1,U3为从机2。
三、C语言程序(1)主机程序#include<reg51.h>#include<string.h>#define _SUCC_ 0x0f//数据传送成功#define _ERR_ 0xf0//数据传送失败unsigned char Table[9]={0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; unsigned char Buff[20]; //数据缓冲区unsigned char temp=0xff;sbit KEY1=P1^6;sbit KEY2=P1^7;//unsigned char addr;//延时1ms函数void delay_1ms(unsigned int t){unsigned int x,y;for(x=t;x>0;x--)for(y=110;y>0;y--);}//缓冲区初始化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工作于方式2TH1=0xfd;TL1=0xfd; //波特率为9600PCON=0;SCON=0xd0; //串口工作于方式3TR1=1; //开启定时器TI=0;RI=0;}//发送数据函数void SEND_data(unsigned char *Buff){unsigned char i;unsigned char lenth;unsigned char check;lenth=strlen(Buff); //计算数据长度check=lenth;TI=0; //发送数据长度TB8=0; //发送数据帧SBUF=lenth;while(!TI);TI=0;for(i=0;i<lenth;i++) //发送数据{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) //主机等待从机返回其地址作为应答信号{TI=0; //发送从机地址TB8=1; //发送地址帧SBUF=addr;while(!TI);TI=0;RI=0;while(!RI);temp=SBUF;RI=0;}temp=_ERR_; //主机等待从机数据接收成功信号while(temp!=_SUCC_){SEND_data(Buff);RI=0;while(!RI);temp=SBUF;RI=0;}}void main(){Buff_init();serial_init();while(1){if(KEY1==0){delay_1ms(5);if(KEY1==0){while(!KEY1);ADDR_data(0x01);}}if(KEY2==0){delay_1ms(5);if(KEY2==0){while(!KEY2);ADDR_data(0x02);}}}}(2)从机1程序#include<reg51.h>#include<string.h>#define addr 0x01//从机1的地址#define _SUCC_ 0x0f//数据传送成功#define _ERR_ 0xf0//数据传送失败unsigned char aa=0xff;//主机与从机之间通信标志unsigned char Buff[20];//数据缓冲区//串口初始化函数void serial_init(){TMOD=0x20; //定时器1工作于方式2TH1=0xfd;TL1=0xfd; //波特率为9600PCON=0;SCON=0xd0; //串口工作于方式3TR1=1; //开启定时器TI=0;RI=0;}//接收数据函数unsigned char RECE_data(unsigned char *Buff) {unsigned char i,temp;unsigned char lenth;unsigned char check;RI=0; //接收数据长度while(!RI);if(RB8==1) //若接收到地址帧,则返回0xfereturn 0xfe;lenth=SBUF;RI=0;check=lenth;for(i=0;i<lenth;i++) //接收数据{while(!RI);if(RB8==1) //若接收到地址帧,则返回0xfereturn 0xfe;Buff[i]=SBUF;check=check^(Buff[i]);RI=0;}while(!RI); //接收校验字节if(RB8==1) //若接收到地址帧,则返回0xfereturn 0xfe;temp=SBUF;RI=0;check=temp^check; //将从主机接收到的校验码与自己计算的校验码比对if(check!=0) //校验码不一致,表明数据接收错误,向主机发送错误信号,函数返回0xff {TI=0;TB8=0;SBUF=_ERR_;while(!TI);TI=0;return 0xff;}TI=0; //校验码一致,表明数据接收正确,向主机发送成功信号,函数返回0x00 TB8=0;SBUF=_SUCC_;while(!TI);TI=0;return 0;}void main(){serial_init();while(1){SM2=1; //接收地址帧while(aa!=addr) //从机等待主机请求自己的地址{RI=0;while(!RI);aa=SBUF;RI=0;}TI=0; //一旦被请求,从机返回自己的地址作为应答,等待接收数据 TB8=0;SBUF=addr;while(!TI);TI=0;SM2=0; //接收数据帧aa=0xff; //从机接收数据,并将数据保存到数据缓冲区while(aa==0xff){aa=RECE_data(Buff);}if(aa==0xfe)continue;P1=Buff[1]; //查看接收到的数据}}(3)从机2程序#include<reg51.h>#include<string.h>#define addr 0x02//从机2的地址#define _SUCC_ 0x0f//数据传送成功#define _ERR_ 0xf0//数据传送失败unsigned char aa=0xff;//主机与从机之间通信标志unsigned char Buff[20];//数据缓冲区//串口初始化函数void serial_init(){TMOD=0x20; //定时器1工作于方式2TH1=0xfd;TL1=0xfd; //波特率为9600PCON=0;SCON=0xd0; //串口工作于方式3TR1=1; //开启定时器TI=0;RI=0;}//接收数据函数unsigned char RECE_data(unsigned char *Buff){unsigned char i,temp;unsigned char lenth;unsigned char check;RI=0; //接收数据长度while(!RI);if(RB8==1) //若接收到地址帧,则返回0xfereturn 0xfe;lenth=SBUF;RI=0;check=lenth;for(i=0;i<lenth;i++) //接收数据{while(!RI);if(RB8==1) //若接收到地址帧,则返回0xfereturn 0xfe;Buff[i]=SBUF;check=check^(Buff[i]);RI=0;}while(!RI); //接收校验字节if(RB8==1) //若接收到地址帧,则返回0xfereturn 0xfe;temp=SBUF;RI=0;check=temp^check; //将从主机接收到的校验码与自己计算的校验码比对if(check!=0) //校验码不一致,表明数据接收错误,向主机发送错误信号,函数返回0xff {TI=0;TB8=0;SBUF=_ERR_;while(!TI);TI=0;return 0xff;}TI=0; //校验码一致,表明数据接收正确,向主机发送成功信号,函数返回0x00 TB8=0;SBUF=_SUCC_;while(!TI);TI=0;return 0;}void main(){serial_init();while(1){SM2=1; //接收地址帧while(aa!=addr) //从机等待主机请求自己的地址{RI=0;while(!RI);aa=SBUF;RI=0;}TI=0; //一旦被请求,从机返回自己地址作为应答,等待接收数据TB8=0;SBUF=addr;while(!TI);TI=0;SM2=0; //接收数据帧aa=0xff; //从机接收数据,并将数据保存到数据缓冲区while(aa==0xff){aa=RECE_data(Buff);}if(aa==0xfe)continue;P1=Buff[2]; //查看接收到的数据}}。
89C52单片机多机通信一、设置定时器的工作方式及初值:TMOD=0x20;TH1=0xF4;TL1=0xF4;二、设置串口寄存器的工作方式SCON=0x90;PCON|=0x80;其中SCON各位为PCON各位为SM2=1时:RB8=1 产生中断RB8=0 不产生中断SM2=0时,产生中断四、多机通信过称:主机>>>>>>地址码+RB8=1>>>>>从机从机判断地址码与之对应则SM2=0主机>>>>>>数据码+RB8=0>>>>>从机从机接收数据五、参考程序(经过实验认证)主机#include<reg52.h>int a;void init(){EA=0;TMOD=0x20;TH1=0xF4;TL1=0xF4;SCON=0x90;PCON|=0x80;EA=1;ES=1;ET1=1;TR1=1;TI=0;RI=0;SM2=1;}void delay(){int j,k;for(j=0;j<300;j++)for(k=0;k<1000;k++); }main(){init();TB8=1;SBUF=0x01;delay();TB8=0;SBUF=0x88;delay();TB8=0x02;SBUF=0x66;while(1);}从机1:地址0x01#include<reg52.h>int a;void init(){EA=0;TMOD=0x20;TH1=0xF4;TL1=0xF4;SCON=0x90;PCON|=0x80;EA=1;ES=1;ET1=1;TR1=1;TI=0;RI=0;SM2=1;}void delay(){int j,k;for(j=0;j<1000;j++) for(k=0;k<1000;k++); }main()while(1)P1=0xff;}void serial () interrupt 4{ if(RI==1){ RI=0;if(SBUF==0x01) SM2=0;else if((SBUF!=0x01)&&(TB8==1)) SM2=1;else {P1=SBUF;delay();}}else TI=0;} /* */从机2 地址0x02#include<reg52.h>int a;void init(){EA=0;TMOD=0x20;TH1=0xF4;TL1=0xF4;SCON=0x90;PCON|=0x80;EA=1;ES=1;TR1=1;TI=0;RI=0;SM2=1;}void delay(){int j,k;for(j=0;j<1000;j++)for(k=0;k<300;k++);}main(){init();while(1)P1=0xff;}void serial () interrupt 4{ if(RI==1){ RI=0;if(SBUF==0x02) SM2=0;else if((SBUF!=0x02)&&(TB8==1)) SM2=1;else {P1=SBUF;delay();}}else TI=0; } /* */。
51单片机的多机通信原理1. 什么是51单片机的多机通信?51单片机的多机通信是指在多个51单片机之间进行数据传输和通信的过程。
通过多机通信,可以实现不同单片机之间的数据共享和协作,从而实现更加复杂的功能。
2. 多机通信的原理是什么?多机通信的原理是通过串口进行数据传输。
在多个单片机之间,可以通过串口进行数据的发送和接收。
通过定义好的协议,可以实现数据的传输和解析,从而实现多机之间的通信。
3. 多机通信的步骤是什么?多机通信的步骤包括以下几个方面:(1)定义好通信协议:在多机通信之前,需要定义好通信协议,包括数据的格式、传输方式等。
(2)设置串口参数:在单片机中,需要设置好串口的参数,包括波特率、数据位、停止位等。
(3)发送数据:在发送数据之前,需要将数据按照协议进行格式化,然后通过串口发送出去。
(4)接收数据:在接收数据之前,需要设置好串口的中断,然后在中断中接收数据,并按照协议进行解析。
(5)处理数据:在接收到数据之后,需要对数据进行处理,包括数据的存储、显示等。
4. 多机通信的应用场景有哪些?多机通信的应用场景非常广泛,包括以下几个方面:(1)智能家居系统:通过多机通信,可以实现智能家居系统中不同设备之间的数据共享和协作。
(2)工业控制系统:在工业控制系统中,多机通信可以实现不同设备之间的数据传输和控制。
(3)智能交通系统:在智能交通系统中,多机通信可以实现不同设备之间的数据共享和协作,从而实现更加智能化的交通管理。
(4)机器人控制系统:在机器人控制系统中,多机通信可以实现不同机器人之间的数据传输和控制,从而实现更加复杂的任务。
5. 多机通信的优缺点是什么?多机通信的优点包括以下几个方面:(1)实现数据共享和协作:通过多机通信,可以实现不同设备之间的数据共享和协作,从而实现更加复杂的功能。
(2)提高系统的可靠性:通过多机通信,可以实现数据的备份和冗余,从而提高系统的可靠性。
(3)提高系统的扩展性:通过多机通信,可以实现系统的模块化设计,从而提高系统的扩展性。
51 单片机串口多机通信的实现和编程
一、51 单片机的主从模式,首先要设定工作方式3:(主从模式+波特率可变)
SCON 串口功能寄存器:SM0=1;SM1=1(工作方式3)
注:主机和从机都要为工作方式3。
【工作方式2 (SM0 SM1 :1 0):串行口为11 位异步通信接口。
发送或接收
一帧信息包括1 位起始位0、8 位数据位、1 位可编程位、1 位停止位1。
发
送数据:发送前,先根据通信协议由软件设置TB8 为奇偶校验位或数据标识位,然后将要发送的数据写入SBUF,即能启动发送器。
发送过程是由执行任何一条以SBUF 为目的寄存器的指令而启动的,把8 位数据装入SBUF,
同时还把TB8 装到发送移位寄存器的第9 位上,然后从TXD(P3.1)端口输出
一帧数据。
接收数据:先置REN=1,使串行口为允许接收状态,同时还要将RI 清0。
然后再根据SM2 的状态和所接收到的RB8 的状态决定此串行口在
信息到来后是否置R1=1,并申请中断,通知CPU 接收数据。
当SM2=0 时,
不管RB8 为0 还是为1,都置RI=1,此串行口将接收发送来的信息。
当
SM2=1 时,且RB8=1,表示在多机通信情况下,接收的信息为地址帧, 此时
置RI=1,串行口将接收发来的地址。
当SM2=1 时,且RB8=0,表示在多机通
信情况下,接收的信息为数据帧, 但不是发给本从机的,此时RI 不置为1,。
基于51单片机的多机通信系统设计多机通信系统是指通过一台主机与多台从机之间进行数据交互和通信的系统。
在本设计中,我们将使用51单片机实现一个基于串行通信的多机通信系统。
系统硬件设计如下:1.主机:使用一个51单片机作为主机,负责发送数据和接收数据。
2.从机:使用多个51单片机作为从机,每个从机负责接收数据和发送数据给主机。
3.串口:主机和从机之间通过串口进行通信。
我们可以使用RS232标准通信协议。
系统软件设计如下:1.主机设计:a.初始化串口:设置串口参数,如波特率、数据位、停止位等。
b.发送数据:将需要发送的数据存储在发送缓冲区中,通过串口发送给从机。
c.接收数据:接收从机发送的数据,并存储在接收缓冲区中。
2.从机设计:a.初始化串口:设置串口参数,如波特率、数据位、停止位等。
b.接收数据:接收主机发送的数据,并存储在接收缓冲区中。
c.发送数据:将需要发送的数据存储在发送缓冲区中,通过串口发送给主机。
系统工作流程如下:1.主机启动,执行初始化操作,包括初始化串口。
2.从机启动,执行初始化操作,包括初始化串口。
3.主机发送数据给从机:主机将需要发送的数据存储在发送缓冲区中,通过串口发送给从机。
4.从机接收并处理数据:从机接收主机发送的数据,并存储在接收缓冲区中,对接收到的数据进行处理。
5.从机发送数据给主机:从机将需要发送的数据存储在发送缓冲区中,通过串口发送给主机。
6.主机接收并处理数据:主机接收从机发送的数据,并存储在接收缓冲区中,对接收到的数据进行处理。
7.主机和从机循环执行步骤3-6,实现多机之间的数据交互和通信。
多机通信系统的设计考虑到以下几个方面:1.硬件设计:需要合理选择单片机和串口的类型和参数,确保系统的稳定性和可靠性。
2.软件设计:需要设计适应系统需求的通信协议和数据处理提取方法,保证数据的准确性和完整性。
3.通信协议:需要定义主机和从机之间的通信协议,包括数据的格式、传输方式等,以便实现正确的数据交互。
单片机_双机通信在现代科技的快速发展下,单片机已经成为了许多行业中不可或缺的一部分。
在各种应用场景中,单片机需要与其他设备进行通信,以实现信息的传递和交换。
而双机通信作为单片机应用中的重要环节之一,具有广泛的使用和研究价值。
本文将就单片机的双机通信进行详细阐述。
单片机作为嵌入式系统的核心部件,主要负责信息的处理和控制任务。
双机通信即指通过串行通信或并行通信方式,实现两个或多个单片机之间的数据传输和互动。
双机通信的实现可以有效提高系统的性能和灵活性,实现分布式处理,充分发挥多个单片机的优势。
一、串行通信的双机通信方式串行通信是一种逐位传输数据的通信方式,适用于简单、低速度的通信需求。
在双机通信中,串行通信通常采用两根传输线分别传送数据和时钟信号。
通过在不同的时间段传输不同的位,实现数据的传输。
串行通信的优点在于线路简单,成本低。
在双机通信中,可以利用串行通信实现两个单片机之间的数据传输和控制。
通过一定的通信协议,可以准确地控制数据的传输顺序和时机,保障通信的准确性和可靠性。
二、并行通信的双机通信方式并行通信是一种同时传输多个位的通信方式,适用于高速、大容量的通信需求。
在双机通信中,可以通过并行通信实现多个单片机之间的数据传输和互动。
并行通信的优点在于传输速度快,适合传输大量数据。
在双机通信中,通过并行通信可以实现多个单片机之间的数据传输和共享。
通过并行通信总线,各个单片机可以同时传输和接收数据,实现高效的通信和协同工作。
三、双机通信的应用实例双机通信在实际应用中具有广泛的应用价值。
以智能家居系统为例,双机通信可以实现各个设备之间的信息传递和控制。
通过单片机之间的双机通信,可以实现智能家居系统中各个设备的联动和协同工作,提高系统的智能化水平和用户体验。
另外,双机通信在工业自动化领域也有着重要的应用。
通过单片机之间的双机通信,可以实现工业自动化系统中各个设备的数据采集、传输和控制。
实时的双机通信可以高效地监控和控制工业生产过程,提高生产效率和质量。
单片机多机通信在单片机多机通信过程中,PC机将指令打包后发给智能接口单元(以下简称主单片机)。
主单片机收到完整一包后将包解开,按对每个从机的指令分别发送,同时将各从机发给PC机的指令送给PC机。
由于64个从机和主单片机使用同一串口通信线,为避免发生冲突,主单片机处于主动状态,按一定的定时间隔与每一台从机顺序通信。
主单片机在与每一台从机通信过程中先发送地址,从机收到地址后若与自己的地址一致,则继续接收主单片机发来的一个字节的命令码,从机收到命令后,将自己的一个字节的命令发送到主单片机。
主单片机完成与64个从机的通信需要64个定时间隔,只要定时间隔足够短,主单片机与从机基本上可以实现实时通信。
在整个通信过程中,主单片机起着通信枢纽的作用。
单片机多机通信过程安排如下:使所有从机的SM2位置1,处于只接收地址帧的状态;主机发送一帧地址信息,其中包含8位地址,第9位为地址、数据标志位,第9位置1表示发送的是地址;从机接收到地址帧后,各自将所接收的地址与本从机的地址相比较,对于地址相符的从机,使SM2清0以接收主机随后发来的信息,对于地址不相符的从机,仍保持SM2=1状态,对主机随后发送的数据不予理睬,直至发送新的地址帧;主机发送控制指令与数据,给被寻址的从机数据帧的第9位置0,表示发送的是数据。
�单片机程序采用PLM51语言设计,主单片机定时中断服务程序框图如图4所示。
主单片机RS-485串行口接收和发送中段服务程序框图如图5所示。
主单片机RS-232C串行口接收中断服务程序如图6所示。
从单片机RS-485串行口接收和发送中段服务程序框图如图7所示。
主单片机在主程序中以查询方式将各从机送来的数据从内存中读出后顺序发送给上位PC机。
程序清单略。
图1 RS485通信接口原理图2 单片机多机通信硬件电路设计中需注意的问题2.1 电路基本原理某节点的硬件电路设计如图1所示,在该电路中,使用了一种RS-485接口芯片SN75LBC184,它采用单一电源Vcc,电压在+3~+5.5 V范围内都能正常工作。
目录一、题目要求与功能分析 (2)1.1题目要求 (2)1.2功能及整体模块分析 (2)二方案论证 (3)2.1设计目的 (3)2.2设计思路 (3)2.2.1原理分析和讨论 (3)2.2.2题设分析 (4)三、电路设计 (6)3.1 整体功能框架设计 (6)3.2 硬件电路设计 (7)3.2.1 主机硬件电路设计 (8)3.2.2 从机硬件电路设计 (11)3.3软件电路设计 (13)3.3.1 协议设计 (13)3.3.2 主机程序流程图设计 (14)3.3.3 从机程序流程图设计 (15)四系统的调试与实现 (17)4.1主机模块功能调试 (17)4.2从机模块调试 (17)4.3整体设计功能调试 (17)五总结与体会 (19)参考文献 (20)附录 (21)一、题目要求与功能分析1.1题目要求本小组的试验题目如下:一、任务:设计实现多台单片机系统之间的串行通信二、基本要求(难度系数0.8):(1)设计一个主从式多机通信系统,包含1台主机和3台从机,主机和从机全部为单片机;(2)选择合适总线接口芯片,正确连接主机和从机;(3)编程实现分布式数据采集功能,主机可以获取各分机当前AD转换结果,并显示。
三、发挥部分:(1)完善通信功能。
(根据完成情况加分,上限+0.2)1.2功能及整体模块分析随着工业化要求提高,分布式系统发展以及控制设备与监控设备之间通讯需要,多机通信系统设计的监控系统逐步普及。
此多机通信系统具有友好的人机操作界面、强大的IO设备端口驱动能力,可与各种PLC、智能仪表、智能模块、板卡、变频器等实时通讯。
在检测大量模拟量的工业现场使用相似的多机通讯系统;单片机接口丰富,与A/D转换模块组合可以完成相同的工作,并且系统可靠、成本低。
本次实验的目的是就是应用单片机的串口通信功能实现一个分布式采集系统。
整个系统中包含一片主机和三片从机,主机的任务是实现对三片从机的AD 转换结果的采集并在数码管上显示之。
简述单片机多机通信的原理
单片机多机通信的原理主要包括两个方面:通信介质和通信协议。
通信介质:多机通信可以通过不同的物理介质实现,常见的有串行通信、并行通信、以太网通信等。
串行通信是单片机多机通信中常用的一种方式,通过单根信号线进行通信。
串行通信可以分为同步串行通信和异步串行通信,其中异步串行通信在单片机多机通信中较为常见。
通过确保发送和接收的速度一致,可以实现单片机之间的数据通信。
通信协议:通信协议是指单片机多机通信中数据传输的规则和格式。
常用的通信协议包括UART、SPI、I2C等。
UART通信协议是一种异步串行通信协议,通过发送和接收缓冲区来实现数据的传输。
SPI通信协议是一种同步串行通信协议,通过主从结构来进行数据的传输。
I2C通信协议也是一种同步串行通信协议,通过总线结构来实现多个设备之间的通信。
在单片机多机通信中,首先需要确定通信介质,然后根据通信介质选择合适的通信协议。
通信协议中,发送端将数据按照一定的规则封装成数据包发送给接收端,接收端按照相应的规则解析数据包并进行相应的处理。
通过通信介质传输数据,再通过通信协议解析数据,实现了单片机之间的数据传输和通信。
课程设计报告课程单片机技术题目串口通信-多机通信系统系别年级 07级专业电子科学与技术班级学号学生姓名指导教师职称设计时间目录1 题设要求分析 (1)2 硬件电路的设计 (4)2.1 系统的组成 (4)2.2 系统的工作原理 (4)2.3 硬件电路原理图设计 (4)2.4 硬件电路的实现 (5)3 软件电路的设计 (6)3.1 通信协议的设计 (6)3.2 主机程序设计 (7)3.3 从机程序设计 (14)4 系统的调试与实现 (17)4.1 从机模块调试 (18)4.2 LED显示模块调试 (18)4.3电平转换模块功能调试 (18)4.4主机模块功能调试 (19)4.5整体设计功能调试 (19)参考文献 (22)1 题设要求分析本小组的试验题目如下:一、任务:设计实现多台单片机系统之间的串行通信二、基本要求(难度系数0.8):(1)设计一个主从式多机通信系统,包含1台主机和3台从机,主机和从机全部为单片机;(2)选择合适总线接口芯片,正确连接主机和从机;(3)编程实现分布式数据采集功能,主机可以获取各分机当前AD转换结果,并显示。
三、发挥部分:(1)完善通信功能。
(根据完成情况加分,上限+0.2)经过本小组成员对本课题认真讨论先做出如下分析:对课题分析后本小组认为本次实验的目的是就是应用单片的串口通信功能实现一个分布式采集系统。
整个系统中包含一片主机和三片从机,主机的任务是实现对三片从机的AD转换结果的采集并在数码管上显示之。
这样从硬件的角度上将整个系统分为两个模块——主机模块和从机模块。
主机模块中包含单片机模块、led数码管显示子模块和串口电平转换子模块,从机模块则包括单片机子模块、AD转换子模块和串口电平转换子模块。
就本次试验而言硬件电路的设计难点在于串口电平转换芯片的选择及其连接,而软件的设计难点在于串口通信协议的制定及相关程序的编写。
实现多机通信方案的实现。
不同于双机通信多机通信系统中需要识别通信信息发出者或是接受者是谁。
经过查阅资料发现在大多数的多机通信系统中都是才采用地址识别的方法实现的。
所谓地址识别方法就是在发送或接受信息前先发送和校验地址帧。
就本题目而言,先要对通信系统中的每台机器分配一个唯一的地址作为识别信息。
具体的识别过程如下:首先,从机处于只接收地址帧的状态;主机发送一帧地址信息;从机接受到地址帧后,将本机地址与地址帧中的地址进行比较,如果地址相同准备接受数据,否则丢弃当前帧,依然处于只接受地址帧的状态;主机发送数据帧,相应的从机接受数据,数据传送完毕后,从机继续回到只接受地址帧的状态,在这个过程中其他从机不受影响;当主机需要与其他从机进行数据传输时,可以再次发送地址帧呼叫从机,重复这一过程[1]。
对于本题而言可通过此过程实现主机对从机的绝对控制。
这样在主机中编写一个循环程序就可以实现对三台从机的AD转换结果的不停采集。
至于地址帧与数据帧的区别则可通过串口工作方式三下的第九位的置1或置0来实现。
在完成通信的基础上,再将采集到的三路结果分别用两个led数码管显示即可试验预期目的。
2 硬件电路的设计2.1 系统的组成根据题目分析可知硬件电分为主机模块和从机模块。
主机模块中包含单片机子模块、led数码管显示子模块和串口电平转换子模块,从机模块则包括单片机子模块、AD转换子模块和串口电平转换子模块。
在主模块中由AT89S51单片机担任主机,六个led数码管担任显示设备和一片MAX485担任串口的电平转换。
在整个主机系统中有三个从机模块三个从机模块结构一样,有一片AT89S51单片机担任从机外接一片ADC0809转换芯片和一片MAX485担任串口的电平转换。
串口采用单工及异步通信方式。
整个硬件结构原如图1所示。
图 1 系统结构原理图2.2 系统的工作原理主机AT89S51编程可实现循环访问个从机,当从机接受主机访问后启动AD 转换设备ADC0809对外部模拟信号进行转换。
当从机获得转换结果后通过串口将其发送到主机,主机接受到转换结果后再将其发送到相应的led数码管显示。
2.3 硬件电路原理图设计(1)led数码管显示电路led数码管显示电路如图2所示显示子模块由六个数码管和相应的启动芯片构成。
其中每路通道的采集值用量为数码管显示。
为了节约单片机的I/O口本题的数码管采用MAX7219芯片。
给芯片的优点在于可完成电路的刷新。
MAX7219芯片的SEG A-SEG DP为数码管段码接口,DIG0-DIG7为位码接口,CLK、DIN、LOAD分别与单片机P1.0、P1.1、P1.2连接。
单片机通过串行的方式将要显示的数据通过CLK、DIN、LOAD三个接口送入相应的显示寄存器内,MAX7219将自动完成对数码管的刷新工作。
具体的电路如图2所示。
图 2 led显示电路(2)串口电平转换电路串口电平转换电路的电路图如图3所示:本实验中采用MAX485的电平转换芯片。
MAX485是一种RS-485标准接口的电平转换芯片。
RS-485采用差分式半双工通信方式,真正实现多点总线连接,具有传输距离远可靠性高的特点。
基于以上原因本小组选择该芯片实现电平转换。
MAX485的1号引脚RO为接收端接单片RXD, 4号引脚DI为发送端接单片TXD, 2、3号引脚分别为发送接收使能端端接单片P1.3引脚。
6、7号引脚总线接线口。
图 3 电平转换电路(3)主机模块电路根据设计要求绘制主机模块电路图如图4所示。
图 4 主机模块电路图(4)从机模块电路根据设计要求绘制从机模块电路图如图5所示。
图 5 从机模块电路图2.4 硬件电路的实现首先是主从机电路的实现。
主机的电路的搭建采用主CPU板、键盘显示接口板各一块。
照实验原理图将主CPU板的P0口接到键盘显示接口板的位码接口,P1口接到键盘显示接口板的段码的接口。
从机的电路由CPU板和ADDA转换板构成。
其次是电平转换电路的焊接。
电平转换的路的实现是通过自己搭建电路完成。
电平转换的电路主要有四块MAX485和两个100Ω电阻构成。
四块MAX485采用总线方式连接,每个芯片分别引出三个引脚用于单片的连接。
最后将各个模块的按照原理图连接起来。
图 6 硬件电路的连接3 软件电路的设计3.1 通信协议的设计通信协议的设计的设计是本题的重点难点,本题通信协议主要是区别主机和从机。
由于串口的方式2、3发送和接收都是11位其第九为可编程置位可以此作为区分地址帧与数据帧从而实现主机与从机,从机与从机的区别。
通信协议同样要规定相同通信速率。
参考相关资料后编写如下的通信协议。
数据传输的双方均使用9600kb/s的速率传送数据,使用主从式通信,主机发送数据,从机接受数据,双方在发送数据时使用查询方式。
双机开始数据传输时,主机发送地址帧呼叫从机。
各从机开始都处于只收地址帧状态。
接收到地址帧后,将接收到的地址内容和本机地址比较,如果地址相同,则向主机返回本机地址作为确认信息,并开始接收数据;如果不同,则继续等待。
主机在发送地址帧后等待,如果接收到的应答信息中的内容和所发地址帧的内容相同,就开始发送数据,如果不一致,主机将继续发送地址帧。
如多次应答仍无回应则认为出错则主机跳出本次通信。
从机在接收完数据后,将根据最后的校验结果判断数据接收是否正确,若校验真确,则向主机发送2AH信号,同时点亮led灯半秒钟,表示本次通信成功;若校验错误,则发送F0H信号,表示接收数据错误,并请求从发。
主机接收到2AH信号,则通信结束,否则主机将重新发送这组数据。
3.2 主机程序设计依据试验要求及相应的通信协议现绘制如下的主机程序流程图:图 7 主机程序流程图主机程序:#include<stdio.h>#include<reg51.h>unsigned char LED_seg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char LED_bit[6]={0x01,0x02,0x04,0x08,0x10,0x20};unsigned char LED_buf[6]={0x00,0x00,0x00,0x00,0x00,0x00};void delay(unsigned long n) //延时子程序{unsigned int i;for(i=1;i<n;i++){ ; }}void convert(unsigned char a ,unsigned char j) //电压转换子程序{unsigned char m,n,i;unsigned char b=0;for(i=0;i<51;i++){b=i*5;if(b<a){i++;}else{break;}}m=i/10;n=i%10;j=j*2;LED_buf[j]=LED_seg[n];LED_buf[j+1]=LED_seg[m]+0x80;}void sbuf_init(void) //串口初始化子程序{SCON=0xd0; //工作方式3PCON=0x00;TMOD=(TMOD&0xf)|0x20;TH1=0xfd;TL1=0xfd;TR1=1;}void flash_led(void) //led显示子程序{unsigned char i;for(i=0;i<6;i++){P2=LED_buf[i];P0=LED_bit[i];delay(200);}P0=0x00;}void main(void) //主函数{ unsigned char ADDR=0x00;unsigned char tmp;unsigned char a=0;unsigned char i=0;unsigned char j=0;sbuf_init();while(1){tmp = ADDR+1;while(tmp!=ADDR){/* 发送从机地址 */TI = 0;TB8 = 1; // 发送地址帧P1 = 0xff; //发送使能delay(20);SBUF = ADDR;while(!TI);TI = 0;delay(20);/* 接收从机应答 */P1 = 0x00; //接受使能delay(50);while(!RI);tmp = SBUF;RI = 0;delay(20);}P1 = 0x00; //接受使能delay(10);while(!RI);a = SBUF;RI = 0;delay(10);j=ADDR;i++;ADDR++;if (i>=3){i=0;ADDR=0x00;}convert(a,j);flash_led();}}3.3 从机程序设计从程序流程图如下:图 8 从机模块流程图从机程序:#include<reg51.h>#include<absacc.h>#include<stdio.h>#define INO XBYTE[0x0000]#define ADDR 0x02 //从机地址0x00、ox01、0x02 sbit AD_BUSY=P3^3;void delay(unsigned long n) //延时子程序{ unsigned int i;for(i=1;i<n;i++){ ; }}void sbuf_init(void) //串口初始换子程序{ SCON=0xd0; //工作方式3 PCON=0x00;TMOD=(TMOD&0xf)|0x20;TH1=0xfd;TL1=0xfd;TR1=1;}void main(void) //主程序{ unsigned char a;unsigned char tmp=0xff;sbuf_init();while(1){ SM2=1; // 只接收地址帧 /* 如果接收到的地址帧不是本机地址,则继续等待 */ tmp=ADDR+1;P1=0x00; //接受使能while(tmp!=ADDR){ while(!RI);tmp=SBUF;RI=0;}delay(20);/* 发送本机地址作为应答信号,准备接收数据 */P1=0xff; //发送使能delay(40);TI=0;TB8=0; // 主机不检测该位SBUF = ADDR;delay(10);while(!TI);TI = 0;//SM2 = 0; //允许接收数据/* 数据发送 */delay(40);/*INO=0;i=i;i=i;while(AD_BUSY==0);a=INO;*/a=0x88;SBUF=a;while(TI==0);TI=0;delay(60);}}4 系统的调试与实现对本课题的设计思路清晰之后,我们接下来所需要做的工作就是依据我们的方案编程实现功能。