目錄
前言... 2
第一章 溫度測量與單片機現狀... 3
1.1溫度控制系統的發展及現狀... 3
1.2 單片機實現溫控系統的現狀... 3
1.3 溫室大棚設計... 4
第二章 系統的硬件設計... 5
2.1 系統總體設計... 5
2.2 AT89C51單片機... 6
2.3 ADC轉換芯片ADC0832. 7
2.4LED顯示部分... 8
2.5 鍵盤部分... 9
2.6 傳感器連接電路... 10
第三章 系統軟件設計... 11
3.1軟件總體設計... 11
3.2 AD轉換程序設計... 12
3.3 鍵盤程序設計... 12
3.4 LED顯示程序設計... 12
3.5 程序運行結果... 12
第四章 系統誤差分析與處理... 14
4.1 電路部分... 14
4.2 軟件部分... 15
第五章 小結... 15
參考文獻:... 16
附錄... 17
前言
在工業生產中,電流、電壓、溫度、壓力、流量、流速和開關量都是常用的主要被控參數。其中,溫度控制也越來越重要。在工業生產的很多領域中,人們都需要對各類加熱爐、熱處理爐、反應爐和鍋爐中的溫度進行檢測和控制。采用單片機對溫度進行控制不僅具有控制方便、簡單和靈活性大等優點,而且可以大幅度提高被控溫度的技術指標,從而大大的提高產品的質量和數量。因此,單片機對溫度的控制問題是工業生產中經常會遇到的控制問題。
溫度是工業生產中常見的工藝參數之一, 任何物理變化和化學反應過程都與溫度密切相關, 因此溫度控制是生產自動化的重要任務。 對于不同生產情況和工藝要求下的溫度控制, 所采用的加熱方式, 控制方式都不同。 隨著單片機的飛速發展, 通過單片機對被控對象進行控制日益廣泛, 具有體積小、功能強、性價比高等特點, 把單片機應用于溫度控制系統中可以起到更好的控溫作用, 電熱恒溫烘箱是使用單片機進行溫度控制的典型應用, 采用單片機做主控單元, 無觸點控制, 可完成對溫度的采集和控制等的要求[1]。
我國北方冬季寒冷而漫長,大力推廣蔬菜大棚種植蔬菜能夠更好地滿足人民生活水平日益提高的需要。冬季蔬菜大棚管理最重要的一個因素就是溫度的控制。溫度管理一般把一天分為午前、午后、前半夜和后半夜4 個時段來進行溫度調節。午前以促進光合作用、增加同化量為主,一般應將棚溫保持在25~30℃為宜;午后光合作用呈下降趨勢,應將溫度比午前降低5℃左右,以20 ~25℃為好,避免高溫下養分消耗過多。日落后4~5h內,要將棚內溫度從20℃逐漸降到15℃上下,以促進體內同化物的運轉。此后,再將夜溫降到10~12℃,以抑制呼吸、減少消耗、增加積累。但不可把溫度降得過低,以免發生低溫危害。另外,陰雨天光照不足,光合作用不能正常進行棚內溫度也應比晴天低5℃左右,以降低呼吸消耗。單片機是一種集CPU、RAM、ROM、I/O接口和中斷系統等部分于一體的器件,只需要外加電源和晶振就可實現對數字信息的處理和控制。因此,單片機廣泛用于現代工業控制中。控制具有體積小、重量輕、價格低、可靠性高、耗電少和靈活機動等許多優點,因此如果能利用單片機進行溫度的測量和控制,將會大大提高溫度測量和控制的可靠性和靈活性。
第一章 溫度測量與單片機現狀1.1溫度控制系統的發展及現狀
溫度控制廣泛應用于社會生活的各個領域,如家電、汽車、材料、電力電子等。常用的控制方法、電路以及所使用的測量方式根據應用場合和所要求的性能指標有所不同。最近十年來,在溫度控制方法上有了快速的發展。己從傳統的直接控制轉變成PID控制、模糊控制、神經網絡控制和遺傳算法等控制方法。
溫度測量是工業、農業、國防和科研等部門最普遍的測量項目。它在工農業生產、現代科學研究及高新技術開發過程中也是一個極其普遍而重要的測量參數。
溫度測量首先是由溫度傳感器來實現的。測溫儀器通常由溫度傳感器和信號處理兩部分組成。溫度測量的過程就是通過溫度傳感器將被測對象的溫度值轉換成電的或其它形式的信號,傳遞給信號處理電路進行信號處理轉換成溫度值顯示出來。溫度傳感器隨著溫度變化而引起變化的物理參數有:膨脹、電阻、電容、熱電動勢、磁性能、頻率、光學特性及熱噪聲等等。隨著生產的發展,新型溫度傳感器還會不斷出現,目前,國內外通用的溫度傳感器及測溫儀大致有以下幾種:熱膨脹式溫度計,電阻溫度計,熱電偶,輻射式測溫儀表。
熱電阻是利用導體或半導體的電阻值隨溫度變化而變化的特性來測量溫度的一種感溫元件。使用熱電阻作感溫元件的溫度計常稱為電阻溫度計。熱電阻具有體積小、反應快、使用方便的優點,通過熱電阻,可以把溫度及其變化轉換成電學量或電學量的變化加以測量。所以,它被廣泛應用于工、農、醫、交通、軍事、科研等各個領域的溫度測量和控制工作中。本次課程設計中就采用鉑熱電阻PT100傳感器。
1.2 單片機實現溫控系統的現狀
單片機是一種集CPU、RAM、ROM、I/O接口和中斷系統等部分于一體的器件,只需要外加電源和晶振就可實現對數字信息的處理和控制。因此,單片機廣泛用于現代工業控制中。控制具有體積小、重量輕、價格低、可靠性高、耗電少和靈活機動等許多優點,因此如果能利用單片機進行溫度的測量和控制,將會大大提高溫度測量和控制的可靠性和靈活性。單片機對溫度測量控制過程是借助于傳感器、A/D轉換器以及擴展接口和執行機構來進行的。在閉環型過程控制中,過程的實時參數由傳感器和A/D轉換器來實時采集,并由單片機自動記錄、處理并控制執行機構動作來進行調節和控制。因此需要對單片機進行擴展和開發,來形成整個單片機溫度控制系統。
通過單片機來控制加熱的過程促進生產過程自動化。而生產過程自動化是保持生產穩定、降低消耗、改善勞動條件、保證生產安全和提高勞動生產率的重要手段。采用溫度控制系統來控制溫度對企業具有重要的意義:
1.降低勞動強度,改善勞動條件。采用單片機系統后,不再需要工人不停的對加熱爐進行檢查。
2.提高控制精度。單片機可以對溫度進行實時的控制,降低溫度加熱的滯后性,以此提高加熱的精度。
3.提高工作效率,降低成本,采用單片機系統控制可以更快的達到恒溫控制的效果,提高工作效率、節省能源、降低成本。
4.提高企業對可控制電加熱技術的應用水平,鍛煉企業技術人員的開發、應用能力。
1.3 溫室大棚設計
菜的生長發育受到溫度的影響,因此對于蔬菜溫室大棚來說,在蔬菜的整個生長過程中,要隨時檢測溫度的變化,以便對溫度進行控制,保證蔬菜所處的環境溫度符合蔬菜生長發育的要求,提高蔬菜的產量和質量。大棚設計規格為40m*8m的規格,,以西紅柿的生長環境為例。它對生長環境的要求十分嚴格,如果溫度太高或太低、通風不及時、濕度過大都會引起農作物的病蟲害,白天溫度要求25℃~28℃,夜間溫度要求13℃~15℃。由于大棚的范圍較大一個溫度傳感器的測量數據可能不足以反映大棚內的實際情況。所以經過查閱資料,大棚的溫度檢測區域分成4塊,每塊規格為10m×8m,在大棚的四個區域安裝4個溫度傳感器。傳感器的高度在0.3m到0.4m,監測大棚內的溫度。溫度傳感器采用鉑熱電阻PT100,其阻值會隨著溫度的變化而改變。PT后的100即表示它在0℃時阻值為100歐姆,在100℃時它的阻值約為138.5歐姆。它的工業原理:當PT100在0攝氏度的時候他的阻值為100歐姆,它的的阻值會隨著溫度上升它的阻值是成勻速增漲的。Pt100 溫度傳感器還具有抗振動、穩定性好、準確度高、耐高壓等優點。鉑熱電阻的線性較好,最大非線性偏差小。廣泛應用與汽車空調、冰箱、冷柜、飲水機、咖啡機,烘干機以及中低溫干燥箱、恒溫箱,滿足溫室大棚的測量要求。大棚設計要求測量溫度有零下30到60度的范圍,由于考慮到我國廣大地區溫度差異較大,冬天與夏天溫度差別也很大,有些地區冬天溫度能達到零下30多度 ,和測量余量的考慮,所以設計傳感器的測量范圍為零下50度到80度。測量溫度范圍能覆蓋我國廣大地區的實際溫度。
第二章 系統的硬件設計2.1 系統總體設計
系統采用了C51單片機作為處理器,具有四個溫度測量模塊,信號轉換模塊,數字顯示模塊,鍵盤控制模塊。溫度測量是由四個溫度傳感器完成,采用 鉑熱電阻PT100傳感器,傳感器接入三運放高共模抑制比放大電路。三運放高共模抑制比放大電路能有效的抑制電路的共模信號,提高整個系統的抗干擾能力。通過放大電路后接入AD轉換芯片AD0832,AD0832是8為AD轉換芯片,能將放大電路輸入的模擬信號轉化為數字信號,供給單片機處理。單片機每次會接收四個溫度傳感器測量的溫度信號,對信號進行處理,根據測量溫度和設定溫度的比較輸出不同的信號。8位數碼管會對結果進行顯示。單片機根據處理結果控制加熱和制冷設備自動調節大棚內的溫度。
圖 2.1 系統整體框圖
2.2 AT89C51單片機
89C51單片機是對所有兼容Intel 8031指令系統的單片機的統稱。該系列單片機的始祖是Intel的8004單片機,后來隨著Flash rom技術的發展,8004單片機取得了長足的進展,成為應用最廣泛的8位單片機之一,其代表型號是ATMEL公司的AT89系列,它廣泛應用于工業測控系統之中。STC89C51是一種低功耗、高性能CMOS8位微控制器,具有 8K 在系統可編程Flash 存儲器。在單芯片上,擁有靈巧的8 位CPU 和在系統可編程Flash,使得STC89C51為眾多嵌入式控制應用系統提供高靈活、有效的解決方案。具有以下標準功能: 8k字節Flash,512字節RAM, 32 位I/O 口線,看門狗定時器,內置4KB EEPROM,MAX810復位電路,三個16 位 定時器/計數器,一個6向量2級中斷結構,全雙工串行口。另外 STC89X52 可降至0Hz 靜態邏輯操作,支持2種軟件可選擇節電模式。空閑模式下,CPU 停止工作,允許RAM、定時器/計數器、串口、中斷繼續工作。掉電保護方式下,RAM內容被保存,振蕩器被凍結,單片機一切工作停止,直到下一個中斷或硬件復位為止。最高運作頻率35Mhz,6T/12T可選。
設計中選用STC 89C51單片機,共有四個8位的I/O口,P0口接入8為數碼管的段選口,決定數碼管顯示的內容。P2口接入8位數碼管的位選口,決定點亮哪一個數碼管。P1口接入鍵盤電路,對整個系統進行控制和設定大棚內保持的溫度。P3口主要接入AD轉換芯片,接收傳感器采集的溫度數據。
圖2.2單片機及接口
2.3 ADC轉換芯片ADC0832
ADC0832是美國國家半導體公司生產的一種8位分辨率、雙通道A/D轉換芯片。由于它體積小,兼容性強,性價比高。ADC0832為8位分辨率A/D轉換芯片,其最高分辨可達256級。可以適應一般的模擬量轉換要求。在此次課程設計中由于溫度控制系統在溫室大棚內使用,對于溫度控制精度要求不高。采用了數碼管顯示,由于單片機IO口數量有限,只顯示到溫度的個位,忽略小數位,所以8位ADC芯片能滿足設計的精度要求。ADC0832內部電源輸入與參考電壓的復用,使得芯片的模擬電壓輸入在0~5V之間。芯片轉換時間僅為32μS,據有雙數據輸出可作為數據校驗,以減少數據誤差,轉換速度快且穩定性能強。獨立的芯片使能輸入,使多器件掛接和處理器控制變的更加方便。通過DI數據輸入端,可以輕易的實現通道功能的選擇。ADC0832芯片有兩個通道,每個芯片可以接入兩個溫度傳感器,通過單片機的程序控制可以分別對兩個傳感器進行AD轉換,可以節約芯片成本。
圖2.3 ADC0832芯片
2.4LED顯示部分
LED數碼管由多個發光二極管封裝在一起組成“8”字型的器件,引線已在內部連接完成,只需引出它們的各個筆劃,公共電極。數碼管實際上是由七個發光管組成8字形構成的,加上小數點就是8個。這些段分別由字母a,b,c,d,e,f,g,dp來表示。當數碼管特定的段加上電壓后,這些特定的段就會發亮,以形成我們眼睛看到的字樣。LED數碼管具有功耗小,無熱量,耐沖擊,長壽命等優點,配合控制器,即可實現流水,漸變,跳變,追逐等效果。在本次課程設計中由于需要顯示的內容較多,所以采用8位數碼管。每兩個數碼管一組,顯示顯示對應的溫度值,設定的溫度,報警及對加熱制冷設備的控制狀態。
圖 2.4 8位數碼管
第一和第二個數碼管為一組,顯示四個傳感器測得溫度的平均值。第三和第四個數碼管為一組,用于顯示設定的溫度值及用鍵盤改變設定溫度時的顯示。第五和第六個數碼管為一組,會輪流顯示四個傳感器測的的溫度值及當傳感器測得的溫度異常時不會顯示具體溫度值,會顯示“——”,進行報警。第七和第八個數碼管為一組,顯示對制冷和加熱設備的控制狀態。當顯示1,2,3時表示對大棚進行加熱,且測得溫度與設定溫度相差越大時,顯示的值也越大。當顯示“00”時表示設定溫度與測得溫度相同。當顯示—1,—2,—3時表示對大棚進行制冷,設定溫度與實際測得溫度相差越大,顯示數字也越大。
2.5 鍵盤部分
鍵盤部分當鍵盤按鈕不按下去時對應的IO口輸入為高電平,當按下按鈕時IO口與地接通,對應接口輸入為低電平。鍵盤部分有四個按鈕,第一個按鈕為開關按鈕,按下第一個按鈕后傳感器和AD芯片及數碼管開始工作,進行數模轉
圖2.5 鍵盤按鈕
換,顯示測定的溫度。只有按下第一個按鈕后按下其他的按鈕才有效。第一次按下第二個按鈕后,進入設定大棚溫度的模式。每次按下第三個按鈕,設定的溫度值加一,每次按下第四個按鈕時設定的溫度減一。設定的溫度值范圍在0到50
循環。當第二次按下第二個按鈕時,退出當前設定溫度的模式,正常執行程序。
2.6 傳感器連接電路
溫度元件與單片機連接電路是一個三運放高共模抑制比放大電路。它具有很好的抗共模干擾的能力,提高溫度測量的精度。
圖2.6 三運放高共模抑制比放大電路
第三章 系統軟件設計3.1軟件總體設計
軟件是單片機的關鍵。設計一個單片機系統,在硬件平臺確定之后,就可以通過設計不同的軟件,實現不同的單片機功能。在設計、實現單片機的軟件系統時,需要考慮眾多因素,如硬件需求、計算機硬件、操作系統等。由于選用專用的開發軟件,必須具有一定的單片機以及數據采集設備配合使用。
控制系統加電后主控單片機啟動,然后調用鍵盤掃描程序,判斷有無按鍵按下。當檢測到第一個按鍵按下后,再進行鍵盤掃描,若檢測到第二個鍵按下則轉入鍵盤控制程序部分。檢測第三個和第四個按鍵是否按下,對設定溫度的數值進行設置,當再次檢測到第二個按鍵按下后退出鍵盤控制程序部分,轉入數據處理和顯示部分程序。若沒有檢測到第二個鍵按下,直接進入數據處理和顯示部分。調用AD轉換程序,獲得傳感器測量的數據,對測量數據進行處理。判斷傳感器測得數據是否異常,若有異常在進一步判斷后顯示“——”進行報警。若沒有異常則顯示最終的溫度數據,并對每個傳感器測得數據進行輪流顯示。并將測得溫度與設定溫度進行比較,對加熱和制冷設備進行控制。
開始
開關是否按下?
圖 3.1 程序總體框圖
3.2 AD轉換程序設計
在本次課程設計中由于熱電阻傳感器輸入信號為連續的電壓量,是連續的模擬信號,需要進行AD轉換變為數字量,單片機才能進行處理。所以需要AD轉換芯片進行AD轉換。在設計中有四個輸入信號,由于采用了ADC0832芯片,每個芯片有兩個輸入通道,所以需要2個AD芯片。在程序設計中,按照芯片時序圖對芯片寫入命令,選擇傳感器對應的通道對輸入信號進行AD轉換。
3.3 鍵盤程序設計
在本次課程設計中,一共定義了四個按鍵。分別是開關,設定,加,減。分別接在P1.0到P1.3四個接口。當按下開關鍵后,單片機開始接收傳感器采集的數據,進行處理和顯示。設定和加減用于對大棚設定溫度的控制。按下設定鍵后,在按下加,減對設定溫度進行調整,再次按下設定鍵退出對溫度的設定。
3.4 LED顯示程序設計
由于程序中需要顯示的數據量較多,所以采用了8位數碼管進行顯示。由于單片機的接口數量有限,采用動態顯示模式。P0口接入數碼管位選接口,P2口接入8位數碼管的段選接口。P0口輸入需要顯示的數字,P2口決定點亮哪一個數碼管。
3.5 程序運行結果
當單片機接電開始工作后,有鍵盤開關按鈕來啟動。由鍵盤設定按鈕來蔬菜大棚所要達到的設定值。溫度傳感器時事測定當前溫度,若當前溫度小于設定值,則加熱設備開始工作,直到當前溫度達到設定值;若當前溫度大于設定值,則加熱爐停止工作,制冷設備開始工作。溫度開始下降,直到當前溫度等于設定值;設定值等于當前溫度 ,通過對加熱和制冷設備的控制保持大棚的溫度穩定。
當實時溫度小于設定值時,數碼管顯示為正數,此時加熱爐作,從而提高大棚的溫度:。數碼管顯示數字為1,2,3,數字越大加熱功率越高。
圖3.2 實際溫度小于設定溫度
當實時溫度與設定值相等時,不采取任何措施:,數碼管顯示為—0。
圖3.3 實際溫度等于設定溫度
當實時溫度大于設定值時,加熱裝置停止工作,制冷裝置開始工作。:溫度差別越大,顯示數字越小。
圖 3.4 實際溫度大于設定溫度
第四章 系統誤差分析與處理4.1 電路部分
由于在本次課程設計中傳感器采用熱電阻,采用三運放高共模抑制比放大電路抑制電路的共模干擾信號。三運放高共模抑制比放大電路是由三個集成運算放大器組成,其中左邊兩個運放輸入阻抗,共模抑制比和增益等性能一致。構成平衡對稱差動放大輸入級,右邊運放構成雙端輸入單端輸出的輸出級,用來進一步抑制電路的共模信號,并適應接地負載的需要。
圖4.1 三運放高共模抑制比放大電路
當左邊兩個運放性能一致時,輸入級的差動輸出及其差模增益只與差模輸入電壓有關,而其共模輸出,失調及漂移均在電路中抵消。因此電路具有良好的干擾抑制能力。
本次課程設計采用的溫度元件是鉑熱電阻PT100,其阻值會隨著溫度的變化而改變。PT后的100即表示它在0℃時阻值為100歐姆,在100℃時它的阻值約為138.5歐姆。廠家提供有PT100在各溫度下電阻值值的分度表,在此可以近似取電阻變化率為 0.385Ω/℃。向PT100輸入穩恒電流,再通過A/D轉換后測PT100兩端電壓,即得到PT100的電阻值,進而算出當前的溫度值。 采用50mA的電流源對PT100進行供電,然后用運算放大器LM324搭建的放大電路將其電壓信號放大10倍后輸入到ADC0832中。由于ADC0832是8位AD轉換芯片,所以轉換精度5/255=0.0196V。由于放大電路將輸入電壓放大10倍,所以 0.0196/10/0.05/0.385=0.1度。由于溫度顯示部分精度只要求到度,所以測量精度滿足要求。
4.2 軟件部分
在設計中采用了四個溫度傳感器,進行測量時會讀取四個傳感器的數據。每次測量后延時1秒,再次進行測量,一共進行四次測量。對每個傳感器測量值去平均數,減小測量的誤差。然后會對四個溫度數據進行處理,若有兩個及以上數據與設定溫度值偏差太大會進行報警。若只有一個傳感器測量溫度異常,會在延時后在測量三次,若數據仍然異常,會進行報警。若數據沒有異常,程序會對四個傳感器測量值再次去平均值,減小誤差,然后進行顯示。
第五章 小結
通過此次課程設計,使我更加扎實的掌握了單片機,程序設計,傳感器等方面的知識,知道了許多東西我們以前不知道知識。在設計過程中雖然遇到了一些問題,但經過一次又一次的思考,一遍又一遍的檢查終于找出了原因所在,也暴露出了前期我在這方面的知識欠缺和經驗不足。實踐出真知,通過親自動手設計程序,使我們掌握的知識不再是紙上談兵。在課程設計過程中,我們不斷發現錯誤,不斷改正,不斷領悟,不斷獲取。最終的檢測調試環節,本身就是在踐行過而能改,善莫大焉的知行觀。這次課程設計終于順利完成了,在設計中遇到了很多問題,最后在查找資料后,許多問題終于游逆而解,但也有的沒有弄懂。在今后社會的發展和學習實踐過程中,一定要不懈努力,不能遇到問題就想到要退縮,一定要不厭其煩的發現問題所在,然后一一進行解決,只有這樣,才能成功的做成想做的事,才能在今后的道路上劈荊斬棘,而不是知難而退,那樣永遠不可能收獲成功,收獲喜悅,也永遠不可能得到社會及他人對你的認可!
參考文獻:
[1]胡漢才.單片機原理及其接口技術[M].北京:清華大學出版社,2004.
[2]張國雄.測控電路.機械工業出版社,2008.3
[3]許海峰.C51單片機項目式教程.—北京:清華大學出版社,2011.4
[4]張福學.傳感器應用及其電路精選[M].北京:電子工業出版社,2003.
[5]臧春華.現代電子技術基礎[M].北京:北京航空航天大學出版社,2005.
[6]單成祥.傳感器的理論與設計基礎及其應用[M].國際工業出版社,1999.
附錄
程序:
#include<reg51.h> //頭文件
#include<intrins.h> //_nop_()頭文件
#define uchar unsigned char
#define uint unsigned int
uchar celiangzhi[4][4];
uchar shedingwendu = 25; ///設定溫度
uchar jianpan = 0; ///判斷鍵盤哪個鍵按下的變量
uchar sheding = 0; //設定溫度的時的標志變量
uchar tem1, tem2, tem3, tem4; //存放傳感器測定值的變量
uchar shuchuwendu; //存放傳感器測定溫度的平均值,最后用數碼管顯示
uchar shuchu; //bijiao()函數執行結果的標志
int k; //判斷有幾個傳感器測定值異常的標志
//ADC0832端口引腳定義
sbit CS = P3 ^ 0; ////將CS位定義為P3.0引腳
sbit CLK = P3 ^ 1; //將CLK位定義為P3.1引腳
sbit DIO = P3 ^ 2; //將DIO位定義為P3.2引腳
sbit CS1 = P3 ^ 3;
sbit CLK1 = P3 ^ 4;
sbit DIO1 = P3 ^ 5;
uchar code led[11] = {0xc0,0xf9,0xa4,0xb0,0x99, // 共陽數碼管段碼表0到9和-
0x92,0x82,0xf8,0x80,0x90,0xbf };
void delay1ms() //延時函數
{
unsignedchar i, j;
for(i = 0; i<10; i++)
for(j = 0; j<33; j++);
}
void delaynms(unsigned char n) //延時n ms
{
unsignedchar i;
for(i = 0; i<n; i++)
delay1ms();
}
/////*****************************************************
unsigned char A_D() //進行AD轉換的函數
{
unsignedchar i, dat;
uchara, b;
CS= 1; //一個轉換周期開始 CS為片選使能口,0使能
CLK= 0; //為第一個脈沖作準備
CS= 0; //CS置0,片選有效
DIO= 1; //DIO置1,規定的起始信號
CLK= 1; //第一個脈沖
CLK= 0; //第一個脈沖的下降沿,此前DIO必須是高電平
//////////////////////////第一個脈沖結束
DIO= 1; //DIO置1, 通道選擇信號
CLK= 1; //第二個脈沖,第2、3個脈沖下沉之前,DI必須跟別輸入兩位數據用于選擇通道,這里選通道CH0
CLK= 0; //第二個脈沖下降沿
DIO= 0; //DI置0,選擇通道0 DI0輸入10時 選擇0通道,輸入11時選擇1通道
CLK= 1; //第三個脈沖
CLK= 0; //第三個脈沖下降沿
DIO= 1; //第三個脈沖下沉之后,輸入端DIO失去作用,應置1
CLK= 1; //第四個脈沖
for(i = 0; i<8; i++) //高位在前
{
CLK= 1; //第四個脈沖
CLK= 0;
dat<<= 1; //將下面儲存的低位數據向右移
dat|= (unsigned char)DIO; //將輸出數據DIO通過或運算儲存在dat最低位
}
CS= 1; //片選無效
a =dat / 51;
b =(dat % 51) * 10 / 51;
a =a * 10 + b;
returna;
}
/////************************************************
unsigned char A_D1()
{
unsignedchar i, dat;
uchara, b;
CS= 1; //一個轉換周期開始 CS為片選使能口,0使能
CLK= 0; //為第一個脈沖作準備
CS= 0; //CS置0,片選有效
DIO= 1; //DIO置1,規定的起始信號
CLK= 1; //第一個脈沖
CLK= 0; //第一個脈沖的下降沿,此前DIO必須是高電平
//////////////////////////第一個脈沖結束
DIO= 1; //DIO置1, 通道選擇信號
CLK= 1; //第二個脈沖,第2、3個脈沖下沉之前,DI必須跟別輸入兩位數據用于選擇通道,這里選通道CH0
CLK= 0; //第二個脈沖下降沿
DIO= 1; //DI置0,選擇通道0 DI0輸入10時 選擇0通道,輸入11時選擇1通道
CLK= 1; //第三個脈沖
CLK= 0; //第三個脈沖下降沿
DIO= 1; //第三個脈沖下沉之后,輸入端DIO失去作用,應置1
CLK= 1; //第四個脈沖
for(i = 0; i<8; i++) //高位在前
{
CLK= 1; //第四個脈沖
CLK= 0;
dat<<= 1; //將下面儲存的低位數據向右移
dat|= (unsigned char)DIO; //將輸出數據DIO通過或運算儲存在dat最低位
}
CS= 1; //片選無效
a =dat / 51;
b =(dat % 51) * 10 / 51;
a =a * 10 + b;
returna;
}
unsigned char A_D2()
{
unsignedchar i, dat;
uchara, b;
CS1= 1; //一個轉換周期開始 CS為片選使能口,0使能
CLK1= 0; //為第一個脈沖作準備
CS1= 0; //CS置0,片選有效
DIO1= 1; //DIO置1,規定的起始信號
CLK1= 1; //第一個脈沖
CLK1= 0; //第一個脈沖的下降沿,此前DIO必須是高電平
//////////////////////////第一個脈沖結束
DIO1=1; //DIO置1, 通道選擇信號
CLK1= 1; //第二個脈沖,第2、3個脈沖下沉之前,DI必須跟別輸入兩位數據用于選擇通道,這里選通道CH0
CLK1= 0; //第二個脈沖下降沿
DIO1= 0; //DI置0,選擇通道0 DI0輸入10時 選擇0通道,輸入11時選擇1通道
CLK1= 1; //第三個脈沖
CLK1= 0; //第三個脈沖下降沿
DIO1= 1; //第三個脈沖下沉之后,輸入端DIO失去作用,應置1
CLK1= 1; //第四個脈沖
for(i = 0; i<8; i++) //高位在前
{
CLK1= 1; //第四個脈沖
CLK1= 0;
dat<<= 1; //將下面儲存的低位數據向右移
dat|= (unsigned char)DIO1; //將輸出數據DIO通過或運算儲存在dat最低位
}
CS1= 1; //片選無效
a =dat / 51;
b =(dat % 51) * 10 / 51;
a =a * 10 + b;
returna;
}
/////************************************************
unsigned char A_D3()
{
unsignedchar i, dat;
uchara, b;
CS1= 1; //一個轉換周期開始 CS為片選使能口,0使能
CLK1= 0; //為第一個脈沖作準備
CS1= 0; //CS置0,片選有效
DIO1= 1; //DIO置1,規定的起始信號
CLK1= 1; //第一個脈沖
CLK1= 0; //第一個脈沖的下降沿,此前DIO必須是高電平
//////////////////////////第一個脈沖結束
DIO1= 1; //DIO置1, 通道選擇信號
CLK1= 1; //第二個脈沖,第2、3個脈沖下沉之前,DI必須跟別輸入兩位數據用于選擇通道,這里選通道CH0
CLK1= 0; //第二個脈沖下降沿
DIO1= 1; //DI置0,選擇通道0 DI0輸入10時 選擇0通道,輸入11時選擇1通道
CLK1= 1; //第三個脈沖
CLK1= 0; //第三個脈沖下降沿
DIO1= 1; //第三個脈沖下沉之后,輸入端DIO失去作用,應置1
CLK1= 1; //第四個脈沖
for(i = 0; i<8; i++) //高位在前
{
CLK1= 1; //第四個脈沖
CLK1= 0;
dat<<= 1; //將下面儲存的低位數據向右移
dat|= (unsigned char)DIO1; //將輸出數據DIO通過或運算儲存在dat最低位
}
CS1= 1; //片選無效
a =dat / 51;
b =(dat % 51) * 10 / 51;
a =a * 10 + b;
returna;
}
void display1(uchar num, uchar dis_w) //數碼管顯示函數,第一二位數碼管顯示數字,顯示最后的溫度結果
{
ucharj;
for(j = 0; j < 2; j++)
{
P0= 0xff;
P2= dis_w;
if(j > 0)
P0= led[num / 10];
else
P0= led[num % 10];
dis_w= dis_w >> 1;
delaynms(5);
}
}
void display2(uchar num) // 數碼管顯示函數,第三四位數碼管顯示數字,顯示設定的溫度值
{
P0= 0xff;
delaynms(5);
P2= 0x04;
P0= led[num / 10];
delaynms(5);
P2= 0x08;
P0= led[num % 10];
delaynms(5);
}
void display6(uchar num) // 第五六位顯示數字,用來顯示四個傳感器測定的溫度
{
P0= 0xff;
delaynms(5);
P2= 0x10;
P0= led[num / 10];
delaynms(5);
P2= 0x20;
P0= led[num % 10];
delaynms(5);
}
void display3() // 第五六位顯示數字,當傳感器測定的溫度異常時報警
{
P0= 0xff;
delaynms(5);
P2= 0x10;
P0= led[10];
delaynms(5);
P2= 0x20;
P0= led[10];
delaynms(5);
}
void display4(uchar i) // 第七八位顯示數字,用來顯示處理結果,顯示1 2 3
{
P0= 0xff;
delaynms(5);
P2= 0x40;
P0= led[0];
delaynms(5);
P2= 0x80;
P0= led;
delaynms(5);
}
void display5(uchar i) // 第七八位顯示數字,用來顯示處理結果,顯示-1 -2 -3 0
{
P0= 0xff;
delaynms(5);
P2= 0x40;
P0= led[10];
delaynms(5);
P2= 0x80;
i =i - 4;
P0= led;
delaynms(5);
}
/////////////////////////////////////////////////
void celiang() //調用AD()函數,用四個傳感器測量溫度。每個傳感器隔一段時間進行一次測量
{ //每個傳感器測試四次,對測量結果取平均值,存放在四個變量中
inti = 0; //
intj = 0;
for(i = 0; i < 4; i++)
{
celiangzhi[j][0]= A_D(); celiangzhi[j][1] = A_D1();
celiangzhi[j][2]= A_D2(); celiangzhi[j][3] = A_D3();
j++;
}
tem1= celiangzhi[0][0] + celiangzhi[1][0] + celiangzhi[2][0] + celiangzhi[3][0];
tem1= tem1 / 4;
tem2= celiangzhi[0][1] + celiangzhi[1][1] + celiangzhi[2][1] + celiangzhi[3][1];
tem2= tem2 / 4;
tem3= celiangzhi[0][2] + celiangzhi[1][2] + celiangzhi[2][2] + celiangzhi[3][2];
tem3= tem3 / 4;
tem4= celiangzhi[0][3] + celiangzhi[1][3] + celiangzhi[2][3] + celiangzhi[3][3];
tem4= tem4 / 4;
}
void kongzhi() //將最終的溫度結果與設定的溫度進行比較,根據比較結果輸出不同的值
{
inti;
i =shuchuwendu - shedingwendu;
if(i < -5)
shuchu= 3;
if((-5 < i)&(i < -2))
shuchu= 2;
if((-2 < i)&(i < 0))
shuchu= 1;
if(i >5)
shuchu= 7;
if((2 < i)&(i < 5))
shuchu= 6;
if((0 < i)&(i < 2))
shuchu= 5;
if(i == 0)
shuchu= 4;
}
int bijiao() //判斷每個傳感器的測量結果有沒有超過合理的范圍
{
ucharxiaxian, shangxian;
inti = 0, j = 0;
ucharbijiao[4];
xiaxian= (shedingwendu - 15);
shangxian= (shedingwendu + 15);
bijiao[0]= tem1; bijiao[1] = tem2; bijiao[2] = tem3;
bijiao[3]= tem4;
for(i = 0; i < 4; i++)
{
if(xiaxian < bijiao && bijiao < shangxian)
{
k++;
}
}
returnk;
}
void keyscan() //鍵盤掃描函數,判斷哪個鍵按下
{
if((P1 & 0x0f) == 0x0f)
jianpan= 0;
if((P1 & 0x0f) == 0x0e)
jianpan= 1;
if((P1 & 0x0f) == 0x0d)
jianpan= 2;
if((P1 & 0x0f) == 0x0b)
jianpan= 3;
if((P1 & 0x0f) == 0x07)
jianpan= 4;
// return jianpan;
}
main(void)
{
int i;
ucharkaiguan = 0;
// ucharceshi = 12;
while(1)
{
keyscan();
if(jianpan == 1)
kaiguan= 1;
while(kaiguan == 1)
{
keyscan();
if(jianpan == 2)
{
sheding= 1;
while(jianpan == 2)
{
keyscan();
}
while(jianpan == 0)
{
keyscan();
display2(shedingwendu);
}
}
while(sheding == 1)
{
keyscan();
if(jianpan == 3)
{
shedingwendu= shedingwendu + 1;
if(shedingwendu > 50)
{
shedingwendu= 1;
}
while(jianpan == 3)
{
keyscan();
}
while(jianpan == 0)
{
keyscan();
display2(shedingwendu);
}
}
if(jianpan == 4)
{
shedingwendu= shedingwendu - 1;
if(shedingwendu <1)
{
shedingwendu= 50;
}
while(jianpan == 4)
{
keyscan();
}
while(jianpan == 0)
{
keyscan();
display2(shedingwendu);
}
}
keyscan();
if(jianpan == 2)
sheding= 0;
while(jianpan == 2)
{
keyscan();
}
}
celiang();
bijiao();
////////////////// 顯示四個傳感器的測量值
for(i = 0; i < 20; i++)
{
delay1ms();
display6(tem1);
}
for(i = 0; i < 20; i++)
{
delay1ms();
display6(tem2);
}
for(i = 0; i < 20; i++)
{
delay1ms();
display6(tem3);
}
for(i = 0; i < 20; i++)
{
delay1ms();
display6(tem4);
}
///////////////////////////////////////////////////////////////////
if(k < 2)
{
display3();
for(i = 0; i < 20; i++)
{
delay1ms();
display3();
}
///////////////////
}
if(k == 3)
{
inti = 0;
intj = 0;
k= 0;
for(i = 0; i < 3; i++)
{
///////////////////////////////
delaynms(500);
//////////////////////////////////////
celiang();
bijiao();////////////////
if(k == 3)
{
j++;
k= 0;
}
}
if(j == 3)
{
for(i = 0; i < 20; i++)
{
delay1ms();
display3();
}
////////////////////////////////////////
}
}
if(k == 4)
{
////////////////////////////////////////////////////
shuchuwendu= tem1 + tem2 + tem3 + tem4;
shuchuwendu= shuchuwendu / 4;
for(i = 0; i < 50; i++)
{
delay1ms();
display1(shuchuwendu,0x02);
}
kongzhi();
if(shuchu < 4)
{
for(i = 0; i < 50; i++)
{
delay1ms();
display4(shuchu);
}
}
else
{
for (i = 0; i < 50; i++)
{
delay1ms();
display5(shuchu);
}
}
}
for(i = 0; i < 20; i++)
{
delay1ms();
display2(shedingwendu);
}
display2(shedingwendu);
k= 0;
}
}
}
|