【《基于DS18B20的單總線方式的蔬菜大棚溫度檢測顯示系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)》15000字(論文)】_第1頁
【《基于DS18B20的單總線方式的蔬菜大棚溫度檢測顯示系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)》15000字(論文)】_第2頁
【《基于DS18B20的單總線方式的蔬菜大棚溫度檢測顯示系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)》15000字(論文)】_第3頁
【《基于DS18B20的單總線方式的蔬菜大棚溫度檢測顯示系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)》15000字(論文)】_第4頁
【《基于DS18B20的單總線方式的蔬菜大棚溫度檢測顯示系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)》15000字(論文)】_第5頁
已閱讀5頁,還剩46頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

[18]:bitNext(void) //二叉樹遍歷 { bits1=0,s2=0;//S1表原碼,S2表反碼 ucharBitCount=1; //1-64 ucharRightShift=0x01; ucharn=0;//循環(huán)變量 ucharDiscrepMarker=0; bitTureCode;//該位真正的ROM編碼 bitnxt;//ROM碼搜索完成標(biāo)志位,1表示搜索完成 bitflag;//DS18B20復(fù)位成功標(biāo)志位,1表示復(fù)位成功 nxt=FLASE; dowcrc=0; flag=Ds18b20_Reset(); if(flag==FLASE||doneflag==FLASE)//初始化失敗或者未完成搜索ROM {LastDiscrap=0; returnFLASE;} DS18B20_WriteByte(0xf0); //搜索ROM(單片機(jī)識(shí)別所有DS18B20的64位編碼) do {s1= DS18B20_ReadBit()//發(fā)送搜索命令后,全體器件發(fā)送64位ROM碼第1位 s2=DS18B20_ReadBit(); //全體器件發(fā)送64位ROM碼的第1位的反碼 if(s1==1&&s2==1) //無器件未與總線相接 {break;} else {if(s1==0&&s2==0) //檢測到差異位,確定搜索方向(0or1) {if(BitCount<LastDiscrap)//BitCount當(dāng)前搜索位LastDiscrap上次 TureCode=ROM[n]&RightShift;最后走零位 elseTureCode=(BitCount==LastDiscrap); //選1BitCount==LastDiscrap if(TureCode==0) DiscrepMarker=BitCount;} else TureCode=s1; //01或10情況看第一個(gè) if(TureCode==1) ROM[n]|=RightShift; else ROM[n]&=~RightShift; DS18B20_WriteBit(TureCode);//器件ROM編碼在該位上的數(shù)據(jù)與寫入BitCount++;的數(shù)據(jù)相同,則繼續(xù)保持與總線聯(lián)系 RightShift<<=1; if(RightShift==0) //已經(jīng)移動(dòng)了7次,7*8次循環(huán) {ow_crc(ROM[n]); //最高8位為CRCn++; RightShift=1;} //返回初值 } }while(n<8); if(BitCount<65||dowcrc) //64位ROM碼還沒發(fā)完或循環(huán)冗余校驗(yàn)碼非零 LastDiscrap=0; else { LastDiscrap=DiscrepMarker; doneflag=(LastDiscrap!=0); //搜索完成 nxt=TURE; } returnnxt;}測溫程序流程圖如圖3-3所示:YY

開始轉(zhuǎn)換(0x44)匹配ROM(0x55)DS18B20復(fù)位N

DS18B20復(fù)位匹配ROM(0x55)讀溫度(0xBE)讀低字節(jié)TL讀高字節(jié)TL溫度負(fù)?取反加一計(jì)算十進(jìn)制數(shù)開始結(jié)束圖3-3測溫過程流程圖程序如下:/*****啟動(dòng)溫度轉(zhuǎn)換函數(shù)*****/voidStartDs18b20(uchar*ROMCODE){uchari;DS18B20_DQ=1;Ds18b20_Reset();DS18B20_WriteByte(0x55);//匹配ROM,接著MCU發(fā)出64位編碼,符合的DS18B20做出響應(yīng)for(i=0;i<8;i++){DS18B20_WriteByte(ROMCODE[i]);}DS18B20_WriteByte(0X44);//發(fā)送溫度轉(zhuǎn)化命令}/*****讀取溫度轉(zhuǎn)換函數(shù)*****/voidReadDs18b20(uchar*ROMCODE){uchari;ucharTLV=0;//采集到的溫度高8位ucharTHV=0;//采集到的溫度低8位unsignedinttemp;Ds18b20_Reset();//再次復(fù)位,等待從機(jī)應(yīng)答DS18B20_WriteByte(0x55); for(i=0;i<8;i++){DS18B20_WriteByte(ROMCODE[i]);}DS18B20_WriteByte(0XBE);//發(fā)送讀溫度命令TLV=DS18B20_ReadByte();//讀出溫度低8位THV=DS18B20_ReadByte();//讀出溫度高8位temp=THV;temp<<=8; //高8位左移4位temp|=TLV;temp&=0X07FF; //16位中前五位為符號(hào)位,保留11位數(shù)據(jù)位if(THV&0x80) //溫度為負(fù){temp=0x0800-temp; //數(shù)據(jù)位取反加一tflag=0x2d;}elsetflag=43; //溫度為正TD=(float)(temp&0x000f)*10/16; //小數(shù)部分溫度 ,LSB為0.0625TZ=temp>>4; //整數(shù)部分溫度DS18B20_DQ=1;//釋放總線}3.1.2顯示電路設(shè)計(jì)顯示電路硬件設(shè)計(jì) RS接P2.6,RW接P2.5,EN接P2.7,數(shù)據(jù)口接P0口,單個(gè)測溫電路顯示部分硬件設(shè)計(jì)如圖3-4所示:圖3-4顯示電路設(shè)計(jì)顯示電路軟件設(shè)計(jì)軟件設(shè)計(jì)如下:/*****從LCD1602某個(gè)位置寫字符串子函數(shù)*****/ voidwritestring(unsignedcharx,unsignedchary,unsignedchar*s){ if(y==0)command(0x80+x);//在第一行顯示數(shù)據(jù) else command(0xC0+x);//在第二行顯示數(shù)據(jù) while(*s) //判斷是否字符串的結(jié)尾{write_dat(*s);//顯示當(dāng)前字符 s++;} //字符串地址加1}/*****向LCD1602某個(gè)位置寫字符子函數(shù)*****/voidwriteChar(unsignedcharx,unsignedchary,unsignedchars){ if(y==0)command(0x80+x);//在第一行顯示數(shù)據(jù) else command(0xC0+x);//在第二行顯示數(shù)據(jù){write_dat(s);}//顯示當(dāng)前字符}在主函數(shù)中利用for循環(huán),每次使一個(gè)DS18B20工作,并將結(jié)果顯示在顯示屏上,部分程序如下:for(k=0;k<number;k++){StartDs18b20(&Ds18b20Rom[k][0]); //開始溫度轉(zhuǎn)化ReadDs18b20(&Ds18b20Rom[k][0]); //讀取溫度值TP1=TZ;tf1=tflag;writestring(0,0,"A1");writeChar(2,0,tflag);writeChar(3,0,TZ/10%10+'0'); //十位writeChar(4,0,TZ%10+'0');//個(gè)位writeChar(5,0,'.');writeChar(6,0,TD+'0');//小數(shù)位}3.1.3存儲(chǔ)電路設(shè)計(jì)存儲(chǔ)電路硬件設(shè)計(jì) 24C02的SCK、SDA引腳分別接P2.1、P2.0,A0、A1、A2接地,電路如圖3-5所示:圖3-5存儲(chǔ)電路設(shè)計(jì)存儲(chǔ)電路軟件設(shè)計(jì) 存儲(chǔ)電路寫一個(gè)字節(jié)數(shù)據(jù)和讀一個(gè)字節(jié)數(shù)據(jù)程序流程圖分別如圖3-6和3-7所示:等待響應(yīng)等待響應(yīng)發(fā)送地址(0XA0)發(fā)送具體地址(0x00~0xff)產(chǎn)生開始信號(hào)等待響應(yīng)寫入數(shù)據(jù)等待響應(yīng)產(chǎn)生結(jié)束信號(hào)開始結(jié)束圖3-6向24C02寫入一字節(jié)數(shù)據(jù)等待響應(yīng)等待響應(yīng)發(fā)送地址(0XA0)讀取一字節(jié)數(shù)據(jù)發(fā)送訪問具體地址(0x00~0xff)產(chǎn)生開始信號(hào)等待響應(yīng)產(chǎn)生開始信號(hào)發(fā)送地址(0XA1)等待響應(yīng)產(chǎn)生非應(yīng)答信號(hào)產(chǎn)生結(jié)束信號(hào)開始結(jié)束圖3-7從24C02讀取一字節(jié)數(shù)據(jù) 具體程序如下:/*****指定一個(gè)地址,對(duì)這個(gè)地址寫入一個(gè)數(shù)******/ voidwrite_e2p(ucharch,uintaddress){ Start(); //產(chǎn)生開始信號(hào) if(address<256){Write8Bit(WriteDeviceAddress);//24C08器件的地址(A2,A1,A0均為0),0xa0表示向24C02寫數(shù)據(jù) TestAck(); //等待響應(yīng) Write8Bit(address);//寫入這個(gè)具體的地址 TestAck();} //等待響應(yīng) Write8Bit(ch);//對(duì)這個(gè)地址寫入一個(gè)數(shù)據(jù) TestAck(); //繼續(xù)等待響應(yīng) Stop(); //停止信號(hào)delayms(10);//防止兩次調(diào)用write_e2p的間隔太短導(dǎo)致數(shù)據(jù)重疊}/*****指定一個(gè)地址,并從這個(gè)地址里面讀出一個(gè)數(shù),返回這個(gè)數(shù)*****/ucharread_e2p(uintaddress){ ucharch; Start(); if(address<256)Write8Bit(WriteDeviceAddress); TestAck(); Write8Bit(address); TestAck();}Start();//主從機(jī)改變通信模式,主機(jī)需重新發(fā)送一個(gè)開始信號(hào) if(address<256)Write8Bit(ReadDviceAddress); TestAck(); ch=Read8Bit(); NoAck(); Stop(); return(ch);}3.1.4數(shù)據(jù)傳輸電路設(shè)計(jì)數(shù)據(jù)傳輸電路硬件設(shè)計(jì) MAX458的RO接單片機(jī)的P3.0,DI接P3.1,RE與DE相接至P2.2;A、B口分別與RS485總線的A、B線相接,A、B接至終端的MAX485的A、B接口,終端的RO和DI分別接至串口的TXD和RXD,實(shí)物中的RS485轉(zhuǎn)USB模塊代替仿真中的終端MAX485和串口,仿真中硬件電路如圖3-8所示。圖3-8數(shù)據(jù)傳輸電路設(shè)計(jì)數(shù)據(jù)傳輸電路軟件件設(shè)計(jì) RS485的軟件設(shè)計(jì)本質(zhì)上仍然是串口程序設(shè)計(jì),故其設(shè)計(jì)與傳統(tǒng)的RS232傳輸時(shí)的程序一致,即先進(jìn)行串口初始化,再發(fā)送數(shù)據(jù),僅有的區(qū)別為,當(dāng)需要發(fā)送數(shù)據(jù)時(shí)需要使RE反和DE引腳設(shè)置為高電平;需要接收數(shù)據(jù)時(shí),需要使RE反和DE引腳為低電平。在分布式測溫系統(tǒng)中為保證每次只能有一個(gè)從機(jī)傳輸數(shù)據(jù),需要在串口中斷函數(shù)中使每個(gè)從機(jī)接收到特定的數(shù)據(jù)再變?yōu)榘l(fā)送模式,具體程序如下: /*****串口初始化函數(shù)*****/ voidUARTinit(void)//串口初始化{ EA=0;//暫時(shí)關(guān)閉中斷 TMOD&=0x0F;//定時(shí)器1模式控制在高4位高四位T1清零,T0不變 TMOD|=0x20;//定時(shí)器1工作在模式2(初值自動(dòng)裝入8為計(jì)數(shù)器),自動(dòng)重裝模式 SCON=0x50;//串口工作在模式1,8位異步收發(fā)波特率可變 TH1=256-fosc/(baudrate*12*16);//計(jì)算定時(shí)器重裝值 TL1=256-fosc/(baudrate*12*16); //波特率=(2^SMOD/32)*(fosc/12)/(256-x) PCON|=0x80;//串口波特率加倍,SMOD為1 ES=1;//串行中斷允許 TR1=1;//啟動(dòng)定時(shí)器1 REN=1;//允許接收 EA=1;//允許中斷}/*****發(fā)送一個(gè)字節(jié)的數(shù)據(jù)函數(shù)*****/voidsendchar(unsignedchard){C2=0; _nop_; C1=1; SBUF=d;//將數(shù)據(jù)寫入到串口緩沖 while(!TI);//等待發(fā)送完畢TI=0;}/*****發(fā)送字符串函數(shù)*****/voidsendstring(unsignedchar*pd){ while((*pd)!='\0')//直到遇到0才結(jié)束 {sendchar(*pd);//發(fā)送一個(gè)字符 pd++;}//移動(dòng)到下一個(gè)字符}/*****串口中斷函數(shù)*****/voidUART(void)interrupt4using1{if(RI==1){d=SBUF; if(d==0x05)//當(dāng)從機(jī)5發(fā)送完成數(shù)據(jù)后向總線發(fā)送0x55,從機(jī)一接收后 {變?yōu)榘l(fā)送模式 C1=1;//C1為使能控制端,1為發(fā)送,0為接收 RI=0;//復(fù)位標(biāo)志清零 }}3.1.5附加電路設(shè)計(jì)附加電路硬件設(shè)計(jì)如圖3-9所示: 圖3-9附加電路設(shè)計(jì)按鍵電路設(shè)計(jì) 設(shè)置一個(gè)變量記錄設(shè)置鍵按下的次數(shù),當(dāng)?shù)谝淮伟聪聲r(shí),進(jìn)入溫度上下限修改界面;在設(shè)置鍵第一次按下后,有遞增/遞減鍵按下時(shí),溫度下限相應(yīng)變化;設(shè)置鍵第二次按下后,有遞增/遞減鍵按下時(shí),溫度上限相應(yīng)變化;設(shè)置鍵第三次按下時(shí),退出溫度上下限的修改界面,進(jìn)入正常測溫模式。具體按鍵子程序如下:voidSetFun(void)//設(shè)置鍵子函數(shù),Set變量記錄按鍵按下次數(shù){ if(SetKey==0) { delayms(20); if(SetKey==0)//按鍵消抖 { if(Set<2) //按鍵按下一次 {Set++; writestring(0,0,""); writestring(0,1,""); writestring(0,1,"Low=Top="); writestring(0,0,"");} elseSet=0;//按鍵按下2次后Set清零 } DispAlData();//顯示數(shù)據(jù)子函數(shù) switch(Set) {case0:writestring(0,1,"");break;//未按下 case1:writestring(0,1,">");writestring(8,1,"");break;//按了一次 case2:writestring(0,1,"");writestring(8,1,">");break;//按了兩次 } while(SetKey==0);//當(dāng)設(shè)置鍵按下未松,程序一直在此處等待 } if((UpKey==0)&&(Set!=0))//遞增鍵 {//遞增鍵按下且設(shè)置鍵不是第一次按下 delayms(20); if(UpKey==0)//按鍵消抖 {switch(Set) {case1: //設(shè)置鍵第一次按下(此時(shí)>選擇LOW)if(AlarmTempLow<125){AlarmTempLow++;//報(bào)警下限加一writestring(0,1,">");//顯示writestring(8,1,"");delayms(200);}elseAlarmTempLow=125;break; case2: //設(shè)置鍵第二次按下(此時(shí)>選擇TOP)if(AlarmTempTop<125){AlarmTempTop++;//報(bào)警上限加一writestring(0,1,"");//顯示writestring(8,1,">");delayms(200);}elseAlarmTempTop=125;break} DispAlData(); while(UpKey==0);//當(dāng)遞增鍵按下未松,程序一直在此處等待 } }if((DnKey==0)&&(Set!=0))//遞減鍵按下且設(shè)置鍵不是第一次按下 { delayms(20); if(DnKey==0)//按鍵消抖 { switch(Set) { case1: //設(shè)置鍵第一次按下(此時(shí)>選擇LOW) if(AlarmTempLow>-20) {AlarmTempLow--;//報(bào)警下限減一 writestring(0,1,"Low=Top="); writestring(0,1,">");writestring(8,1,""); delayms(200); } elseAlarmTempLow=-20;break;//溫度最低下限為-20 case2://設(shè)置鍵第二次按下(此時(shí)>選擇TOP) if(AlarmTempTop>0) {AlarmTempTop--;//溫度上限減一 writestring(0,1,"Low=Top="); writestring(0,1,"");writestring(8,1,">"); delayms(200); }elseAlarmTempTop=0;break;//溫度上限如果小于0,為0 } DispAlData(); while(DnKey==0);//當(dāng)遞增鍵按下未松,程序一直在此處等待 } }報(bào)警電路設(shè)計(jì)設(shè)置一個(gè)變量用于存放溫度數(shù)據(jù)的整數(shù)部分,當(dāng)該溫度高于最高溫度或者低于最低溫度值時(shí)使蜂鳴器報(bào)警;同時(shí)設(shè)置一個(gè)變量記錄清除/恢復(fù)報(bào)警鍵按下的次數(shù),在第一次、第三次……按下會(huì)取消報(bào)警,沒有按下或者第二次、第四次按下……會(huì)恢復(fù)報(bào)警。具體報(bào)警子程序如下:voidAlarm(void){ if(TP1!=0xff)//TP1表一號(hào)DS18B20采集溫度的整數(shù)部分 { if((TP1>(AlarmTempTop))||(TP1<(AlarmTempLow))) {Alarm1=1;} else{Alarm1=0;}//溫度低于下限或者高于上限,報(bào)警標(biāo)志為1 }else{Alarm1=0;} if(stoper%2==0)//stoper記錄alarmK按鍵按下的次數(shù){ if(Alarm1==1){BEEP=0;} elseBEEP=1;}else{BEEP=1;}}3.1.6單個(gè)系統(tǒng)程序流程圖設(shè)計(jì) 單個(gè)系統(tǒng)程序流程圖如圖3-10所示:啟動(dòng)溫度轉(zhuǎn)換啟動(dòng)溫度轉(zhuǎn)換顯示基本信息串口發(fā)送數(shù)據(jù)讀取24C02內(nèi)容初始化LCD、串口向24C02寫數(shù)據(jù)讀取溫度溫度顯示報(bào)警掃描按鍵掃描開始While(1)結(jié)束圖3-10單個(gè)系統(tǒng)程序流程圖設(shè)計(jì)3.2系統(tǒng)整體程序設(shè)計(jì) 首先是從機(jī)一工作(發(fā)送狀態(tài)),其余從機(jī)處于監(jiān)聽狀態(tài),當(dāng)其開始測溫并將溫度傳遞至總線上,總線再將溫度傳遞至串口,當(dāng)從機(jī)一的數(shù)據(jù)發(fā)送完畢,緊接著向總線發(fā)送0X01,隨后處于監(jiān)聽狀態(tài);當(dāng)總線上其余處于監(jiān)聽狀態(tài)的從機(jī)均會(huì)接收到信號(hào),并觸發(fā)中斷函數(shù),但只有從機(jī)二在接收到0X01后,在主函數(shù)中才會(huì)執(zhí)行測溫傳輸?shù)纫幌盗胁僮?,從機(jī)二向總線傳遞完成數(shù)據(jù)后隨即發(fā)送0X02,并將自身設(shè)置為接收狀態(tài);從機(jī)三接收到數(shù)據(jù)后開始工作,從機(jī)四開始工作,當(dāng)從機(jī)四發(fā)送完溫度數(shù)據(jù)后,發(fā)送0X05至總線,從機(jī)一接收數(shù)據(jù)后開始工作,五個(gè)從機(jī)不斷依次傳遞數(shù)據(jù)。從機(jī)一中相關(guān)程序如下:while(1) { Alarm();//報(bào)警函數(shù) SetFun();//按鍵設(shè)置函數(shù) clean();//報(bào)警清除/恢復(fù)函數(shù) if((d==0x05)||(q==0x04)) { C1=1; write_e2p(AlarmTempTop,0x25); write_e2p(AlarmTempLow,0x26); writestring(0,0,""); writestring(0,1,""); clean(); if(Set==0) //設(shè)置鍵沒有按下 { for(k=0;k<number;k++) { StartDs18b20(&Ds18b20Rom[k][0]);//開始溫度轉(zhuǎn)化 ReadDs18b20(&Ds18b20Rom[k][0]); //讀取溫度值 writestring(0,0,"A1"); TP1=TZ;tf1=tflag; writeChar(2,0,tflag);//顯示溫度正負(fù) writeChar(3,0,TZ/10%10+'0'); //溫度十位 writeChar(4,0,TZ%10+'0');//溫度個(gè)位 writeChar(5,0,'.'); writeChar(6,0,TD+'0');//溫度小數(shù)位 writestring(0,1,""); writestring(0,2,""); writestring(2,1,"LOW"); writestring(10,1,"TOP"); DispAlData(); delayms(500); dispBuf[0]=TZ/10%10+'0';dispBuf[1]=TZ%10+'0'; dispBuf[2]='.'; dispBuf[3]=TD+'0'; dispBuf[4]='\0'; sendstring(dispBuf);//傳輸溫度 sendstring("\r\n");//換行 }else(C1=0);sendchar(0x01); C1=0;//從機(jī)一處于接收狀態(tài)q=0x01;d=0x00;//使從機(jī)一停止串口傳輸 } } 3.3Proteus仿真調(diào)試3.3.1溫度檢測調(diào)試 測溫?cái)?shù)據(jù)的顯示如圖3-11所示:圖3-11測溫?cái)?shù)據(jù)顯示3.3.2RS485傳輸調(diào)試 Proteus中串口選擇為COM1。利用虛擬串口VSPD,使COM1與COM2相連,如圖3-12所示。圖3-12虛擬串口設(shè)置 串口調(diào)試助手接收數(shù)據(jù)如圖3-13所示:圖3-13串口助手接收數(shù)據(jù)3.3.3存儲(chǔ)電路調(diào)試 第一次將溫度報(bào)警上下限值分別設(shè)置為15和5度,后來在程序中將設(shè)定值改為25和5度,在開機(jī)畫面顯示的歷史溫度仍然會(huì)顯示為25度和5度,更改后的開機(jī)顯示如圖3-14所示,進(jìn)入循環(huán)顯示溫度后如圖3-15所示:圖3-14歷史溫度顯示圖3-15更改后溫度顯示3.3.4按鍵電路調(diào)試 先按一下設(shè)置鍵,進(jìn)入溫度下限修改模式,如圖3-16所示,此時(shí)可以按遞增鍵或遞減鍵加減溫度下限值,在按一下設(shè)置鍵進(jìn)入溫度上限修改模式,如圖3-17所示,此時(shí)可以按遞增鍵或遞減鍵加減溫度上限值,再按一下設(shè)置鍵進(jìn)入正常測溫模式。圖3-16設(shè)置鍵按下后圖3-17遞增鍵按下后第4章上位機(jī)設(shè)計(jì)與仿真調(diào)試4.1VB上位機(jī)界面設(shè)計(jì) VB的特點(diǎn)是面向?qū)ο蟮恼Z言,操作簡單,且具有可視化的圖形界面,可直接生成EXE文件,作為上位機(jī)編程軟件具有較大優(yōu)勢。此次設(shè)計(jì)的對(duì)象窗口中的主要控件有(1)MSComm控件,可以通過串口傳輸和接收數(shù)據(jù)實(shí)現(xiàn)串行通訊功能。常見屬性為Comport,用于返回端口號(hào);PortOpen,用于打開和關(guān)閉串口,True時(shí)為打開串口;Input,用于從緩沖區(qū)接收字符;InputLen,表示從緩沖區(qū)讀取的字符數(shù),缺省值是0,此時(shí)接收緩沖區(qū)中的全部內(nèi)容;Settings,用于設(shè)置并返回波特率、奇偶校驗(yàn)、數(shù)據(jù)位、停止位,缺省值為9600、N、8、1,即波特率為9600bit/s,無奇偶校驗(yàn),數(shù)據(jù)位為8位,停止位1位;InBufferCount用于表示緩沖區(qū)等待的字符數(shù)。(2)Picture控件,該控件可用于繪制曲線。常見屬性為ScaleHeight,ScaleWidth返回或設(shè)置對(duì)象內(nèi)部的水平或垂直度時(shí)單位;Line,用于繪制從一點(diǎn)至另一點(diǎn)的直線。 (3)Checkbox控件,用于建立控件數(shù)組,在按鈕單擊事件里進(jìn)行循環(huán)判斷每個(gè)復(fù)選框的狀態(tài)。常見屬性為AddItem,用于將項(xiàng)目添加到ComboBox控件。 (4)Text控件,主要用于顯示文本或者輸入文字。常見屬性有Text屬性,用來顯示文本框中的文本內(nèi)容。 (5)Timer控件,可以有規(guī)律地間隔一段時(shí)間執(zhí)行一次代碼。主要屬性有Interval屬性,用于設(shè)置間隔時(shí)間,有效值在0至65535ms之間。 (6)Label控件,用于顯示字符串。 對(duì)象窗口界面如圖4-1所示:圖4-1上位機(jī)界面4.2上位機(jī)軟件設(shè)計(jì)及調(diào)試軟件設(shè)計(jì)如下:(1)PrivateSubForm_Load()'初始界面MSComm1.InputLen=4'串口每次讀取2個(gè)字符Combo1.AddItem"COM1"'COM1、COM2、COM3、COM4、COM5加入Combo1控件Combo1.AddItem"COM2"Combo1.AddItem"COM3"Combo1.AddItem"COM4"Combo1.AddItem"COM5"Combo1.ListIndex=0'默認(rèn)顯示COM1口Shape1.BackColor=RGB(222,222,222)'串口指示燈的設(shè)為灰色Shape2.BackColor=RGB(222,222,222)'溫度過高指示燈的設(shè)為灰色Shape3.BackColor=RGB(222,222,222)'溫度過低指示燈的設(shè)為灰色AlarmTempLow=5'溫度報(bào)警下限默認(rèn)為5度AlarmTempHig=25'溫度報(bào)警上限默認(rèn)為25度Picture1.ScaleHeight=800'將溫度的Y軸70等分Picture1.ScaleWidth=500'將溫度的X軸50等分X_Pos=0'曲線從x=0開始繪制Picture1.Line(0,378)-(5,378),RGB(128,0,255)'10度線Picture1.Line(0,278)-(5,278),RGB(128,0,255)'20度線 ……EndSub(2)PrivateSubCommand1_Click()'打開串口按鍵OnErrorGoToErr'程序執(zhí)行出錯(cuò)時(shí),跳到err處執(zhí)行IfCommand1.Caption="打開串口"Then'如果串口還未打開MSComm1.CommPort=Combo1.ListIndex+1'獲取串口號(hào)MSComm1.PortOpen=True'打開串口Shape1.BackColor=RGB(0,255,0)'打開串口指示燈Command1.Caption="關(guān)閉串口"'將按鈕標(biāo)題改為“關(guān)閉串口”Else'如果串口已經(jīng)打開MSComm1.PortOpen=False'關(guān)閉串口Shape1.BackColor=RGB(222,222,222)'將串口指示燈置為灰色Command1.Caption="打開串口"'將按鈕標(biāo)題改為“關(guān)閉串口”EndIfExitSubErr:'打開錯(cuò)誤的串口,則進(jìn)行錯(cuò)誤提醒MsgBox"串口號(hào)不存在!",vbOKOnly,"錯(cuò)誤"EndSub(3)PrivateSubTimer1_Timer()DimstrAsStringIfMSComm1.InBufferCount>=3Then'如果串口緩沖區(qū)的內(nèi)容超出3個(gè),讀取串口數(shù)據(jù)str=MSComm1.InputIfVal(str)<>0ThenText5.Text=Val(str)EndIfIfX_Pos=0Then'開始繪制曲線X_Pos=1ElsePicture1.PSet(X_Pos,478-Val(Text5.Text)*10),RGB(128,0,255)'畫點(diǎn)X_Pos=X_Pos+1'在溫度曲線到達(dá)圖形控件最右側(cè)時(shí)把曲線清除并從左側(cè)重新繪制IfX_Pos=500ThenPicture1.ClsX_Pos=0EndIfEndIf'如果溫度超過報(bào)警上限,則警示燈亮If(Val(Text5.Text))*10>(AlarmTempHig)*10ThenShape2.BackColor=RGB(255,0,0)ElseShape2.BackColor=RGB(222,222,222)EndIf'如果溫度低于報(bào)警下限,則警示燈亮If(Val(Text5.Text))*10<(AlarmTempLow)*10ThenShape3.BackColor=RGB(255,0,0)ElseShape3.BackColor=RGB(222,222,222)EndIfEndIf(4)PrivateSubCommand4_Click()'按下溫度上限加一按鈕后,觸發(fā)此程序buff(0)=&H3'串口發(fā)送03,溫度上限加一MSComm1.Output=buffText2.Text=Val(Text2.Text)+1EndSub調(diào)試界面如圖4-2所示:圖4-2上位機(jī)運(yùn)行界面第5章實(shí)物安裝與調(diào)試5.1PCB電路板設(shè)計(jì) 在設(shè)計(jì)中加入程序下載接口,需要在Proteus中加入U(xiǎn)SB與FT232芯片,用于將TTL電平轉(zhuǎn)化為USB電平,單個(gè)測溫系統(tǒng)的PCB電路板設(shè)計(jì)如圖5-1所示: 圖5-1單個(gè)測溫系統(tǒng)PCB設(shè)計(jì)5.2實(shí)物仿真 單個(gè)測溫系統(tǒng)的實(shí)物焊接如圖5-2和5-3所示: 圖5-2單片機(jī)模塊焊接圖5-3DS18B20模塊焊接 仿真結(jié)果如圖5-4所示: 圖5-4仿真調(diào)試結(jié)論與展望 本文設(shè)計(jì)了基于低功耗的STC52單片機(jī)的分布式蔬菜大棚溫度檢測系統(tǒng)。通過五個(gè)測溫系統(tǒng)實(shí)現(xiàn)對(duì)大棚五處位置的測溫,且每個(gè)測溫點(diǎn)可擴(kuò)展多個(gè)DS18B20;通過LCD1602對(duì)溫度數(shù)據(jù)進(jìn)行本地顯示;通過RS485總線將采集的溫度數(shù)據(jù)傳輸至控制室的上位機(jī);并在電路構(gòu)造上加入了24C02芯片,完成對(duì)數(shù)據(jù)的存儲(chǔ);報(bào)警電路可在溫度異常的情況下進(jìn)行報(bào)警;獨(dú)立按鍵電路可對(duì)報(bào)警上下限值進(jìn)行修改?,F(xiàn)將本設(shè)計(jì)的完成的內(nèi)容以及設(shè)計(jì)心得歸納如下: (1)設(shè)計(jì)的系統(tǒng)具有較強(qiáng)的實(shí)用性,不僅可以適用于蔬菜大棚,其它需要測溫的環(huán)境如糧倉,室內(nèi)溫度等都可以進(jìn)行測量同時(shí)該設(shè)計(jì)性價(jià)比高。 (2)此次設(shè)計(jì)的算法具有較強(qiáng)的移植性,對(duì)于每個(gè)位置的單片機(jī)可測得的溫度值不僅僅為一個(gè)點(diǎn)位,只需程序稍加修改,就可完成一個(gè)端口掛接多個(gè)DS18B20進(jìn)行測溫。 (3)采用RS485總線方式傳輸,布線較少,擴(kuò)展方便,若需要擴(kuò)展測溫位置,只需在總線上掛接同樣的硬件測溫系統(tǒng),程序稍加修改就可實(shí)現(xiàn)測溫點(diǎn)的擴(kuò)展。 (4)設(shè)計(jì)過程中首先進(jìn)行的是測溫電路的設(shè)計(jì),其主要問題在于無法識(shí)別DS18B20的ROM碼,后來在網(wǎng)上了解到是由于CRC循環(huán)冗余校驗(yàn)碼的錯(cuò)誤,并從網(wǎng)上學(xué)習(xí)的相關(guān)的知識(shí)對(duì)程序進(jìn)行修改,并完成了相關(guān)模塊的設(shè)計(jì)。 (5)設(shè)計(jì)中碰到的一個(gè)問題是,當(dāng)溫度不在溫度上下限之中時(shí),雖然能夠報(bào)警,但設(shè)計(jì)的按K4按下后無法使蜂鳴器停止,發(fā)現(xiàn)是由于報(bào)警子程序一直放在while(1)循環(huán)中,每次溫度掃描出現(xiàn)異常都會(huì)觸發(fā)報(bào)警,而設(shè)計(jì)的按鍵子程序只是簡單的使蜂鳴器停止,后來設(shè)了一個(gè)變量stoper來記錄按鍵按下的次數(shù)。主要思路是:初值為0,第一次按下后加一,使蜂鳴器停止;再按下一次,stoper變?yōu)?,蜂鳴器停止;當(dāng)大于2時(shí)變?yōu)?,同時(shí)關(guān)閉蜂鳴器;且只有在該變量是2的整數(shù)倍時(shí)再觸發(fā)報(bào)警程序,該問題便得到了解決。 當(dāng)然由于作者自身能力有限,同時(shí)時(shí)間有限,該設(shè)計(jì)仍有較多的不足之處: (1)僅僅測量了溫度的變量,對(duì)于其它重要的參數(shù)如濕度、光照、二氧化碳濃度等沒有進(jìn)行測量和彼此之間的聯(lián)系缺乏探討。 (2)缺乏對(duì)執(zhí)行器的控制,雖然有溫度報(bào)警,但沒有對(duì)溫度進(jìn)行控制如加一個(gè)繼電器控制直流電機(jī)開關(guān),抑或是采用PWM技術(shù)來給直流電機(jī)進(jìn)行調(diào)速,在溫度較高時(shí),使電機(jī)的轉(zhuǎn)速較快,當(dāng)溫度降低可以自動(dòng)降低轉(zhuǎn)速,也可以通過上位機(jī)對(duì)電機(jī)等進(jìn)行控制,使控制系統(tǒng)更加高效。 蔬菜大棚控制的未來發(fā)展方向必定是朝著多元化和智能化方向發(fā)展,需要的人工數(shù)量將減少,不僅僅局限于對(duì)各種參數(shù)的測量,更重要的是其中的關(guān)系,只有各種參數(shù)達(dá)到相對(duì)均衡的條件下,蔬菜等經(jīng)濟(jì)作物才能真正做到增產(chǎn)增收REF_Ref70841868\r\h。參考文獻(xiàn)杜紅霞,李慧冬,方麗萍,陳子雷,官帥,梁京蕓.一種可自動(dòng)通風(fēng)的蔬菜大棚[P].山東:CN206101119U,2017-04-19.楊方,蘇中濱,王潤濤,王基宇,張健,任帥,劉瑩,馬佳玉.基于物理農(nóng)業(yè)生物電場調(diào)控的自動(dòng)化溫室大棚[P].黑龍江:CN103210809A,2013-07-24.董文國.蔬菜溫室大棚智能控制系統(tǒng)的設(shè)計(jì)[D].曲阜師范大學(xué),2012.鄭文剛,趙春江,王紀(jì)華.溫室智能控制的研究進(jìn)展[J].農(nóng)業(yè)網(wǎng)絡(luò)信息,2004(02):8-11.唐勇.中壓開關(guān)柜溫濕度在線監(jiān)測系統(tǒng)設(shè)計(jì)[J].新型工業(yè)化,2019,9(02):87-89.程仕發(fā).智能溫室大棚監(jiān)控系統(tǒng)的研究與設(shè)計(jì)[D].山西:太原理工大學(xué),2020.金鈺.工業(yè)控制計(jì)算機(jī)在自動(dòng)化溫室控制中的應(yīng)用[J].工業(yè)控制計(jì)算機(jī),2000(01):16-18.杜輝,陳教料.基于藍(lán)牙技術(shù)的分布式溫室監(jiān)控系統(tǒng)設(shè)計(jì)研究[J].自動(dòng)化儀表,2005(03):21-23+29.唐林林.蔬菜大棚的智能監(jiān)控系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D].山東大學(xué),2010.李海南.溫室蔬菜大棚監(jiān)控系統(tǒng)研究與實(shí)現(xiàn)[D].吉林大學(xué),2015.GuoQingChen.MineMulti-PointTemperatureMeasurementandControlNetworkRemoteMonitoringSystemResearch[J].AppliedMechanicsandMaterials,2014,3629.Xue-HanGao,Jian-JunXu,Li-MeiYan.VegetableGreenhousesIntelligentTemperatureControlSystem[J].AdvanceJournalofFoodScienceandTechnology,2016,10(1).張毅剛,王少軍,付寧.單片機(jī)原理及接口技術(shù)[M].人民郵電出版社:,201501.333.劉鳴,車立新,陳興梧,趙煜.溫度傳感器DS18B20的特性及程序設(shè)計(jì)方法[J].電測與儀表,2001(10):47-51.樊強(qiáng),張敏,李霞.基于DS18B20的溫度采集系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].農(nóng)機(jī)化研究,2011,33(12):161-164.柴睿.液壓沖擊器的智能控制系統(tǒng)研究[D].上海交通大學(xué),2009.朱江.基于支持向量機(jī)的煤礦瓦斯突出預(yù)測系統(tǒng)的研究[D].安徽理工大學(xué),2014.李多,陳軍.基于單片機(jī)串口實(shí)現(xiàn)1-Wire總線通信的方法[J].微型機(jī)與應(yīng)用,2012,31(11):22-24.

附錄:蔬菜大棚溫度檢測系統(tǒng)硬件電路設(shè)計(jì):蔬菜大棚溫度檢測系統(tǒng)從機(jī)一主函數(shù):voidmain(void){ uintk;ucharL; ucharH; ucharnumber;BEEP=1; C1=0;LCD_Initial();UARTinit();//串口初始化writestring(0,0,"SearchSensor");delayms(200);number=FindDevices(Ds18b20Rom);writestring(0,0,"Searchsensors");

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論