【《分布式單片機蔬菜大棚溫度檢測系統(tǒng)的電路設(shè)計與仿真調(diào)試案例》4000字】_第1頁
【《分布式單片機蔬菜大棚溫度檢測系統(tǒng)的電路設(shè)計與仿真調(diào)試案例》4000字】_第2頁
【《分布式單片機蔬菜大棚溫度檢測系統(tǒng)的電路設(shè)計與仿真調(diào)試案例》4000字】_第3頁
【《分布式單片機蔬菜大棚溫度檢測系統(tǒng)的電路設(shè)計與仿真調(diào)試案例》4000字】_第4頁
【《分布式單片機蔬菜大棚溫度檢測系統(tǒng)的電路設(shè)計與仿真調(diào)試案例》4000字】_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

分布式單片機蔬菜大棚溫度檢測系統(tǒng)的電路設(shè)計與仿真調(diào)試案例目錄TOC\o"1-3"\h\u21425分布式單片機蔬菜大棚溫度檢測系統(tǒng)的電路設(shè)計與仿真調(diào)試案例 [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(單片機識別所有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情況看第一個 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)移動了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)冗余校驗碼非零 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ù)?取反加一計算十進制數(shù)開始結(jié)束圖3-3測溫過程流程圖程序如下:/*****啟動溫度轉(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ù)位,等待從機應(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位中前五位為符號位,保留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;//釋放總線}1.1.2顯示電路設(shè)計1.1.2.1顯示電路硬件設(shè)計 RS接P2.6,RW接P2.5,EN接P2.7,數(shù)據(jù)口接P0口,單個測溫電路顯示部分硬件設(shè)計如圖3-4所示:圖3-4顯示電路設(shè)計1.1.2.2顯示電路軟件設(shè)計軟件設(shè)計如下:/*****從LCD1602某個位置寫字符串子函數(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某個位置寫字符子函數(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),每次使一個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');//個位writeChar(5,0,'.');writeChar(6,0,TD+'0');//小數(shù)位}1.1.3存儲電路設(shè)計1.1.1.1存儲電路硬件設(shè)計 24C02的SCK、SDA引腳分別接P2.1、P2.0,A0、A1、A2接地,電路如圖3-5所示:圖3-5存儲電路設(shè)計1.1.1.2存儲電路軟件設(shè)計 存儲電路寫一個字節(jié)數(shù)據(jù)和讀一個字節(jié)數(shù)據(jù)程序流程圖分別如圖3-6和3-7所示:等待響應(yīng)等待響應(yīng)發(fā)送地址(0XA0)發(fā)送具體地址(0x00~0xff)產(chǎn)生開始信號等待響應(yīng)寫入數(shù)據(jù)等待響應(yīng)產(chǎn)生結(jié)束信號開始結(jié)束圖3-6向24C02寫入一字節(jié)數(shù)據(jù)等待響應(yīng)等待響應(yīng)發(fā)送地址(0XA0)讀取一字節(jié)數(shù)據(jù)發(fā)送訪問具體地址(0x00~0xff)產(chǎn)生開始信號等待響應(yīng)產(chǎn)生開始信號發(fā)送地址(0XA1)等待響應(yīng)產(chǎn)生非應(yīng)答信號產(chǎn)生結(jié)束信號開始結(jié)束圖3-7從24C02讀取一字節(jié)數(shù)據(jù) 具體程序如下:/*****指定一個地址,對這個地址寫入一個數(shù)******/ voidwrite_e2p(ucharch,uintaddress){ Start(); //產(chǎn)生開始信號 if(address<256){Write8Bit(WriteDeviceAddress);//24C08器件的地址(A2,A1,A0均為0),0xa0表示向24C02寫數(shù)據(jù) TestAck(); //等待響應(yīng) Write8Bit(address);//寫入這個具體的地址 TestAck();} //等待響應(yīng) Write8Bit(ch);//對這個地址寫入一個數(shù)據(jù) TestAck(); //繼續(xù)等待響應(yīng) Stop(); //停止信號delayms(10);//防止兩次調(diào)用write_e2p的間隔太短導(dǎo)致數(shù)據(jù)重疊}/*****指定一個地址,并從這個地址里面讀出一個數(shù),返回這個數(shù)*****/ucharread_e2p(uintaddress){ ucharch; Start(); if(address<256)Write8Bit(WriteDeviceAddress); TestAck(); Write8Bit(address); TestAck();}Start();//主從機改變通信模式,主機需重新發(fā)送一個開始信號 if(address<256)Write8Bit(ReadDviceAddress); TestAck(); ch=Read8Bit(); NoAck(); Stop(); return(ch);}1.1.4數(shù)據(jù)傳輸電路設(shè)計1.1.4.1數(shù)據(jù)傳輸電路硬件設(shè)計 MAX458的RO接單片機的P1.0,DI接P1.1,RE與DE相接至P2.2;A、B口分別與RS485總線的A、B線相接,A、B接至終端的MAX485的A、B接口,終端的RO和DI分別接至串口的TXD和RXD,實物中的RS485轉(zhuǎn)USB模塊代替仿真中的終端MAX485和串口,仿真中硬件電路如圖3-8所示。圖3-8數(shù)據(jù)傳輸電路設(shè)計1.1.4.2數(shù)據(jù)傳輸電路軟件件設(shè)計 RS485的軟件設(shè)計本質(zhì)上仍然是串口程序設(shè)計,故其設(shè)計與傳統(tǒng)的RS232傳輸時的程序一致,即先進行串口初始化,再發(fā)送數(shù)據(jù),僅有的區(qū)別為,當(dāng)需要發(fā)送數(shù)據(jù)時需要使RE反和DE引腳設(shè)置為高電平;需要接收數(shù)據(jù)時,需要使RE反和DE引腳為低電平。在分布式測溫系統(tǒng)中為保證每次只能有一個從機傳輸數(shù)據(jù),需要在串口中斷函數(shù)中使每個從機接收到特定的數(shù)據(jù)再變?yōu)榘l(fā)送模式,具體程序如下: /*****串口初始化函數(shù)*****/ voidUARTinit(void)//串口初始化{ EA=0;//暫時關(guān)閉中斷 TMOD&=0x0F;//定時器1模式控制在高4位高四位T1清零,T0不變 TMOD|=0x20;//定時器1工作在模式2(初值自動裝入8為計數(shù)器),自動重裝模式 SCON=0x50;//串口工作在模式1,8位異步收發(fā)波特率可變 TH1=256-fosc/(baudrate*12*16);//計算定時器重裝值 TL1=256-fosc/(baudrate*12*16); //波特率=(2^SMOD/32)*(fosc/12)/(256-x) PCON|=0x80;//串口波特率加倍,SMOD為1 ES=1;//串行中斷允許 TR1=1;//啟動定時器1 REN=1;//允許接收 EA=1;//允許中斷}/*****發(fā)送一個字節(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ā)送一個字符 pd++;}//移動到下一個字符}/*****串口中斷函數(shù)*****/voidUART(void)interrupt4using1{if(RI==1){d=SBUF; if(d==0x05)//當(dāng)從機5發(fā)送完成數(shù)據(jù)后向總線發(fā)送0x55,從機一接收后 {變?yōu)榘l(fā)送模式 C1=1;//C1為使能控制端,1為發(fā)送,0為接收 RI=0;//復(fù)位標(biāo)志清零 }}1.1.5附加電路設(shè)計附加電路硬件設(shè)計如圖3-9所示: 圖3-9附加電路設(shè)計1.1.5.1按鍵電路設(shè)計 設(shè)置一個變量記錄設(shè)置鍵按下的次數(shù),當(dāng)?shù)谝淮伟聪聲r,進入溫度上下限修改界面;在設(shè)置鍵第一次按下后,有遞增/遞減鍵按下時,溫度下限相應(yīng)變化;設(shè)置鍵第二次按下后,有遞增/遞減鍵按下時,溫度上限相應(yīng)變化;設(shè)置鍵第三次按下時,退出溫度上下限的修改界面,進入正常測溫模式。具體按鍵子程序如下: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è)置鍵第一次按下(此時>選擇LOW)if(AlarmTempLow<125){AlarmTempLow++;//報警下限加一writestring(0,1,">");//顯示writestring(8,1,"");delayms(200);}elseAlarmTempLow=125;break; case2: //設(shè)置鍵第二次按下(此時>選擇TOP)if(AlarmTempTop<125){AlarmTempTop++;//報警上限加一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è)置鍵第一次按下(此時>選擇LOW) if(AlarmTempLow>-20) {AlarmTempLow--;//報警下限減一 writestring(0,1,"Low=Top="); writestring(0,1,">");writestring(8,1,""); delayms(200); } elseAlarmTempLow=-20;break;//溫度最低下限為-20 case2://設(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)遞增鍵按下未松,程序一直在此處等待 } }1.1.5.2報警電路設(shè)計設(shè)置一個變量用于存放溫度數(shù)據(jù)的整數(shù)部分,當(dāng)該溫度高于最高溫度或者低于最低溫度值時使蜂鳴器報警;同時設(shè)置一個變量記錄清除/恢復(fù)報警鍵按下的次數(shù),在第一次、第三次……按下會取消報警,沒有按下或者第二次、第四次按下……會恢復(fù)報警。具體報警子程序如下:voidAlarm(void){ if(TP1!=0xff)//TP1表一號DS18B20采集溫度的整數(shù)部分 { if((TP1>(AlarmTempTop))||(TP1<(AlarmTempLow))) {Alarm1=1;} else{Alarm1=0;}//溫度低于下限或者高于上限,報警標(biāo)志為1 }else{Alarm1=0;} if(stoper%2==0)//stoper記錄alarmK按鍵按下的次數(shù){ if(Alarm1==1){BEEP=0;} elseBEEP=1;}else{BEEP=1;}}1.1.6單個系統(tǒng)程序流程圖設(shè)計 單個系統(tǒng)程序流程圖如圖3-10所示:啟動溫度轉(zhuǎn)換啟動溫度轉(zhuǎn)換顯示基本信息串口發(fā)送數(shù)據(jù)讀取24C02內(nèi)容初始化LCD、串口向24C02寫數(shù)據(jù)讀取溫度溫度顯示報警掃描按鍵掃描開始While(1)結(jié)束圖3-10單個系統(tǒng)程序流程圖設(shè)計1.2系統(tǒng)整體程序設(shè)計 首先是從機一工作(發(fā)送狀態(tài)),其余從機處于監(jiān)聽狀態(tài),當(dāng)其開始測溫并將溫度傳遞至總線上,總線再將溫度傳遞至串口,當(dāng)從機一的數(shù)據(jù)發(fā)送完畢,緊接著向總線發(fā)送0X01,隨后處于監(jiān)聽狀態(tài);當(dāng)總線上其余處于監(jiān)聽狀態(tài)的從機均會接收到信號,并觸發(fā)中斷函數(shù),但只有從機二在接收到0X01后,在主函數(shù)中才會執(zhí)行測溫傳輸?shù)纫幌盗胁僮?,從機二向總線傳遞完成數(shù)據(jù)后隨即發(fā)送0X02,并將自身設(shè)置為接收狀態(tài);從機三接收到數(shù)據(jù)后開始工作,從機四開始工作,當(dāng)從機四發(fā)送完溫度數(shù)據(jù)后,發(fā)送0X05至總線,從機一接收數(shù)據(jù)后開始工作,五個從機不斷依次傳遞數(shù)據(jù)。從機一中相關(guān)程序如下:while(1) { Alarm();//報警函數(shù) SetFun();//按鍵設(shè)置函數(shù) clean();//報警清除/恢復(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');//溫度個位 writeChar(5,0,'.');

溫馨提示

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

評論

0/150

提交評論