1. 试述MCS—51单片机的多机通讯原理
用串口连接,其中一个为主机,其余为从机,所有从机的RXD都接到主机的TXD端,TXD接到主机的RXD端,所有通信都有主机来发起,从机不能主动发起通信操作,只能等待,而且从机之间通信要通过主机中转。串行端口控制寄存器SCON要做相应的配置。
2. 简述mcs 51单片机实现多机通信的过程
使用串口的方式 2 和方式3 ,通过使用第九数据位和内置UART0 地址识别硬件支持一个主处理器与一个或多个从处理器之间的多机通信。当主机开始一次数据传输时先发送一个用于选择目标从机的地址字节。地址字节与数据字节的区别是:地址字节的第九位为逻辑1;数据字节的第九位总是设置为逻辑0。
如果从机的SM20 位(SCON0.5)被置‘1’,则只有当接收到的第九位为逻辑1(RB80=1),收到有效的停止位并且接收的数据字节与UART0 从地址匹配时UART0 才会产生中断。在接收地址的中断处理程序中,从机应清除它的SM20 位以允许后面接收数据字节时产生中断。一旦接收完整个消息,被寻址的从机应将它的SM20 位重新置‘1’以忽略所有的数据传输,直到它收到下一个地址字节。在SM20 为逻辑‘1’时,UART0 忽略所有那些与UART0 地址不匹配以及第九位不是逻辑‘1’的字节。
可以将多个地址分配给一个从机,或将一个地址分配给多个从机从而允许同时向多个从机进行“广播”式发送。主机可以被配置为接收所有的传输数据,或通过实现某种协议使主/从角色能临时变换以允许原来的主机和从机之间进行半双工通信。
3. 89C51系列单片机串口通信的四种方式极其特点
80C51串行通信共有4种工作方式,由串行控制寄存器SCON中SM0SM1决定.
方式0是同步移位寄存器方式,帧格式8位,波特率固定:fosc/12;
方式1是8位异步通信方式,帧格式10位,波特率可变:T1溢出率/n(n=32或16);
方式2是9位异步通信方式,帧格式样11位,波特率固定:fosc/n(n=64或32);
方式3是9位异步通信方式,帧格式11位,波特率可变:T1溢出率/n(n=32或16);
方式1,2,3的区别方要表现在帧格式及波特率两个方面.
方式1与方式2帧格式相同波特率不同:方式1波特率可变与T1溢出率有关;方式2波特率固定.
方式1与方式3波特率相同帧格式不同:方式1帧格式10位;方式3帧格式11位.
方式1,2,3通信过程完全相同,均为异步通信方式.
方式0 移位寄存器 作同步传输方式,波特率固定,
方式1、2 异步通信,波特率可变,应用范围广
方式3 应用于多机通信
串行窗口,是看不见敲进去的字符的。
要想看见,须再用一个串行窗口。
方式 0 :这种工作方式比较特殊,与常见的微型计算机的串行口不同,它又叫同步移位寄存器输出方式。在这种方式下,数据从 RXD 端串行输出或输入,同步信号从 TXD 端输出,波特率固定不变,为振荡率的 1/12 。该方式是以 8 位数据为一帧,没有起始位和停止位,先发送或接收最低位。
方式 2 :采用这种方式可接收或发送 11 位数据,以 11 位为一帧,比方式 1 增加了一个数据位,其余相同。第 9 个数据即 D8 位具有特别的用途,可以通过软件搂控制它,再加特殊功能寄存器 SCON 中的 SM2 位的配合,可使 MCS-51 单片机串行口适用于多机通信。方式 2 的波特率固定,只有两种选择,为振荡率的 1/64 或 1/32 ,可由 PCON 的最高位选择。
方式 3 :方式 3 与方式 2 完全类似,唯一的区别是方式 3 的波特率是可变的。而帧格式与方式 2- 样为 11 位一帧。所以方式 3 也适合于多机通信。
ORG 0000H
SJMP START
ORG 0023H
LJMP UART_INT
START:
;*****串口初始化********
;MOV PCON,#80H ;SMOD=1 X2
;MOV SCON,#50H ;串口方式1(10位)
MOV SCON,#0D0H ;串口方式3(11位)
MOV TMOD,#20H ;T1为8位重装
MOV TH1,#0FDH ;9600PTS 11.0592M (12T)
MOV TL1,#0FDH
MOV TH0,#0FFH
MOV TL0,#0FFH
;**********************
SETB ES
SETB TR1
SETB EA
SJMP $
UART_INT:
CLR RI
MOV A,SBUF
RRC A
MOV P1.0,C
RETI
给你个关键字,去搜呗,labview 串口通信 ,只要labview可以串口通信了,那就能跟单片机套上了
其实你完全可以用Vc++的MFC里面的串口控件去写,几句话而已,也可以控制
我来告诉你标准答案!80C51串行通信共有4种工作方式,由串行控制寄存器SCON中SM0SM1决定.
方式0是同步移位寄存器方式,帧格式8位,波特率固定:fosc/12;
方式1是8位异步通信方式,帧格式10位,波特率可变:T1溢出率/n(n=32或16);
方式2是9位异步通信方式,帧格式样11位,波特率固定:fosc/n(n=64或32);
方式3是9位异步通信方式,帧格式11位,波特率可变:T1溢出率/n(n=32或16);
方式1,2,3的区别方要表现在帧格式及波特率两个方面.
方式1与方式2帧格式相同波特率不同:方式1波特率可变与T1溢出率有关;方式2波特率固定.
方式1与方式3波特率相同帧格式不同:方式1帧格式10位;方式3帧格式11位.
方式1,2,3通信过程完全相同,均为异步通信方式.
串口可以一对多,主从方式,串口有一位用作识别码,主机先要发送接受数据的从机地址,只有地址相符,从机才能使能接受,然后主机发送
把:if(a==1)
改为:if(a==0x31)
试试。
4. 51单片机如何连接多个器件
当然是通过引脚了,但是如果器件设备是有接口的也可以使用各种总线连接(特定的引脚)。如:RS232接口
5. 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);
}
6. 51单片机双机通信
//=====================================================================
// 多机通讯主机程序
//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);
} //=====================================================================
// 多机通讯从机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;
}
}
7. 简述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#机的缓冲区。