当前位置:首页 > RS485多机通信一主机两个下位机
RS485一主机两个下位机,上位机通过发送下位机地址查询下位机两个按钮的状态,仿真时同时在P1口和P2口显示按钮状态 一、原理图
RP1RESPACK-8RP2RESPACK-81234567891U119XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD39383736353433322122232425262728101112131415161719U2地址:0x5118XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD393837363534333221222324252627281011121314151617地址:0x5218XTAL2XTAL29RST9RST293031PSENALEEAU31234ROREDEDIMAX487A6SAB7SB293031PSENALEEA23456789U41234ROREDEDIMAX487A6SAB7SB12345678P1.0/T2P1.1/T2EXP1.2P1.3P1.4P1.5P1.6P1.7AT89C52R112012345678P1.0/T2P1.1/T2EXP1.2P1.3P1.4P1.5P1.6P1.7AT89C52R2120U619XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD393837363534333221222324252627281011121314151617123418XTAL2上位机9RST293031PSENALEEAU7ROREDEDIMAX487A6SAB7SB12345678P1.0/T2P1.1/T2EXP1.2P1.3P1.4P1.5P1.6P1.7AT89C52R310k
二、程序
1、上位机程序
#include \
/* 延时t毫秒 */ void delay(uint t) {
uint i; while(t--) {
/* 对于11.0592M时钟,约延时1ms */ for (i=0;i<125;i++) {}
} }
void SendCMD(unsigned char Dbyte)//UART0发送一个字节 { RS487wr=1; TI = 0; }
void SendADDR(unsigned char Dbyte)//UART0发送一个字节 {
RS487wr=1; TI = 0; }
TB8 = 1; SBUF = Dbyte; while(!TI); TI = 0;
// 发送地址帧 // 发送长度
TB8 = 0;
SBUF = Dbyte; while(!TI); TI = 0;
// 发送数据帧 // 发送长度
uchar ReciveUart(void) { }
void init_serial() { TMOD = 0x20;
SCON = 0xd0; TH1 = 0xfd; TL1 = 0xfd; TR1 = 1;
PCON = 0x00;
// SMOD=0
uchar temp; RS487wr=0; REN=1; RI = 0; while(!RI); temp = SBUF; RI = 0;
return temp;
}
/* 主程序 */ void main() { uchar i = 0;
uchar addr_tmp; uchar data_tmp; init_serial(); EA = 1;
// 串口初始化
// 开所有中断
/* 发送地址帧并接收应答信息,如果接收的信号与发送的地址信息不同,则重新发送地址帧 */ while(1) {
//这段程序无效
addr=BASE_ADDR; //下位机地址初值(第一个下位机地址) addr_tmp = addr-1; while(addr_tmp!=addr) {
/* 发送从机地址 */ SendADDR(addr); /* 接收从机应答 */
addr_tmp=ReciveUart(); }
SendCMD(DataCMD); //给下位机发送 传输端口状态信息 data_tmp=ReciveUart();//接收下位机端口信息 P1= data_tmp;
addr=BASE_ADDR+1; //下位机地址2初值(第2个下位机地址) addr_tmp = addr-1; while(addr_tmp!=addr) { }
/* 发送从机地址 */ SendADDR(addr); /* 接收从机应答 */ addr_tmp=ReciveUart();
SendCMD(DataCMD); //给下位机发送 传输端口状态信息 data_tmp=ReciveUart();//接收下位机端口信息 P2=data_tmp; }
}
2)下位机程序 #include \
/* 延时t毫秒 */ void delay(uint t) {
}
uint i;
while(t--) { /* 对于11.0592M时钟,约延时1ms */ for (i=0;i<125;i++) }
{}
void SendCMD(unsigned char Dbyte)//UART0发送一个字节 {
RS487wr=1; TI = 0; TB8 = 0;
// 发送数据帧
// 发送长度
// delay(20); SBUF = Dbyte; }
while(!TI); TI = 0;
void SendADDR(unsigned char Dbyte)//UART0发送一个字节 {
RS487wr=1; TI = 0; TB8 = 1; delay(20); }
SBUF = Dbyte; while(!TI); TI = 0;
// 发送地址帧
// 发送长度
uchar ReciveUart(void) { uchar temp;
RS487wr=0; REN=1; RI = 0; delay(20); while(!RI); temp = SBUF; RI = 0; delay(20); return temp;
//
//
}
/* 串口初始化函数 */
共分享92篇相关文档