基于51自動噴水系統(tǒng)的設(shè)計與開發(fā)_第1頁
基于51自動噴水系統(tǒng)的設(shè)計與開發(fā)_第2頁
基于51自動噴水系統(tǒng)的設(shè)計與開發(fā)_第3頁
基于51自動噴水系統(tǒng)的設(shè)計與開發(fā)_第4頁
基于51自動噴水系統(tǒng)的設(shè)計與開發(fā)_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

我們的愛情,我們的理想,我們的未來,我們的成長,我們的幸福PAGE②我們的愛情,我們的理想,我們的未來,我們的成長,我們的幸福我們的愛情,我們的理想,我們的未來,我們的成長,我們的幸福我們的愛情,我們的理想,我們的未來,我們的成長,我們的幸福第五屆“飛兆杯”電子設(shè)計競賽(2014年度)復(fù)賽報告項目中文名稱:自動噴水系統(tǒng)項目英文名稱:Automaticsprinklersystem參賽隊員:劉陳磚,何鑫,龍浩指導(dǎo)教師:孫來業(yè)參賽院系:自動化學院目錄摘要3一、系統(tǒng)整體硬件構(gòu)成41、整體框架圖42、主要器件選擇43、主要電路分析5二、系統(tǒng)軟件構(gòu)成71、整體結(jié)構(gòu)圖72、主要模塊分析8三、電路連接10四、項目計劃使用器件列表10中文摘要本次設(shè)計的自動噴水系統(tǒng)包括溫濕度報警電路、電機驅(qū)動電路、電熱器驅(qū)動電路,其中涉及到單片機AT89S52、DS-18B20數(shù)字溫度傳感器、繼電器和M4QA045、電動機、ULN-2003A集成芯片、濕敏電阻,以及LCD1602顯示器等元件,從而實現(xiàn)了溫室大棚中溫度和濕度的控制和報警系統(tǒng),解決了溫室大棚人工控制測試的溫度及濕度誤差大,且費時費力、效率低等問題。該系統(tǒng)運行可靠,成本低。系統(tǒng)通過對溫室內(nèi)的溫度與濕度參量的采集,并根據(jù)獲得參數(shù)實現(xiàn)對溫度和濕度的自動調(diào)節(jié),達到了溫室大棚自動控制的目的。促進了農(nóng)作物的生長,從而提高溫室大棚的產(chǎn)量,帶來很好的經(jīng)濟效益和社會效益。[關(guān)鍵詞]AT89S52溫濕度的采集與顯示ULN-2003A自動控制自動檢測AbstractSubjectdesigntemperatureandhumidityalarmcircuittheM4QA045motordrivecircuit,heaterdrivecircuit,whichinvolvestoSTC89C52single-chip,theDS-18B20digitaltemperaturesensor,relayandM4QA045ofmotor,theULN-2003Achip,humidityresistance,andLCD1602monitorsandothercomponents,inordertoachievethegreenhousetemperatureandhumiditycontrolandalarmsystems,tosolvethegreenhousetemperatureandhumidityofthemanualcontroltestingerror,andtime-consumingandlowefficiency.Thesystemisreliableandlowcost.Systemthroughthecollection,greenhousetemperatureandhumidityparametersandgettheparameterstoautomaticallyadjustthetemperatureandhumidity,tothepurposeoftheautomaticcontrolofthegreenhouse.Promotethegrowthofcrops,therebyincreasingtheyieldofthegreenhouse,andbringgoodeconomicandsocialbenefits.Keywords:AT89S52,microcontroller,digitaltemperaturesensorinDS-18B20,ULN-2003Achip,greenhouse,automaticcontrol,automaticdetection一、系統(tǒng)硬件構(gòu)成1、整體框架圖2、主要器件選擇單片機的選擇:電子技術(shù)飛速發(fā)展,使得計算機不斷更新?lián)Q代。其中單片機更是一枝獨秀,廣泛應(yīng)用于各個領(lǐng)域,使其自動化程度大提高。單片機具有體積小,價格低廉,功能強大等優(yōu)點?;诖舜雾椖窟x擇單片機AT89S52.AT89S52功能特性:兼容MCS51指令系統(tǒng)8k可反復(fù)擦寫(大于1000次)FlashROM32個雙向I/O口256x8bit內(nèi)部RAM3個16位可編程定時/計數(shù)器中斷時鐘頻率0-24MHz2個串行中斷,可編程UART串行通道2個外部中斷源,共8個中斷源2個讀寫中斷口線,3級加密位低功耗空閑和掉電模式,軟件設(shè)置睡眠和喚醒功能有PDIP、PQFP、TQFP及PLCC等幾種封裝形式,以適應(yīng)不同產(chǎn)品的需求。傳感器的選擇:對于傳感器的選擇,起初我是選用兩個傳感器,溫度采集使用DS18B20,而濕度采用AM1001。但是,在網(wǎng)上查找資料的過程中發(fā)現(xiàn)市場上擁有已將溫濕度采集集成在同一片傳感器上的AM2301,同時,它是以效準數(shù)字信號輸出的復(fù)合傳感器,省去了模數(shù)轉(zhuǎn)換的麻煩,節(jié)省了硬件資源。綜合考慮,我選用了AM2301溫濕度傳感器。顯示器的選擇:顯示器可采用LED數(shù)碼管和LCD顯示屏,將二者進行比較,LED結(jié)構(gòu)簡單,它實際上是由七個發(fā)光二極管組成8字形構(gòu)成的,但實際顯示字符種類不多,LCD功能強大,現(xiàn)金的趨勢,并且LCD在本系統(tǒng)中就足以發(fā)揮作用,加上成本低廉,所以在本次設(shè)計中選用LCD顯示數(shù)據(jù)。3、主要電路分析主機和傳感器之間可通過三個步驟完成數(shù)據(jù)讀取步驟一:AM2301上電后(AM2301上電后要等待2S以越過不穩(wěn)定狀態(tài),在此期間讀取設(shè)備不能發(fā)送任何指令),測試環(huán)境溫濕度數(shù)據(jù),并記錄數(shù)據(jù),此后傳感器自動轉(zhuǎn)入休眠狀態(tài)。AM2301的SDA數(shù)據(jù)線由上拉電阻拉高一直保持高電平,此時AM2301的SDA引腳處于輸入狀態(tài),時刻檢測外部信號。步驟二:微處理器的I/O設(shè)置為輸出,同時輸出低電平,且低電平保持時間不能小于800us,典型值是拉低1MS,然后微處理器的I/O設(shè)置為輸入狀態(tài),釋放總線,由于上拉電阻,微處理器的I/O即AM2301的SDA數(shù)據(jù)線也隨之變高,等主機釋放總線后,AM2301發(fā)送響應(yīng)信號,即輸出80微秒的低電平作為應(yīng)答信號,緊接著輸出80微秒的高電平通知外設(shè)準備接收數(shù)據(jù)。步驟三:AM2301發(fā)送完響應(yīng)后,隨后由數(shù)據(jù)總線SDA連續(xù)串行輸出40位數(shù)據(jù),微處理器根據(jù)I/O電平的變化接收40位數(shù)據(jù)。位數(shù)據(jù)“0”的格式為:50微秒的低電平加26-28微秒的高電平;位數(shù)據(jù)“1”的格式為:50微秒的低電平加70微秒的高電平。電磁閥控制電路電磁閥控制電路主要由NPN共集-共射復(fù)合管及繼電器組成,當單片機P0.7給出高電平,復(fù)合管導(dǎo)通,繼電器接通,將開關(guān)吸合,電磁閥接通開始放水。報警電路設(shè)計報警電路設(shè)計作為一個獨立的模塊,采用市面上比較普遍的蜂鳴器電路,結(jié)構(gòu)比較簡單,使用AT89S52上的一根口線驅(qū)動蜂鳴器發(fā)聲。硬件電路整體比較簡單,電路圖這里不多贅訴二、系統(tǒng)軟件構(gòu)成1、整體結(jié)構(gòu)圖首先經(jīng)行初始化,然后按一定頻率采樣輸入,程序執(zhí)行,刷新輸出都比較簡單,重點注意溫濕度傳感器初始化、讀寫數(shù)據(jù)的時序問題,運行時中斷的處理,PWM的控制2、主要模塊分析顯示模塊:初始化LCD1602顯示模塊,設(shè)置8位格式,2行,5*7矩陣顯示,整體顯示,關(guān)光標,不閃爍設(shè)定輸入方式,增量不移位,清除屏幕顯示,延時等待,將采集到的溫濕度數(shù)據(jù)進行轉(zhuǎn)換,十六進制轉(zhuǎn)換成十進制,然后,判斷是否在第一行顯示,輸入相應(yīng)的地址數(shù)據(jù),延時等待,輸入需要顯示的數(shù)據(jù)PWM程序設(shè)計:進行中斷程序初始化,設(shè)置定時器T0中斷時間為1ms,中斷100次,即100ms作為一個脈沖周期,每中斷一次,由變量T0_number進行計數(shù),當變量T0_number大于100時,給變量T0_numbe賦值0,重新開始計數(shù),當變量T0_number小于變量PWM_width_H時,輸出高電平,當變量T0_number大于變量PWM_width_H時,輸出低電平,以此控制脈寬電路連接四、項目計劃使用器件列表器件型號數(shù)量用途AT89S521核心元件晶振12M/11.0592M1晶振電路核心元件排阻10K—81按鍵5獨立按鍵核心元件二極管IN41481下載口ISP-PORT1跳線1電源插座1帶鎖開關(guān)3蜂鳴器1報警電路核心元件三極管90141DS18B201探測溫度元件LCD1顯示電路電機1散熱電路電容若干電阻排阻若干排針若干排孔若干插座DIP—401插座DIP—201插座DIP—161杜邦線若干導(dǎo)線連接附件:程序#include<reg51.h>//包含單片機寄存器的頭文件#include<stdlib.h>//包含隨機函數(shù)rand()的定義文件#include<intrins.h>//包含_nop_()函數(shù)定義的頭文件unsignedcharcodedigit[10]={"0123456789"};//定義字符數(shù)組顯示數(shù)字unsignedcharcodemode[]={"mode"};unsignedcharcodeon[]={"on"};unsignedcharcodeoff[]={"off"};unsignedcharcodetimee[]={"time:"};unsignedcharcodetempp[]={"temp:"};unsignedcharcodekey[]={"key:"};unsignedcharcount,count1=0;//定義變量統(tǒng)計中斷累計次數(shù)unsignedcharn0=0,n=0,n1=1,n2=0,n3=0,n4=0,n5=0;//定義按鍵功能unsignedchars,m,h,time_h=12,time_m,time1_h=12,time1_m;//定義變量儲存秒、分鐘和小時unsignedchartemp_h=23,temp_l=20;//定義溫度設(shè)定值unsignedcharTL;//儲存暫存器的溫度低位unsignedcharTH;//儲存暫存器的溫度高位unsignedcharTN;//儲存溫度的整數(shù)部分/*******************************************************************************以下是對液晶模塊的操作程序*******************************************************************************/sbitRS=P2^0;//寄存器選擇位,將RS位定義為P2.0引腳sbitRW=P2^1;//讀寫選擇位,將RW位定義為P2.1引腳sbitE=P2^2;//使能信號位,將E位定義為P2.2引腳sbitBF=P0^7;//忙碌標志位,,將BF位定義為P0.7引腳sbitS1=P1^4;//將S1位定義為P1.4sbitS2=P1^5;//將S2位定義為P1.5sbitS3=P1^6;//將S3位定義為P1.6sbitS4=P1^7;//將S4位定義為P1.7sbithigh=P1^0;sbitdown=P1^1;/*****************************************************函數(shù)功能:延時1ms(3j+2)*i=(3×33+2)×10=1010(微秒),可以認為是1毫秒***************************************************/voiddelay1ms(){unsignedchari,j; for(i=0;i<10;i++) for(j=0;j<33;j++) ; }/*****************************************************函數(shù)功能:延時若干毫秒入口參數(shù):n***************************************************/voiddelaynms(unsignedcharn){unsignedchari; for(i=0;i<n;i++) delay1ms();}/*****************************************************函數(shù)功能:判斷液晶模塊的忙碌狀態(tài)返回值:result。result=1,忙碌;result=0,不忙***************************************************/bitBusyTest(void){bitresult; RS=0;//根據(jù)規(guī)定,RS為低電平,RW為高電平時,可以讀狀態(tài)RW=1;E=1;//E=1,才允許讀寫_nop_();//空操作_nop_();_nop_();_nop_();//空操作四個機器周期,給硬件反應(yīng)時間 result=BF;//將忙碌標志電平賦給resultE=0;//將E恢復(fù)低電平returnresult;}/*****************************************************函數(shù)功能:將模式設(shè)置指令或顯示地址寫入液晶模塊入口參數(shù):dictate***************************************************/voidWriteInstruction(unsignedchardictate){while(BusyTest()==1);//如果忙就等待 RS=0;//根據(jù)規(guī)定,RS和R/W同時為低電平時,可以寫入指令 RW=0; E=0;//E置低電平(根據(jù)表8-6,寫指令時,E為高脈沖,//就是讓E從0到1發(fā)生正跳變,所以應(yīng)先置"0" _nop_(); _nop_();//空操作兩個機器周期,給硬件反應(yīng)時間 P0=dictate;//將數(shù)據(jù)送入P0口,即寫入指令或地址 _nop_(); _nop_(); _nop_(); _nop_();//空操作四個機器周期,給硬件反應(yīng)時間 E=1;//E置高電平 _nop_(); _nop_(); _nop_(); _nop_();//空操作四個機器周期,給硬件反應(yīng)時間 E=0;//當E由高電平跳變成低電平時,液晶模塊開始執(zhí)行命令}/*****************************************************函數(shù)功能:指定字符顯示的實際地址入口參數(shù):x***************************************************/voidWriteAddress(unsignedcharx){WriteInstruction(x|0x80);//顯示位置的確定方法規(guī)定為"80H+地址碼x"}/*****************************************************函數(shù)功能:將數(shù)據(jù)(字符的標準ASCII碼)寫入液晶模塊入口參數(shù):y(為字符常量)***************************************************/voidWriteData(unsignedchary){while(BusyTest()==1); RS=1;//RS為高電平,RW為低電平時,可以寫入數(shù)據(jù) RW=0; E=0;//E置低電平(根據(jù)表8-6,寫指令時,E為高脈沖,//就是讓E從0到1發(fā)生正跳變,所以應(yīng)先置"0" P0=y;//將數(shù)據(jù)送入P0口,即將數(shù)據(jù)寫入液晶模塊 _nop_(); _nop_(); _nop_();_nop_();//空操作四個機器周期,給硬件反應(yīng)時間 E=1;//E置高電平 _nop_(); _nop_(); _nop_(); _nop_();//空操作四個機器周期,給硬件反應(yīng)時間 E=0;//當E由高電平跳變成低電平時,液晶模塊開始執(zhí)行命令}/*****************************************************函數(shù)功能:對LCD的顯示模式進行初始化設(shè)置***************************************************/voidLcdInitiate(void){delaynms(15);//延時15ms,首次寫指令時應(yīng)給LCD一段較長的反應(yīng)時間WriteInstruction(0x38);//顯示模式設(shè)置:16×2顯示,5×7點陣,8位數(shù)據(jù)接口 delaynms(5);//延時5ms,給硬件一點反應(yīng)時間WriteInstruction(0x38); delaynms(5);//延時5ms,給硬件一點反應(yīng)時間 WriteInstruction(0x38);//連續(xù)三次,確保初始化成功 delaynms(5);//延時5ms,給硬件一點反應(yīng)時間 WriteInstruction(0x0c);//顯示模式設(shè)置:顯示開,無光標,光標不閃爍 delaynms(5);//延時5ms,給硬件一點反應(yīng)時間 WriteInstruction(0x06);//顯示模式設(shè)置:光標右移,字符不移 delaynms(5);//延時5ms,給硬件一點反應(yīng)時間 WriteInstruction(0x01);//清屏幕指令,將以前的顯示內(nèi)容清除 delaynms(5);//延時5ms,給硬件一點反應(yīng)時間}/******************************************************************************函數(shù)功能:顯示小時******************************************************************************/voidDisplayHour(){unsignedchari,j; i=h/10;//取整運算,求得十位數(shù)字 j=h%10;//取余運算,求得各位數(shù)字WriteAddress(0x0b);//寫顯示地址,將十位數(shù)字顯示在第2行第5列 WriteData(digit[i]);//將十位數(shù)字的字符常量寫入LCD WriteData(digit[j]);//將個位數(shù)字的字符常量寫入LCD}/******************************************************************************函數(shù)功能:顯示分鐘******************************************************************************/voidDisplayMinute(){unsignedchari,j;i=m/10;//取整運算,求得十位數(shù)字j=m%10;//取余運算,求得各位數(shù)字WriteAddress(0x0e);//寫顯示地址,將十位數(shù)字顯示在第2行第8列 WriteData(digit[i]);//將十位數(shù)字的字符常量寫入LCD WriteData(digit[j]);//將個位數(shù)字的字符常量寫入LCD}/*****************************************************函數(shù)功能:顯示設(shè)定時間時值入口參數(shù):x***************************************************/voiddisplay_time_h(unsignedcharx){unsignedcharj,l;//j,k,l分別儲存溫度的百位、十位和個位 j=x/10;//取十位 l=x%10;//取個位 WriteAddress(0x4b);//寫顯示地址,將在第2行第7列開始顯示 WriteData(digit[j]);//將百位數(shù)字的字符常量寫入LCD WriteData(digit[l]);//將個位數(shù)字的字符常量寫入LCD delaynms(50);//延時1ms給硬件一點反應(yīng)時間}voiddisplay_time1_h(unsignedcharx){unsignedcharj,l;//j,k,l分別儲存溫度的百位、十位和個位 j=x/10;//取十位 l=x%10;//取個位 WriteAddress(0x45);//寫顯示地址,將在第2行第7列開始顯示 WriteData(digit[j]);//將百位數(shù)字的字符常量寫入LCD WriteData(digit[l]);//將個位數(shù)字的字符常量寫入LCD delaynms(50);//延時1ms給硬件一點反應(yīng)時間}/*****************************************************函數(shù)功能:顯示設(shè)定時間時值入口參數(shù):x***************************************************/voiddisplay_time_m(unsignedcharx){unsignedcharj,l;//j,k,l分別儲存溫度的百位、十位和個位 j=x/10;//取十位 l=x%10;//取個位 WriteAddress(0x4e);//寫顯示地址,將在第2行第7列開始顯示 WriteData(digit[j]);//將百位數(shù)字的字符常量寫入LCD WriteData(digit[l]);//將個位數(shù)字的字符常量寫入LCD delaynms(50);//延時1ms給硬件一點反應(yīng)時間}voiddisplay_time1_m(unsignedcharx){unsignedcharj,l;//j,k,l分別儲存溫度的百位、十位和個位 j=x/10;//取十位 l=x%10;//取個位 WriteAddress(0x48);//寫顯示地址,將在第2行第7列開始顯示 WriteData(digit[j]);//將百位數(shù)字的字符常量寫入LCD WriteData(digit[l]);//將個位數(shù)字的字符常量寫入LCD delaynms(50);//延時1ms給硬件一點反應(yīng)時間}/*****************************************************函數(shù)功能:顯示時間:的小數(shù)點***************************************************/void display_colon(void){ WriteAddress(0x4d); //寫顯示地址,將在第2行第10列開始顯示 WriteData(':');//將小數(shù)點的字符常量寫入LCD delaynms(50);//延時1ms給硬件一點反應(yīng)時間 WriteAddress(0x47); //寫顯示地址,將在第2行第10列開始顯示 WriteData(':');//將小數(shù)點的字符常量寫入LCD delaynms(50); //延時1ms給硬件一點反應(yīng)時間 WriteAddress(0x0d); //寫顯示地址,將在第2行第10列開始顯示 WriteData(':');//將小數(shù)點的字符常量寫入LCD delaynms(50); //延時1ms給硬件一點反應(yīng)時間 }void display1_colon(void){WriteAddress(0x0d); //寫顯示地址,將在第2行第10列開始顯示 WriteData(':');//將小數(shù)點的字符常量寫入LCD delaynms(50); //延時1ms給硬件一點反應(yīng)時間}void display_gang1(void) { WriteAddress(0x4a); //寫顯示地址,將在第2行第10列開始顯示 WriteData('-');//將小數(shù)點的字符常量寫入LCD delaynms(50);//延時1ms給硬件一點反應(yīng)時間 }void display_sanre(void) { WriteAddress(0x4b); //寫顯示地址,將在第2行第10列開始顯示 WriteData('-');//將小數(shù)點的字符常量寫入LCD delaynms(50);//延時1ms給硬件一點反應(yīng)時間 }void display_jiare(void) { WriteAddress(0x46); //寫顯示地址,將在第2行第10列開始顯示 WriteData('+');//將小數(shù)點的字符常量寫入LCD delaynms(50);//延時1ms給硬件一點反應(yīng)時間 }void display1_sanre(void) { WriteAddress(0x09); //寫顯示地址,將在第2行第10列開始顯示 WriteData('-');//將小數(shù)點的字符常量寫入LCD delaynms(50);//延時1ms給硬件一點反應(yīng)時間 }void display1_jiare(void) { WriteAddress(0x09); //寫顯示地址,將在第2行第10列開始顯示 WriteData('+');//將小數(shù)點的字符常量寫入LCD delaynms(50);//延時1ms給硬件一點反應(yīng)時間 }voiddispiay_timee(void){unsignedchari; WriteAddress(0x40);//寫顯示地址,將在第2行第13列開始顯示 i=0;//從第一個字符開始顯示 while(timee[i]!='\0')//只要沒有寫到結(jié)束標志,就繼續(xù)寫 { WriteData(timee[i]);//將字符常量寫入LCD i++;//指向下一個字符 delaynms(50);//延時1ms給硬件一點反應(yīng)時間 } }voiddispiay_key(void){unsignedchari; WriteAddress(0x40);//寫顯示地址,將在第2行第13列開始顯示 i=0;//從第一個字符開始顯示 while(key[i]!='\0')//只要沒有寫到結(jié)束標志,就繼續(xù)寫 { WriteData(key[i]);//將字符常量寫入LCD i++;//指向下一個字符 delaynms(50);//延時1ms給硬件一點反應(yīng)時間 } }voiddisplay_n1(void) { WriteAddress(0x04); //寫顯示地址,將在第2行第10列開始顯示 WriteData(digit[n1]);//將小數(shù)點的字符常量寫入LCD delaynms(50);//延時1ms給硬件一點反應(yīng)時間}voiddispiay_mode(void){unsignedchari; WriteAddress(0x00);//寫顯示地址,將在第2行第13列開始顯示 i=0;//從第一個字符開始顯示 while(mode[i]!='\0')//只要沒有寫到結(jié)束標志,就繼續(xù)寫 { WriteData(mode[i]);//將字符常量寫入LCD i++;//指向下一個字符 delaynms(50);//延時1ms給硬件一點反應(yīng)時間 } }voiddispiay_on1(void){unsignedchari; WriteAddress(0x47);//寫顯示地址,將在第2行第13列開始顯示 i=0;//從第一個字符開始顯示 while(on[i]!='\0')//只要沒有寫到結(jié)束標志,就繼續(xù)寫 { WriteData(on[i]);//將字符常量寫入LCD i++;//指向下一個字符 delaynms(50);//延時1ms給硬件一點反應(yīng)時間 } }voiddispiay_on(void){unsignedchari; WriteAddress(0x4c);//寫顯示地址,將在第2行第13列開始顯示 i=0;//從第一個字符開始顯示 while(on[i]!='\0')//只要沒有寫到結(jié)束標志,就繼續(xù)寫 { WriteData(on[i]);//將字符常量寫入LCD i++;//指向下一個字符 delaynms(50);//延時1ms給硬件一點反應(yīng)時間 } }voiddispiay_off1(void){unsignedchari; WriteAddress(0x47);//寫顯示地址,將在第2行第13列開始顯示 i=0;//從第一個字符開始顯示 while(off[i]!='\0')//只要沒有寫到結(jié)束標志,就繼續(xù)寫 { WriteData(off[i]);//將字符常量寫入LCD i++;//指向下一個字符 delaynms(50);//延時1ms給硬件一點反應(yīng)時間 } }voiddispiay_off(void){unsignedchari; WriteAddress(0x4c);//寫顯示地址,將在第2行第13列開始顯示 i=0;//從第一個字符開始顯示 while(off[i]!='\0')//只要沒有寫到結(jié)束標志,就繼續(xù)寫 { WriteData(off[i]);//將字符常量寫入LCD i++;//指向下一個字符 delaynms(50);//延時1ms給硬件一點反應(yīng)時間 } }/************************************************************************以下是DS18B20的操作程序************************************************************************/sbitDQ=P3^7;unsignedchartime;//設(shè)置全局變量,專門用于嚴格延時/*****************************************************函數(shù)功能:將DS18B20傳感器初始化,讀取應(yīng)答信號出口參數(shù):flag***************************************************/bitInit_DS18B20(void) {bitflag;//儲存DS18B20是否存在的標志,flag=0,表示存在;flag=1,表示不存在DQ=1;//先將數(shù)據(jù)線拉高for(time=0;time<2;time++)//略微延時約6微秒;DQ=0;//再將數(shù)據(jù)線從高拉低,要求保持480~960usfor(time=0;time<200;time++)//略微延時約600微秒;//以向DS18B20發(fā)出一持續(xù)480~960us的低電平復(fù)位脈沖DQ=1;//釋放數(shù)據(jù)線(將數(shù)據(jù)線拉高)for(time=0;time<10;time++);//延時約30us(釋放總線后需等待15~60us讓DS18B20輸出存在脈沖)flag=DQ;//讓單片機檢測是否輸出了存在脈沖(DQ=0表示存在)for(time=0;time<200;time++)//延時足夠長時間,等待存在脈沖輸出完畢;return(flag);//返回檢測成功標志}/*****************************************************函數(shù)功能:從DS18B20讀取一個字節(jié)數(shù)據(jù)出口參數(shù):dat***************************************************/unsignedcharReadOneChar(void){ unsignedchari=0; unsignedchardat;//儲存讀出的一個字節(jié)數(shù)據(jù) for(i=0;i<8;i++) { DQ=1;//先將數(shù)據(jù)線拉高 _nop_(); //等待一個機器周期 DQ=0;//單片機從DS18B20讀書據(jù)時,將數(shù)據(jù)線從高拉低即啟動讀時序 dat>>=1; _nop_();//等待一個機器周期 DQ=1;//將數(shù)據(jù)線"人為"拉高,為單片機檢測DS18B20的輸出電平作準備 for(time=0;time<2;time++);//延時約6us,使主機在15us內(nèi)采樣 if(DQ==1) dat|=0x80;//如果讀到的數(shù)據(jù)是1,則將1存入dat else dat|=0x00;//如果讀到的數(shù)據(jù)是0,則將0存入dat //將單片機檢測到的電平信號DQ存入r[i] for(time=0;time<8;time++) ;//延時3us,兩個讀時序之間必須有大于1us的恢復(fù)期 } return(dat);//返回讀出的十進制數(shù)據(jù)}/*****************************************************函數(shù)功能:向DS18B20寫入一個字節(jié)數(shù)據(jù)入口參數(shù):dat***************************************************/WriteOneChar(unsignedchardat){ unsignedchari=0; for(i=0;i<8;i++) { DQ=1;//先將數(shù)據(jù)線拉高 _nop_(); //等待一個機器周期 DQ=0;//將數(shù)據(jù)線從高拉低時即啟動寫時序 DQ=dat&0x01;//利用與運算取出要寫的某位二進制數(shù)據(jù),//并將其送到數(shù)據(jù)線上等待DS18B20采樣 for(time=0;time<10;time++) ;//延時約30us,DS18B20在拉低后的約15~60us期間從數(shù)據(jù)線上采樣 DQ=1;//釋放數(shù)據(jù)線 for(time=0;time<1;time++);//延時3us,兩個寫時序間至少需要1us的恢復(fù)期 dat>>=1;//將dat中的各二進制位數(shù)據(jù)右移1位 } for(time=0;time<4;time++);//稍作延時,給硬件一點反應(yīng)時間} /******************************************************************************以下是與溫度有關(guān)的顯示設(shè)置******************************************************************************//*****************************************************函數(shù)功能:顯示溫度的整數(shù)部分入口參數(shù):x***************************************************/voiddisplay_temp1(unsignedcharx){unsignedchark,l;//k,l分別儲存溫度的百位、十位和個位 k=(x%100)/10;//取十位 l=x%10;//取個位 WriteAddress(0x06);//寫顯示地址,將在第2行第7列開始顯示 WriteData(digit[k]);//將十位數(shù)字的字符常量寫入LCD WriteData(digit[l]);//將個位數(shù)字的字符常量寫入LCD delaynms(50);//延時1ms給硬件一點反應(yīng)時間}/*****************************************************函數(shù)功能:顯示溫度最高值入口參數(shù):x***************************************************/voiddisplay_temp_h(unsignedcharx){unsignedchark,l;//k,l分別儲存溫度的百位、十位和個位 k=(x%100)/10;//取十位 l=x%10;//取個位 WriteAddress(0x4e);//寫顯示地址,將在第2行第7列開始顯示 WriteData(digit[k]);//將十位數(shù)字的字符常量寫入LCD WriteData(digit[l]);//將個位數(shù)字的字符常量寫入LCD delaynms(50);//延時1ms給硬件一點反應(yīng)時間}/*****************************************************函數(shù)功能:顯示溫度的最低值入口參數(shù):x***************************************************/voiddisplay_temp_l(unsignedcharx){unsignedchark,l;//j,k,l分別儲存溫度的百位、十位和個位 k=(x%100)/10;//取十位 l=x%10;//取個位 WriteAddress(0x4b);//寫顯示地址,將在第2行第7列開始顯示 WriteData(digit[k]);//將十位數(shù)字的字符常量寫入LCD WriteData(digit[l]);//將個位數(shù)字的字符常量寫入LCD delaynms(50);//延時1ms給硬件一點反應(yīng)時間}voiddispiay_tempp(void){unsignedchari; WriteAddress(0x40);//寫顯示地址,將在第2行第13列開始顯示 i=0;//從第一個字符開始顯示 while(tempp[i]!='\0')//只要沒有寫到結(jié)束標志,就繼續(xù)寫 { WriteData(tempp[i]);//將字符常量寫入LCD i++;//指向下一個字符 delaynms(50);//延時1ms給硬件一點反應(yīng)時間 } }void display_gang(void) { WriteAddress(0x4d); //寫顯示地址,將在第2行第10列開始顯示 WriteData('-');//將小數(shù)點的字符常量寫入LCD delaynms(50);//延時1ms給硬件一點反應(yīng)時間 }/*****************************************************函數(shù)功能:做好讀溫度的準備***************************************************/voidReadyReadTemp(void){Init_DS18B20();//將DS18B20初始化 WriteOneChar(0xCC);//跳過讀序號列號的操作 WriteOneChar(0x44);//啟動溫度轉(zhuǎn)換 for(time=0;time<100;time++); //溫度轉(zhuǎn)換需要一點時間 Init_DS18B20();//將DS18B20初始化 WriteOneChar(0xCC);//跳過讀序號列號的操作 WriteOneChar(0xBE);//讀取溫度寄存器,前兩個分別是溫度的低位和高位 }/******************************************************************函數(shù)功能:鍵盤掃描********************************************************************/voidkey_scan(void){ if(S4) { n1++; WriteInstruction(0x01);//清屏幕指令,將以前的顯示內(nèi)容清除 delaynms(5);//延時5ms,給硬件一點反應(yīng)時間 high=0; down=0; if(n1==4) n1=1; } if(n1==1) { if(S3) { n++; if(n==2) n=0; } if(n==0) { if(S1)//如果是S2鍵按下 temp_h++;//分鐘加1 if(S2&&temp_h>temp_l)//如果是S3鍵按下 temp_h--;//小時加 } if(n==1) { if(S1&&temp_l<temp_h)//如果是S2鍵按下 temp_l++;//分鐘加1 if(S2)//如果是S3鍵按下 temp_l--;//小時加 } } if(n1==2) { if(S3) { n0++; if(n0==4) n0=0; } if(n0==0) { if(S1)//如果是S2鍵按下 {n4=1;n5=0; display1_jiare();} if(S2)//如果是S3鍵按下 {n4=0;n5=1; display1_sanre(); } } if(n0==1) { if(S1)//如果是S2鍵按下 m++;//分鐘加1 if(S2)//如果是S3鍵按下 h++;//小時加1 } if(n0==2) { if(S1)//如果是S2鍵按下 {time_h++;//分鐘加1 if(time_h==24) time_h=0;} if(S2)//如果是S3鍵按下 {time_m++;//小時加 if(time_m==60) time_m=0;} } if(n0==3) { if(S1)//如果是S2鍵按下 {time1_h++;//分鐘加1 if(time1_h==24) time1_h=0;} if(S2)//如果是S3鍵按下 {time1_m++;//小時加 if(time1_m==60) time1_m=0;} } }}/******************************************************************函數(shù)功能:控制********************************************************************/voidcontrol(void){ if(n1==1) { if(TN>temp_h) {high=1;down=0;} if(TN<temp_l) {high=0;down=1;} if(TN<=temp_h&&TN>=temp_l) {high=0;down=0;} } if(n1==2) { if(n4==1&&n5==0) { if((h>=time1_h&&h<time_h&&m>=time1_m)||(h>=time1_h&&m>=time1_m&&h<=time_h&&m<=time_m)) {down=0; high=1;} else {high=0;} } if(n4==0&&n5==1) {if((h>=time1_h&&h<time_h&&m>=time1_m)||(h>=time1_h&&m>=time1_m&&h<=time_h&&m<=time_m)) {down=1;high=0;} else {down=0;} } } if(n1=

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論