單片機雙機點對點通信的主機部分程序
#ifndef__P2P_M_C__
#define__P2P_M_C__
#include
#include
#define__MAX_LEN_64//數(shù)據(jù)最大長度
#define_MHz_11//設(shè)置 單片機 使用的晶振頻率(11.0592MHz)
/*以下為程序協(xié)議中使用的握手信號*/
#define__RDY_0x06//主機開始通信時發(fā)送的呼叫信號
#define__BUSY_0x15//從機忙應(yīng)答
#define__OK_0x00//從機準備好
#define__SUCC_0x0f//數(shù)據(jù)傳送成功
#define__ERR_0xf0//數(shù)據(jù)傳送錯誤
voidinit_serial();//串口初始化
voidsend_data(unsignedchar*buf);//發(fā)送數(shù)據(jù)
voiddelay10ms(unsignedintcount);//延時子程序(10ms)
voidmain()
{
charbuf[__MAX_LEN_];
unsignedchari=0;
unsignedchartmp=__BUSY_;
/*為緩沖區(qū)賦初值*/
P0=0xff;
while(P1!=0)//每隔100ms從P0口讀取,若讀取到0則表明數(shù)據(jù)采集結(jié)束
{
*(buf+i)=P0;
delay10ms(10);//延時100ms
P0=0xff;
i++;
}
*(buf+i)=0;//緩沖區(qū)最后一個字節(jié)為0表示數(shù)據(jù)結(jié)束
/*串口初始化*/
init_serial();//初始化串口
EA=0;//關(guān)閉所有中斷
/*發(fā)送握手信號06H*/
TI=0;
SBUF=__RDY_;
while(!TI);
TI=0;
/*接收應(yīng)答信息,如果接收的信號為00H,表示從機允許接收*/
while(tmp!=__OK_)
{
RI=0;
while(!RI);
tmp=SBUF;
RI=0;
}
/*發(fā)送數(shù)據(jù)并接收校驗信息,如果接收的信號為0FH,表示從機接收成功,否則將重新發(fā)送該組數(shù)據(jù)*/
tmp=__ERR_;
while(tmp!=__SUCC_)
{
send_data(buf);//發(fā)送數(shù)據(jù)
RI=0;
while(!RI);
tmp=SBUF;
RI=0;
}
while(1);//程序結(jié)束,進入死循環(huán)
}
/*初始化串口*/
voidinit_serial()
{
TMOD=0x20;//定時器T1使用工作方式2
TH1=250;//設(shè)置初值
TL1=250;
TR1=1;//開始計時
PCON=0x80;//SMOD=1
SCON=0x50;//工作方式1,波特率9600bps,允許接收
}
/*發(fā)送數(shù)據(jù)*/
voidsend_data(unsignedchar*buf)
{
unsignedcharlen;//保存數(shù)據(jù)長度
unsignedcharecc;//保存校驗字節(jié)
len=strlen(buf);//計算要發(fā)送數(shù)據(jù)的長度
ecc=len;//開始進行校驗字節(jié)計算
/*發(fā)送數(shù)據(jù)長度*/
TI=0;
SBUF=len;//發(fā)送長度
while(!TI);
TI=0;
/*發(fā)送數(shù)據(jù)*/
for(i=0;i
ecc=ecc^(*buf);//計算校驗字節(jié)
SBUF=*buf;//發(fā)送數(shù)據(jù)
buf++;
while(!TI);
TI=0;
}
/*發(fā)送校驗字節(jié)*/
SBUF=ecc;//發(fā)送校驗字節(jié)
while(!TI);
TI=0;
}
/*延時10ms,精度較低,參數(shù)count為延時時間*/
voiddelay10ms(unsignedintcount)
{
unsignedinti,k;
unsignedcharj;
unsignedinttmp;
tmp=(int)((100*_MHZ_)/12);
for(i=0;i
for(k=0;k
#endif