/*雙機點對點通信的從機部分*/
#ifndef__P2P_S_C__
#define__P2P_S_C__
#include
#include
#define__MAX_LEN_64//數據最大長度
#define_MHz_11//設置單片機使用的晶振頻率(11.0592MHz)
/*以下為程序協(xié)議中使用的握手信號*/
#define__RDY_0x06//主機開始通信時發(fā)送的呼叫信號
#define__BUSY_0x15//從機忙應答
#define__OK_0x00//從機準備好
#define__SUCC_0x0f//數據傳送成功
#define__ERR_0xf0//數據傳送錯誤
voidinit_serial();//串口初始化
unsignedcharrecv_data(unsignedchar*buf);//接收數據
voidBeep_ok();//蜂鳴表示數據接收ok,該函數代碼未給出
voidmain()
{
charbuf[__MAX_LEN_];
unsignedchari=0;
unsignedchartmp=0xff;
/*串口初始化*/
init_serial();//初始化串口
EA=0;//關閉所有中斷
/*進入設備應答階段*/
while(1)
{
/*如果接收到的數據不是握手信號__RDY_,則繼續(xù)等待*/
while(tmp!=__RDY_)
{
RI=0;
while(!RI);
tmp=SBUF;
RI=0;
}
/*程序通過檢測P0口數據判斷當前設備狀態(tài),若P0=0xab,表示當前設備忙*/
P0=0xff;
tmp=P0;
if(tmp==0xab)//如果P0口數據為0x,則當前設備忙,發(fā)送__BUSY_信號
{
TI=0;
SBUF=__BUSY_;
while(!TI);
TI=0;
continue;
}
TI=0;//否則發(fā)送__OK_信號表示可以接收數據
SBUF=__OK_;
while(!TI);
TI=0;
/*數據接收*/
tmp=0xff;
while(tmp==0xff)
{
tmp=recv_data(buf);//校驗失敗返回0xff,接收成功則返回0
}
Beep_ok();//蜂鳴表示數據接收成功
}
}
/*初始化串口*/
voidinit_serial()
{
TMOD=0x20;//定時器T1使用工作方式2
TH1=250;//設置初值
TL1=250;
TR1=1;//開始計時
PCON=0x80;//SMOD=1
SCON=0x50;//工作方式1,波特率9600bps,允許接收
}
/*接收數據,注意該函數使用buf指向的緩沖區(qū)保存數據,在數據末尾使用’