单片机多机通信实现
单片机多机通信实现
单片机多机通信实现随着科技的进步和应用的需求,单片机成为了嵌入式系统中不可或缺的一部分。
在很多应用场景中,我们需要将多个单片机之间进行通信,以实现数据的传输和协同工作。
本文将介绍单片机多机通信的实现方法。
一、串口通信串口通信是最常见和简单的单片机通信方式之一。
单片机通过串口将数据以字节的形式传输给另一个单片机。
常见的串口通信协议有RS232、RS485和UART等。
其中,RS232是单片机与计算机之间的标准通信协议,而RS485适用于单片机与多个设备之间的通信。
串口通信需要注意以下几个方面:1. 波特率的设置:通信双方需要设定相同的波特率,以确保数据的准确传输。
2. 数据格式的规定:包括数据位、校验位和停止位等,通讯双方需要设置相同的数据格式。
3. 通信控制的实现:通过编程控制单片机的串口发送和接收功能,实现数据的传输。
二、I2C通信I2C(Inter-Integrated Circuit)是一种串行总线协议,它可实现多个单片机的通信和协同工作。
I2C通信需要引入一个主设备和多个从设备的概念,主设备控制通信的起止和数据的传输,从设备用于接收和发送数据。
I2C通信需要注意以下几个方面:1. I2C地址的分配:每个从设备通过唯一的地址与主设备进行通信,地址的分配需要事先规划好。
2. 数据的读写操作:通过发送特定的控制信号,主设备可以向从设备发送读或写的命令,并接收从设备返回的数据。
3. 时序的控制:I2C通信依赖于时钟信号和数据信号的同步,通信双方需要根据协议规定好时序的控制。
三、SPI通信SPI(Serial Peripheral Interface)通信是一种全双工、同步的通信协议。
它通过4根线进行通信,包括时钟、数据输入、数据输出和片选信号。
SPI通信适用于多个主设备与多个从设备之间的通信,可以实现数据的传输和设备的控制。
SPI通信需要注意以下几个方面:1. 主从设备的选定:SPI通信中,每次只有一个主设备能够与从设备进行通信,其他设备通过片选信号进行选择。
单片机多机通信代码
单片机多机通信代码单片机多机通信是指通过单片机实现多个设备之间的数据传输和通信。
在现代的智能家居系统、工业自动化系统以及物联网等领域,单片机多机通信扮演着重要的角色。
为了实现单片机多机通信,需要首先确定通信的方式和协议。
常见的通信方式包括串口通信、SPI通信、I2C通信等。
在选择通信方式时,需要考虑设备之间的距离、通信速率、通信复杂度等因素。
协议方面,可以使用现有的通信协议,如Modbus、CAN、TCP/IP等,也可以根据具体需求自定义通信协议。
在单片机多机通信的实现过程中,首先需要配置单片机的通信接口。
例如,在使用串口通信时,需要设置波特率、数据位数、停止位数等参数。
接下来,需要编写相应的程序代码来实现数据的发送和接收。
发送数据时,可以使用单片机的串口发送函数将数据发送给其他设备;接收数据时,则需要使用单片机的串口接收函数来接收其他设备发送的数据。
在多机通信中,一台设备可以充当主机,负责控制其他设备的工作,也可以充当从机,接收主机发送的指令并执行相应的操作。
主机和从机之间可以通过发送和接收数据来实现通信。
例如,在智能家居系统中,主机可以控制灯光的开关、温度的调节等操作,而从机则负责接收主机发送的指令并执行相应的操作。
在实际应用中,单片机多机通信可以实现设备之间的信息交互和协同工作。
例如,在工业自动化系统中,可以通过多机通信实现各个设备之间的数据共享和协作,提高生产效率和质量。
在物联网中,可以通过多机通信实现各个物联设备之间的联动和互联,实现智能化控制和管理。
单片机多机通信是一种重要的通信方式,可以实现设备之间的数据传输和通信。
通过合理选择通信方式和协议,并编写相应的程序代码,可以实现设备之间的信息交互和协同工作,从而提高系统的功能和性能。
单片机实现双机通信自己的
单片机实现双机通信自己的单片机是一种集成电路芯片,可以实现各种功能。
双机通信是指两台或多台计算机通过网络或其他方式进行数据传输和通信的过程。
在很多应用中,需要使用单片机实现双机通信,以实现数据传输和信息交换等功能。
单片机实现双机通信的基本原理是通过通信端口(例如串口或网络接口等)进行数据的发送和接收。
在这个过程中,需要使用一些通信协议来规定数据的格式和传输的方式。
下面是一种基于串口通信的单片机双机通信的实现方法。
首先,我们需要确定通信的硬件配置。
通常情况下,可以通过串口连接两台单片机,其中一台设置为发送方,另外一台设置为接收方。
发送方将待发送的数据通过串口发送出去,接收方则接收这些数据。
在单片机程序代码的编写方面,我们需要首先配置串口的通信参数,例如波特率、数据位、停止位、奇偶校验等。
这些参数需要在发送方和接收方进行一致配置,以保证数据的正确传输。
接下来,我们需要实现发送和接收的程序。
首先,发送方需要将待发送的数据存储在发送缓冲区中,然后通过串口将数据发送出去。
接收方则需要实时监听串口接收缓冲区中是否有数据到达,并将接收到的数据存储在接收缓冲区中。
另外,为了保证数据的正确传输,通常还要实现一些数据校验机制,例如奇偶校验、循环冗余校验(CRC)等。
这些校验机制可以用于检测和纠正数据传输中的错误。
在程序编写的过程中,还需要考虑到程序的稳定性和容错性。
例如,在发送方发送数据时,可能会遇到发送缓冲区已满的情况,此时需要实现相应的处理机制,例如等待一段时间后再次发送。
同样,在接收方接收数据时,也可能会遇到接收缓冲区溢出的情况,此时需要及时处理,以避免数据的丢失。
最后,在实际应用中,还需要考虑一些高级的功能,例如数据压缩、加密、数据传输速度的控制等。
这些功能可以根据具体的需求进行实现。
总之,单片机实现双机通信是一项复杂的任务,需要考虑到硬件和软件两个方面的因素。
在程序编写的过程中,需要考虑到通信参数的配置、发送和接收的程序编写、数据校验、稳定性和容错性等方面的问题。
51单片机多机通信
一、多机通信原理在多机通信中,主机必须要能对各个从机进行识别,在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单片机的多机通信
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单片机的多机通信原理
51单片机的多机通信原理1. 什么是51单片机的多机通信?51单片机的多机通信是指在多个51单片机之间进行数据传输和通信的过程。
通过多机通信,可以实现不同单片机之间的数据共享和协作,从而实现更加复杂的功能。
2. 多机通信的原理是什么?多机通信的原理是通过串口进行数据传输。
在多个单片机之间,可以通过串口进行数据的发送和接收。
通过定义好的协议,可以实现数据的传输和解析,从而实现多机之间的通信。
3. 多机通信的步骤是什么?多机通信的步骤包括以下几个方面:(1)定义好通信协议:在多机通信之前,需要定义好通信协议,包括数据的格式、传输方式等。
(2)设置串口参数:在单片机中,需要设置好串口的参数,包括波特率、数据位、停止位等。
(3)发送数据:在发送数据之前,需要将数据按照协议进行格式化,然后通过串口发送出去。
(4)接收数据:在接收数据之前,需要设置好串口的中断,然后在中断中接收数据,并按照协议进行解析。
(5)处理数据:在接收到数据之后,需要对数据进行处理,包括数据的存储、显示等。
4. 多机通信的应用场景有哪些?多机通信的应用场景非常广泛,包括以下几个方面:(1)智能家居系统:通过多机通信,可以实现智能家居系统中不同设备之间的数据共享和协作。
(2)工业控制系统:在工业控制系统中,多机通信可以实现不同设备之间的数据传输和控制。
(3)智能交通系统:在智能交通系统中,多机通信可以实现不同设备之间的数据共享和协作,从而实现更加智能化的交通管理。
(4)机器人控制系统:在机器人控制系统中,多机通信可以实现不同机器人之间的数据传输和控制,从而实现更加复杂的任务。
5. 多机通信的优缺点是什么?多机通信的优点包括以下几个方面:(1)实现数据共享和协作:通过多机通信,可以实现不同设备之间的数据共享和协作,从而实现更加复杂的功能。
(2)提高系统的可靠性:通过多机通信,可以实现数据的备份和冗余,从而提高系统的可靠性。
(3)提高系统的扩展性:通过多机通信,可以实现系统的模块化设计,从而提高系统的扩展性。
51单片机串口多机通信的实现和编程
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单片机的多机通信系统设计多机通信系统是指通过一台主机与多台从机之间进行数据交互和通信的系统。
在本设计中,我们将使用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.通信协议:需要定义主机和从机之间的通信协议,包括数据的格式、传输方式等,以便实现正确的数据交互。
单片机多机平权式通信的实现
三 、单 片 机 最 小 系统 的 设计
本系统共用三块单片机 ,每块单片机均选用 A T 8 9 S 5 2 , 最小系统也
发送数据 区可存放 1 B~ 4 8 B的数据 ,以空字符‘ 、 0 作 为发送数据结束 标志 。接收数据时以空字符作为接收有效数据结束标志 。通信结束时 , 从机发回收发长度作为校验。 本系统对微处理器要求不是太高 ,速度不要求太高 ,但代码较长 ,
、
单片机 多机通信方案选择
根据需要 ,各片单片机有相等 的权限 ,每块单片机都可设 置为主机 或从机 ,因此单 片机的 串口应具有双 向可选择性 。采用两个同相 三态 门 加上一个反相器 即可构成这样的接 口,并 由 单 片机 的一根引脚控制单片
机 串口的连接方式。
E R R= 0 时为合法命令 , E R R=1 时为非法命令 ; T R D Y= 0 时表示从 机发送未就绪 , T R D Y= 1 表示从机发送就绪。 R R D Y= 0 表示从机接收未 就绪 ; R R D Y = 1 表示从机接收已经就绪。
本文在研究传统 的多机通信系统的基础上 , 设计了一种基于 M C S 一 5 1 系列单 片机 A T 8 9 S 5 2的多机通信系统。初始时 ,1 号单片机为主机 。 主机通过串 口向从单片机发送指定格式的数据 ,从单片机收数据并作出 响应 ,主机通过液 晶屏显示通信信息 , 从机通过 L E D显示通信状态 。主 机通信结束 即转为从机 ,其他单 片机可置为主机 ,获得总线控制权 。1 号单片机通过矩阵键盘控制通信过程与显示 , 2 与3 号单片机通过独立按 键控制通信状态与主从机切换。
一
串 口中断 ,置 S M 2 = O 准备接收命令。接收到主机发来的命令 , 先判断 ,
用单片机实现一主三从式多机通信(包括论文)
目录一、题目要求与功能分析 (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通信协议也是一种同步串行通信协议,通过总线结构来实现多个设备之间的通信。
在单片机多机通信中,首先需要确定通信介质,然后根据通信介质选择合适的通信协议。
通信协议中,发送端将数据按照一定的规则封装成数据包发送给接收端,接收端按照相应的规则解析数据包并进行相应的处理。
通过通信介质传输数据,再通过通信协议解析数据,实现了单片机之间的数据传输和通信。
51单片机多机通信程序
51单片机多机通信程序(主机部分) /* multi_m.c *//* 多机通信的主机部分*/#ifndef __MULTI_M_C__#define __MULTI_M_C__#include <AT89X51.H>#include <STRING.H>#define __MAX_LEN_ 64 // 数据最大长度#define _MHZ_ 11 // 设置单片机使用的晶振频率(11.0592MHz) /* 以下为程序协议中使用的握手信号*/#define __SUCC_ 0x0f // 数据传送成功#define __ERR_ 0xf0 // 数据传送错误void init_serial(); // 串口初始化void send_data(unsigned char *buf); // 发送数据void delay10ms(unsigned int count); // 延时子程序(10ms) void main(){char buf[__MAX_LEN_];unsigned char i = 0;unsigned char tmp;unsigned char addr; // 该字节用于保存要通信的从机地址/* 为缓冲区赋初值*/P0 = 0xff;while(P1 != 0) // 每隔100ms从P0口读取,若读取到0则表明数据采集结束{*(buf+i) = P0;delay10ms(10); // 延时100msP0 = 0xff;i++;}*(buf+i) = 0; // 缓冲区最后一个字节为0表示数据结束/* 读要访问的分机地址*/P0 = 0xff;addr = P0;/* 串口初始化*/init_serial(); // 初始化串口EA = 0; // 关闭所有中断/* 发送地址帧并接收应答信息,如果接收的信号与发送的地址信息不同,则重新发送地址帧*/tmp = addr-1;while(tmp != addr){/* 发送从机地址*/TB8 = 1; // 发送地址帧SBUF = addr;while(!TI);TI = 0;/* 接收从机应答*/RI = 0;while(!RI);tmp = SBUF;RI = 0;}/* 发送数据并接收校验信息,如果接收的信号为0FH,表示从机接收成功,否则将重新发送该组数据*/tmp = __ERR_;while(tmp != __SUCC_){send_data(buf); // 发送数据RI = 0;while(!RI);tmp = SBUF;RI = 0;}while(1); // 程序结束,进入死循环}/* 初始化串口*/void init_serial(){TMOD = 0x20; //定时器T1使用工作方式2TH1 = 250; // 设置初值TL1 = 250;TR1 = 1; // 开始计时PCON = 0x80; // SMOD = 1SCON = 0xd0; //工作方式3,9位数据位,波特率9600bps,允许接收}/* 发送数据*/void send_data(unsigned char *buf){unsigned char len; // 保存数据长度unsigned char ecc; // 保存校验字节len = strlen(buf); // 计算要发送数据的长度ecc = len; // 开始进行校验字节计算/* 发送数据长度*/TB8 = 0; // 发送数据帧SBUF = len; // 发送长度while(!TI);TI = 0;/* 发送数据*/for(i=0; i<len; i++){ecc = ecc^(*buf); // 计算校验字节TB8 = 0; // 发送数据帧SBUF = *buf; // 发送数据buf++;while(!TI);TI = 0;}/* 发送校验字节*/TB8 = 0; // 发送数据帧SBUF = ecc; // 发送校验字节while(!TI);TI = 0;}/* 延时10ms,精度较低,参数count为延时时间*/ void delay10ms(unsigned int count){unsigned int i, k;unsigned char j;unsigned int tmp;tmp = (int)((100*_MHZ_)/12);for(i=0; i<count; i++)for(j=0; j<100; j++)for(k=0; k<tmp; k++);}#endif51单片机多机通信程序(从机部分)/* multi_s.c *//* 多机通信的从机部分*/#ifndef __MULTI_S_C__#define __MULTI_S_C__#include <AT89X51.H>#include <STRING.H>#define __MAX_LEN_ 64 // 数据最大长度#define _MHZ_ 11 // 设置单片机使用的晶振频率(11.0592MHz)/* 以下为程序协议中使用的握手信号*/#define __SUCC_ 0x0f // 数据传送成功#define __ERR_ 0xf0 // 数据传送错误void init_serial(); // 串口初始化unsigned char recv_data(unsigned char *buf); // 接收数据void Beep_ok(); // 蜂鸣表示数据接收ok,该函数代码未给出void main() {char buf[__MAX_LEN_];unsigned char i = 0;unsigned char tmp = 0xff;unsigned char addr; // 保存本机地址/* 从P1口读取本机地址*/P1 = 0xff;addr = P1;/* 串口初始化*/init_serial(); // 初始化串口EA = 0; // 关闭所有中断/* 进入设备应答阶段*/while(1){SM2 = 1; // 只接收地址帧/* 如果接收到的地址帧不是本机地址,则继续等待*/ tmp = addr-1;while(tmp != addr){RI = 0;while(!RI);tmp = SBUF;RI = 0;}/* 发送应答信号,并做好接收数据的准备*/TI = 0;TB8 = 0; // 主机不检测该位SBUF = addr;while(!TI);TI = 0;SM2 = 0; // 允许接收数据信息/* 数据接收*/tmp = 0xff;while(tmp == 0xff) // 如果数据校验失败则重新接收数据{tmp = recv_data(buf); // 校验失败返回0xff,检测到地址帧则返回0xfe,接收成功则返回0}if(tmp == 0xfe) // 在数据接收过程中,如果发现地址帧,则重新开始整个接收过程continue;Beep_ok(); // 蜂鸣表示数据接收成功}}/* 初始化串口*/void init_serial(){TMOD = 0x20; //定时器T1使用工作方式2TH1 = 250; // 设置初值TL1 = 250;TR1 = 1; // 开始计时PCON = 0x80; // SMOD = 1SCON = 0xd0; //工作方式3,9位数据位,波特率9600bps,允许接收}/* 接收数据,注意该函数使用buf指向的缓冲区保存数据,在数据末尾使用’\0’表示数据结束* 返回值为0,数据校验成功,返回值为0xfe,接受过程中接收到地址帧,返回值为0xff,数据校验失败*/unsigned char recv_data(unsigned char *buf){unsigned char len; // 该字节用于保存数据长度unsigned char ecc; // 该字节用于保存校验字节unsigned char i,tmp;/* 接收数据长度*/RI = 0;while(!RI);if(RB8 == 1) // 若当前接收为地址帧则返回0xfereturn 0xfe;len = SBUF;RI = 0;/* 使用len的值为校验字节ecc赋初值*/ecc = len;/* 接收数据*/for(i=0; i<len; i++){while(!RI);if(RB8 == 1) // 若当前接收为地址帧则返回0xfe return 0xfe; *buf = SBUF; // 接收数据ecc = ecc^(*buf); // 进行字节校验RI = 0;buf++;}*buf = 0; // 表示数据结束/* 接收校验字节*/while(!RI);if(RB8 == 1) // 若当前接收为地址帧则返回0xfe return 0xfe; tmp = SBUF;RI = 0;/* 进行数据校验*/ecc = tmp^ecc;if(ecc != 0) // 校验失败{*(buf-len) = 0; // 清空数据缓冲区TI = 0; // 发送校验失败信号TB8 = 0;SBUF = __ERR_;while(!TI);TI = 0;return 0xff; // 返回0xff表示校验错误} TI = 0; // 校验成功TB8 = 0;SBUF = __SUCC_;while(!TI);TI = 0;return 0; // 校验成功,返回0}#endif。
单片机双机之间的串行通信设计
单片机双机串行实验报告实验报告:单片机双机串行通信实验一、实验目的本实验旨在通过单片机实现双机间的串行通信,包括数据的发送和接收,并利用这种通信方式完成一定的任务。
二、实验原理1.串行通信:串行通信是将数据一个个位发送或接收的方式。
数据通过一个线路逐位发送或接收,可以减少通信所需的线路数目。
2. UART串口通信:UART是通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)的简称,是一种最常用的串口通信方式,通常用于单片机与计算机、单片机与单片机之间的通信。
3.串口模块:串口模块是负责将数据转变为串行传输的硬件模块,包括发送端和接收端。
通过设置波特率、数据位、校验位和停止位等参数,可以实现数据的可靠传输。
4.单片机串口通信:单片机内部集成了UART串口通信接口,只需要通过相应的寄存器配置,可以实现串口通信功能。
5.双机串行通信:双机串行通信是通过串口将两台单片机进行连接,一台单片机作为发送端,负责将数据发送出去;另一台单片机作为接收端,负责接收并处理发送的数据。
三、实验器材与软件1.实验器材:两台单片机、USB转TTL模块、杜邦线若干。
2. 实验软件:Keil C51集成开发环境。
四、实验内容与步骤1.配置发送端单片机(1)连接单片机和USB转TTL模块,将USB转TTL模块的TXD端连接到单片机的P3口,将GND端连接到单片机的地线。
(2)在Keil C51环境下创建新工程,编写发送端程序。
(3)配置串口通信的波特率、数据位、校验位和停止位,并打开串口发送中断。
(4)循环发送指定的数据。
2.配置接收端单片机(1)连接单片机和USB转TTL模块,将USB转TTL模块的RXD端连接到单片机的P3口,将GND端连接到单片机的地线。
(2)在Keil C51环境下创建新工程,编写接收端程序。
(3)配置串口通信的波特率、数据位、校验位和停止位,并打开串口接收中断。
简述单片机多机通信原理
简述单片机多机通信原理
单片机多机通信是指通过单片机实现多个设备之间的数据交换和通信。
通常情况下,单片机多机通信的原理可以分为以下几个步骤:
1. 确定通信方式:根据具体的应用场景和需求,选择适合的通信方式,如串行通信、并行通信、SPI通信、I2C通信等。
2. 确定通信协议:确定通信双方之间的数据传输格式和通信协议,如传输数据的长度、起始位、校验位等。
通信协议的选择也受到硬件条件的限制。
3. 硬件连接:通过硬件连接将多个设备与单片机连接起来。
根据选择的通信方式,可以使用串口、并口、GPIO口等进行连接。
4. 初始化设置:在每个设备上设置适当的参数,如波特率、传输模式、中断等。
这些参数设置需要与单片机上的相应设置相匹配。
5. 数据传输:根据通信协议,在发送端将要传输的数据经过编码处理,然后通过通信线路发送给接收端,接收端收到数据后进行解码处理,得到原始数据。
6. 数据处理:单片机接收到数据后,根据需求进行相应的数据处理,如提取有效信息、进行数据计算等。
7. 状态更新:单片机在接收到新数据后,需要更新相应的状态信息,以便下一次数据传输的准备。
通过以上步骤,单片机可以实现多机之间的数据交换和通信,可以用于各种场景,如智能家居、工业自动化、嵌入式系统等。
51单片机多机通信过程
51单片机多机通信过程51单片机具有多机通信的功能,可实现一台主机于多台从机的通信。
多机通信充分利用了单片机内部的多机通信控制位SM2。
当从机SM2,1时,从机只接收主机发出的地址帧(第九位为1),对数据帧(第九位为0)不予理睬;而当SM2=0时,可接收主机发送过来的所有信息。
多机通信的过程如下:(1)所有从机SM2均置1,处于只接收地址帧状态。
(2)主机先发送一个地址帧,其中前8位数据表示地址,第9位为1表示该帧为地址帧。
(3)所有从机接收到地址帧后,进行中断处理,把接收到的地址与自身地址相比较。
地址相符时将SM2清成0,脱离多机状态,地址不相符的从机不作任何处理,即保持SM2,1。
(4)地址相符的从机SM2=0,可以接收到主机随后发来的信息,即主机发送的所有信息。
收到信息TB8=0,则表示是数据帧,而对于地址不符的从机SM2=1,收到信息TB8=0,则不予理睬,这样就实现了主机与地址相符的从机之间的双机通信。
(5)被寻址的从机通信结束后置SM2=1,恢复多机通信系统原有的状态。
主机:设置为SM2=0。
这是双机通信的形式,可以任意的发送和接收发送:以TB8=1发送,将发送到所有SM2=1的分机。
这是呼叫某个从机。
以TB8=0发送,将发送到SM2=0的分机。
这是双机通信的形式。
------从机:先设置为SM2=1。
这是多机通信的形式,只能收到RB8=1的。
接收:仅能收到RB8=1的数据,确认是呼叫本机时,令SM2=0。
设置为SM2=0后,是双机通信的形式。
追问那从机的RB8要怎么设,是需要软件设置还是单片机自己识别,在编程的时候要怎么写, 回答从机的RB8,不需要编程。
从机的RB8,是接收到的,它是主机发送出来的TB8。
想要对TB8进行控制,需要在主机中编程。
单片机多机通讯说明:该程序为多机通讯程序,最多可以挂255个从机。
该程序主机发送端与多个从机的接收端相接,主机的接收端与多个从机的发送端相接。
单片机多机通信的原理
单片机多机通信的原理单片机多机通信是指通过一组单片机进行信息传输和交换的过程。
单片机多机通信可以实现不同单片机之间的数据传输、控制和协调工作。
在多机通信中,每个单片机都有独立的功能和任务,并通过通信方式进行协作完成工作。
1.通信协议:通信协议是单片机多机通信的重要基础。
在多机通信中,需要定义一套协议,规定数据帧的格式,数据的传输方式和操作的流程。
常见的通信协议有SPI、I2C、UART等。
选择合适的通信协议可以根据传输距离、传输速度、设备复杂度等需求来进行选择。
2.总线结构:多机通信中常使用总线结构,将多个单片机连接在同一总线上。
总线结构包括三种类型:并行总线、串行总线和混合总线。
并行总线是指在总线的每条线上同时传输一个单元(八位),速度较快;串行总线是指数据逐位的传输,速度较慢但可以实现长距离传输;混合总线则结合了并行总线和串行总线的优点。
根据具体应用需求,选择合适的总线结构。
3.通信方式:在多机通信中,可以采用半双工通信或者全双工通信方式。
半双工通信是指通信双方交替发送和接收数据,在同一时刻只能进行发送或接收操作;全双工通信是指通信双方可以同时进行发送和接收操作。
根据通信需求和硬件条件,选择合适的通信方式。
4.帧同步:在多机通信中,数据的传输需要进行帧同步,即接收端需要识别出每个数据帧的起始和结束位置。
帧同步可以通过在传输数据中插入特定的起始标识符和结束标识符来实现。
当接收到起始标识符后,接收端开始接收数据帧,直到接收到结束标识符,表示数据帧传输完成。
5.编码和解码:多机通信中,发送数据的单片机需要将数据进行编码,接收数据的单片机需要对接收到的数据进行解码。
编码和解码方式有很多种,如二进制编码、格雷码编码等。
编码和解码的目的是确保数据的可靠传输和正确接收。
6.冲突检测和处理:在多机通信中,由于多个单片机共享同一总线,可能会出现冲突和竞争的情况。
为了避免冲突,需要设计冲突检测和处理机制。
常见的机制有仲裁器、优先级检测和时间片轮转等。
MCS-51单片机的多机通信方式
多机通信原理
每台从机一个地址(编号) 系统中的通信总是由主机发起 主机向从机发送的信息分为地址字节和数据字节两种。地址字
节用于寻址从机,数据字节为发给从机的实际数据,二者可以 使用第9位来区分。地址字节帧的第9位为1,数据字节帧的第9 位为0 系统初始化时,将所有从机的SM2位置为1,并允许串行口接收 中断。这样,只有主机送来的地址帧才会被接收
单片机原理与应用
MCS-51单片机的多机通信方式
SCON中的SM2位可以作为多处理机通信位,使单片机方便地 应用于集散式分布系统中
集散式分布系统,或者称为分布式控制系统(DCS),是相对于 集中式控制系统而言的一种新型计算机控制系统,它是在集中 式控制系统的基础上发展、演变而来的。这种系统中,有一台 主机和多台从机。主机负责全局运行情况的监视、统计、控制 等,各从机负责本地信号的采集处理、本地资源的控制。主机 和从机通过通信线路相联系
1.2 通信协议的设计
通信协议中,除规定命令、数据的格式,还有以下一些方面需 要特别考虑
命令的顺序 差错处理 超时处理
单片机原理与应用
ห้องสมุดไป่ตู้
1.1 多机通信原理
主从式多机通信连接方式
多机通信原理
当串行口工作在方式2或3时 若SM2=1,则只有接收到的第9位数据(RB8)为1时,才将数据
送入接收缓冲器SBUF,并置位RI,申请中断,否则丢弃接收 到的数据 若SM2=0,则无论第9位数据(RB8)是1还是0,都将数据装入 SBUF,置位RI,申请中断
MCS单片机多机通信的工作原理解析
MCS单片机多机通信的工作原理解析随着科技的不断发展,单片机(Microcontroller)在各个领域的应用越来越广泛。
在某些应用场景下,需要多个单片机之间进行通信,实现数据传输和共享操作。
而MCS单片机多机通信技术,正是专门用来实现多台单片机之间的高效通信的一种技术。
1. MCS单片机多机通信的基本原理MCS单片机多机通信的基本原理是通过引入中间介质来实现多个单片机之间的数据传输。
常见的中间介质包括串口、SPI总线、I2C总线等。
接下来我将重点介绍一种常用的MCS单片机多机通信原理,即基于串口通信的方式。
2. 基于串口通信的MCS单片机多机通信原理解析在基于串口通信的MCS单片机多机通信中,通常会选择一台单片机作为主控,其他单片机作为从设备。
主控单片机负责发送指令和接收数据,而从设备单片机则负责执行指令,并返回相应的数据。
具体实现过程如下:- 主控单片机通过串口发送指令给从设备单片机。
- 从设备单片机接收到指令后,执行相应的操作,并将执行结果发送回主控单片机。
- 主控单片机接收到从设备单片机发送的数据后,进行相应的处理。
为了保证通信的稳定性和可靠性,通常会在通信协议中添加数据校验位和帧头帧尾等标志位。
这样可以在通信过程中检测并纠正错误,保证数据的正确传输。
3. MCS单片机多机通信的应用场景MCS单片机多机通信广泛应用于各种领域,其中一些常见的应用场景包括:- 工业控制系统:用于监控设备状态、实现设备间的数据共享和协调控制等。
- 自动化设备:用于实现各个模块之间的数据交换和传输。
- 无线通信系统:用于实现多个无线设备之间的数据传输和通信。
4. 实例分析:电梯控制系统以电梯控制系统为例,介绍MCS单片机多机通信在实际应用中的工作原理。
电梯控制系统通常由一个主控单片机和多个从设备单片机组成,主控单片机负责控制电梯的运行、调度和故障检测等功能,而从设备单片机则负责电梯的各个部件的控制。
在电梯控制系统中,主控单片机通过串口发送指令给从设备单片机,例如指令可以包括电梯的上行、下行、停止等操作。
单片机ASCⅡ码协议进行多机串行口通信
单片机ASCⅡ码协议进行多机串行口通信单片机ASCII码协议是一种常用的通信协议,用于实现多机串行口通信。
它通过将数据以ASCII码的形式进行传输,从而实现各个单片机之间的数据交换与通信。
在下面的1200字以上的文章中,我将详细介绍单片机ASCII码协议的原理、实现方法以及其在多机串行口通信中的应用。
首先,我们来了解一下单片机ASCII码协议的原理。
ASCII码是一种标准的字符编码方式,它将字符映射为7位或8位的二进制代码。
在单片机ASCII码协议中,使用一字节的数据进行传输,其中包含了一个ASCII码字符。
这种协议的优点是传输速度较快,且数据可靠传输,但是需要进行数据的解码和编码操作。
在实现单片机ASCII码协议的过程中,我们首先需要通过串行口将数据发送出去,并在接收端接收数据。
发送过程中,我们需要将要发送的数据进行ASCII码的转换,将字符转换成对应的ASCII码,并发送出去。
接收过程中,我们需要将接收到的ASCII码进行解码,将其转换为对应的字符。
通过解码后的数据,我们就可以进行后续的处理和分析。
在多机串行口通信中,单片机ASCII码协议扮演了重要的角色。
它能够实现多个单片机之间的数据交换和通信,可以用于传输各种类型的数据,如传感器数据、控制指令等。
具体的应用场景包括无线通信、物联网、嵌入式系统等。
单片机ASCII码协议在无线通信中的应用是一种常见的情况。
通过使用无线模块与单片机进行连接,可以实现距离较远的通信。
在通信的过程中,数据需要进行编码和解码操作。
发送端将要发送的数据进行ASCII码转换,并通过无线模块发送出去。
接收端接收到数据后,进行解码操作,并将解码后的数据进行处理或者显示。
在物联网领域,单片机ASCII码协议也有广泛的应用。
物联网系统中常常包含多个传感器和执行器,这些设备需要进行数据交换和通信。
通过使用单片机ASCII码协议,可以方便地实现各个设备之间的数据传输。
传感器可以将采集到的数据通过ASCII码协议进行编码,并发送给控制中心。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
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//数据传送失败
图3-4 排阻符号
排阻具有九个引脚,一个公共端,另外八个脚分别接到需要接上拉电阻的单片机的P0口。排阻相当于8个大小均为10K的电阻,在电路中主要其电平转化作用,通过的电流很小,每只电阻的功耗也很小。如接5V电源,每只电阻的电流约为0.5mA,很小,但是由于P0口是接液晶,不用接排阻也能实现,本着节约的原则在本设计中没有接排阻。
单片机多机通信实现
1、设计要求
三片单片机利用串行口进行串行通信:串行通信的波特率为9600bit/s。串行口工作方式为方式1的单工串行通信。
2、设计方案
一个主机和两个从机,主机通过按键选择要通信的从机,按键确认后通过矩阵键盘输入要传输的信息,从机接收主机发送的信息并发回长度校验码给主机,主机确认校验信息是否正确,若正确,主机液晶显示“send:信息”和从机数,从机液晶显示所接收的信息;若错误则主机从发信息,重复前面的步骤。
//将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显示
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;
en=0;
}
void lcd_init()
//1602初始化函数
{
lcd_wcom(0x38);
//8位数据,双列,5*7字形
lcd_wcom(0x0c);
//开启显示屏,关光标,光标不闪烁
lcd_wcom(0x06);
//显示地址递增,即写一个数据后,
显示位置右移一位
lcd_wcom(0x01); //清屏
按键处理为多分支结构,每个分支完成一种功能。具体流程如下:
图4-1按键处理流程图
通信方向设置流程如下:
图4-2通信方向设置流程图
从机选择流程如下:
图4-3从机选择流程图
5.3系统初始化程序设计
系统初始化程序包括定时器初始化、串口初始化、发送数据初始化和全局变量初始化。初始化步骤如下:
图4-4系统初始化步骤
复位电路也可以换成看门狗电路实现,可使单片机可靠的复位。为了简化电路设计,本系统采用简单方法,可使单片机上电复位,此外可以通过按键手动复位。单片机上电即可复位,R1与C3的充电时间大于两倍的机器周期,使RST引脚有足够长的时间保存高电平,使单片机可靠的复位。正常工作时,按下按键SW1就可以使单片机复位。
unsigned char check;
lenth=strlen(Buff); //计算数据长度
check=lenth;
TI=0; //发送数据长度
TB8=0; //发送数据帧
SBUF=lenth; //发送长度
while(!TI);
TI=0;
for(i=0;i<lenth;i++) //发送数据
{
}
//缓冲区初始化
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
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的排阻,自己画的排阻符号如下:
液晶显示程序只许根据需要调用液晶模块内的函数即可,显示以字符形式输出。输出字符的ASCII码,液晶显示对应的字符。用指向code区的指针访问待显示的字符数据串来显示。
6结论
本设计解决了多单片机的串行通信问题,通信速度较快并具有一定的检错能力。但检错机制不够精确,难以保证很高的正确率,还需进一步完善。扩展功能:平权式多机通信协议,这样就可解决通信过程中,争用主机权问题,采用优先编码器为核心的主机权分配电路,可以使电路工作可靠稳定。
对于1号单片机,还有液晶屏初始化这一步。1号单片机的主程序执行顺序:
图4-51号单片机主程序
定时器初始化使定时器一工作在方式二,波特率设置为9600b/s,并开中断。串口初始化使串口工作在方式三,9位数据位。发送与接收数据区的开始地址被已经被指定,用指针常量表示。发送数据初始化在发送数据区存放待发送的数据串,以空字符作为结束符。全局变量初始化只需根据需要设置即可。
图3-9按键控制流程图
按键扫描采用行扫描法,先输出全零行,再读看是否有按键按下,如有按键,则先消抖动,然后再次确认是否有按键,如果确有按键,再逐行置低电平扫描按下的键的行列位置,最后将按键对应位置的8位二进制码(即低四位表示行号,高四位表示列号)返回;若无按键,则返回0。
获取键值函数为Switch结构的散转程序,根据按键的行与列得到按键的键值,这里预先定义按键的键值为字符‘0’~‘C’、‘E’,‘C’’S’。以字符形式表示键值利于液晶直接显示。
主机整体原理图如下:
图3—5主机原理图
两从机的原理图与主机的原理图仅仅的区别就是没有外接矩阵键盘,其他的都一样。
4电源电路设计
本系统主要供电为5V直流电,为了获得5V的直流电压和足够大的电流,并能提供两种接口,交流与直流输入都能通用,将电源电路设计成如下形式。
图3-6电源电路原理图
交流输入用15V的变压器,将变压器通过接口插到板子上。直流输入与交流输入类似,都要经过整流桥,确保电解电容C4不会反接,稳压电路公用,用MC7805实现5V直流稳压,最大可输出1A的电流,足以为整个系统供电。C5与C6用于防止稳压块产生自激振荡。C4用于滤波,使输入纹波很小,输出端接电容C7,用于防止输出电压突变。
3、硬件电路设计
3.1单片机最小系统的设计
本系统共用三块单片机,每块单片机均选用AT89S52,最小系统也都一样。由于三块单片机的主要任务是通信,为了得到准确的波特率,采用振荡频率为11.0592MHz的晶振,再接两个30pF的瓷片电容即可构成单片机的时钟电路。
单片机最小系统电路如下:
图3-1单片机最小系统电路
5多机通信协议的算法设计
5.1主从机程序设计
主机模式流程如下:
图3-7 主机模式通信流程图
从机模式通信流程如下:
图3-8从机模式通信流程图
5.2键盘程序设计
1号单片机的按键采用矩阵形式,4×4的行列矩阵,共16个按键,可以完成多种控制功能。1号单片机的键盘程序包括:按键扫描、获取键值与按键处理几部分。按键处理又包括实现各种功能的函数。由键盘程序负责调度。键盘控制流程如下:
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)
//将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++)
[5] 林雪每,彭佳红,姚志成.单片机多机通信协议的设计[J].单片机开发与应用,2006.2.
[6] 戴仙金.51单片机及其C语言程序开发实例[M].北京:清华大学出版社.2008.
7、完成效果