新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 51單片機(jī)232多機(jī)通信

51單片機(jī)232多機(jī)通信

作者: 時間:2016-11-25 來源:網(wǎng)絡(luò) 收藏
自己寫的簡單的程序,實在是很簡單,不過我可是菜鳥,為了記下自己的點點進(jìn)步,所以貼到博客上。

具體實現(xiàn)的功能就是主機(jī)發(fā)送命令,相應(yīng)的從機(jī)給主機(jī)回送數(shù)據(jù)(數(shù)字),主機(jī)通過數(shù)碼管顯示。

本文引用地址:http://butianyuan.cn/article/201611/321472.htm

通信協(xié)議比較簡單,需要加上對地址應(yīng)答部分和數(shù)據(jù)校驗。

//主機(jī)加按鍵命令,發(fā)送命令,查詢方式,從機(jī)受到命令后發(fā)送數(shù)據(jù),主機(jī)顯示
#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;//從機(jī)各位驗證地址
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; // 設(shè)置初值
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號從機(jī)函數(shù)
{
delay(10);
while(key1)//按鍵去抖動
while(1) //接收循環(huán)
{

P2=temp1;
SBUF = temp1;
while(!TI);
TI=0; //發(fā)送地址

// delay(100);
while(!RI);
RI = 0;
tmp1 = SBUF;
P0=tmp1;//接收從機(jī)1回送的數(shù)據(jù);并把數(shù)據(jù)給P0
if(key2||key3)
{
delay(1);
if(key2||key3)
break;
}//如果其他按鍵按下則跳出本函數(shù)執(zhí)行相應(yīng)按鍵的發(fā)送地址函數(shù)

}
}
while(key2) // 2號從機(jī)函數(shù)
{
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號從機(jī)函數(shù)
{
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;
}

}


}
}

從機(jī)程序:

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

uchar aa = 0x20; //起始數(shù)據(jù)
uchar temp;
sbit P10=P1^0;//接收數(shù)據(jù)成功指示

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; // 設(shè)置初值
TL1 = 253;
TR1 = 1; // 開始計時
PCON = 0; // SMOD = 0
SCON = 0x50; //工作方式1,波特率9600bps,允許接收
EA=1;
ES=1;
}
void intrr() interrupt 4 //串口中斷函數(shù)
{
while(!RI); //接收地址
RI = 0;



if(SBUF==0x01) //1號機(jī)地址
{

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


RI=0;
delay(1000); //發(fā)送數(shù)據(jù)延時


SBUF=aa; //發(fā)送起始數(shù)據(jù)
while(!TI);
TI=0;
aa++; //數(shù)據(jù)循環(huán)
if(aa>0x29)
aa=0x20;
P0=aa; //同時把數(shù)據(jù)給P0口顯示
delay(100);
}
}
void main(void)//主函數(shù)
{


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

while(1) //循環(huán)
{
;
}

}



評論


技術(shù)專區(qū)

關(guān)閉