<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于51單片機的RS-485的多機通信

基于51單片機的RS-485的多機通信

作者: 時(shí)間:2016-11-27 來(lái)源:網(wǎng)絡(luò ) 收藏
//-----------------------函數聲明,變量定義---------------------

#include

本文引用地址:http://dyxdggzs.com/article/201611/322565.htm

sbit RE_DE=P1^0;

#define COUNT 10 // 定義接收緩沖區大小

#define Slaver_NUM 10

unsignedcharbdata flag;//在可位尋址去定義一個(gè)標志變量

sbit time_over_flag =flag^0;//接收超時(shí)標志

unsignedcharbuffer[COUNT];//定義緩沖區

unsignedcharpoint;//定義緩沖區位置指示

unsignedcharSlave_AD[Slaver_NUM];//定義有效地址存放區

unsignedcharADD_num;//有效地址個(gè)數

unsignedcharidata count_10ms;//用于表示有多少次10ms中斷

unsignedcharidata send_data[7]={

0x31,0x32,0x33,0x34,0x35,0x36,0x37};//與定義發(fā)送數據,共7位

voidUART_init();//串口初始化函數

voidCOM_send(void);//串口接收函數

unsignedcharCLU_checkdata(void);//計算校驗位函數

//---------------------------------------------------------------

// 函數名稱(chēng): UART_init()串口初始化函數

// 函數功能: 在系統時(shí)鐘為11.059MHZ時(shí),設定串口波特率為9600bit/s

// 串口接收中斷允許,發(fā)送中斷禁止,設定定時(shí)器中斷允許

//---------------------------------------------------------------

voidUART_init()

{

//初始化串行設置

SCON =0x58;//選擇串口工作方式為1,打開(kāi)接收允許,TB8=1

TMOD =0x21;//定時(shí)器1工作在方式2,定時(shí)器0工作在方式1

TR1 =1;//啟動(dòng)定時(shí)器T1

ES=1;//允許串行口中斷

PS=1;//設計串行口中斷優(yōu)先級

//初始化定時(shí)器1

TH1 =0xfd;//實(shí)現波特率9600(系統時(shí)鐘11.0592MHZ)

ET1 =0;//定時(shí)器1中斷禁止

}

//---------------------------------------------------------------

// 函數名稱(chēng): timer0_init()初始化定時(shí)器0

// 函數功能: 設置timer0工作模式

//---------------------------------------------------------------

voidtimer0_init()

{

time_over_flag=0;

count_10ms=0;

ADD_num=0;

TL0=0x0F0;//T0用于產(chǎn)生10ms的中斷

TH0=0x0D8;//50次T0中斷產(chǎn)生1次超時(shí)溢出

ET0=1;//允許定時(shí)器0中斷

}

//---------------------------------------------------------------

// 函數名稱(chēng): system_init()系統初始化

// 函數功能: 調用串口、定時(shí)器初始化函數,完成系統初始化

//---------------------------------------------------------------

voidsystem_init(void)

{

//系統總設置

UART_init();

timer0_init();

EA =1;//單片機中斷允許

}

//---------------------------------------------------------------

// 函數名稱(chēng): com_interrup()串口接收中斷處理函數

// 函數功能: 接收包括起始位"S"在內的十位數據到數據緩沖區

//---------------------------------------------------------------

com_interrupt(void) interrupt 4using3

{

unsignedcharRECEIVR_buffer;

if(RI)//處理接收中斷

{RI=0;//清除中斷標志位

RECEIVR_buffer=SBUF;//接收串口數據

if(point==0)//如果還沒(méi)有接收到起始位

{

if(RECEIVR_buffer==0xFE)//判斷是否起始標志位

{

buffer[point++]=RECEIVR_buffer;//把接收到的數據放入接收緩存區

}

else

point=0;//不是,繼續等待起始位

}

elseif(point>0&&point<10)//判斷是否接收夠十位數據

buffer[point++]=RECEIVR_buffer;//不夠,把接收到的數據放入接收緩存區

elseif(point==10)

{

if(RECEIVR_buffer==0xEF)//判斷結束標志位是否正確

{

buffer[point]=RECEIVR_buffer;//把接收到的數據放入接收緩存區

Slave_AD[ADD_num++]=buffer[2];//把接收到的地址放到地址存儲器

//表示該地址有有效設備

}

else

point=0;//不是,繼續等待起始位

}

elsepoint=0;//緩沖區已滿(mǎn),清除緩存區內數據重新接收

}

if(TI)//串口發(fā)送中斷

{

TI=0;//清除發(fā)送中斷

}

}

//---------------------------------------------------------------

// 函數名稱(chēng): timer0_interrup()

// 函數功能:定時(shí)器T0中斷服務(wù)程序

// 函數說(shuō)明:T0枚10ms中斷一次,連續中斷50次置time_over_flag=1;

//---------------------------------------------------------------

timer0_interrupt(void) interrupt 1using2

{

count_10ms++;

if(count_10ms==50)

{

ET0=0;//關(guān)閉定時(shí)器T0中斷

TR0=0;//停止定時(shí)器T0

time_over_flag=1;//設置接收超時(shí)標志

count_10ms=0x00;//10ms計數器復位

}

else

{

TL0=0x0F0;//重裝定時(shí)器初始值

TH0=0x0D8;

}

}

//---------------------------------------------------------------

// 函數名稱(chēng): COM_send()串口發(fā)送函數

// 函數功能: 把數據緩沖區的十位數據發(fā)送出去

//---------------------------------------------------------------

voidCOM_send(void)

{

RE_DE=1;//設置MAX483進(jìn)入發(fā)送狀態(tài)

for(point=0;point=10,TI=1;point++)//連續發(fā)送十位數據

//把緩存區的數據都發(fā)送到串口

{

SBUF=buffer[point];

TI=0;

}

RE_DE=0;//設置MAX483進(jìn)入接收狀態(tài)

}

//---------------------------------------------------------------

// 函數名稱(chēng): write_buffer()

// 函數功能: 寫(xiě)發(fā)送緩沖區十位數據

//---------------------------------------------------------------

voidwrite_buffer(unsignedcharslaver_add)

{

unsignedchari;

TB8=1;//打開(kāi)多機通信方式

buffer[0]=0xFE;

buffer[1]=slaver_add;

for(i=2;i<9;i++)//連續發(fā)送十位數據

//把緩存區的數據都發(fā)送到串口

{

buffer[i]=send_data[i-2];

}

buffer[9]=0xEF;

}

//---------------------------------------------------------------

// 函數名稱(chēng): 主函數

// 函數功能: 調度個(gè)子函數,完成通信過(guò)程

//---------------------------------------------------------------

voidmain(void)

{

unsignedchari=0;

system_init();//系統初始化

do{//查旬0到10好地址有沒(méi)有對應設備

write_buffer(i++);//寫(xiě)查詢(xún)第i號設備的發(fā)送信息

COM_send();//調用發(fā)送函數,完成發(fā)送

timer0_init();//完成一次查詢(xún),重新初始定時(shí)器0,準備下一次查詢(xún)

}

while(time_over_flag&&i<10);

}



關(guān)鍵詞: 51單片機RS-485多機通

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>