日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 單片機 > 單片機
[導讀] 多機通信的主機部分程序/*multi_m.c*//*多機通信的主機部分*/#ifndef__MULTI_M_C__#define__MULTI_M_C__#include#include#define__MAX_LEN_64//數據最大長度#define_MHz_11//設置單片機使用的晶振頻率(

多機通信主機部分程序

/*multi_m.c*/
/*多機通信的主機部分*/
#ifndef__MULTI_M_C__
#define__MULTI_M_C__

#include
#include

#define__MAX_LEN_64//數據最大長度
#define_MHz_11//設置單片機使用的晶振頻率(11.0592MHz)

/*以下為程序協(xié)議中使用的握手信號*/
#define__SUCC_0x0f//數據傳送成功
#define__ERR_0xf0//數據傳送錯誤

voidinit_serial();//串口初始化
voidsend_data(unsignedchar*buf);//發(fā)送數據
voiddelay10ms(unsignedintcount);//延時子程序(10ms)

voidmain()
{
charbuf[__MAX_LEN_];
unsignedchari=0;
unsignedchartmp;
unsignedcharaddr;//該字節(jié)用于保存要通信的從機地址

/*為緩沖區(qū)賦初值*/
P0=0xff;
while(P1!=0)//每隔100ms從P0口讀取,若讀取到0則表明數據采集結束
{
*(buf+i)=P0;
delay10ms(10);//延時100ms
P0=0xff;
i++;
}
*(buf+i)=0;//緩沖區(qū)最后一個字節(jié)為0表示數據結束
/*讀要訪問的分機地址*/
P0=0xff;
addr=P0;
/*串口初始化*/
init_serial();//初始化串口
EA=0;//關閉所有中斷

/*發(fā)送地址幀并接收應答信息,如果接收的信號與發(fā)送的地址信息不同,則重新發(fā)送地址幀*/
tmp=addr-1;
while(tmp!=addr)
{
/*發(fā)送從機地址*/
TI=0;
TB8=1;//發(fā)送地址幀
SBUF=addr;
while(!TI);
TI=0;
/*接收從機應答*/
RI=0;
while(!RI);
tmp=SBUF;
RI=0;
}
/*發(fā)送數據并接收校驗信息,如果接收的信號為0FH,表示從機接收成功,否則將重新發(fā)送該組數據*/
tmp=__ERR_;
while(tmp!=__SUCC_)
{
send_data(buf);//發(fā)送數據
RI=0;
while(!RI);
tmp=SBUF;
RI=0;
}
while(1);//程序結束,進入死循環(huán)
}

/*初始化串口*/
voidinit_serial()
{
TMOD=0x20;//定時器T1使用工作方式2
TH1=250;//設置初值
TL1=250;
TR1=1;//開始計時
PCON=0x80;//SMOD=1
SCON=0xd0;//工作方式3,9位數據位,波特率9600bps,允許接收
}

/*發(fā)送數據*/
voidsend_data(unsignedchar*buf)
{
unsignedcharlen;//保存數據長度
unsignedcharecc;//保存校驗字節(jié)

len=strlen(buf);//計算要發(fā)送數據的長度
ecc=len;//開始進行校驗字節(jié)計算
/*發(fā)送數據長度*/
TI=0;
TB8=0;//發(fā)送數據幀
SBUF=len;//發(fā)送長度
while(!TI);
TI=0;
/*發(fā)送數據*/
for(i=0;i{
ecc=ecc^(*buf);//計算校驗字節(jié)
TB8=0;//發(fā)送數據幀
SBUF=*buf;//發(fā)送數據
buf++;
while(!TI);
TI=0;
}
/*發(fā)送校驗字節(jié)*/
TB8=0;//發(fā)送數據幀
SBUF=ecc;//發(fā)送校驗字節(jié)
while(!TI);
TI=0;
}

/*延時10ms,精度較低,參數count為延時時間*/
voiddelay10ms(unsignedintcount)
{
unsignedinti,k;
unsignedcharj;
unsignedinttmp;
tmp=(int)((100*_MHZ_)/12);

for(i=0;ifor(j=0;j<100;j++)
for(k=0;k}

#endif


本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯系該專欄作者,如若文章內容侵犯您的權益,請及時聯系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關閉