溫室溫度遠程監測系統設計_第1頁
溫室溫度遠程監測系統設計_第2頁
溫室溫度遠程監測系統設計_第3頁
溫室溫度遠程監測系統設計_第4頁
溫室溫度遠程監測系統設計_第5頁
已閱讀5頁,還剩26頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

溫室溫度遠程監測系統設計【摘要】本系統是基于單片機STC12C2052AD配合溫度傳感器DS18B20和RS-232串行通信及RS-485遠程通信、將在溫室內溫度數據傳輸到上位機進行實時監控和出現異常報警的一套溫室溫度監測系統。下位機放置在溫室內,通過傳感器采集溫度,然后經由單片機的串行接口,由RS-485總線負責下位機與上位機的通信,利用MAX232實現下位機及MAX485的TTL電平和上位機RS-232C電平之間的轉換,實現下位機與上位機之間的異步串行通信。上位機采用VisualBasic串行通信編程,接收和分析經由下位機發上來的數據,設置報警溫度,以及其他參數,當實際參數超過設置參數時,上位機進行聲光報警來提示管理員,從而進行其他相應操作。系統采用簡單的雙絞線通信線纜、抗煩擾、布線簡單、傳輸距離遠。本系統的實用性和可靠性高、操作簡單、可廣泛用于個人或者企業的溫室進行溫度監測使用,且無后期維護費用。目錄第1章緒論隨著社會主義農村的建設和社會的進步,生產水平的提高,溫室也逐漸增多。溫室內的溫度是生產過程中最重要參數之一,傳統的監測方法是人工長期監守,利用干濕球玻璃溫度計現場采集數據的方式,勞動強度大,操作規程復雜,制約了溫室管理員的工作效率。現代電子技術的發展,已經滲入到人們生活的方方面面。利用智能監測系統對溫室內的溫度實行遠程監測,不但可以解決傳統溫度監測的弊端,而且大幅度的提高農業生產的科技含量和生產水平,更重要的是促進了新農村建設的發展和社會的進步。國外對溫室環境控制技術研究較早,始于20世紀70年代。先是采用模擬式的組合儀表,采集現場信息并進行指示、記錄和控制。80年代末出現了分布式控制系統。現在世界各國的溫室控制技術發展很快,一些國家在實現自動化的基礎上正向著完全自動化、無人化的方向發展。我國對于溫室控制技術的研究相對較晚,始于20世紀80年代。我國工程技術人員掌握了人工氣候室內微機控制技術。之后,我國的溫室控制技術得到了迅速發展。但由于我國農業現代化水平較低,農業勞動力大量過剩,溫室的一次性投資大,資金短缺以及對操作人員的素質要求比較高等因素,限制了溫室控制技術在溫室系統的擴展。從國內外溫室控制技術的發展狀況來看,溫室環境控制技術都是從手動控制轉向自動控制,監測技術也正逐步走向智能化。本系統設計是以單片機為核心,利用溫度傳感器對溫度進行采集,再經過單片機與計算機通信,將溫室內的溫度數據傳送給上位機軟件處理,對溫室內的溫度遠程監測。實現了對溫室內的溫度自動控制,使勞動生產率得到提到.第2章系統設計方案2.1系統總體設計溫室溫度監測系統的系統框圖如2-1所示。主要是由溫度傳感器和單片機構成的下位機、遠程通信、上位機三大部分組成。圖2-1系統框圖下位機由單片機進行控制,溫度由溫度傳感器進行溫度采集。單片機對信號進行處理,然后由LCD液晶進行下位機現場顯示。同時單片機與上位機進行實時遠程通信。上位機的控制處理程序,對接受到的數據進行處理,存儲,分析。同時進行動態顯示、查詢、備份。對超限數據進行聲光報警提示。2.2方案選擇整套主要是由溫度傳感器和單片機構成的下位機、遠程通信、上位機三大部分組成,方案的選擇將直接影響設計效率和最后整體效果。2.2.1溫度傳感器的選擇溫度傳感器AD590屬于模擬量輸出,需要使用AD芯片將模擬量轉換為數字量,另外如果多個傳感器就需要占用更多的轉換芯片以及單片機口線,外圍元件復雜。溫度傳感器DS18B20具有獨特的1-Wire總線技術,可以掛接多個傳感器[1]。數字量輸出,測量溫度范圍-55℃至+125℃,測量精度高,增值量為0.5攝氏度,在一秒內可以把溫度轉化成數字,測得的溫度值的存儲在兩個八位的RAM中,單片機直接從中讀出數據轉換成十進制就是溫度,基于DS18B20的優點,能夠滿足溫室內的溫度要求,加之對DS18B20的使用經驗最后決定使用DS18B20傳感器來采集溫度。2.2.2通信方式選擇遠程通信部分在本設計中非常重要,該部分的設計質量直接影響整體設計的質量、成本以及實際應用前景,因此確定一個好的遠程傳輸方案就顯得尤為重要。隨著通信技術、計算機技術和網絡技術的飛速發展,遠程監視系統越來越多的應用于生產和管理領域中。就遠程數據傳輸方式而言,目前有很多種,歸納起來分一下兩大類:(1)無線通信方式無線傳輸方式可分為衛星通訊、GSM數字網、GPRS數字網、CDMA數字網及數據通信電臺等傳輸方式。衛星通訊、GSM數字網、GPRS數字網和CDMA數字網絡雖然有很多優點比如:網絡覆蓋范圍廣,不受地域限制,信號較穩定,無同頻干擾,保密性好,可處理大量的短消息、數據和傳真傳送等業務功能;但是由于路由選擇復雜容易造成短信息等數據傳輸的系統延遲,而且其使用成本高,所以只適合在特殊場合下使用,如用衛星進行電視信號傳輸,GSM和CDMA廣泛用于手機業務,GPRS全球定位系統等等。數據傳輸電臺方式具有建網靈活方便,實時性高,費用較低等特點,特別適合偏遠地區沒有公用電話網的場合。但是需要申請無線電臺播放頻段才可使用,而且其有效工作距離和發射功率有關,如果距離太遠成本會很高。(2)有線通信方式有線通信方式可分為電力線載波傳輸、因特網傳輸、RS-485總線[2]遠程傳輸等。電力線載波方式由于抗干擾和傳遞距離等關鍵技術還沒有完全解決,在國內尚處于小區試驗階段;因此在我國還不太適合實際應用。因特網可利用通用網絡或電話線,需預先架設網絡及大型專用設備,投入資金很大。RS-485總線速度很快,最大10MB/S,傳送距離相對很遠(90KB/S下可傳1200米),以差分平衡方式傳輸信號,具有很強的抗共模干擾的能力,允許一對雙絞線上一個發送器驅動多個負載設備。因此工業現場控制系統中一般采用該總線標準進行數據傳輸。通信網絡各節點均帶有RS-485串行通信接口。在總線末端接一個匹配電阻,吸收總線上的反射信號,保證正常傳輸信號干凈、無毛刺。可靠性高,投入小,1對雙絞線即可勝任。鑒于投入和架設的難易程度,最終決定本次設計選用RS-485總線負責遠程通信串口通信。2.2.3程序使用語言的選擇本次設計包含2個部分,上位機和下位機,1.下位機編程可使用的編程語言有匯編語言和C語言,其中匯編語言是一種用文字助記符來表示機器指令的符號語言,是最接近機器碼的一種語言。其主要優點是占用資源少,程序執行效率高。但是不同的CPU,其匯編語言可能有點差異,所以不易移植;而且沒有很好的可讀性,以及良好的結構。用C語言編寫單片機程序比匯編語言更符合人們的思考習慣,開發者可以擺脫與硬件無必要的接觸,更專心的考慮功能和算法而不是考慮一些細節問題,這樣就減少了開發和調試的時間。C語言具有良好的程序結構,適用于模塊化程序設計,因此采用C語言設計單片機應用系統程序時,首先要盡可能地采用結構化的程序設計方法,將功能模塊化,由不同的模塊完成不同的功能,這樣可使整個應用系統程序結構清晰,易于調試和維護。不同的功能模塊,分別指定相應的入口參數和出口參數,對于一些要重復調用的程序一般把其編成函數,這樣可以減少程序代碼的長度,又便于整個程序的管理,還可增強可讀性和移植性。所以本次單片機應用程序設計選擇C語言進行編寫。2.上位機監測軟件編程可以使用的語言有VB和C,C++等其他高級語言,其中VB的圖形用戶界面(GUI)。不需編寫大量代碼去描述界面元素的外觀和位置,而只要把預先建立的對象add到屏幕上的一點即可。如果已使用過諸如Paint之類的繪圖程序,則實際上已掌握了創建用戶界面的必要技巧。VisualBasic在原有BASIC語言的基礎上進一步發展[3],至今包含了數百條語句、函數及關鍵詞,其中很多和WindowsGUI有直接關系。專業人員可以用VisualBasic實現其它任何Windows編程語言的功能,而初學者只要掌握幾個關鍵詞就可以建立實用的應用程序。VisualBasic不僅是VisualBasic編程語言[4]。VisualBasic編程系統,MicrosoftExcel的ApplicationsEdition,MicrosoftAccess和Windows的許多其他應用程序都使用這一語言。VisualBasicScriptingEdition(VBScript)是廣泛使用的腳本語言,它是VisualBasic語言的子集。這樣,在學習VisualBasic中得到的經驗可應用到所有這些領域中。C,C++語言,適合大型軟件系統編程,提供了對機器級概念的訪問(如字節、地址),而這些是其他編程語言試圖隱藏的內容,因為這樣很容易造成系統的不穩定甚至崩潰,同時它也是一種小型語言,提供了一套有限的特征集合,為了保持少量的特征,C語言在很大程度上依賴一個標準函數庫;C語言提供詳細的差錯功能,但是稍不小心可能導致編程出錯,難以修改。鑒于本系統設計中實際需要,VB更適合用來編程本監測軟件,所以在這次設計中使用VB進行上位機編程。

第3章系統硬件設計下位機部分包含電源模塊、單片機控制模塊、溫度采集模塊、遠程通信模塊和液晶顯示模塊。單片機負責采集傳感器產生的數據和對數據進行分析處理,得到可用的信息,然后將信息通過單片機串口發送至遠程通信模塊,最后傳送至上位機。其中控制部分采用STC12C2050AD單片機,傳感器采用DS18B20數字溫度傳感器,通信部分使用MAX485通信芯片進行遠距離有線數據傳輸,芯片電平與單片機兼容。同時備有MAX232芯片,該作用是直接進行電平轉換,與上位機進行測試和調整,以及程序的寫入。下位機整體結構簡單、體積小巧、維護方便。3.1電源模塊設計電源的設計是電子電路設計的重要環節,在某種意義上可以說電源電路的性能指標直接關系到設計成敗。電源電路的設計,因系統供電形式、系統對電源的要求等具體情況的不同其構成原理也有所不同。本設計的所有器件都是5V電源器件,所以外接電源直接用7805穩壓模塊就可以直接完成,大容量電容可以起到更好的濾波效果。另外,當市電停電時為了不給用戶造成因為停電期間的不能顯示溫度,進而造成經濟損失,所以在下位機增加了外接電源插孔。做到外接電源單獨模塊化,此外,也方便外接電源的維修和更換。外接電源電路原理圖如圖3-1所示[5],電路圖繪圖工具使用ProtelDXP[6]。其中Jpw為電源輸出插頭。圖3-1外接電源模3.2單片機控制模塊設計STC12C2052AD單片機是下位機的核心,同樣也是硬件系統的核心。編寫的下位機程序就是燒寫入到該芯片中,它對整個下位機進行控制,包括讀取和分析傳感器的發送的數據、控制液晶屏顯示的內容、并且將數據通過串口輸出。STC公司的STC12C2052AD單片機具有單時鐘/機器周期(1T)、高速、低功耗、超強抗干擾等特點:1.工作溫度范圍從-40℃至+85℃,2.指令代碼完全兼容傳統8051[9],但速度快8-12倍;3.內部集成MAX810專用復位電路;4.具有串口,經過芯片進行轉換后與計算機的RS232串口進行通信;5.針對電機控制,強干擾場合。引腳圖如圖3-12。圖3-12STC12C2052AD管腳圖STC12C2052AD內部有256字節RAM,2K程序空間,集成度高,芯片本身就是1個最小系統。在能滿足系統的性能要求的情況下,可優先考慮采用此種方案。用這種芯片構成的最小系統簡單、可靠。用STC12C2052AD單片機構成最小應用系統時,只要將單片機接上時鐘電路和復位電路。最小系統是整體設計的核心部分。本系統使用RC復位電路。其中單片機的1腳是復位腳,使用阻容組合電路來實現看門狗功能。STC12C2052AD內部RC振蕩器5.2MHz~6.8MHz,可接高精度外部晶體或時鐘(具體應用由ISP軟件設置),本系統使用個外部晶體,晶體頻率為11.0592MHz,外接晶體管腳為芯片4、5腳。在晶體的選擇上要準確。晶體的性能直接影響單片機能否正常工作。C1、C22個33pF的電容是幫助諧振的。兩個電容與晶體共同構成諧振電路。若不接,大部份情況下也可以用。但是有可能振不起來。該最小應用系統可以進行PWM輸出,AD輸入等一些功能。STC12C2052AD使用5V工作電壓。STC12C2052AD最小系統如圖3-3所示。圖3-3STC12C2052AD單片機最小系統圖3.3溫度采集電路模塊溫度采集電路使用的溫度傳感器是由DALLAS公司生產的DS18B20。數字量輸出可以使該芯片直接接入單片機的口線上,分辨率為9~12位(可設置),工作電壓范圍為3.0V至5.5V。其獨特的1-Wire總線型數字量輸出的使得可以在一條總線上掛接多個傳感器,而且相互不影響溫。封裝類型為TO-92,芯片如圖3-15。這使得溫度傳感器放置在許多不同的地方。它的用途很多,包括空調環境控制,感測建筑物內溫設備或機器,并進行過程監測和控制,簡化了分布式溫度傳感應用;應用范圍包括恒溫控制,工業系統,消費電子產品溫度計,或任何熱敏感系統。圖3-15DS18B20引腳說明圖1.GND:電源地;2.DQ:數據輸入,數據輸出;3.VDD:電源。該芯片在本系統中的作用是將溫度轉換位數字量。在本系統中,該芯片2腳數據輸出由一只4.7K上拉電阻(R2)與3腳電源相連。1腳連接系統電源地;3腳連接系統電源;2腳與單片機6腳相連。傳感器與單片機硬件連接已經完成。如圖3-4。圖3-4DS18B20硬件連接圖3.4遠程通信電路模塊3.4.1調試端口電路設計數據通信方式有兩種,即并行數據通信和串行數據通信。并行數據通信中,數據的各位同時傳送,其優點是傳遞速度快;缺點是數據有多少位,就需要多少根數據線;串行通信中,數據字節一位一位串行地順序傳送,通過串行接口實現。它的優點是只需一對數據線(利用電話線就可作為數據線),這樣就大大降低了傳送成本,特別適用于遠距離通信;其缺點是傳送速度較低。在應用時,可根據數據通信的距離決定采用哪種通信方式,例如,單片機機與外部設備(如打印機等)通信時,如果距離小于30m可采用并行數據通信方式;當距離大于30m時,則要采用串行數據通信方式。單片機具有并行(如圖3-17)和串行(如圖3-18)二種基本數據通信方式。基于本設計實際應用環境這里選擇使用串行通信方式。圖3-17并行通信圖圖3-18串行方式圖1.按照串行數據的時鐘控制方式,串行通信分為異步通信和同步通信兩類。在異步通信中,數據是以字符為單位組成字符幀傳送的。發送端和接收端由各自獨立的時鐘來控制數據的發送和接收,這兩個時鐘彼此獨立,互不同步。2.在串行通信中按照數據傳送方向,串行通信可分為單工、半雙工和全雙工三種制式。單工通信定義為在任何一個時刻,信號只能從甲方向乙方單向傳輸,甲方只能發信,乙方只能收信。半雙工通信定義為在任何一個時刻,信號只能單向傳輸,或從甲方向乙方,或從乙方向甲方,每一方都不能同時收、發信息。雙工通信定義為在任何一個時刻,信號能夠雙向傳輸,每一方都能同時進行收信和發信工作。3.在進行串行通信接口設計時,必須根據需要確定選擇標準接口、傳輸介質及電平轉換等問題。RS-232C是使用得最早、最多的一種異步串行通信總線標準。它由美國電子工業協會(ElectronicIndustriesAssociation)于1962年公布,1969年最后一次修訂而成。其中RS是RecommendedStandard的縮寫,232是該標準的標識,C表示此標準已修改了三次。RS-232C主要用來定義計算機系統的一些數據終端設備(DTE)和數據通信設備(DCE)之間接口的電氣特性,目前已廣泛用于計算機與終端或外設之間的近端連接,適合于短距離或帶調制解調器的通信場合。由于RS-232C標準早于TTL電路的產生,與TTL、MOS邏輯電平規定不同。該標準采用負邏輯:低電平表示邏輯1,電平值為-3V~-l5V;高電平表示邏輯0,電平值為+3V一+l5V。因此,RS-232C不能直接與TTL電路連接,使用時必須加上適當的電平轉換電路,否則將使TTL電路燒毀。常用的電平轉換芯片有MC1488、MC1489、MAX232,其中MAX232采用單5V電源供電,使用非常方便。MAX232系列芯片由MAXIM公司生產,工作溫度范圍為0℃至70℃,內含兩路接收器和驅動器。片內含有一個電容性電壓發生器以便在5V電源供電時提供EIARS-232C電平。每個接收器將EIARS-232C電平輸入轉換為5V的采用該芯片硬件接口簡單、價格適中,所以被廣泛使用。圖3-19為該芯片引腳圖。圖3-19MAX232引腳說明圖C1+,C1-:倍壓器電容接入端,接0.1μF電容;C2+,C2-:電壓反相器電容接入端,接0.1μF電容;V+:升壓電容接入端,對+5V接0.1μF電容;V-:極性變換電容接入端,對地接0.1μF電容;T1in、T2in:T1out、T2out:EIARS-232-C電平輸出端,接串口端口;R1in、R2in:EIARS-232-C電平輸入端,接串口端口;R1out、R2out:TTL/CMOS電平輸出端,接單片機輸出端口。該系統在實際應用中,一些特殊情況需要直接與下位機進行通訊,這樣,在下位機引入MAX232電平轉換芯片,外圍元件簡單,12腳與單片機3腳相連;11腳與單片機4腳相連,進行串行數據的傳輸和轉換。硬件連接如圖3-20所示。圖3-20MAX232與單片機硬件連接圖3.4.2遠程通信電路設計在以單片機為基礎的數據采集和實時控制系統中,通過計算機中的RS-232接口進行計算機與單片機之間的命令和數據傳送,就可以利用計算機對生產現場進行監測和控制。由于計算機上的RS-232所傳送的距離不超過30m,所以,在遠距離的數據傳送和控制時,可以用MAX485協議轉換芯片將RS-232轉換成RS-485協議進行遠距離傳送。RS-485收發器采用平衡發送和差分接收,因此具有抑制共模干擾的能力,加上接收器具有高的靈敏度,能檢測低達200mV的電壓,故傳輸信號能在千米以外得到恢復。使用RS-485總線,一對雙絞線就能實現多站聯網,構成分布式系統,設備簡單、價格低廉、能進行長距離通信的優點使其得到了廣泛的應用。RS-485支持半雙工或全雙工模式。通常采用半雙工方式組網應用。圖3-8為典型半雙工RS-485通信網絡。各驅動器分時使用傳輸線(不發送數據的驅動器應被禁止)。總線網絡上可掛接32個節點。傳輸線通常采用雙絞線,可以較大程度抑制共模干擾。在傳輸線的末端接120的電阻進行阻抗匹配,消除由于不匹配在線路上產生的信號反射。在實際應用中,為減少誤碼率,通信距離越遠,通信數率應取低一些。RS-485規定:通信距離為120m時,最大通信速率為1Mbps;若通信距離為1.2km,則最大通信速率為100kbps。圖3-8RS-485通信網絡圖綜上所述,對于遠程有線高速通信,所以RS-485是最好選擇,其構成簡單,高速可靠的特性使得其已經得到了廣泛的應用。這里使用MAX485高速通信芯片來實現本系統的高速實時通信功能。在應用中僅為單向通信,只需要2個MAX485即可完成,一個芯片負責把單片機的數據送到總線上,另一片負責從總線接收數據送到上位機串口。(1)RS-485發送部分:發送部分與MAX485的6腳和7腳相連的接口P1為總線接口。R5為120的平衡電阻,3腳發射使能置高,無需進行控制,數據經單片機3腳異步串口輸出給MAX485芯片4腳。如圖3-9。圖3-9MAX458與單片機連接構成的發送電路圖(2)RS-485接收部分:由于MAX485與MAX232都是屬于有源芯片,工作電壓為5V,只有提給芯片提供電源芯片才能工作。另外接收部分連接至上位機,上位機串口使用的是RS-232C協議,電平是EIARS-232C電平。可以使用DTR和DSR的狀態進行串口去電,方法是是DTR或DSR其中1個或者2個輸出高電平,經過D1,D2進行隔離后連接到L78M05ABV這個+5V穩壓模塊輸入端,輸出即為MAX232與MAX485所需要的5V電源。圖3-10是由MAX485與MAX232連接,構成的RS-485總線的接收電路部分。RS-485通過MAX-485右側的接口P2連接RS-485總線,經過平衡電阻R6后連接至MAX485芯片6,7腳。其接收使能端2腳置為高電平,這樣使其可以接收RS-485總線上的信號。其輸出與MAX232芯片連接,目的是將TTL電平轉換為上位機串口所用的RS-232C電平。最后送至上位機串口。圖3-10RS-485接收電路圖3.5顯示電路模塊為了方便在溫室內得到溫度信息和防止因為市電停電上位機無法處理和得知溫室內現場的溫度,所以增加顯示電路。常用的顯示電路有很多,比如LED數碼管,液晶顯示模塊(LCD,LCM),點陣LED等等。其中LED數碼管和點陣硬件電路連接復雜,顯示效果死板,LED數碼管不能顯示漢字,點陣可以顯示漢字,但是程序復雜而且體積和功耗也很大。而帶有字庫的液晶顯示模塊不僅功耗低功耗設計可滿足產品的省電要求;可以顯示字符,漢字,還有自定義圖形,而且顯示信息量遠遠大于其他顯示電路,同時與單片機等微控器的接口界面靈活。簡化程序存儲空間。提高單片機利用率。這里使用帶有字庫的LCM128645ZK液晶顯示模塊來顯示溫度信息。LCM128645ZK的字型ROM內含8192個16*16點中文字型和128個16*8半寬的字母符號字型;另外繪圖顯示畫面提供一個64*256點的繪圖區域GDRAM;而且內含CGRAM提供4組軟件可編程的16*16點陣造字功能。電源操作范圍寬(2.7Vto5.5V),低功耗設計可滿足產品的省電要求;同時與單片機等微控器的接口界面靈活(三種模式:并行8位/4位,串行3線/2線)。中文液晶顯示模塊可實現漢字、ASCII碼、點陣圖形的同屏顯示,廣泛用于各種儀器儀表、家用電器和信息產品上作為顯示器件。中文液晶顯示模塊具有上/下/左/右移動當前顯示屏幕及清除屏幕的命令,具有光標顯示/閃爍控制命令及關閉顯示命令。預留多種控制線(復位/串并選擇/亮度調整)供用戶靈活使用。液晶LCM128645ZK管腳說明:1:Vss(地);2:VDD(邏輯電壓);3:VO(對比度調節);4:RS/CS(選擇寄存器,并行/片選,串行);5:RW/SID(讀寫控制,并行/輸入數據,串行);6:E/SCLK(讀寫數據起始,并行/輸入脈沖,串行);7~14:DB0~DB7(數據線0~7);15:PSB(控制界面);16:NC(未用);17:/RST(復位信號);18:VR(對比度調節);19:LED+(背光正極);20:LED-(背光負極)。本設計中采用并口數據傳輸接法,具體設置是將PSB腳接高電,由指令位(DLFLAG)來選擇8-BIT或者4-BIT接口,主控制系統將配合(RS,RW,E,DB0...DB7)來完成傳輸動作。相關參數及時序圖如下:此模塊硬件電路如圖3-11。電阻R3,R4是對比度調節電阻,排阻的目的是提高P1口的上拉電流。液晶顯示模塊使用并行數據傳輸,占用STC12C2052AD的P1.0~P1.7,P3.3~P3.5口線。3-11液晶顯示電路圖第4章系統軟件設計在本次設計中,STC12C2052AD單片機軟件所使用的編程語言Intel公司為單片機所開發的C,上位機控制軟件使用微軟Microsoft公司的VisualBasic。4.1下位機控制軟件用C編寫程序比匯編更符合人們的思考習慣,開發者可以擺脫與硬件無必要的接觸,更專心的考慮功能和算法而不是考慮一些細節問題,這樣就減少了開發和調試的時間。C語言具有良好的程序結構,適用于模塊化程序設計,因此采用C語言設計單片機應用系統程序時,首先要盡可能地采用結構化的程序設計方法,將功能模塊化,由不同的模塊完成不同的功能,這樣可使整個應用系統程序結構清晰,易于調試和維護。不同的功能模塊,分別指定相應的入口參數和出口參數,對于一些要重復調用的程序一般把其編成函數,這樣可以減少程序代碼的長度,又便于整個程序的管理,還可增強可讀性和移植性。4.1.1傳感器訪問和控制方法1.溫度轉換命令為44H,轉換后的數據存儲在16位寄存器中[11]。讀取存儲器命令為BEH,低位字節在前,高位字節在后,如表4-1。高位字節的“S”位可以確定數值的正負。表4-2為數據/溫度關系表。表4-1讀取順序232221202-12-22-32-4LSBMSb(Unit=℃)LSbSSSSS262524MSB2.警告搜索命令為ECH,當寄存器中設置的溫度值超過HT或者低于HT,就會發出告警信號。在1-Wire總線系列元器件中DS18B20家族代碼為28H。3.64位光刻ROM排列如表4-3。讀命ROM令為33H;匹配ROM命令為55H;搜索ROM命令為F0H;跳過ROM命令為CCH。4.帶有3個字節E2RAM,用戶/TH字;用戶/TL字;控制字。5.控制寄存器,第7位永遠為0,第6位為R1,第5位為R0第0~4位永遠為1。R0,R1為溫度分辨率控制位。如表4-4。默認R0=1,R1=1。6.寫存儲器命令為4EH;復制寄存器命令為48H(將寄存器內容復制到E2RAM);反向調用命令為B8H(將E2RAM內的溫度存儲到寄存器);讀取時電源供應命令為B4H(0為寄生電源,1為擴展電源)。7.操作示例[12]:復位信號-保持-跳過ROM(CCH)-寫寄存器(4EH,寫入TH,TL,控制字)-復位-保持-跳過ROM(CCH)-讀取寄存器(BEH,讀取CRC,如果正確,繼續,否則重復)-復位-保持-跳過ROM(CCH)-復制寄存器(48H,復制完成后需要等待10ms)-復位-保持-完成。表4-2溫度/數據關系表溫度二進制輸出十六進制輸出+125000001111101000007D0h+8500000101010100000550h*+25.062500000001100100010191h+10.125000000001010001000A2h+0.500000000000010000008h000000000000000000000h-0.51111111111111000FFF8h-10.1251111111101011110FF5Eh-25.06251111111001101111FF6Fh-551111110010010000FC90h*當接通電源后默認溫度是+85℃表4-364位光刻只讀存儲器8位CRC碼48位系列號8位家族碼(28h)MSBLSBMSBLSBMSBLSB表4-4溫度分辨率控制位R0R1溫度分辨率最長轉換時間009位93.75ms(tconv/8)0110位187.5ms(tconv/4)1011位375ms(tconv/2)1112位750ms(tconv)8.具體程控方法://*************18B20定義sbitDQ=P3^2;//18B20數據口DQtypedefUcharbyte;//*************18B20驅動**********//*************延時voiddelay(Uchari){while(i--);}//*************復位byteow_reset(void){bytepresence;DQ=0;//拉低總線delay(510);//保持480us//太小太大出現000DQ=1;//釋放總線delay(310);//等待回復300//太小太大出現000presence=DQ;//讀取信號delay(400);//等待結束信號400//太小出現容易出極限值255return(presence);//返回0:正常1:不存在}//*************從1-wire總線上讀取一個字節byteread_byte(void){bytei;bytevalue=0;for(i=8;i>0;i--){value>>=1;DQ=0;DQ=1;//delay(24);//不延時無錯誤if(DQ)value|=0x80;delay(50);//不延時出現亂數}return(value);}//*************向1-WIRE總線上寫一個字節voidwrite_byte(charval){bytei;for(i=8;i>0;i--)//一次寫一位{DQ=1;DQ=0;DQ=val&0x01;delay(35);//太小出現255DQ=1;val>>=1;}delay(50);//不延時,無異常}/*//*************voidadjust_res(charres)//res分別等于0x1f,0x3f,0x5f,0x7f溫度讀數分辨率分別對應//0.5,0.25,0.125,0.0625{ow_reset();//復位write_byte(0xcc);//跳過Romwrite_byte(0x4e);//寫暫存器write_byte(0x02);//寫THwrite_byte(0x01);//寫TLwrite_byte(0x7f);//寫結構寄存器write_byte(res);ow_reset();//復位write_byte(0xcc);//跳過Romwrite_byte(0x48);//把暫存器內容寫到EPRam中}*///*************UintRead_Temperature(void){union{Ucharc[2];Uintx;}temp;temp.x=0x0000;if(!ow_reset()){write_byte(0xCC);//SkipROMwrite_byte(0xBE);//ReadScratchPadtemp.c[1]=read_byte();//Startreaddatatemp.c[0]=read_byte();//readtwobytedatafromdeviceow_reset();//resetwrite_byte(0xCC);//SkipROMwrite_byte(0x44);//StartConversion}returntemp.x;}4.1.2本設計中采用并口數據傳輸接法,具體設置是將PSB腳接高電,由指令位(DLFLAG)來選擇8-BIT或者4-BIT接口,主控制系統將配合(RS,RW,E,DB0...DB7)來完成傳輸動作。初始化方法:接通電源-等待大于40ms-功能設置(RS=0,RW=0,數據為0011X0XX)-等待大于100us-功能設置(RS=0,RW=0,數據為0011X0XX)-等待大于37us-顯示開關設置(RS=0,RW=0,數據為00001DCB)-等待大于100us-清屏(RS=0,RW=0,數據為00000001)-等待大于10ms輸入模式設置(RS=0,RW=0,數據為000001IS或者000000ds)-初始化完成。相關參數及時序圖如下:具體程控方法://**************************LCM12864ZK驅動//*************判忙函數:判斷D7voidBUSYLOOP(){UcharBUSY;LCM_data=0x0ff;RS=0;RW=1;do{E=1;BUSY=LCM_data;E=0;}while(BUSY>0x7f);}//*************寫控制字函數voidWrite_command(UcharCMD,Ucharbb)//bb=1判斷忙標志,bb=0時直接寫命令{if(bb)BUSYLOOP();RS=0;RW=0;E=1;LCM_data=CMD;delay(150);E=0;}//*************寫數據函數voidWrite_data(UcharCMD){BUSYLOOP();RS=1;RW=0;E=1;LCM_data=CMD;delay(150);E=0;}//*************液晶初始化(并口8位)voidInit(){Write_command(0x30,0);//功能設定8位控制;基本指令集動作delay(100);Write_command(0x30,0);//重復功能設定delay(100);Write_command(0x0C,1);//顯示狀態開關;整體顯示delay(100);Write_command(0x01,1);//清除顯示delay(200);Write_command(0x06,1);//設定光標的移動方向}//*************顯示字符串voidDisplay_str(Uchar*ptr,Ucharddram){//ddram為0時接續上一次位置繼續寫入內容//ddram不為0時寫入位置//第一行0x80-87//第三行0x88-8f//第二行0x90-97//第四行0x98-9fUchari=0;if(ddram!=0)Write_command(ddram,0);//定位顯示起始地址for(i=0;ptr[i]!='\0';i++)Write_data(ptr[i]);//輸出單個字符}4.1.3下位機控制軟件說明圖4-5是下位機整個系統的控制軟件系統工作流程圖。開始開始系統初始化液晶初始化讀取傳感器處理數據獲得溫度值串口輸出液晶顯示圖4-5下位機軟件流程圖下位機單片機控制源程序見附錄B4.2上位機控制軟件上位機監視計算機軟件使用VisualBasic語言編寫,主要包括數據的接收通信模塊、和設置模塊。主界面下要完數據處理和顯示對通訊接口的操作和對數據的操作。4.2.1串口通信使用VisualBasic6.0企業版自帶的MSComm串口通信控件完成通信中的數據收發操作,在工程-部件(快捷鍵ctrl+T)里選MicrosoftCommControl6.0。然后確定,就可以在控件中找到MSComm控件了。Microsoft

Communications

Control(以下簡稱MSComm)是Microsoft公司提供的簡化Windows下串行通信編程的ActiveX控件,它為應用程序提供了通過串行接口收發數據的簡便方法。MSComm控件專為串口通信設計,在MSComm控件中封裝了串口通信對底層的所有操作[13]。具體的來說,它提供了兩種處理通信問題的方法:一是事件驅動(Event-driven)方法,一是查詢法。事件驅動方式:事件驅動通訊是處理串行端口交互作用的一種非常有效的方法。在許多情況下,在事件發生時需要得到通知,例如,在串口接收緩沖區中有字符,或者

Carrier

Detect

(CD)

Request

To

Send

(RTS)

線上一個字符到達或一個變化發生時。在這些情況下,可以利用

MSComm

控件的

OnComm

事件捕獲并處理這些通訊事件。OnComm

事件還可以檢查和處理通訊錯誤。所有通訊事件和通訊錯誤的列表,參閱

CommEvent

屬性。在編程過程中,就可以在OnComm事件處理函數中加入自己的處理代碼。這種方法的優點是程序響應及時,可靠性高。每個MSComm

控件對應著一個串行端口。如果應用程序需要訪問多個串行端口,必須使用多個

MSComm

控件。查詢方式:查詢方式實質上還是事件驅動,但在有些情況下,這種方式顯得更為便捷。在程序的每個關鍵功能之后,可以通過檢查

CommEvent

屬性的值來查詢事件和錯誤。如果應用程序較小,并且是自保持的,這種方法可能是更可取的。在本次設計中使用的MSComm控件的屬性:CommPort屬性設置并返回通訊端口號;RThreshold屬性:在MSComm控件設置CommEvent屬性為comEvReceive并產生OnComm之前,設置并返回的要接收的字符數;OnComm常數:comEvSend1發送事件。

comEvReceive2接收事件。

comEvCTS3clear-to-send線變化。

comEvDSR4data-setready線變化。

comEvCD5carrierdetect線變化。

comEvRing6振鈴檢測。

comEvEOF7文件結束;InputMode常數:comInputModeText0(缺省)通過Input屬性以文本方式取回數據。

comInputModeBinary1通過Input屬性以二進制方式檢取回數據;Settings屬性:設置并返回波特率、奇偶校驗、數據位、停止位參數;InputLen屬性:設置并返回Input屬性從接收緩沖區讀取的字符數;錯誤消息:Error。4.2.2利用MSComm實現串口通信第一步:在程序Form中添加需要的對象(如圖4-6),和MSComm控件,然后在PrivateSubForm_Load()事件中初始化MSComm控件,查找串口,在這里已經將MSComm控件重命名為MSC。圖4-6程序中的全部對象在程序中,首先在Form_Load()窗體載入事件查詢可用串口,增加TXFS列表框的選擇列表,具體程序如下:PrivateSubForm_Load()'窗體載入事件DimIAsInteger'定義變量,下拉列表框添加列表Ins_Test.Enabled=TrueWriteFile("程序初始化")DK.Enabled=True'斷開按鈕使能LJ.Enabled=False'連接按鈕使能OutData.Enabled=False'通訊超時定時器使能WriteFile("檢測串口")ForI=0To7'增加下拉列表框列表OnErrorResumeNextMSC.CommPort=I+1MSC.PortOpen=TrueIfErr.Number=0ThenTXFS.AddItemWriteFile("COM"&I+1)'增加COM列表CallDK_Click'調用斷開按鈕事件NextIMSC.DTREnable=False'DTR事件使能StaBar.Panels(1).Text="選擇通信端口,開始操作."StaBar.Panels(2).Text=NowEndSub第二步:后在按鈕“連接”增加單擊事件,LJ_Click()連接按鈕事件中設置MSC屬性,打開TXFS列表中選擇的串口號、設置緩沖區長度為5字節、OnComm事件觸發字符個數為5字節、波特率為19200kbs,無奇偶校驗、數據位長度為8位、停止位為1位。程序如下:PrivateSubLJ_Click()'連接按鈕事件TestNum=Asc("g")'設置LED顯示截止字符(要求大于f)OutData.Enabled=True'通訊超時定時器使能DK.Enabled=True'斷開按鈕使能TC.Enabled=False'退出按鈕使能LJ.Enabled=False'連接按鈕使能TXFS.Enabled=False'下拉列表框使能WriteFile("通訊端口設置為"&TXFS.Text)WithMSC.CommPort=Int(Mid(TXFS.Text,4))'設置COM口.InputLen=5.RThreshold=5.Settings="19200,N,8,1".PortOpen=True.DTREnable=TrueEndWithStaBar.Panels(1).Text=WriteFile("通訊初始化...")EndSub第三步:在MSC_OnComm()事件中TempStr讀取緩沖區MSC.Input中的的數據數據、清空緩沖區,為下一次接收數據做準備,并在狀態欄顯示通訊狀態和當前日期時間。程序如下:PrivateSubMSC_OnComm()'OnComm事件OnErrorResumeNextOutData.Enabled=False'通訊超時定時器使能DispTime.Enabled=False'顯示時間定時器使能MSC.DTREnable=False'DTR事件使能TempStr=MSC.Input'獲取串口數據JS.Caption=Leds(TempStr)'送給label顯示MSC.InBufferCount=0'清空緩沖TempStr=Time()&"_"&TempStr'欲寫入內容字符串StaBar.Panels(1).Text="溫度數據獲取成功!"IfTempStr<>LstTmpThen'當前和最后一次不相同寫入1#文件LstTmp=WriteFile(TempStr)EndIfMSC.DTREnable=True'DTR事件使能StaBar.Panels(2).Text=NowOutData.Enabled=True'通訊超時定時器使能EndSub第四步:在DK_Click()斷開按鈕單擊事件中關閉串口,程序如下:PrivateSubDK_Click()'斷開按鈕單擊事件LJ.Enabled=True'連接按鈕使能TC.Enabled=True'退出按鈕使能TXFS.Enabled=True'下拉列表框使能DK.Enabled=False'斷開按鈕使能MSC.PortOpen=False'串口通訊控件端口使能MSC.DTREnable=False'串口通訊控件DTR事件使能OutData.Enabled=False'超時警告定時器使能StaBar.Panels(1).Text=WriteFile(DK.Caption&"操作已完成.")'寫入文件EndSub4.2.3其他功能實現1.程序中狀態欄右側顯示時間,實現方法是使用定時器,時間為1000ms,獲得時間程序如下:PrivateSubDispTime_Timer()'無數據時顯示時間StaBar.Panels(2).Text=NowEndSub2.很多變量是函數都需要使用的,這時需要使用全局型變量:PublicLstTmpAsString'全局變量最后一次內容PublicTempStrAsString'當前內容PublicTestNumAsInteger'初始化顯示字符PublicTestCountAsInteger'小數點位置計數3.在程序啟動后進行程序自檢,led顯示16進制數字和小數點的從左至右的顯示:PrivateSubIns_Test_Timer()'LED顯示0-9,a-fDimDecAsBooleanIfTestNum<Asc("0")ThenTestNum=Asc("0")ElseIfTestNum>Asc("9")AndTestNum<Asc("a")ThenTestNum=Asc("a")ElseIfTestNum>Asc("f")ThenTestNum=Asc("8")'設置LED顯示字符TestCount=3'定位LED小數點位置Ins_Test.Enabled=False'停止LED顯示EndIfForJ=0To3Temp=Led(J).DspStr(Chr(TestNum),False)NextJTemp=Led(TestCountMod4).DspStr(Chr(TestNum),True)'LED小數點循環顯示IfTestCount>3ThenTestCount=0TestCount=TestCount+1TestNum=TestNum+1TestDec=NotTestDecEndSub4.因異常原因的連接超時,時間為3000ms:PrivateSubOutData_Timer()'通訊超時定時器3SWDJKXT.HideMsgBoxWriteFile("數據傳輸超時,檢查設置...."&vbLf&vbLf&"時間:"&Now),vbOKOnly,"警告"WriteFile("!!重新載入程序!!"&vbLf&vbLf&vbLf)CallDK_Click'重載窗體TestNum=0TestCount=0WDJKXT.ShowCallForm_LoadEndSub5.退出按鈕單擊后退出程序:PrivateSubTC_Click()'退出按鈕事件WriteFile("關閉程序")EndEndSub6.日志,程序自啟動開始,直至點擊退出按鈕退出,期間任何操作都寫入日志,日志按年月為文件夾,日期為文件名進行記錄。PrivateFunctionWriteFile(MSGAsString)'寫入LOG文件DimSubDirAsStringOnErrorResumeNextIfReplace(MSG,"","")=""ThenExitFunctionSubDir=Year(Now)&Format(Month(Now),"00")MkDirSubDirOpenSubDir&"\"&Day(Now)&".txt"ForAppendAs#1'打開文件,文件號為1#Print#1,Time()&""&MSGClose#1'關閉1#文件WriteFile=MSGEndFunction7.程序其中調用了Led.ocx控件顯示數據:Priv

溫馨提示

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

最新文檔

評論

0/150

提交評論