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

单片机双机通信

发布时间:2022-02-09 02:46:53

❶ 51单片机怎么双机通信

你好!!

单片机双机通讯,就是直接单片机的串口RX和TX直接连接,然后通过串口命令完成通讯!

给你一个实例,可以完全满足你的要求!

希望帮到你,满意请采纳!

❷ 设计一个单片机双机通信系统,并编写通信程序

串口调试助手是PC端的软件,用来从PC的串口发送和接收数据的。我们调试PC和单片机之间通讯的时候用来模拟PC端应用软件给单片机发送数据和接收单片机发送的数据的。你调试的是单片机和单片机之间的通讯,不适合用串口调试助手的。
但是单片机和单片机通讯不容易知道实际通讯的数据,所以存在很大的调试难度。如果条件允许的话,一般是通过单片机连PC串口,让PC模拟模块收发数据来验证串口通讯是否正常(PC端能够直接看到单片机发送的数据,从而判断程序是否符合同模块的通讯要求),再把PC换成模块进行通讯。这样调试比较方便。

你和模块通讯也是单纯的串口通讯。
我又仔细分析了一下你的系统,按你的意思应该是拿51单片机做上位机。习惯上我们把PC称为上位机,所以刚才没明白。

1、SMOD是用来给串口波特率硬件倍频的。在串口模式1,2,3下,如果SMOD=0波特率是4800,那么SMOD=1时波特率是9600。它存在的理由就是:如果要求的波特率非常快,在给定晶振条件下SMOD=0已经满足不了,才需要SMOD=1倍频。
比如你11.0592MHZ在SMOD=0时波特率最大28800bps达不到要求的57600bps,所以你要用SMOD=1倍频才能实现。
你串口要选择模式1,波特率是可变的,取决于定时器1的溢出速率:
波特率=(2SMOD÷32)×定时器1 溢出速率
通常会使用定时器1 工作在定时器工作模式2下,这时定时值中的TL1 做为计数,TH1 做为自动重装值 ,这个定时模式下,定时器溢出后,TH1 的值会自动装载到TL1,再次开始计数,这样可以不用软件去干预,使得定时更准确。在这个定时模式2 下定时器1 溢出速率的计算公式如下:
溢出速率=(计数速率)/(256-TH1) ;
计数速率= 11.0592M/12;
算了一下是TH1=255(#0FFH);就是计数器走一个计数周期。

2、你不用关心什么叫做数据包,只是一种形象的叫法。把一串数据作为一次通讯的内容,这一串数据就是一个包了。那个2位和4位只是写法上便于你理解的,
如01H +0000H + 01H + 03H + 0005H
对应上面的包格式解释0000H是地址码保留字0005H是校验和。
而串口通讯一帧只能发送一个字节。发送的时候只能 01H + 00H +00H + 01H + 03H + 00H + 05H 依序发送。
用汇编写的话流程就是 写入第一个字节01H到SBUF,等待直到TI=1,发送第二个字节00H,等待直到TI=1,发送第三个字节00H,如此循环直到发送完05H为止。

3、类似发送,应答8181H也是81H+81H两个字节回复的。可以用中断,也可以用查询。例如2的发送通讯中05H发送完之后就要开始查询RI直到RI=1,然后就把 SBUF中的字节读出来,是81H,清RI后再查询RI直到RI=1,把 SBUF中的字节读出来,是81H,清RI。如果判断两个接收的都是81H那就表明收包正确。

4、串口通讯一帧只能发送一个字节。这个就不是问题了。

+我hi交流,不留Q,不留程序。

❸ 在单片机的串口通信中,双机通信与单机通信有什么不同

在单片机的串口通信中,有双机通信,却没有单机通信,你给自己打电话怎么打?要通信,至少要有两个单片机。两个单片机互相通信叫双机通信。另一种应该是多机通信,在多机通信模式下,通常是一个主机发送,多个从机接收。就好比,一个老师在讲课/发送,很多的学生在听课/接收,学生也想发送/发言答题,一是老师提问学生,二是学生举手经老师允许才可发言。

❹ 单片机双机通信是不是要对两个单片机分别写程序

是啊。针对发送和接受的单片机都要进行编程
现在的单片机应该都有串口模块(TXD和RXD两个管脚),通过串口发送数据的流程一般都是:1,设置串口模块的相关寄存器,如格式寄存器(8位,有无校验位等),波特率寄存器;2,发送的话就向发送数据寄存器写入数据,接收数据则不需要;3,通过标志位或中断的方式表明发送或接收动作完成。
你用的单片机如果有仿真器就用仿真器验证,或者单片机支持在线调试就使用在线验证的方式。

❺ 51单片机双机通讯问题

#include<reg51.h> //发送 供参考
sbitk0=P1^0; //这是10按键
sbitk1=P1^1; //发送0-9 的编码
sbitk2=P1^2;
sbitk3=P1^3;
sbitk4=P1^4;
sbitk5=P1^5;
sbitk6=P1^6;
sbitk7=P1^7;
sbitk8=P3^3;
sbitk9=P3^4;
sbitled=P3^5;
bit y0,y1,y2,y3,y4,y5,y6,y7,y8,y9;
voidmain(void)
{
SCON=0x50; //REN=1允许串行接受状态,串口工作模式1
TMOD|=0x20; //定时器工作方式2
PCON|=0x80; //数据位8、停止位1。效验位无(12M)
TH1=0xFD; //TH1=0xFD;波特率9600
TL1=0xFD;
TR1 =1;
while(1)
{
if(k0==0&&y0==0){y0=1;SBUF=0xc0;led=0;}
if(k0==1){y0=0;}
if(k1==0&&y1==0){y1=1;SBUF=0xf9;led=0;}
if(k1==1){y1=0;}
if(k2==0&&y2==0){y2=1;SBUF=0xa4;led=0;}
if(k2==1){y2=0;}
if(k3==0&&y3==0){y3=1;SBUF=0xb0;led=0;}
if(k3==1){y3=0;}
if(k4==0&&y4==0){y4=1;SBUF=0x99;led=0;}
if(k4==1){y4=0;}
if(k5==0&&y5==0){y5=1;SBUF=0x92;led=0;}
if(k5==1){y5=0;}
if(k6==0&&y6==0){y6=1;SBUF=0x82;led=0;}
if(k6==1){y6=0;}
if(k7==0&&y7==0){y7=1;SBUF=0xf8;led=0;}
if(k7==1){y7=0;}
if(k8==0&&y8==0){y8=1;SBUF=0x80;led=0;}
if(k8==1){y8=0;}
if(k9==0&&y9==0){y9=1;SBUF=0x90;led=0;}
if(k9==1){y9=0;}
if(led==0)
{
while(!TI);
TI=0;
led=1;
}
}
}

#include<reg51.h>//接收
voidmain(void)
{
SCON=0x50; //REN=1允许串行接受状态,串口工作模式1
TMOD|=0x20; //定时器工作方式2
PCON|=0x80; //数据位8、停止位1。效验位无(12M)
TH1=0xFD; //TH1=0xFD;波特率9600
TL1=0xFD;
TR1 =1;
ES =1; //开串口中断
EA =1; //开总中断
P1=0xbf;
while(1)
{

}
}
voidchuankou(void)interrupt4
{
if(RI==1)
{
RI=0;
TI=0;
P1=SBUF; // 显示0-9
}
}

❻ 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;
}
}

❼ 单片机 双机通信 程序

双机通信不需要安装虚拟端口软件
,两机通过txd
<==>
rxd
直接通信。
#include
#define
uchar
unsigned
char;
#define
uint
unsigneed
int;
uchar
a0,a1,a2,a3,temp,i;
uchar
code
tab[
]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbit
p2_0=p2^0;
sbit
p2_1=p2^1;
sbit
p2_2=p2^2;
sbit
p2_3=p2^3;
void
delay(int
ms)
{
while(ms--)
for(i=0;i<123;i++);
}
void
inituart()
{
tmod=0x20;
//m1=1,m0=0
定时器1工作方式2(定时常数重装,8
位)
scon=0x50;
//sm0=0,sm1=1,ren=1
串口工作方式1,允许接收
th1=0xfd;
//晶振11.0592时,波特率9600
tl1=th1;
//tl1计数,溢出后,th1值送入tl1
ea=1;
//开总中断
es=1;
//允许串口中断
tr1=1;
//启动定时器1
}
void
disp()
{
a0=temp%2;
a1=temp/2%2;
a2=temp/2/2%2;
a3=temp/2/2/2%2;
p2_0=0;
p0=tab[a0];
delay(1);
p2_0=1;
p2_1=0;
p0=tab[a1];
delay(1);
p2_1=1;
p2_2=0;
p0=tab[a2];
delay(1);
p2_2=1;
p2_3=0;
p0=tab[a3];
delay(1);
p2_3=1;
}
void
main()
{
inituart();
//调用串口初始化子程序
while(1)
{
disp();
sbuf=p1;
while(ti==0);
ti=0;
}
}
void
uartinterrupt(
)
interrupt
4
{
if(ri)
{
ri=0;
temp=sbuf;
}
}

❽ 求51单片机双机通讯C程序!!! 要求是全双工的!!!!

多字节的数据传输,是需要制定规则的,收发双方都要按照规则通信。

参考下图。

❾ 单片机双机通信程序

双机器通信很容易的。如果用Proteus仿真的话还得安装虚拟端口软件。

❿ 单片机多机通信与双机通信问题

多机通信就1个单片机与多个单片机通信,双机通信就是两个单片机通信,或一PC与多机,或一pc与单片机,这个这么好理解还拿出来问!

阅读全文

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

热点内容
云上服务器贵州 浏览:643
qq三国怎么使用云服务器 浏览:296
一键加密字体怎么设置 浏览:141
majority算法 浏览:818
如何开启电脑的dlna服务器 浏览:7
3提成怎么算法 浏览:970
php是不是解释性语言 浏览:25
手机设置远程定位服务器地址 浏览:913
android模拟器装apk 浏览:773
炒黄金app哪个好用 浏览:993
恐惧症app哪个最好用 浏览:288
亿赛通加密软件好用吗 浏览:578
为什么光遇排队服务器忙 浏览:826
哪个app能把手p瘦 浏览:253
java中的date类型 浏览:431
面向程序员的范畴论 浏览:57
如何查询服务器所有电脑名 浏览:902
shell命令jar 浏览:301
有什么做手帐app 浏览:156
phpjquery源码 浏览:886