標題: 基于51單片機實現(xiàn)多路熱電偶測溫設計 [打印本頁]
作者: zdg0702 時間: 2018-6-20 22:35
標題: 基于51單片機實現(xiàn)多路熱電偶測溫設計
在本文中,主要說明單片機與K型熱電偶以及K型熱電偶模數(shù)轉(zhuǎn)換器—MAX6675的組合,形成單片機的溫度檢測系統(tǒng)。
自動化工程訓練課程設計
目 錄
緒論
方案論證
2.1溫度采集方案
2.2顯示界面方案
系統(tǒng)整體設計
3.1 系統(tǒng)總體分析
3.2設計原理
各個元器件及芯片簡介
4.1 AT89C51單片機介紹
4.2 K型熱電偶簡介
4.3 MAX6675簡介
4.4 LCD12864簡介
各部分電路設計
5.1溫度采集電路
5.2數(shù)據(jù)處理電路
5.3溫度顯示電路
5.4超限報警電路
心得體會
附錄1 硬件仿真圖與運行效果展示
附錄2 軟件代碼
第一章 緒論
在工業(yè)生產(chǎn)中,需要檢測工藝生產(chǎn)線的溫度,而且這個溫度范圍還很大。該系統(tǒng)采集主要以Atmel公司的AT89C51單片機為控制處理核心,由它完成對數(shù)據(jù)的采集處理以及控制數(shù)據(jù)的無線傳輸。AT89C51單片機是一種低功耗/低電壓/高性能的8位單片機,片內(nèi)帶有一個8KB的可編程/可擦除/只讀存儲器。無線收發(fā)一體數(shù)傳MODEM模塊PTR2000芯片性能優(yōu)異,在業(yè)界居領先水平,它的顯著特點是所需外圍元件少,因而設計非常方便。因此用來設計工業(yè)溫度檢測系統(tǒng)相當?shù)暮线m。
在本文中,主要說明單片機與K型熱電偶以及K型熱電偶模數(shù)轉(zhuǎn)換器—MAX6675的組合,形成單片機的溫度檢測系統(tǒng)。包括:如何針對系統(tǒng)的需求選擇合適的溫度檢測器件,如何根據(jù)選擇的器件設計外圍電路和單片機的接口電路,如何編寫控制溫度檢測器件進行數(shù)據(jù)傳輸?shù)膯纹瑱C程序,并簡要介紹數(shù)字溫度傳感器MAX6675的應用。
第二章 方案論證
2.1溫度采集方案
方案一:模擬溫度傳感器。采用熱敏電阻,將溫度值轉(zhuǎn)換為電壓值,經(jīng)運算放大器放大后送A/D轉(zhuǎn)換器將模擬信號變換為數(shù)字信號,再由單片機經(jīng)過比較計算得到溫度值。優(yōu)點:應用廣泛,特別是工程領域,采用不同的熱敏電阻,可實現(xiàn)低溫到超高溫的測量。缺點:必須采用高速高位A/D轉(zhuǎn)換器,系統(tǒng)復雜,成本高,還以引進非線性誤差,得通過軟件差值修正
方案二:采用集成數(shù)字溫度傳感器DS18B20。該傳感器采用單總線接口,能方便的與單片機通信。測溫范圍從-55到+125,測溫精度9-12位可調(diào),12位時最大轉(zhuǎn)換時間為750ms,但是不滿足本設計的要求。缺點:不能實現(xiàn)高溫測量。
方案三:采用K型熱電偶與K型熱電偶模數(shù)轉(zhuǎn)換器—MAX6675的組合,該組合采用單總線接口,能方便的與單片機通信,測量范圍從0到+1050度,測溫精度為12位,完全滿足本設計的要求,因此采用此方案。
2.2顯示界面方案
方案一:用數(shù)碼管顯示,優(yōu)點:結(jié)構(gòu)簡單,成本低。缺點:只能顯示一測量點和有限的符號。
方案二:采用LCD12864顯示?梢詫崿F(xiàn)中英文操作提示,方便人機交換。能同時顯示多點溫度值,使用方便,而且價格適中,本系統(tǒng)設計為多點溫度采集情況可以采用。
第三章 系統(tǒng)總體設計
3.1 系統(tǒng)總體分析
本系統(tǒng)采用的是K型熱電偶采集溫度,因此本設計有溫度采集部分,數(shù)據(jù)處理部分,溫度顯示部分,故障顯示并顯示部分組成。AT89C51單片機以及單片機的外圍電路由晶振電路,復位電路,溫度采集電路,溫度顯示電路,超限報警電路組成。系統(tǒng)設計框圖如下:
系統(tǒng)設計框圖
3.2設計原理
溫度采集部分
先使用K型熱電偶對環(huán)境溫度進行檢查,再經(jīng)過K型熱電偶模數(shù)轉(zhuǎn)換器—MAX6675,進行溫度轉(zhuǎn)換,將環(huán)境溫度轉(zhuǎn)換成12位二進制數(shù)據(jù)采集進單片機,以便單片機進行數(shù)據(jù)處理。在本系統(tǒng)中,由于是8路溫度采集,因此使用串行的方式,依次對8路溫度進行采集,并用單片機的P2口來傳輸與反饋數(shù)據(jù)。
數(shù)據(jù)處理部分
利用算法,在單片機中對采集到的數(shù)據(jù)進行處理,并轉(zhuǎn)換成百、十、個位通過P0口進行輸出。
溫度顯示部分
通過調(diào)用LCD的顯示函數(shù),將溫度以兩列的方式實時地顯示在LCD上。
超限報警部分
通過軟件算法,檢測8度的溫度是否在100度到999度的范圍內(nèi),一旦超過這個范圍,這進行故障報警,并在LCD上顯示“超溫”或者“低溫”,并且同時通過蜂鳴器以及LED燈,來進行聲光報警。
第四章 各個元器件及芯片簡介
4.1 AT89C51單片機介紹
AT89C51單片機簡介
AT89C51是一種帶4K字節(jié)閃爍可編程可擦除只讀存儲器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低電壓,高性能CMOS8位微處理器,俗稱單片機。單片機的可擦除只讀存儲器可以反復擦除100次。該器件采用ATMEL高密度非易失存儲器制造技術制造,與工業(yè)標準的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃爍存儲器組合在單個芯片中,ATMEL的AT89C51是一種高效微控制器,AT89C2051是它的一種精簡版本。

- 主要特性:
1、與MCS-51 兼容 2、4K字節(jié)可編程閃爍存儲器 3、1000寫/擦循環(huán)數(shù)據(jù)保留時間10年 4、全靜態(tài)工作,0Hz-24Hz·三級程序存儲器鎖定 5、128*8位內(nèi)部RAM32可編程I/O線 6、兩個16位定時器/計數(shù)器 7、5個中斷源 8、可編程串行通道低功耗的閑置和掉電模式 9、片內(nèi)振蕩器和時鐘電路
2.主要管腳說明:
P0口:P0口為一個8位漏級開路雙向I/O口,每腳可吸收8TTL門電流。當P1口的管腳第一次寫1時,被定義為高阻輸入。P0能夠用于外部程序數(shù)據(jù)存儲器,它可以被定義為數(shù)據(jù)/地址的第八位。 P1口:P1口是一個內(nèi)部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1后,被內(nèi)部上拉為高,可用作輸入,P1口被外部下拉為低電平時,將輸出電流,這是由于內(nèi)部上拉的緣故。P2口:P2口為一個內(nèi)部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個TTL門電流,當P2口被寫“1”時,其管腳被內(nèi)部上拉電阻拉高,且作為輸入。并因此作為輸入時,P2口的管腳被外部拉低,將輸出電流。P2口當用于外部程序存儲器或16位地址外部數(shù)據(jù)存儲器進行存取時,P2口輸出地址的高八位。P3口:P3口管腳是8個帶內(nèi)部上拉電阻的雙向I/O口,可接收輸出4個TTL門電流。當P3口寫入“1”后,它們被內(nèi)部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。
4.2 K型熱電偶簡介
K型熱電偶作為一種溫度傳感器,K型熱電偶通常和顯示儀表,記錄儀表和電子調(diào)節(jié)器配套使用。K型熱電偶可以直接測量各種生產(chǎn)中從0℃到1300℃范圍的液體蒸汽和氣體介質(zhì)以及固體的表面溫度。K型熱電偶通常由感溫元件、安裝固定裝置和接線盒等主要部件組成,K型熱電偶是目前用量最大的廉金屬熱電偶,其用量為其他熱電偶的總和。K型熱電偶絲直徑一般為1.2~4.0mm。K型熱電偶具有線性度好,熱電動勢較大,靈敏度高,穩(wěn)定性和均勻性較好,抗氧化性能強,價格便宜等優(yōu)點,能用于氧化性惰性氣氛中廣泛為用戶所采用。 熱電偶測溫由熱電偶、連接導線及顯示儀表三部分組成。如果將熱電偶的熱端加熱,使得冷、熱兩端的溫度不同,則在該熱電偶回路中就會產(chǎn)生熱電勢,這種物理現(xiàn)象就稱為熱電現(xiàn)象(即熱電效應)。在熱電偶回路中產(chǎn)生的電勢由溫差電勢和接觸電勢兩部分組成。接觸電勢:它是兩種電子密度不同的導體相互接觸時產(chǎn)生的一種熱電勢。當兩種不同的導體A和B相接觸時,假設導體A和B的電子密度分別為NA和NB并且NA>NB,則在兩導體的接觸面上,電子在兩個方向的擴散率就不相同,由導體A擴散到導體B的電子數(shù)比從B擴散到A的電子數(shù)要多。導體A失去電子而顯正電,導體B獲得電子而顯負電。因此,在A、B兩導體的接觸面上便形成一個由A到B的靜電場,這個電場將阻礙擴散運動的繼續(xù)進行,同時加速電子向相反方向運動,使從B到A的電子數(shù)增多,最后達到動態(tài)平衡狀態(tài)。此時A、B之間也形成一電位差,這個電位差稱為接觸電勢。此電勢只與兩種導體的性質(zhì)相接觸點的溫度有關,當兩種導體的材料一定,接觸電勢僅與其接點溫度有關。溫度越高,導體中的電子就越活躍,由A導體擴散到B導體的電子就越多,接觸面處所產(chǎn)生的電動勢就越大,即接觸電勢越大。
4.3 MAX6675簡介
熱電偶作為一種主要的測溫元件,具有結(jié)構(gòu)簡單、制造容易、使用方便、測溫范圍寬、測溫精度高等特點。但是將熱電偶應用在基于單片機的嵌入式系統(tǒng)領域時,卻存在著以下幾方面的問題。
- 線性:熱電偶輸出熱電勢與溫度之間的關系為非線性關系,因此在應用時必須進行線性化處理。
- 冷補償:熱電偶輸出的熱電勢為冷端保持為0℃時與測量端差值,而在實際應用中冷端的溫度是隨著環(huán)境溫度而變化的,故需要進行冷端補
- 數(shù)字化輸出與嵌入式系統(tǒng)接口必然要采用數(shù)字化輸出及數(shù)字化接口,而作為模擬小信號測溫元件的熱電偶顯然無法直接滿足這個要求。
因此, 若將熱電偶應用于嵌入式系統(tǒng)時, 須進行復雜的信號放大、AD轉(zhuǎn)換、查表線性化、溫度補償及數(shù)字化輸出接口等軟硬件設計。如果能將上述的功能集成到一個集成電路芯片中, 即采用單芯片來完成信號放大、冷端補償、線性化及數(shù)字化輸出功能, 則將大大簡化熱電偶在嵌入式領域的應用設計。
MAX6675性能及結(jié)構(gòu)
Maxim公司新近推出的MAX6675是一復雜的單片熱電偶數(shù)字轉(zhuǎn)換器, 內(nèi)部具有信號調(diào)節(jié)放大器、12位的模擬數(shù)字化熱電偶轉(zhuǎn)換器、冷端補償傳感和校正、數(shù)字控制器、1個SPI兼容接口和1個相關的邏輯控制。MAX6675內(nèi)部集成有冷端補償電路;帶有簡單的3位串行SPI接口;可將溫度信號轉(zhuǎn)換成12位數(shù)字量,溫度分辨率達0.25℃;內(nèi)含熱電偶斷線檢測電路。冷端補償?shù)臏囟确秶?20℃~80℃,它的溫度分辨能力為0. 25 ℃,可以測量0℃~1023.75℃的溫度,工作電壓為3. 0~5. 5V。 MAX6675的主要特性如下: ①簡單的SPI串行口溫度值輸出; ②0℃~+1024℃的測溫范圍; ③12位0.25℃的分辨率; ④片內(nèi)冷端補償; ⑤高阻抗差動輸入; ⑥熱電偶斷線檢測; ⑦單一+5V的電源電壓; ⑧低功耗特性; ⑨工作溫度范圍-20℃~+85℃; ⑩2000V的ESD信號。
該器件采用8引腳SO帖片封裝。引腳排列如圖1所示,引腳功能如下表所列。


MAX6675的工作原理與功能
根據(jù)熱電偶測溫原理,熱電偶的輸出熱電勢不僅與測量端的溫度有關,而且與冷端的溫度有關,使用硬件電路進行冷端補償時,雖能部分改善測量精度,但由于熱電偶使用環(huán)境的不同及硬件電路本身的局限性,效果并不明顯;而使用軟件補償,通常是使用微處理機表格法或線性電路等方法來減小熱電偶本身非線性帶來的測量誤差,但同時也增加了程序編制及調(diào)試電路的難度。MAX6675對其內(nèi)部元器件參數(shù)進行了激光修正,從而對熱電偶的非線性進行了內(nèi)部修正。同時,MAX6675內(nèi)部集成的冷端補償電路、非線性校正電路、斷偶檢測電路都給K型熱電偶的使用帶來了極大方便,其工作原理如圖2所示。

(1) 溫度變換
MAX6675內(nèi)部具有將熱電偶信號轉(zhuǎn)換為與ADC輸入通道兼容電壓的信號調(diào)節(jié)放大器,T+和T-輸入端連接到低噪聲放大器A1,以保證檢測輸入的高精度,同時是熱電偶連接導線與干擾源隔離。熱電偶輸出的熱電勢經(jīng)低噪聲放大器A1放大,再經(jīng)過A2電壓跟隨器緩沖后,送至ADC的輸入端。在將溫度電壓值轉(zhuǎn)換為相等價的溫度值之前,它需要對熱電偶的冷端進行補償,冷端溫度即是MAX6675周圍溫度與0℃實際參考值之間的差值。對于K型熱電偶, 電壓變化率為41µ/℃, 電壓可由線性公式Vout=(41µ/℃)×(tR-tAMB)來近似熱電偶的特性。上式中, Vout為熱電偶輸出電壓(mV), tR是測量點溫度,tAMB是周圍溫度。
(2)冷端補償
熱電偶的功能是檢測熱、冷兩端溫度的差值,熱電偶熱節(jié)點溫度可在0℃~+1023.75℃范圍變化。冷端即安裝MAX6675的電路板周圍溫度,比溫度在-20℃~+85℃范圍內(nèi)變化。當冷端溫度波動時,MAX6675仍能精確檢測熱端的溫度變化。
(3) 熱補償
在測溫應用中,芯片自熱將降低MAX6675溫度測量精度,誤大小依賴于MAX6675封裝的熱傳導性、安裝技術和通風效果。為降低芯片自熱引起的測量誤差,可在布線時使用大面積接地技術提高MAX6675溫度測量精度。
(4) 噪聲補償
MAX6675的測量精度對電源耦合噪聲較敏感。為降低電源噪聲影響,可在MAX6675的電源引腳附近接入1只0.1μF陶瓷旁路電容。
(5)測量精度的提高
熱電偶系統(tǒng)的測量精度可通過以下預防措施來提高:①盡量采用不能從測量區(qū)域散熱的大截面導線;②如必須用小截面導線,則只能應用在測量區(qū)域,并且在無溫度變化率區(qū)域用擴展導線;③避免受能拉緊導線的機械擠壓和振動;④當熱電偶距離較遠時,應采用雙絞線作熱電偶連線;⑤在溫度額定值范圍內(nèi)使用熱電偶導線;⑥避免急劇溫度變化;⑦在嚴劣環(huán)境中,使用合適的保護套以保證熱電偶導線;⑧僅在低溫和小變化率區(qū)域使用擴展導線;⑨保持熱電偶電阻的事件
(6) SPI串行接口
MAX6675采用標準的SPI串行外設總線與MCU接口,且MAX6675只能作為從設備。MAX6675 SO端輸出溫度數(shù)據(jù)的格式如圖3所示,MAX6675 SPI接口時序如圖4所示。MAX6675從SPI串行接口輸出數(shù)據(jù)的過程如下:MCU使CS變低并提供時鐘信號給SCK,由SO讀取測量結(jié)果。CS變低將停止任何轉(zhuǎn)換過程;CS變高將啟動一個新的轉(zhuǎn)換過程。一個完整串行接口讀操作需16個時鐘周期,在時鐘的下降沿讀16個輸出位,第1位和第15位是一偽標志位,并總為0;第14位到第3位為以MSB到LSB順序排列的轉(zhuǎn)換溫度值;第2位平時為低,當熱電偶輸入開放時為高,開放熱電偶檢測電路完全由MAX6675實現(xiàn),為開放熱電偶檢測器操作,T-必須接地,并使能地點盡可能接近GND腳;第1位為低以提供MAX6675器件身份碼,第0位為三態(tài)。


4.4 LCD12864簡介
帶中文字庫的128X64 是一種具有4 位/8 位并行、2 線或3 線串行多種接口方式,內(nèi)部含有國標一級、二級簡體 中文字庫的點陣圖形液晶顯示模塊;其顯示分辨率為128×64, 內(nèi)置8192 個16*16 點漢字,和128 個16*8 點ASCII 字符 集.利用該模塊靈活的接口方式和簡單、方便的操作指令,可構(gòu)成全中文人機交互圖形界面?梢燥@示8×4 行16×16 點 陣的漢字. 也可完成圖形顯示.低電壓低功耗是其又一顯著特點。由該模塊構(gòu)成的液晶顯示方案與同類型的圖形點陣液晶 顯示模塊相比,不論硬件電路結(jié)構(gòu)或顯示程序都要簡潔得多,且該模塊的價格也略低于相同點陣的圖形液晶模塊。
第五章 各部分電路設計
5.1溫度采集電路
5.1.1硬件部分
該部分為8路溫度采集,采用K型熱電偶與K型熱電偶模數(shù)轉(zhuǎn)換器—MAX6675互相搭配的方式,如下圖所示:
以其中一路為例,MAX6675的冷熱接收端分別于熱電偶的冷熱端相連,其串行數(shù)據(jù)輸出端分別與單片機的P2口相連,如下圖所示:
之后MAX6675的時鐘信號端以及使能端分別與P1.0和P1.1端相連,如下圖所示:
以上就是整個溫度采集部分的硬件接線圖
5.1.2軟件部分
由于MAX6675采用的是12位二進制的串行數(shù)據(jù)輸出的方式,而且,其有效的數(shù)據(jù)分別在3~~14位,因此需要進行串行數(shù)據(jù)的移位操作,以下為部分軟件算法:
for(i=0;i<16;i++)
{ Temp_1<<=1;
_nop_();
SCK=1;
if(SO1==1){Temp_1=Temp_1|0x01;}
else Temp_1=Temp_1|0x00;
_nop_();
SCK=0;
_nop_();
}
Temp_1=Temp_1<<1;
Temp_1=Temp_1>>4;
Temp_1=Temp_1*1024/4096;
以上算法把數(shù)據(jù)左移移一位,然后再右移四位,從而得到完整的12位二進制溫度數(shù)據(jù)。
5.2數(shù)據(jù)處理電路
5.2.1硬件部分
該部分數(shù)據(jù)處理主要在單片機內(nèi)部進行,并且將處理后的數(shù)據(jù)從P0口輸出到LCD進行顯示,如下圖所示:
5.2.2軟件部分
將處理后的數(shù)據(jù)分別處理成百、十、個位進行輸出,以下為部分軟件算法:
if(wendu1<=999&&wendu1>=100)
{
guzhang_flag1=0;
ge1=temp1%10;
temp1=temp1/10;
shi1=temp1%10;
bai1=temp1/10;
}
通過以上算法,就可以將數(shù)據(jù)分解成百、十、個,從而方便地在LCD上顯示。5.3溫度顯示電路
5.3.1硬件部分
該部分是通過LCD進行對溫度數(shù)據(jù)的顯示其使能端與P1口相連,數(shù)據(jù)輸入端與P0口相連,如下圖所示:
通過以上的連接,可以實現(xiàn)單片機對LCD的控制以及溫度數(shù)據(jù)的顯示。
5.3.2軟件部分
LCD上的漢字以及數(shù)據(jù),都需要使用相應的字模軟件來對漢字和數(shù)據(jù)進行編碼,并存儲在相應的數(shù)組中,通過相應的函數(shù)調(diào)用,將所需顯示的數(shù)據(jù),按照相應的格式顯示在LCD上,以下為部分軟件算法:
- 漢字顯示函數(shù):
- void Display_HZ(uchar screen,uchar page,uchar column,uchar *p)
- {
- uchar i;
- SelectScreen(screen);
- Set_page(page); //寫上半頁:16*8
- Set_column(column*16); //控制列
- for(i=0;i<16;i++) //控制16列的數(shù)據(jù)輸出,左右各64個點,可顯示4個漢字
- {
- write_LCD_data(p[i]); //漢字的上半部分
- }
- Set_page(page+1); //寫下半頁:16*8
- Set_column(column*16); //控制列
- for(i=0;i<16;i++) //控制16列的數(shù)據(jù)輸出
- {
- write_LCD_data(p[i+16]); //漢字的下半部分
- }
- }
- 數(shù)字顯示函數(shù):
- void Display_ASCII(uchar screen,uchar page,uchar column,uchar *p) //左右各64個點,可顯示8個字符
- {
- uchar i;
- SelectScreen(screen);
- Set_page(page);
- Set_column(column);
- for(i=0;i<8;i++) //顯示字符上半部分:8*8
- {
- write_LCD_data(p[i]);
- }
- Set_page(page+1); //顯示字符下半部分:8*8
- Set_column(column);
- for(i=0;i<8;i++)
- {
- write_LCD_data(p[i+8]);
- }
- }
- 調(diào)用方式如下:
- Display_HZ(1,0,2,huan);
- Display_HZ(1,0,3,ying);
- Display_ASCII(1,0,0*8,shuzi[10]);
- Display_ASCII(1,0,1*8,shuzi[1]);
- 以下為LCD顯示函數(shù)部分:(以1路為例)
- void Disp_temp()
- {
- temp1=wendu1;
- if(wendu1<=999&&wendu1>=100)
- {
- guzhang_flag1=0;
- ge1=temp1%10;
- temp1=temp1/10;
- shi1=temp1%10;
- bai1=temp1/10;
- Display_ASCII(1,0,4*8,shuzi[bai1]);
- Display_ASCII(1,0,5*8,shuzi[shi1]);
- Display_ASCII(1,0,6*8,shuzi[ge1]);
- Display_ASCII(1,0,7*8,shuzi[12]);
- }
- else if(wendu1>999)
- {
- guzhang_flag1=1;
- Display_HZ(1,0,2,chao);
- Display_HZ(1,0,3,wen);
-
- }
- else if(wendu1<100)
- {
- guzhang_flag1=1;
- Display_HZ(1,0,2,di);
- Display_HZ(1,0,3,wen);
-
- }
復制代碼
通過以上的軟件算法,可以直觀的以兩列的方式顯示8路溫度的數(shù)值,并且當出現(xiàn)溫度超限時,還會出現(xiàn)文字提示報警。
5.4超限報警電路
5.4.1硬件部分
該部分硬件上由于是聲光報警,因此需要蜂鳴器和LED燈,分別將這兩個部件連接至P1.2和P3.4口,對其進行控制,如下圖:
5.4.2軟件部分
通過設立超限標志位,當出現(xiàn)超限時,對標志位進行置位,并通過判斷標志位,來判斷是否出現(xiàn)超限,并報警,部分軟件算法如下:
if(guzhang_flag1==1||guzhang_flag2==1||guzhang_flag3==1||guzhang_flag4==1||guzhang_flag5==1||guzhang_flag6==1||guzhang_flag7==1||guzhang_flag8==1)
{
SOUND=1;
LED=1;
}
elseif(guzhang_flag1==0&&guzhang_flag2==0&&guzhang_flag3==0&&guzhang_flag4==0&&guzhang_flag5==0&&guzhang_flag6==0&&guzhang_flag7==0&&guzhang_flag8==0)
{
SOUND=0;
LED=0;
}
通過以上的軟硬件結(jié)合,就能夠順利的實現(xiàn)超限報警功能。
第六章 心得體會
通過這次工程訓練課程設計,自己對理論知識的掌握有了更加深刻的體會。記得剛開始拿到題目時,到網(wǎng)上搜索了一下,發(fā)現(xiàn)有很多溫度檢測的課程設計,心里還曾經(jīng)暗暗地慶幸自己選了一個容易的題目,但是到后面做的時候,在發(fā)現(xiàn)老師給我們挖了一個坑。首先,網(wǎng)上的資料沒有這么寬的溫度檢測范圍,其次就算有個別符合要求的溫度范圍,也只是一路的溫度檢測。
所以,在前期的設計中,自己真的是遇到了問題,不過,功夫不負有心人。我先一個模塊,一個模塊的調(diào)試,首先需要解決的是溫度檢測范圍的問題,因此經(jīng)過一番查找,終于發(fā)現(xiàn)了MAX6675這個神奇的東西,得意解決了范圍問題。然后就是多路溫度檢測的問題,我先檢測一路是否可行,后面發(fā)現(xiàn)一路確實可行,最后延伸到八路,反復的調(diào)整數(shù)據(jù),終于解決了多路的問題。
最后是顯示,還好自己曾經(jīng)使用過LCD12864,上手也比較容易。就是通過這樣一個模塊,一個模塊的調(diào)試,最終把這個有點坑的題目給解決了。在完成題目的那一刻,自己心中真的欣喜不已,當然其中還有一些不足,就是溫度檢測還會有一些誤差,溫度越高,誤差越大,不過都在5度以內(nèi),以工業(yè)要求,應該是可行的。還有就是如果有個上位機功能,系統(tǒng)功能會更加的實用一些。
總的來說,這次課設還是順利地完成了,盡管其中還有一些不足,但是自己在單片機方面也進步了許多,希望在今后的學習生活中,能夠不斷地進步,最后感謝老師給我這次進步的機會,謝謝。
附錄1 硬件仿真圖
附錄2 軟件代碼
以下是軟件部分的結(jié)構(gòu)截圖,讀者只需將相應的的軟件部分復制,按截圖的結(jié)構(gòu)來搭構(gòu),就能組成一個完整的軟件部分。當然由于時間倉促,還有不足的地方,望讀者改進。
main.c部分是主程序部分,對溫度數(shù)據(jù)進行處理并換算,如下:
main.c
(見附件)
hz.h存放的是12864需要顯示的各數(shù)據(jù)的字模信息,如果讀者需要修改字模信息,推薦使用LCD點陣提取工具zimo221,不過需要注意,這個字模提取工具下載安裝之后,需要設置一下,如下圖:(一定要這么設置,才不會顯示亂碼,注意!。。
hz.h
- unsigned char code shuzi[13][16]={/*-- 文字: 0 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
- 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
-
- /*-- 文字: 1 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
- 0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,
-
- /*-- 文字: 2 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
- 0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,
-
- /*-- 文字: 3 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
- 0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,
-
- /*-- 文字: 4 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
- 0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,
-
- /*-- 文字: 5 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
- 0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,
-
- /*-- 文字: 6 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
- 0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,
-
- /*-- 文字: 7 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
- 0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,
-
- /*-- 文字: 8 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
- 0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,
-
- /*-- 文字: 9 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
- 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,
-
- /*-- 文字: < --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
- 0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,
-
- /*-- 文字: > --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
- 0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00,
-
- /*-- 文字: --*/ //空格
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- };
-
- unsigned char code huan[]={
- /*-- 文字: 歡 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
- 0x04,0x24,0x44,0x84,0x64,0x9C,0x40,0x30,0x0F,0xC8,0x08,0x08,0x28,0x18,0x00,0x00,
- 0x10,0x08,0x06,0x01,0x82,0x4C,0x20,0x18,0x06,0x01,0x06,0x18,0x20,0x40,0x80,0x00,};
- unsigned char code ying[]={
- /*-- 文字: 迎 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
- 0x40,0x40,0x42,0xCC,0x00,0x00,0xFC,0x04,0x02,0x00,0xFC,0x04,0x04,0xFC,0x00,0x00,
- 0x00,0x40,0x20,0x1F,0x20,0x40,0x4F,0x44,0x42,0x40,0x7F,0x42,0x44,0x43,0x40,0x00,};
- unsigned char code shi[]={
- /*-- 文字: 使 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
- 0x80,0x60,0xF8,0x07,0x04,0xE4,0x24,0x24,0x24,0xFF,0x24,0x24,0x24,0xE4,0x04,0x00,
- 0x00,0x00,0xFF,0x00,0x80,0x81,0x45,0x29,0x11,0x2F,0x41,0x41,0x81,0x81,0x80,0x00,};
- unsigned char code yong[]={
- /*-- 文字: 用 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
- 0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,0x00,
- 0x80,0x60,0x1F,0x02,0x02,0x02,0x02,0x7F,0x02,0x02,0x42,0x82,0x7F,0x00,0x00,0x00,
- };
- unsigned char code zhi[]={
- /*-- 文字: 智 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
- 0x10,0x94,0x53,0x32,0x1E,0x32,0x52,0x10,0x00,0x7E,0x42,0x42,0x42,0x7E,0x00,0x00,
- 0x00,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00,0x00,};
- unsigned char code neng[]={
- /*-- 文字: 能 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
- 0x08,0xCC,0x4A,0x49,0x48,0x4A,0xCC,0x18,0x00,0x7F,0x88,0x88,0x84,0x82,0xE0,0x00,
- 0x00,0xFF,0x12,0x12,0x52,0x92,0x7F,0x00,0x00,0x7E,0x88,0x88,0x84,0x82,0xE0,0x00,
- };
- unsigned char code wen[]={
- /*-- 文字: 溫 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
- 0x10,0x60,0x02,0x8C,0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,
- 0x04,0x04,0x7E,0x01,0x40,0x7E,0x42,0x42,0x7E,0x42,0x7E,0x42,0x42,0x7E,0x40,0x00,};
- unsigned char code du[]={
- /*-- 文字: 度 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
- 0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0x25,0x26,0x24,0xFC,0x24,0x24,0x24,0x04,0x00,
- 0x40,0x30,0x8F,0x80,0x84,0x4C,0x55,0x25,0x25,0x25,0x55,0x4C,0x80,0x80,0x80,0x00,
- };
- unsigned char code jian[]={
- /*-- 文字: 檢 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
- 0x10,0x10,0xD0,0xFF,0x90,0x50,0x20,0x50,0x4C,0x43,0x4C,0x50,0x20,0x40,0x40,0x00,
- 0x04,0x03,0x00,0xFF,0x00,0x41,0x44,0x58,0x41,0x4E,0x60,0x58,0x47,0x40,0x40,0x00,
- };
- unsigned char code ce[]={
- /*-- 文字: 測 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
- 0x10,0x60,0x02,0x8C,0x00,0xFE,0x02,0xF2,0x02,0xFE,0x00,0xF8,0x00,0xFF,0x00,0x00,
- 0x04,0x04,0x7E,0x01,0x80,0x47,0x30,0x0F,0x10,0x27,0x00,0x47,0x80,0x7F,0x00,0x00,
- };
- unsigned char code xi[]={
- /*-- 文字: 系 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
- 0x00,0x00,0x22,0x32,0x2A,0xA6,0xA2,0x62,0x21,0x11,0x09,0x81,0x01,0x00,0x00,0x00,
- 0x00,0x42,0x22,0x13,0x0B,0x42,0x82,0x7E,0x02,0x02,0x0A,0x12,0x23,0x46,0x00,0x00,};
- unsigned char code tong[]={
- /*-- 文字: 統(tǒng) --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
- 0x20,0x30,0xAC,0x63,0x30,0x00,0x88,0xC8,0xA8,0x99,0x8E,0x88,0xA8,0xC8,0x88,0x00,
- 0x22,0x67,0x22,0x12,0x12,0x80,0x40,0x30,0x0F,0x00,0x00,0x3F,0x40,0x40,0x71,0x00,
- };
- unsigned char code zhi1[]={
- /*-- 文字: 制 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
- 0x40,0x50,0x4E,0x48,0x48,0xFF,0x48,0x48,0x48,0x40,0xF8,0x00,0x00,0xFF,0x00,0x00,
- 0x00,0x00,0x3E,0x02,0x02,0xFF,0x12,0x22,0x1E,0x00,0x0F,0x40,0x80,0x7F,0x00,0x00,
- };
- unsigned char code zuo[]={
- /*-- 文字: 作 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
- 0x00,0x80,0x60,0xF8,0x07,0x40,0x30,0x0F,0xF8,0x88,0x88,0x88,0x88,0x08,0x08,0x00,
- 0x01,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x08,0x08,0x08,0x08,0x08,0x00,0x00,
- };
- unsigned char code zhe[]={
- /*-- 文字: 者 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
- 0x20,0x20,0x24,0x24,0x24,0x24,0xBF,0x64,0x24,0x34,0x28,0x24,0x22,0x20,0x20,0x00,
- 0x10,0x08,0x04,0x02,0xFF,0x49,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00,0x00,
- };
- unsigned char code li[]={
- /*-- 文字: 黎 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
- 0x00,0x48,0x2A,0x1A,0x7E,0x19,0xA9,0x40,0xA4,0x13,0x0A,0x26,0x42,0x3E,0x00,0x00,
- 0x04,0x04,0x42,0x22,0x15,0x49,0x80,0x7E,0x00,0x09,0x15,0x22,0x42,0x04,0x04,0x00,
-
- };
- unsigned char code yi[]={
- /*-- 文字: 毅 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
- 0x20,0x24,0xAC,0x75,0xA6,0x34,0x2C,0xA4,0xA0,0x9E,0x82,0x82,0x9E,0xA0,0x20,0x00,
- 0x49,0x49,0x24,0x52,0x89,0x7F,0x05,0x98,0x80,0x43,0x2C,0x10,0x2C,0x43,0x80,0x00,
-
- };
- unsigned char code gang[]={
- /*-- 文字: 剛 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
- 0x00,0xFE,0x12,0x62,0x82,0x72,0x02,0xFE,0x00,0x00,0xF8,0x00,0x00,0xFF,0x00,0x00,
- 0x00,0xFF,0x08,0x06,0x01,0x4E,0x80,0x7F,0x00,0x00,0x0F,0x40,0x80,0x7F,0x00,0x00,
- };
- unsigned char code fuhao[]={
- /*-- 文字: — --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
- 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- };
- unsigned char code chao[]={
- /*-- 文字: 超 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
- 0x40,0x48,0x48,0x48,0xFF,0x48,0x48,0x42,0xA2,0x9E,0x82,0xA2,0xC2,0xBE,0x00,0x00,
- 0x80,0x60,0x1F,0x20,0x7F,0x44,0x44,0x40,0x4F,0x48,0x48,0x48,0x48,0x4F,0x40,0x00,
- };
- unsigned char code di[]={
- /*-- 文字: 低 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
- 0x00,0x80,0x60,0xF8,0x07,0x00,0xFC,0x84,0x84,0x84,0xFE,0x82,0x83,0x82,0x80,0x00,
- 0x01,0x00,0x00,0xFF,0x00,0x00,0xFF,0x40,0x20,0x00,0x41,0x8E,0x30,0x40,0xF8,0x00,
-
- };
復制代碼
12864.h里面定義的是LCD12864的顯示函數(shù),具體怎么應用,讀者可以好好看一下,如下:
12864.h
- #define uint unsigned int
- #define uchar unsigned char
- #define LCD_DB P0 //數(shù)據(jù)口
- sbit CS1=P1^4; //0左半屏
- sbit CS2=P1^5; //0右半屏
- sbit RS=P1^6; //0命令,1數(shù)據(jù)
- sbit RW=P1^7; //0讀,1寫
- sbit EN=P1^3; //使能
- …………
- …………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼完整的Word格式文檔51黑下載地址(含完整源碼):
作者: remon 時間: 2019-2-7 11:09
mark!
作者: ylbjrzbl 時間: 2019-3-15 17:16
我試著跑了一下你的程序和電路,不行啊
作者: woyaodwn 時間: 2019-3-28 10:30
這個能正常運行嗎
作者: guoyanyan25 時間: 2022-1-21 15:32
小伙子搞得不錯,看好你
歡迎光臨 (http://www.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |