1. C51单片机多机通信C语言
单片机a,b,c.a为主机,bc为从机。a上有一个外部中断0输入,按第一次a的两个LED亮500ms,再按一下,b机的两个LED灯亮500ms,第三次按下c机的两个LED灯亮500ms,然后周而复始。两个数码管分别显示0/1/2,和abc(bc由从机反馈)
/*
主从通信基本步骤:
1.主机从机初始化为方式2或者3,从机都置SM2=1,允许中断
2.主机置TB8=1,发送从机地址
3.所有从机均接收主机发送要寻址的从机地址
4.被寻址的从机确认地址后,置本机SM2=0,向主机返回地址,供主机核对
5.核对无误后,主机向被寻址的从机发送命令,通知从机接受或者发送数据。
6.本次通信结束后,主从机重置SM2=1,主机可再对其他从机寻址
*/
******************************************************************
主机a:
******************************************************************
#include<reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
ucharleddata[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x40,0x00};
ucharMode;
sbitP10=P1^0;
sbitP13=P1^3;
sbitP17=P1^7;
sbitP20=P2^0;
sbitP21=P2^1;
voidUART_init()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SCON=0xd0;
ES=1;
EX0=1;
IT0=1;//INT0下跳触发
EA=1;
TI=0;
}
voidDelayMs(intms)
{
uchari;
while(ms--)
for(i=0;i<120;i++);
}
voidputc_to_SerialPort(ucharc)
{
SBUF=c;
while(TI==0);
TI=0;
}
voidMasterControl(unsignedcharAddr,unsignedcharComd)
{
TB8=1;
putc_to_SerialPort(Addr);
DelayMs(50);
TB8=0;
putc_to_SerialPort(Comd);
DelayMs(50);
}
Ex0_int(void)interrupt0
{
P0=leddata[Mode];
P20=0;
if(Mode==0)
{
P2=leddata[10];
P10=0;
P13=0;
DelayMs(500);
P10=1;
P13=1;
//MasterControl('b','C');
//MasterControl('c','C');
}
elseif(Mode==1)
{
P10=1;
P13=1;
MasterControl('b','O');
//MasterControl('c','C');
}
elseif(Mode==2)
{
P10=1;
P13=1;
//MasterControl('b','C');
MasterControl('c','O');
}
Mode=(Mode+1)%3;
}
com_int(void)interrupt4
{
if(RI)
{
RI=0;
if(SBUF=='b')
{
P2=leddata[11];
}
if(SBUF=='c')
{
P2=leddata[12];
}
}
}
voidmain(void)
{
P0=0x00;
P1=0xff;
P2=0x00;
UART_init();
Mode=0;
while(1);
}
******************************************************************
从机b:
******************************************************************
#include<reg51.h>
#defineucharunsignedchar
ucharRecData;
sbitP10=P1^0;
sbitP13=P1^3;
voidUART_init()
{
TMOD=0x21;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SCON=0xf0;
ES=1;
PS=1;
EA=1;
}
voidDelayMs(intms)
{
uchari;
while(ms--)
for(i=0;i<120;i++);
}
voidputc_to_SerialPort(ucharc)
{
SBUF=c;
while(TI==0);
TI=0;
}
com_int(void)interrupt4
{
if(RI)
{
RecData=SBUF;
RI=0;
if(RB8==1)//地址
{
if(RecData=='b')//是自己的地址,置SM2=0,准备接受数据
{
SM2=0;
putc_to_SerialPort('b');
}
else//不是自己的地址
{
SM2=1;
}
}
if(RB8==0)//数据
{
if(RecData=='O')
{
P10=0;
P13=0;
DelayMs(500);
P10=1;
P13=1;
}
if(RecData=='C')
{
P10=1;
P13=1;
}
SM2=1;
}
}
}
voidmain(void)
{
P0=0xff;
P1=0xff;
UART_init();
while(1);
}
******************************************************************
从机c:
******************************************************************
#include<reg51.h>
#defineucharunsignedchar
ucharRecData;
sbitP10=P1^0;
sbitP13=P1^3;
voidUART_init()
{
TMOD=0x21;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SCON=0xf0;
ES=1;
PS=1;
EA=1;
}
voidDelayMs(intms)
{
uchari;
while(ms--)
for(i=0;i<120;i++);
}
voidputc_to_SerialPort(ucharc)
{
SBUF=c;
while(TI==0);
TI=0;
}
com_int(void)interrupt4
{
if(RI)
{
RecData=SBUF;
RI=0;
if(RB8==1)//地址
{
if(RecData=='c')//是自己的地址,置SM2=0,准备接受数据
{
SM2=0;
putc_to_SerialPort('c');
}
else//不是自己的地址
{
SM2=1;
}
}
if(RB8==0)//数据
{
if(RecData=='O')
{
P10=0;
P13=0;
DelayMs(500);
P10=1;
P13=1;
SM2=1;
}
if(RecData=='C')
{
P10=1;
P13=1;
SM2=1;
}
}
}
}
voidmain(void)
{
P0=0xff;
P1=0xff;
UART_init();
while(1);
}
2. 51单片机多机通信(跪求程序)
想伸手拿,别人给你做项目。可能做不到。。。。自己学一下,别人给出点方案是可以的
3. 单片机多机通信是怎么回事
单片机多机通信很复杂的,给你解释下原理,其他的自己到网上去搜下资料,看下程序就可以理解了的。我们学的是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,恢复多机通信系统原有的状态。
4. 简述at89s51单片机主从结构多机通信原理
简述MCS-51系列单片机主从结构多机通信原理,设有一台主机与三台从机通信,其中一台从机通信地址号为01H,请叙述主机呼叫从机并向其传送一个字节数据的过程。(请给出原理图)
答:
原理图如上图所示,假设主机呼叫01H从机,首先呼叫:主机发送地址帧0000 00011(TB8)此时各从机的SM2位置1,且收到的RB8=1,故激活RI。各从机将接收到的地址与地机地址比较,结果1#机被选中,则其SM2清零;0#、2#机不变。接着传数;主机发送数据帧,×××× ××××0 ,此时1#机SM2=0, RB8=0 则激活RI,而0#,2#机SM2=1,RB8=0则不激活RI,然后数据进入1#机的缓冲区。
5. 简述80C51单片机多机通信的特点。
多机通信是工作于方式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。
6. 单片机如何实现多机串口通讯
可以选用 MCS-51 单片机。
它有多机串口通信的解决方案。
7. 用max485 51单片机多机通信问题
多机通信,不一定画上 MAX485,直接连接,就可以实验程序了。
前面初始化,已经是 SM2=1,只能收到 TB8=1 的数据。
所以,程序中,并不需要再判断 RB8 是否为一。
;-------------------
if (RI) {
RI = 0;
a = SBUF;
if(a == 0x01) { // (2好从机为02)
SM2 = 0;
delay(10);
P35 = 1; //fasong
SBUF = 0x12;
while(!TI); //--楼主这里漏掉了分号
TI = 0;
P35 = 0;
SM2 = 1; //继续设置为仅收取 TB8=1 的状态
}
}
参考:
http://hi..com/do_sermon/item/46b7c92b103d24cea4275a77
8. MCS-51单片机的串行接口有()种工作方式其中方式()为多机通讯方式
MCS-51单片机的串行接口有(4)种工作方式其中方式(3)为多机通讯方式
8051各中断源的中断请求是属于什么级别是由(IE)寄存器的内容决定的
决定程序执行顺序的寄存器是(PC),它的最大寻址范围是(64K)。PC的值是(程序运行当前)的地址。
P0口当不作系统扩展时,可作(IO)使用。当作系统扩展时,P0口担任分时复用的总线口。在这种情况下,应在外部加(锁存器)将地址数据锁存,地址锁存信号用(ALE)。
根据串行通信数据传输的方向,可将串行通信系统传输方式分为(单工)方式,(半双工)方式和(全双工)方式。
9. 试述MCS—51单片机的多机通讯原理
用串口连接,其中一个为主机,其余为从机,所有从机的RXD都接到主机的TXD端,TXD接到主机的RXD端,所有通信都有主机来发起,从机不能主动发起通信操作,只能等待,而且从机之间通信要通过主机中转。串行端口控制寄存器SCON要做相应的配置。
10. 简述mcs 51单片机实现多机通信的过程
使用串口的方式 2 和方式3 ,通过使用第九数据位和内置UART0 地址识别硬件支持一个主处理器与一个或多个从处理器之间的多机通信。当主机开始一次数据传输时先发送一个用于选择目标从机的地址字节。地址字节与数据字节的区别是:地址字节的第九位为逻辑1;数据字节的第九位总是设置为逻辑0。
如果从机的SM20 位(SCON0.5)被置‘1’,则只有当接收到的第九位为逻辑1(RB80=1),收到有效的停止位并且接收的数据字节与UART0 从地址匹配时UART0 才会产生中断。在接收地址的中断处理程序中,从机应清除它的SM20 位以允许后面接收数据字节时产生中断。一旦接收完整个消息,被寻址的从机应将它的SM20 位重新置‘1’以忽略所有的数据传输,直到它收到下一个地址字节。在SM20 为逻辑‘1’时,UART0 忽略所有那些与UART0 地址不匹配以及第九位不是逻辑‘1’的字节。
可以将多个地址分配给一个从机,或将一个地址分配给多个从机从而允许同时向多个从机进行“广播”式发送。主机可以被配置为接收所有的传输数据,或通过实现某种协议使主/从角色能临时变换以允许原来的主机和从机之间进行半双工通信。