① 51单片机双机通讯物理接线有什么要求(芯片引脚怎么连接)
51单片机双机通讯,如果双机距离超过了1米,就要采用RS232接口,这是常用的串口通信方式,物理接线可采用3线连接即可,距离超过10米时应采用双芯屏蔽线。距离小于1米时,属于实验性的临时串口通信,两个单片机的RXD,TXD引脚交叉连接就行,需要共地,用普通的3条导线连接。
② 51单片机的双机通信 跪求大神帮我读懂程序,马上采纳
ORG 0000H
LJMP START
ORG 0023H //定时器中哪丛断入口地址
LJMP SINT1 //定时器中断程序
ORG 0040H//主程序从0040h开始执行
START:
MOV SP,#60H//设置堆栈
MOV TMOD,#20H//初始化定时器控制寄存器
MOV TH1,#0F3H
MOV TL1,#0F3H//设置定时器1初值
SETB TR1//开启定时器1
MOV SCON,#0C0H;方式3//设置串口控制寄存器
MOV PCON,#00H
SETB EA//允许总中断
SETB ES//允许串口中断
{ MOV R0,#20H
MOV A,@R0
MOV C,P//p和tb8估计是用伪指令定义的东西
MOV TB8,C
MOV SBUF,A} 读取地址20h里的内容发送到串口
(JNB TI,$//等待发送完
CLR TI);//发送完以后清除发送标志 这两句不需要了
AJMP $//原地等待
SINT1:
PUSH PSW
PUSH A//压入堆栈保护
CLR TI 清发送标志
INC R0 //寄存器ro里面的内容加1
MOV A,@R0//间接寻址 读取ro所指向地址的内容 比如:ro里面是21h 就是读取21h地址的内容到 a
MOV C,P
MOV TB8,C
MOV SBUF,A
CJNE R0,#2FH,RET1 //比较是否发送完如果完了就离开中断没有的蔽贺话继续发送 ;跳出中断
CLR TI//清标志
CLR ES//不允许串口中断
CLR EA//关总中断
POP A
POP PSW //弹出a和psw的数据 回复psw中断之前的数值
RET1: RETI
END
这个发送程序就是通过定时器中断依次把数据送到串口发送寄存器。
接收程序:
ORG 0000H
LJMP START
ORG 0023H
LJMP SINT1
ORG 0040H
START:
MOV SP,#60H
MOV TMOD,#20H
MOV TH1,#0F3H
MOV TL1,#0F3H
SETB TR1
MOV SCON,#0D0H
MOV PCON,#00H
SETB EA
SETB ES
MOV R0,#20H
AJMP $
SINT1: PUSH PSW
PUSH A //a和psw压入堆栈保护
CLR RI//清串口接收标志
MOV A,SBUF//读取串口的数值
MOV C,P
JNC L1
JNB RB8,ERROR//这几句是判断 如果错误就跳转到错误处理程序
AJMP NORMAL//没问题宏缓派的话跳转到正常执行
L1:JB RB8,ERROR
NORMAL:MOV @R0,A 读取a的内容到ro所指向的地址 单片机间接寻址
INC R0 //
CJNE R0,#30H,RET1 // 比较 如果够了就中断返回 ;跳出中断
POP A //还不够
POP PSW //还不够恢复a 和psw的值 准备下一次中断接收
RET
ERROR: “出错了”
CLR RI
CLR ES
CLR EA //错误处理 关掉串口中断和总中断 不恢复psw里面的值。单片机将无事可做。老在执行 AJMP $
RET1: RETI
END
够详细了吧
自己多查查资料。
③ 51单片机怎么双机通信
你好!!
单片机双机通讯,就是直接单片机的串口RX和TX直接连接,然后通过串口命令完成通讯!
给你一个实例,可以完全满足你的要求!
希望帮到你,满意请采纳!
④ 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;
}
}
⑤ 两个单片机做一个系统,单片机之间用什么方式通信最好啊!!
1、一般采用单片机串口通讯就可以。
2、串口通讯采用什么信号,要根据实际情况确定。
3、如果单片机之间通讯距离远的话,可以采用RS485通讯方式;如果单片机之间通讯距离近的话,两个单片机串口可以直接通讯。
4、如果对通讯速度要求不高的话,也可以用单片机的普通口做,通过外搭电路,实现两个单片机的通讯。
5、不论采用什么方式的通讯,通讯协议都是自己定义。
⑥ 8051单片机的串行通信速率可以达到10MB/S吗
对于标准51内核来说,其串口波特率发生器最少也是振荡周期的16分频。
如果串口通信达运燃运到10MB/s,按照8N1格式相旁梁当于100Mbps,也就是说这颗51需要跑在1.6GHz的速率段基下……太难了。
以前有人用液氮冷却让51跑到接近100MHz,但1600MHz只能说是天方夜谭了。
⑦ 单片机跟PC的串行通信 速度可以达到多快
单片机主要看时钟,串口波特率是由时钟分频而来的,一般极限值是最大时钟/16
串口本身看距离,距离越远速度越低,标准232最大距离只有15m
以上哪个值低,哪个就是最快速度
⑧ 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
}
}