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