51单片机双机通信最远距离能有多远
- 提问者网友:山高云阔
- 2021-04-10 23:21
- 五星知识达人网友:舊物识亽
- 2021-04-11 00:11
可以到几十公里甚至几百公里(当然有前提条件!通电话网)
一般RS485可以几千米
RS232可以15-20米
TTL可以1-2米
- 1楼网友:蓝房子
- 2021-04-11 01:59
- 2楼网友:玩家
- 2021-04-11 01:35
//===================================================================== // 多机通讯主机程序 //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; } }
- 3楼网友:woshuo
- 2021-04-11 00:28