Ⅰ 单片机多机通信程序
单片机多机通信,一个主机多个从机+一个通信协议就可以了,正常的串口设置就可以,协议可以以数据包形式,如:引导符、从机号、数据长度、指令类型、数据1---数据n、校验码、结束符,以主机发送指令从机应答,从机间需由主机协助。
Ⅱ 单片机多机通信的实现
google上一搜,成千上万。
MCS-51的串行通信口
--------------------------------------------------------------------------------
MCS-51单片机内部有一个全双工的串行通信口,即串行接收和发送缓冲器(SBUF),这两个在物理上独立的接收发送器,既可以接收数据也可以发送数据。但接收缓冲器只能读出不能写入,而发送缓冲器则只能写入不能读出,它们的地址为99H。这个通信口既可以用于网络通信,亦可实现串行异步通信,还可以构成同步移位寄存器使用。如果在传行口的输入输出引脚上加上电平转换器,就可方便地构成标准的RS-232接口。下面我们分别介绍。
[1]. 基本概念
数据通信的传输方式
常用于数据通信的传输方式有单工、半双工、全双工和多工方式。
单工方式:数据仅按一个固定方向传送。因而这种传输方式的用途有限,常用于串行口的打印数据传输与简单系统间的数据采集。
半双工方式:数据可实现双向传送,但不能同时进行,实际的应用采用某种协议实现收/发开关转换。
全双工方式:允许双方同时进行数据双向传送,但一般全双工传输方式的线路和设备较复杂。
多工方式:以上三种传输方式都是用同一线路传输一种频率信号,为了充分地利用线路资源,可通过使用多路复用器或多路集线器,采用频分、时分或码分复用技术,即可实现在同一线路上资源共享功能,我们盛之为多工传输方式。
串行数据通信两种形式
异步通信
在这种通信方式中,接收器和发送器有各自的时钟,它们的工作是异步的,异步通信用一帧来表示一个字符,其内容如下:一个起始位,仅接着是若干个数据位,图2是传输45H的数据格式。
同步通信
同步通信格式中,发送器和接收器由同一个时钟源控制,为了克服在异步通信中,每传输一帧字符都必须加上起始位和停止位,占用了传输时间,在要求传送数据量较大的场合,速度就慢得多。同步传输方式去掉了这些起始位和停止位,只在传输数据块时先送出一个同步头(字符)标志即可。
同步传输方式比异步传输方式速度快,这是它的优势。但同步传输方式也有其缺点,即它必须要用一个时钟来协调收发器的工作,所以它的设备也较复杂。
串行数据通信的传输速率
串行数据传输速率有两个概念,即每秒转送的位数bps(Bit per second)和每秒符号数—波特率(Band rate),在具有调制解调器的通信中,波特率与调制速率有关。
[2]. MCS-51的串行口和控制寄存器
串行口控制寄存器
MCS-51单片机串行口寄存器结构如图3所示。SBUF为串行口的收发缓冲器,它是一个可寻址的专用寄存器,其中包含了接收器和发送器寄存器,可以实现全双工通信。但这两个寄存器具有同一地址(99H)。MCS-51的串行数据传输很简单,只要向发送缓冲器写入数据即可发送数据。而从接收缓冲器读出数据即可接收数据。
此外,从图中可看出,接收缓冲器前还加上一级输入移位寄存器,MCS-51这种结构目的在于接收数据时避免发生数据帧重叠现象,以免出错,部分文献称这种结构为双缓冲器结构。而发送数据时就不需要这样设置,因为发送时,CPU是主动的,不可能出现这种现象。
串行通信控制寄存器
在上一节我们已经分析了SCON控制寄存器,它是一个可寻址的专用寄存器,用于串行数据的通信控制,单元地址是98H,其结构格式如下:
表1 SCON寄存器结构
SCON D7 D6 D5 D4 D3 D2 D1 D0
SM0 SM1 SM2 REN TB8 RB8 TI RI
位地址 9FH 9EH 8DH 9CH 9BH 9AH 99H 98H
下面我们对各控制位功能介绍如下:
(1).SM0、SM1:串行口工作方式控制位。
SM0,SM1 工作方式
00 方式0
01 方式1
10 方式2
11 方式3
(2).SM2:多机通信控制位。
多机通信是工作于方式2和方式3,SM2位主要用于方式2和方式3。接收状态,当串行口工作于方式2或3,以及SM2=1时,只有当接收到第9位数据(RB8)为1时,才把接收到的前8位数据送入SBUF,且置位RI发出中断申请,否则会将接受到的数据放弃。当SM2=0时,就不管第位数据是0还是1,都难得数据送入SBUF,并发出中断申请。
工作于方式0时,SM2必须为0。
(3).REN:允许接收位。
REN用于控制数据接收的允许和禁止,REN=1时,允许接收,REN=0时,禁止接收。
(4).TB8:发送接收数据位8。
在方式2和方式3中,TB8是要发送的——即第9位数据位。在多机通信中同样亦要传输这一位,并且它代表传输的地址还是数据,TB8=0为数据,TB8=1时为地址。
(5).RB8:接收数据位8。
在方式2和方式3中,RB8存放接收到的第9位数据,用以识别接收到的数据特征。
(6).TI:发送中断标志位。
可寻址标志位。方式0时,发送完第8位数据后,由硬件置位,其它方式下,在发送或停止位之前由硬件置位,因此,TI=1表示帧发送结束,TI可由软件清“0”。
(7).RI:接收中断标志位。
可寻址标志位。接收完第8位数据后,该位由硬件置位,在其他工作方式下,该位由硬件置位,RI=1表示帧接收完成。
电源管理寄存器PCON
PCON主要是为CHMOS型单片机的电源控制而设置的专用寄存器,单元地址是87H,其结构格式如下:
表2 PCON电源管理寄存器结构
PCON D7 D6 D5 D4 D3 D2 D1 D0
位符号 SMOD - - - GF1 GF0 PD IDL
在CHMOS型单片机中,除SMOD位外,其他位均为虚设的,SMOD是串行口波特率倍增位,当SMOD=1时,串行口波特率加倍。系统复位默认为SMOD=0。
中断允许寄存器IE
中断允许寄存器在前一节中已阐述,这里重述一下对串行口有影响的位ES。ES为串行中断允许控制位,ES=1允许串行中断,ES=0,禁止串行中断。
表3 IE中断允许控制寄存器结构
位符号 EA - - ES ET1 EX1 ET0 EX0
位地址 AFH AEH ADH ACH ABH AAH A9H A8H
[完]
Ⅲ 单片机的多机通信是,如何设置从机的地址。
一般是由编程者自己来确定地址,或者通过硬件来设置,硬件地址设置通过电路板上的拨码开关来选择,例如下面这个图,有两个拨码开关,两位就00、01、10、11四个地址,依次类推,摄像监控云台控制里就是通过这种办法来设置的从机地址(一般是485通信)
Ⅳ 单片机要实现多机通信,那个RB8和TB8是怎么变化的
------
主机:
设置为SM2=0。
这是双机通信的形式,可以任意的发送和接收
发送:
以TB8=1发送,将发送到所有SM2=1的分机。这是呼叫某个从机。
以TB8=0发送,将发送到SM2=0的分机。这是双机通信的形式。
------
从机:
先设置为SM2=1。
这是多机通信的形式,只能收到RB8=1的。
接收:
仅能收到RB8=1的数据,确认是呼叫本机时,令SM2=0。
设置为SM2=0后,是双机通信的形式。
Ⅳ 单片机多机串行异步通信
//===================================================================== // 多机通讯从机1程序 //cong1.c //writer:谷雨 2008年3月22日于EDA实验室 //注: //===================================================================== #include<reg52.h> #define addr 0x31 //从机1地址 unsigned char receive; unsigned char xx[ ]={"1234567890"}; void Uart_Init(void) { TMOD = 0x20; //定时器T1使用工作方式2 TH1 = 0XF3; TL1 = 0XF3; PCON = 0x00; //SMOD=1; SCON = 0xf0; //工作方式3,9位数据位,波特率9600bit/s,允许接收 TR1 = 1; //开始计时 EA = 1; //中断允许 ES = 1; //串行中断允许 } void Serial_INT() interrupt 4 { if(!RI) return; RI=0; if(RB8==1) { if(SBUF==addr) SM2=0; else SM2=1; } if(RB8==0) receive=SBUF; } void SendOneByte(unsigned char c) { TB8=0; SBUF = c; while(!TI); TI = 0; } void SendListChar(unsigned char *DData,unsigned char Ef) { unsigned char L=0; if(Ef!=0) { for( ;L<Ef;L++) //显示有效长度 SendOneByte(DData[L]); //发送单个字符 }else while (DData[L]!='\0') //发送至字串结束 { SendOneByte(DData[L]); //发送单个字符 L++; //下一个字符 } } void main() { Uart_Init(); while(1) { switch(receive) { case 0xff: break; case 0x01: //在此可以写入要完成的动作,最多可完成256个动作 SendListChar(xx,0); break; case 0x02: break; case 0x33: P1=!P1; //为方便其间,赋值给P1口,测P1口电平来检测该程序 break; default: break; } receive=0xff; } } //===================================================================== // 多机通讯主机程序 //zhuji.c //writer:谷雨 2008年3月22日于EDA实验室 //注:主机先发送地址,接收到应答后,再发送数据 //===================================================================== #include<reg52.h> #define addr1 0x31 //从机1地址 #define addr2 0x32 //从机2地址 unsigned char xx[10]; unsigned char p = 0; void delay_1ms(unsigned int i) { unsigned char j; while ((i--)!=0) {for (j=0;j<125;j++);} } void Uart_Init(void) { TMOD = 0x20; //定时器T1使用工作方式2 TH1 = 0XF3; TL1 = 0XF3; PCON = 0x00; //SMOD=1; SCON = 0xf0; //工作方式3,9位数据位,波特率9600bit/s,允许接收 SM2 = 0; TR1 = 1; //开始计时 EA = 1; //中断允许 ES = 1; //串行中断允许 } void Serial_INT() interrupt 4 { if(!RI) return; ES = 0; RI = 0; xx[p] = SBUF; p++; ES = 1; } void send_addr(unsigned char addr) //发送地址 { p = 0; TB8 = 1; //发送地址帧 SBUF=addr; //发送地址 while(!TI); //等待发送完毕 TI=0; //软件复位TI } void send_data(unsigned char ddata) //发送数据 { TB8=0; //发送数据帧 SBUF=ddata; //发送数据 while(!TI); TI=0; //软件复位TI } void main() { Uart_Init(); delay_1ms(2000); while(1) { send_addr(addr1); //向从机1发地址 send_data(0x33); send_data(0x01); delay_1ms(500); if(xx[9]=='0') P1=0xaa; delay_1ms(500); send_addr(addr2); //向从机2发地址 send_data(0x33); send_data(0x01); delay_1ms(500); if(xx[9]=='9') P1=0x55; delay_1ms(500); } // while(1); }
Ⅵ STC15单片机多机通讯怎样避免多个从机同时回复主机数据
这种结构,又是理想的一个主机,多个从机的网络通信系统。主机向从机发送时,要带有从机地址,从机与这个地址相符时,才与主机通信。
各从机之间是不能互相通信的。从机能与一个主机通信。只有一个主机。
详细的通信过程,教材上就讲这个事,主机,从机都用TB8T和RB8位来识别地址帧。
但实际上,几乎没有这么做的,所以,就是教材上这么讲,实际没人这么做。
Ⅶ 简述mcs 51单片机实现多机通信的过程
使用串口的方式 2 和方式3 ,通过使用第九数据位和内置UART0 地址识别硬件支持一个主处理器与一个或多个从处理器之间的多机通信。当主机开始一次数据传输时先发送一个用于选择目标从机的地址字节。地址字节与数据字节的区别是:地址字节的第九位为逻辑1;数据字节的第九位总是设置为逻辑0。
如果从机的SM20 位(SCON0.5)被置‘1’,则只有当接收到的第九位为逻辑1(RB80=1),收到有效的停止位并且接收的数据字节与UART0 从地址匹配时UART0 才会产生中断。在接收地址的中断处理程序中,从机应清除它的SM20 位以允许后面接收数据字节时产生中断。一旦接收完整个消息,被寻址的从机应将它的SM20 位重新置‘1’以忽略所有的数据传输,直到它收到下一个地址字节。在SM20 为逻辑‘1’时,UART0 忽略所有那些与UART0 地址不匹配以及第九位不是逻辑‘1’的字节。
可以将多个地址分配给一个从机,或将一个地址分配给多个从机从而允许同时向多个从机进行“广播”式发送。主机可以被配置为接收所有的传输数据,或通过实现某种协议使主/从角色能临时变换以允许原来的主机和从机之间进行半双工通信。
Ⅷ 如何用硬件实现单片机的多机通讯
这个硬件和软件配合才行,你需要多少个从机
Ⅸ 单片机多机通信的基本原理
将一机设为主机,其他设为从机,将从机编号,并存起来,通信时,主机若要对所有机器通信,刚发出一个自己设定好的信号,若要对某一特定机器通信,则发出该机器的编号,各机收到通信请求命令后,将命令与自己存的编号对比,看主机是不是要与本机通信,若是,接收后边的信号,若不是,则不接收!
Ⅹ 单片机多机通信是怎么回事
单片机多机通信很复杂的,给你解释下原理,其他的自己到网上去搜下资料,看下程序就可以理解了的。我们学的是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,恢复多机通信系统原有的状态。