/*multi_s.c*/
/*多機通信的從機部分*/
#ifndef__MULTI_S_C__
#define__MULTI_S_C__
#include
#include
#define__MAX_LEN_64//數(shù)據(jù)最大長度
#define_MHz_11//設置單片機使用的晶振頻率(11.0592MHz)
/*以下為程序協(xié)議中使用的握手信號*/
#define__SUCC_0x0f//數(shù)據(jù)傳送成功
#define__ERR_0xf0//數(shù)據(jù)傳送錯誤
voidinit_serial();//串口初始化
unsignedcharrecv_data(unsignedchar*buf);//接收數(shù)據(jù)
voidBeep_ok();//蜂鳴表示數(shù)據(jù)接收ok,該函數(shù)代碼未給出
voidmain()
{
charbuf[__MAX_LEN_];
unsignedchari=0;
unsignedchartmp=0xff;
unsignedcharaddr;//保存本機地址
/*從P1口讀取本機地址*/
P1=0xff;
addr=P1;
/*串口初始化*/
init_serial();//初始化串口
EA=0;//關閉所有中斷
/*進入設備應答階段*/
while(1)
{
SM2=1;//只接收地址幀
/*如果接收到的地址幀不是本機地址,則繼續(xù)等待*/
tmp=addr-1;
while(tmp!=addr)
{
RI=0;
while(!RI);
tmp=SBUF;
RI=0;
}
/*發(fā)送應答信號,并做好接收數(shù)據(jù)的準備*/
TI=0;
TB8=0;//主機不檢測該位
SBUF=addr;
while(!TI);
TI=0;
SM2=0;//允許接收數(shù)據(jù)信息
/*數(shù)據(jù)接收*/
tmp=0xff;
while(tmp==0xff)//如果數(shù)據(jù)校驗失敗則重新接收數(shù)據(jù)
{
tmp=recv_data(buf);//校驗失敗返回0xff,檢測到地址幀則返回0xfe,接收成功則返回0
}
if(tmp==0xfe)//在數(shù)據(jù)接收過程中,如果發(fā)現(xiàn)地址幀,則重新開始整個接收過程
continue;
Beep_ok();//蜂鳴表示數(shù)據(jù)接收成功
}
}
/*初始化串口*/
voidinit_serial()
{
TMOD=0x20;//定時器T1使用工作方式2
TH1=250;//設置初值
TL1=250;
TR1=1;//開始計時
PCON=0x80;//SMOD=1
SCON=0xd0;//工作方式3,9位數(shù)據(jù)位,波特率9600bps,允許接收
}
/*接收數(shù)據(jù),注意該函數(shù)使用buf指向的緩沖區(qū)保存數(shù)據(jù),在數(shù)據(jù)末尾使用’