您的位置 首页 培训

51单片机232多机通讯

自己写的简单的程序,实在是很简单,不过我可是菜鸟,为了记下自己的点点进步,所以贴到博客上。具体实现的功能就是主机发送命令,相应的

自己写的简略的程序,实在是很简略,不过我但是菜鸟,为了记下自己的点点前进,所以贴到博客上。

详细完成的功用便是主机发送指令,相应的从机给主机回送数据(数字),主机经过数码管显现。

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

//主机加按键指令,发送指令,查询方法,从机遭到指令后发送数据,主机显现
#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() interrupt 4 //串口中止函数
{
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) //循环
{
;
}

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/peixun/259522.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部