新闻中心

EEPW首页>嵌入式系统>设计应用> 51单片机232多机通信

51单片机232多机通信

作者: 时间:2016-11-25 来源:网络 收藏
自己写的简单的程序,实在是很简单,不过我可是菜鸟,为了记下自己的点点进步,所以贴到博客上。

具体实现的功能就是主机发送命令,相应的从机给主机回送数据(数字),主机通过数码管显示。

本文引用地址://m.amcfsurvey.com/article/201611/321472.htm

通信协议比较简单,需要加上对地址应答部分和数据校验。

//主机加按键命令,发送命令,查询方式,从机受到命令后发送数据,主机显示
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit key1=P1^0; //按键命令
sbit key2=P1^1;
sbit key3=P1^2;

uchar temp1=0x01,temp2=0x02,temp3=0x03;//从机各位验证地址
void delay(uchar N) //1ms延时
{
uint i,j;
for(i=0;i for(j=0;j<110;j++);
}
void init_serial()
{
TMOD = 0x20;//定时器T1使用工作方式2
TH1 = 253;// 设置初值
TL1 = 253;
TR1 = 1;// 开始计时
PCON = 0;// SMOD = 0
SCON = 0x50;//工作方式1,波特率9600bps,允许接收

}

void main(void)
{uchar tmp1,tmp2,tmp3;//
init_serial(); //初始化
P1=0;//P1口清零
while(1)
{

while(key1)// 1号从机函数
{
delay(10);
while(key1)//按键去抖动
while(1)//接收循环
{

P2=temp1;
SBUF = temp1;
while(!TI);
TI=0;//发送地址

// delay(100);
while(!RI);
RI = 0;
tmp1 = SBUF;
P0=tmp1;//接收从机1回送的数据;并把数据给P0
if(key2||key3)
{
delay(1);
if(key2||key3)
break;
}//如果其他按键按下则跳出本函数执行相应按键的发送地址函数

}
}
while(key2) // 2号从机函数
{
delay(10);
while(key2)
while(1)
{

P2=temp2;
SBUF = 0x02;
while(!TI);
TI=0;

//delay(100);
while(!RI);
RI = 0;
tmp2 = SBUF;
P0=tmp2;
RI=0;
if(key1||key3)
{
delay(1);
if(key1||key3)
break;
}

}
}
while(key3) // 3号从机函数
{
delay(10);
if(key3)
while(1)
{
P2=temp3;
SBUF = 0x03;
while(!TI);
TI=0;

//delay(100);
while(!RI);
RI = 0;
tmp3 = SBUF;
P0=tmp3;
RI=0;
if(key2||key1)
{
delay(1);
if(key2||key1)
break;
}

}


}
}

从机程序:

#include
#include
#define uchar unsigned char
#define uint unsigned int

uchar aa = 0x20; //起始数据
uchar temp;
sbit P10=P1^0;//接收数据成功指示

void delay(uchar N) //1ms延时
{
uint i,j;
for(i=0;i for(j=0;j<110;j++);
}
void init_serial()
{
TMOD = 0x20;//定时器T1使用工作方式2
TH1 = 253;// 设置初值
TL1 = 253;
TR1 = 1;// 开始计时
PCON = 0;// SMOD = 0
SCON = 0x50;//工作方式1,波特率9600bps,允许接收
EA=1;
ES=1;
}
void intrr()interrupt4//串口中断函数
{
while(!RI);//接收地址
RI = 0;



if(SBUF==0x01) //1号机地址
{

temp = SBUF;
P10=~P10;
P2=temp;//把地址给P2口


RI=0;
delay(1000); //发送数据延时


SBUF=aa;//发送起始数据
while(!TI);
TI=0;
aa++;//数据循环
if(aa>0x29)
aa=0x20;
P0=aa;//同时把数据给P0口显示
delay(100);
}
}
void main(void)//主函数
{


init_serial();//初始化
P1=0xff;
delay(1000);

while(1)//循环
{
;
}

}



评论


技术专区

关闭