多機(jī)通信的主機(jī)部分程序
多機(jī)通信的主機(jī)部分程序
/*multi_m.c*/
/*多機(jī)通信的主機(jī)部分*/
#ifndef__MULTI_M_C__
#define__MULTI_M_C__
#include
#include
#define__MAX_LEN_64//數(shù)據(jù)最大長(zhǎng)度
#define_MHz_11//設(shè)置單片機(jī)使用的晶振頻率(11.0592MHz)
/*以下為程序協(xié)議中使用的握手信號(hào)*/
#define__SUCC_0x0f//數(shù)據(jù)傳送成功
#define__ERR_0xf0//數(shù)據(jù)傳送錯(cuò)誤
voidinit_serial();//串口初始化
voidsend_data(unsignedchar*buf);//發(fā)送數(shù)據(jù)
voiddelay10ms(unsignedintcount);//延時(shí)子程序(10ms)
voidmain()
{
charbuf[__MAX_LEN_];
unsignedchari=0;
unsignedchartmp;
unsignedcharaddr;//該字節(jié)用于保存要通信的從機(jī)地址
/*為緩沖區(qū)賦初值*/
P0=0xff;
while(P1!=0)//每隔100ms從P0口讀取,若讀取到0則表明數(shù)據(jù)采集結(jié)束
{
*(buf+i)=P0;
delay10ms(10);//延時(shí)100ms
P0=0xff;
i++;
}
*(buf+i)=0;//緩沖區(qū)最后一個(gè)字節(jié)為0表示數(shù)據(jù)結(jié)束
/*讀要訪問的分機(jī)地址*/
P0=0xff;
addr=P0;
/*串口初始化*/
init_serial();//初始化串口
EA=0;//關(guān)閉所有中斷
/*發(fā)送地址幀并接收應(yīng)答信息,如果接收的信號(hào)與發(fā)送的地址信息不同,則重新發(fā)送地址幀*/
tmp=addr-1;
while(tmp!=addr)
{
/*發(fā)送從機(jī)地址*/
TI=0;
TB8=1;//發(fā)送地址幀
SBUF=addr;
while(!TI);
TI=0;
/*接收從機(jī)應(yīng)答*/
RI=0;
while(!RI);
tmp=SBUF;
RI=0;
}
/*發(fā)送數(shù)據(jù)并接收校驗(yàn)信息,如果接收的信號(hào)為0FH,表示從機(jī)接收成功,否則將重新發(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é)束,進(jìn)入死循環(huán)
}
/*初始化串口*/
voidinit_serial()
{
TMOD=0x20;//定時(shí)器T1使用工作方式2
TH1=250;//設(shè)置初值
TL1=250;
TR1=1;//開始計(jì)時(shí)
PCON=0x80;//SMOD=1
SCON=0xd0;//工作方式3,9位數(shù)據(jù)位,波特率9600bps,允許接收
}
/*發(fā)送數(shù)據(jù)*/
voidsend_data(unsignedchar*buf)
{
unsignedcharlen;//保存數(shù)據(jù)長(zhǎng)度
unsignedcharecc;//保存校驗(yàn)字節(jié)
len=strlen(buf);//計(jì)算要發(fā)送數(shù)據(jù)的長(zhǎng)度
ecc=len;//開始進(jìn)行校驗(yàn)字節(jié)計(jì)算
/*發(fā)送數(shù)據(jù)長(zhǎng)度*/
TI=0;
TB8=0;//發(fā)送數(shù)據(jù)幀
SBUF=len;//發(fā)送長(zhǎng)度
while(!TI);
TI=0;
/*發(fā)送數(shù)據(jù)*/
for(i=0;i
ecc=ecc^(*buf);//計(jì)算校驗(yàn)字節(jié)
TB8=0;//發(fā)送數(shù)據(jù)幀
SBUF=*buf;//發(fā)送數(shù)據(jù)
buf++;
while(!TI);
TI=0;
}
/*發(fā)送校驗(yàn)字節(jié)*/
TB8=0;//發(fā)送數(shù)據(jù)幀
SBUF=ecc;//發(fā)送校驗(yàn)字節(jié)
while(!TI);
TI=0;
}
/*延時(shí)10ms,精度較低,參數(shù)count為延時(shí)時(shí)間*/
voiddelay10ms(unsignedintcount)
{
unsignedinti,k;
unsignedcharj;
unsignedinttmp;
tmp=(int)((100*_MHZ_)/12);
for(i=0;i
for(k=0;k
#endif