資源描述:
《51串口通信c程序--模塊集合》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、本文以51單片機(jī)控制四路開關(guān)量輸入/六路開關(guān)量輸出為例,設(shè)計(jì)了一個(gè)簡單的上位機(jī)下位機(jī)通信作品,作為模塊學(xué)習(xí)和整理,供讀者參考!難為,2010-11-28,于上海!四路開關(guān)量輸入/六路開關(guān)量輸出C語言程序#include#defineuintunsignedint#defineucharunsignedcharucharindata[4];ucharoutdata[4];volatileuchartemp1=0,temp2=0;uchari,j;voidinitial_comm(void
2、){SCON=0x50;//設(shè)定串行口工作方式:mode1;8-bitUART,enableucvrTMOD=0x21;//TIMER1;mode2;8-BitReloadPCON=0x80;//波特率不加倍SMOD=1TH1=0xfa;//baud:9600;fosc=11.0596IE=0x90;//enableserialinterruptTR1=1;//timer1}voiduart_send(void){ES=0;if(indata[3]==indata[0]^indata[1]^indata
3、[2]){if(indata[1]==0x01){temp1=P0;temp1=temp1&0x0f;outdata[0]=0xee;outdata[1]=0x02;outdata[2]=temp1;outdata[3]=outdata[0]^outdata[1]^outdata[2];for(i=0;i<4;i++){SBUF=outdata[i];while(TI==0);TI=0;}}if(indata[1]==0x03){temp2=indata[2];P1=temp2;}if(indata[1
4、]==0x04){outdata[0]=0xee;outdata[1]=0x05;outdata[2]=temp2;outdata[3]=outdata[0]^outdata[1]^outdata[2];for(i=0;i<4;i++){SBUF=outdata[i];while(TI==0);TI=0;}}}ES=1;}voidmain(){initial_comm();ES=1;while(1){uart_send();}}voiduart_receive(void)interrupt4{RI=0;
5、for(j=0;j<4;j++){indata[j]=SBUF;while(RI==0);RI=0;}}四路開關(guān)量輸入/六路開關(guān)量輸出通訊協(xié)議通信設(shè)置:波特率9600b/s1位起始位8位數(shù)據(jù)位無校驗(yàn)位1位停止位命令格式:區(qū)別碼(1字節(jié))+Command(1字節(jié))+Content(1字節(jié))+Xor(1字節(jié))區(qū)別碼:上位發(fā)送/單片機(jī)接收:0xff單片機(jī)發(fā)送/上位機(jī)接收:0xeeCommand=0x01上位機(jī)命令單片機(jī)讀取四路輸入開關(guān)量的輸入狀態(tài)如:0xff+0x01+0x00+XorCommand=0x02
6、單片機(jī)返回四路輸入狀態(tài)給上位機(jī)此時(shí),Content的1字節(jié)中的低四位分別表示四路開關(guān)量的輸入狀態(tài)1表示輸入高電平,0表示輸入低電平第一路輸入(第0位)第二位輸入(第1位)第三路輸入(第2位)第四路輸入(第3位)如:假設(shè)某一時(shí)刻四路輸入開關(guān)量的輸入狀態(tài)為0x03,上位機(jī)讀取其狀態(tài)為:0xee+0x02+0x03+XorCommand=0x03上位機(jī)命令單片機(jī)控制六路輸出的輸出狀態(tài)此時(shí),Content的1字節(jié)中的低六位分別表示六路開關(guān)量的輸出狀態(tài)1表示輸出高電平,0表示輸出低電平第一路輸出(第0位)第二路輸
7、出(第1位)第三路輸出(第2位)第四路輸出(第3位)第五路輸出(第4位)第六路輸出(第5位)如:上位機(jī)欲設(shè)置某一時(shí)刻六路輸出開關(guān)量的輸出狀態(tài)為0x01:0xff+0x03+0x01+XorCommand=0x04上位機(jī)命令單片機(jī)讀取六路輸出開關(guān)量的輸出狀態(tài)如:0xff+0x04+0x00+XorCommand=0x05單片機(jī)返回六路輸出狀態(tài)給上位機(jī)此時(shí),Content的1字節(jié)中的低六位分別表示六路開關(guān)量的輸出狀態(tài)1表示輸出高電平,0表示輸出低電平第一路輸出(第0位)第二路輸出(第1位)第三路輸出(第2位
8、)第四路輸出(第3位)第五路輸出(第4位)第六路輸出(第5位)如:某一時(shí)刻六路輸出開關(guān)量的輸出狀態(tài)為0x01,上位機(jī)讀取其狀態(tài)為:0xee+0x05+0x01+XorContent:表示四路輸入開關(guān)量的輸入狀態(tài)(數(shù)據(jù))或者六路輸出開關(guān)量的輸出狀態(tài)(數(shù)據(jù)),在不使用它的命令格式中,它的值無意義,為通信方便,在不使用它的命令格式中,規(guī)定其值為0x00;Xor:從第一個(gè)字節(jié)開始到Xor的前一個(gè)字節(jié)(總共3個(gè)字節(jié)),做異或運(yùn)算