標(biāo)題:
單片機(jī)多機(jī)通訊從機(jī)程序
[打印本頁]
作者:
12366666
時(shí)間:
2017-6-6 19:32
標(biāo)題:
單片機(jī)多機(jī)通訊從機(jī)程序
從機(jī)程序:
http://www.torrancerestoration.com/bbs/dpj-87068-1.html
主機(jī)程序:
http://www.torrancerestoration.com/bbs/dpj-87067-1.html
#include<reg51.h>
#include<string.h>
#define addr 0x01//從機(jī)1的地址
#define _SUCC_ 0x0f//數(shù)據(jù)傳送成功
#define _ERR_ 0xf0//數(shù)據(jù)傳送失敗
unsigned char aa=0xff;//主機(jī)與從機(jī)之間通信標(biāo)志
unsigned char Buff[20];//數(shù)據(jù)緩沖區(qū)
//串口初始化函數(shù)
void serial_init()
{
TMOD=0x20; //定時(shí)器1工作于方式2
TH1=0xfd;
TL1=0xfd; //波特率為9600
PCON=0;
SCON=0xd0; //串口工作于方式3
TR1=1; //開啟定時(shí)器
TI=0;
RI=0;
}
//接收數(shù)據(jù)函數(shù)
unsigned char RECE_data(unsigned char *Buff)
{
unsigned char i,temp;
unsigned char lenth;
unsigned char check;
RI=0; //接收數(shù)據(jù)長度
while(!RI);
if(RB8==1) //若接收到地址幀,則返回0xfe
return 0xfe;
lenth=SBUF;
RI=0;
check=lenth;
for(i=0;i<lenth;i++) //接收數(shù)據(jù)
{
while(!RI);
if(RB8==1) //若接收到地址幀,則返回0xfe
return 0xfe;
Buff[i]=SBUF;
check=check^(Buff[i]);
RI=0;
}
while(!RI); //接收校驗(yàn)字節(jié)
if(RB8==1) //若接收到地址幀,則返回0xfe
return 0xfe;
temp=SBUF;
RI=0;
check=temp^check; //將從主機(jī)接收到的校驗(yàn)碼與自己計(jì)算的校驗(yàn)碼比對
if(check!=0) //校驗(yàn)碼不一致,表明數(shù)據(jù)接收錯(cuò)誤,向主機(jī)發(fā)送錯(cuò)誤信號,函數(shù)返回0xff
{
TI=0;
TB8=0;
SBUF=_ERR_;
while(!TI);
TI=0;
return 0xff;
}
TI=0; //校驗(yàn)碼一致,表明數(shù)據(jù)接收正確,向主機(jī)發(fā)送成功信號,函數(shù)返回0x00
TB8=0;
SBUF=_SUCC_;
while(!TI);
TI=0;
return 0;
}
void main()
{
serial_init();
while(1)
{
SM2=1; //接收地址幀
while(aa!=addr) //從機(jī)等待主機(jī)請求自己的地址
{
RI=0;
while(!RI);
aa=SBUF;
RI=0;
}
TI=0; //一旦被請求,從機(jī)返回自己的地址作為應(yīng)答,等待接收數(shù)據(jù)
TB8=0;
SBUF=addr;
while(!TI);
TI=0;
SM2=0; //接收數(shù)據(jù)幀
aa=0xff; //從機(jī)接收數(shù)據(jù),并將數(shù)據(jù)保存到數(shù)據(jù)緩沖區(qū)
while(aa==0xff)
{
aa=RECE_data(Buff);
}
if(aa==0xfe)
continue;
P1=Buff[1]; //查看接收到的數(shù)據(jù)
}
}
復(fù)制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1