导航:首页 > 操作系统 > 多单片机通信

多单片机通信

发布时间:2022-01-29 11:22:49

㈠ 基于RS485总线的PC与多个单片机通信的C语言程序

这个问题很简单,用485通讯的话,思路如下
思路:
PC方面:可以用MSCOMM控件先发一个字符表示接收地址,后延迟1ms,(注意PC端在485通讯在字符发送过程中一定要加延迟,这是我多次测试的总结,如果是用调试助手的话,他内部代码已经加过延迟了,就不必考虑这个问题)再发控制指令,初学者建议直接用调试助手
单片机方面:首先对接收数据进行核对,如果不是本地地址,放弃,如果是本地地址,在检测命令是否正确,如果正确,做出处理后返回PC本地地址并发送命令
我举个例子教你怎么玩多站通讯,下面是我已经通过测试的一个程序
#include <reg51.h> //选用晶振11.0592MHz
#include <absacc.h>
#define DATA51 DBYTE[0x80] //80H存数据
#define AddressID 0x31 //本机地址1
sbit RS485E=P3^7; //定义485的使能脚// RS5485E=0为接收状态 RS5485E=1为发送状态
sbit MAX485_DIR=P3^7;
main()
{

//****************通讯设置
SCON = 0xF0; //REN=1允许串行接受状态,串口工作模式3,SM2=1
TMOD|= 0x20; //定时器工作方式2
PCON|= 0x80; //波特率提高一倍
IP=0x10; //串口优先级高
// TH1 = 0xFD; //baud*2 /* reload value 19200、数据位8、停止位1。效验位无(11.0592)
TH1 = 0xf4; //fa // //baud*2 /* 波特率4800、数据位8、停止位1。效验位无 (11.0592M)
TL1 = 0xf4;
TR1 = 1; //开启定时器1
EA = 1; // 开总中断
ES = 1; //开串口中断
RS485E=0; // RS5485E=0为接收状态 RS5485E=1为发送状态
while(1);
}

void counter4(void) interrupt 4 using 2 //串口中断
{
while(RI==0);
RI=0;
if(SBUF==AddressID)
{
while(RI==0);
RI=0;
if(SBUF==0x01) //发送指令
{
MAX485_DIR=1; //开发送
SBUF=AddressID;
while(TI==0);
TI=0;
SBUF=0x6f; //发送o
while(TI==0);
TI=0;
SBUF=0x6b; //发送k
MAX485_DIR=0; //开接收
}

if(SBUF==0x00) //接收
{
//这里怎么处理就看你自己要怎么做了,你没要求,我也不好怎么写,就自己写吧
}
}

}
程序调试通过,可以直接套用

㈡ 单片机多机通信程序

单片机多机通信,一个主机多个从机+一个通信协议就可以了,正常的串口设置就可以,协议可以以数据包形式,如:引导符、从机号、数据长度、指令类型、数据1---数据n、校验码、结束符,以主机发送指令从机应答,从机间需由主机协助。

㈢ 多个单片机串口通信如何进行

利用单片机串口控制寄存器SCON中的SM2位选择模式2或模式3可以进行多机通信,具体说是用第九位TB8和RB8来区分地址帧和数据帧,当TB8为0时发送的是数据帧,通常单片机接收到后直接抛弃,不产生中断,当TB8为1时发送的是地址帧,单片机收到的第9位(RB8)为1时把收到的前8位地址与本机地址比对,如果相同则切换接收模式以接收接下来的数据帧,如果不同则继续保持接收地址帧的状态。

㈣ 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);

}

㈤ 单片机多机通信是怎么回事

单片机多机通信很复杂的,给你解释下原理,其他的自己到网上去搜下资料,看下程序就可以理解了的。我们学的是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,恢复多机通信系统原有的状态。

㈥ 单片机多机通信有哪些方式呢

主要看距离,板内有iic,spi等,板外can,usb,以太网。。。

㈦ 51单片机多机通信

楼主先解决双机通信的函数。

楼主把双机通信函数,显示出来,之后,
大家帮你,稍稍改一改,就是多机通信的函数了。

㈧ 关于单片机的多机通信

描述一下硬件连接情况,是在同一组通讯线上还是分两组通讯线实现1主2从?
如果是通讯总线分挂从机,就要将从机的串口设置成空闲地址帧方式,地址帧使用两个停止位.让从机在空闲状态下对2个地址位相应,产生串口服务申请或者中断.被叫从机发现于自己地址一致就会应,并建立一个停止位的通讯连接.地址不一致的从机同时也收到了地址呼叫,只是因为不是自己而不再响应,直到下一个地址帧到来.如果是这样,请在从机硬件的TX,RX线上传接100欧姆电阻避免电流冲击.
如果是分两组通讯线,应该没有问题的.

㈨ 单片机多机通信的基本原理

将一机设为主机,其他设为从机,将从机编号,并存起来,通信时,主机若要对所有机器通信,刚发出一个自己设定好的信号,若要对某一特定机器通信,则发出该机器的编号,各机收到通信请求命令后,将命令与自己存的编号对比,看主机是不是要与本机通信,若是,接收后边的信号,若不是,则不接收!

㈩ 单片机通信方式有几种

要看你用的是那个单片机
常用的有UART,SPI,I2C等
也可并行通讯,也可以自定义协议
完全取决于你的应用

阅读全文

与多单片机通信相关的资料

热点内容
程序员职业有哪些好处 浏览:706
大都会软件app如何扫码 浏览:428
单片机0x38 浏览:755
程序员浪漫工作 浏览:328
php几分钟前 浏览:307
项目编译及运行 浏览:893
程序员的基本功 浏览:521
遗传算法排班 浏览:288
如何加密金融安全网 浏览:29
家里的wifi太卡了怎么样自己加密 浏览:232
华为链路聚合命令 浏览:425
apache自动运行php 浏览:518
485和单片机 浏览:974
xp修复系统命令 浏览:519
微你app怎么加好友 浏览:795
程序员转正 浏览:208
应用隐私加密忘记密码怎么办 浏览:683
2g视频怎么压缩 浏览:610
康佳电视服务器异常怎么解决 浏览:840
怎么用c语言编译简单的小游戏 浏览:814