在日常生活中,需要檢測人員的體溫,而且這個溫度范圍很小。該系統采集主要以Atmel公司的AT89C51單片機為控制處理核心,由它完成對數據的采集處理以及控制數據在LCD顯示屏上的顯示。AT89C51單片機是一種低功耗/低電壓/高性能的8位單片機,片內帶有一個8KB的可編程/可擦除/只讀存儲器。
在本文中,主要說明單片機與K型熱電偶以及K型熱電偶模數轉換器—MAX6675的組合,形成單片機的溫度檢測系統。包括:如何根據選擇的器件設計外圍電路和單片機的接口電路,如何編寫控制溫度檢測器件進行數據傳輸的單片機程序,如何使用LCD12864進行字符的顯示,并簡要介紹數字溫度傳感器MAX6675的應用。
1 系統總體方案設計
1.1 工作原理
1.2 總體設計方案
2 系統硬件設計
2.1 信號采集電路
2.1.1 傳感器
2.2 單片機系統電路
2.3 人機交互電路
2.4 溫度顯示電路
3 仿真電路及硬件分析
4 系統軟件設計
4.1 軟件設計思路
4.2 程序流程圖
4.3 主要程序代碼
5 實驗結果顯示
6 附錄及元器件清單
6.1 所用相關軟件
6.2 元器件清單
統總體方案設計
1.1 工作原理熱電堆基本原理 熱電堆是一種熱釋紅外線傳感器,它是由熱電偶構成的一種器件。它在耳式體溫計、放射溫度計、電烤爐、食品溫度檢測等領域中,作為溫度檢測器件獲得了廣泛的應用。熱電堆的組成基本單元--熱電偶。 K型熱電偶作為一種溫度傳感器,K型熱電偶通常和顯示儀表,記錄儀表和電子調節器配套使用。K型熱電偶可以直接測量各種生產中從0℃到1300℃范圍的液體蒸汽和氣體介質以及固體的表面溫度。K型熱電偶通常由感溫元件、安裝固定裝置和接線盒等主要部件組成,K型熱電偶是目前用量最大的廉金屬熱電偶,其用量為其他熱電偶的總和。K型熱電偶絲直徑一般為1.2~4.0mm。K型熱電偶具有線性度好,熱電動勢較大,靈敏度高,穩定性和均勻性較好,抗氧化性能強,價格便宜等優點,能用于氧化性惰性氣氛中廣泛為用戶所采用。 熱電偶測溫由熱電偶、連接導線及顯示儀表三部分組成。如果將熱電偶的熱端加熱,使得冷、熱兩端的溫度不同,則在該熱電偶回路中就會產生熱電勢,這種物理現象就稱為熱電現象(即熱電效應)。在熱電偶回路中產生的電勢由溫差電勢和接觸電勢兩部分組成。接觸電勢:它是兩種電子密度不同的導體相互接觸時產生的一種熱電勢。當兩種不同的導體A和B相接觸時,假設導體A和B的電子密度分別為NA和NB并且NA>NB,則在兩導體的接觸面上,電子在兩個方向的擴散率就不相同,由導體A擴散到導體B的電子數比從B擴散到A的電子數要多。導體A失去電子而顯正電,導體B獲得電子而顯負電。因此,在A、B兩導體的接觸面上便形成一個由A到B的靜電場,這個電場將阻礙擴散運動的繼續進行,同時加速電子向相反方向運動,使從B到A的電子數增多,最后達到動態平衡狀態。此時A、B之間也形成一電位差,這個電位差稱為接觸電勢。此電勢只與兩種導體的性質相接觸點的溫度有關,當兩種導體的材料一定,接觸電勢僅與其接點溫度有關。溫度越高,導體中的電子就越活躍,由A導體擴散到B導體的電子就越多,接觸面處所產生的電動勢就越大,即接觸電勢越大。
MAX6675的工作原理與功能 根據熱電偶測溫原理,熱電偶的輸出熱電勢不僅與測量端的溫度有關,而且與冷端的溫度有關,使用硬件電路進行冷端補償時,雖能部分改善測量精度,但由于熱電偶使用環境的不同及硬件電路本身的局限性,效果并不明顯;而使用軟件補償,通常是使用微處理機表格法或線性電路等方法來減小熱電偶本身非線性帶來的測量誤差,但同時也增加了程序編制及調試電路的難度。MAX6675對其內部元器件參數進行了激光修正,從而對熱電偶的非線性進行了內部修正。同時,MAX6675內部集成的冷端補償電路、非線性校正電路、斷偶檢測電路都給K型熱電偶的使用帶來了極大方便,其工作原理如圖2所示。 (1) 溫度變換 MAX6675內部具有將熱電偶信號轉換為與ADC輸入通道兼容電壓的信號調節放大器,T+和T-輸入端連接到低噪聲放大器A1,以保證檢測輸入的高精度,同時是熱電偶連接導線與干擾源隔離。熱電偶輸出的熱電勢經低噪聲放大器A1放大,再經過A2電壓跟隨器緩沖后,送至ADC的輸入端。在將溫度電壓值轉換為相等價的溫度值之前,它需要對熱電偶的冷端進行補償,冷端溫度即是MAX6675周圍溫度與0℃實際參考值之間的差值。對于K型熱電偶, 電壓變化率為41μ/℃, 電壓可由線性公式Vout=(41μ/℃)×(tR-tAMB)來近似熱電偶的特性。上式中, Vout為熱電偶輸出電壓(mV), tR是測量點溫度,tAMB是周圍溫度。 (2)冷端補償 熱電偶的功能是檢測熱、冷兩端溫度的差值,熱電偶熱節點溫度可在0℃~+1023.75℃范圍變化。冷端即安裝MAX6675的電路板周圍溫度,比溫度在-20℃~+85℃范圍內變化。當冷端溫度波動時,MAX6675仍能精確檢測熱端的溫度變化。 (3) 熱補償 在測溫應用中,芯片自熱將降低MAX6675溫度測量精度,誤大小依賴于MAX6675封裝的熱傳導性、安裝技術和通風效果。為降低芯片自熱引起的測量誤差,可在布線時使用大面積接地技術提高MAX6675溫度測量精度。 (4) 噪聲補償 MAX6675的測量精度對電源耦合噪聲較敏感。為降低電源噪聲影響,可在MAX6675的電源引腳附近接入1只0.1μF陶瓷旁路電容。 (5)測量精度的提高 熱電偶系統的測量精度可通過以下預防措施來提高:①盡量采用不能從測量區域散熱的大截面導線;②如必須用小截面導線,則只能應用在測量區域,并且在無溫度變化率區域用擴展導線;③避免受能拉緊導線的機械擠壓和振動;④當熱電偶距離較遠時,應采用雙絞線作熱電偶連線;⑤在溫度額定值范圍內使用熱電偶導線;⑥避免急劇溫度變化;⑦在嚴劣環境中,使用合適的保護套以保證熱電偶導線;⑧僅在低溫和小變化率區域使用擴展導線;⑨保持熱電偶電阻的事件 (6) SPI串行接口 MAX6675采用標準的SPI串行外設總線與MCU接口,且MAX6675只能作為從設備。MAX6675 SO端輸出溫度數據的格式如圖3所示,MAX6675 SPI接口時序如圖4所示。MAX6675從SPI串行接口輸出數據的過程如下:MCU使CS變低并提供時鐘信號給SCK,由SO讀取測量結果。CS變低將停止任何轉換過程;CS變高將啟動一個新的轉換過程。一個完整串行接口讀操作需16個時鐘周期,在時鐘的下降沿讀16個輸出位,第1位和第15位是一偽標志位,并總為0;第14位到第3位為以MSB到LSB順序排列的轉換溫度值;第2位平時為低,當熱電偶輸入開放時為高,開放熱電偶檢測電路完全由MAX6675實現,為開放熱電偶檢測器操作,T-必須接地,并使能地點盡可能接近GND腳;第1位為低以提供MAX6675器件身份碼,第0位為三態。
LCD12864顯示原理 在數字電路中,所有的數據都是以0和1保存的,對LCD控制器進行不同的數據操作,可以得到不同的結果。對于顯示英文操作,由于英文字母種類很少,只需要8位(一字節)即可。而對于中文,常用卻有6000以上,于是我們的DOS前輩想了一個辦法,就是將ASCII表的高128個很少用到的數值以兩個為一組來表示漢字,即漢字的內碼。而剩下的低128位則留給英文字符使用,即英文的內碼。 那么,得到了漢字的內碼后,還僅是一組數字,那又如何在屏幕上去顯示呢?這就涉及到文字的字模,字模雖然也是一組數字,但它的意義卻與數字的意義有了根本的變化,它是用數字的各位信息來記載英文或漢字的形狀,如英文的'A'在字模的記載方式如圖1所示: 圖1 “A”字模圖 而中文的“你”在字模中的記載卻如圖2所示: 圖2 “你”字模圖 根據芯片的不同取模的方式不同,有多種取模方式:單色點陣液晶字模,橫向取模,字節正序,單色點陣液晶字模,橫向取模,字節倒序,單色點陣液晶字模,縱向取模,字節正序,單色點陣液晶字模,縱向取模,字節倒序等等。 1.2 總體設計方案本系統采用的是K型熱電偶采集溫度,因此本設計有溫度采集部分,數據處理部分,溫度顯示部分,故障顯示并顯示部分組成。AT89S52單片機以及單片機的外圍電路由晶振電路,復位電路,溫度采集電路,溫度顯示電路,報警電路組成。系統設計框圖如下: 系統框圖 溫度采集部分 先使用K型熱電偶對環境溫度進行檢查,再經過K型熱電偶模數轉換器—MAX6675,進行溫度轉換,將環境溫度轉換成12位二進制數據采集進單片機,以便單片機進行數據處理。在本系統中,由于是4路溫度采集,因此使用串行的方式,依次對4路溫度進行采集,并用單片機的P2口來傳輸與反饋數據。 數據處理部分 利用算法,在單片機中對采集到的數據進行處理,并轉換成百、十、個位通過P0口進行輸出。 溫度顯示部分 通過調用LCD的顯示函數,將溫度以兩行的方式實時地顯示在LCD上。 超限報警部分 通過軟件算法,檢測4路的溫度是否超出人體正常體溫,一旦超過這個范圍,則進行報警,并在LCD上顯示“發燒”,并且同時通過蜂鳴器以及LED燈,來進行聲光報警。當檢測到熱電偶出現斷耦時,在LCD上顯示“斷耦”,并且同時通過點亮對應的LED燈進行報警。
2 系統硬件設計2.1 信號采集電路2.1.1 傳感器 該部分為四路溫度采集,采用K型熱電偶與K型熱電偶數模轉換器-MAX6675互相搭配的方式,如下圖所示: 以其中一路為例,MAX6675的冷熱接收端分別于熱電偶的冷熱端相連,其串行數據輸出端分別與單片機的P2口相連。 Maxim公司新近推出的MAX6675是一復雜的單片熱電偶數字轉換器, 內部具有信號調節放大器、12位的模擬數字化熱電偶轉換器、冷端補償傳感和校正、數字控制器、1個SPI兼容接口和1個相關的邏輯控制。MAX6675內部集成有冷端補償電路;帶有簡單的3位串行SPI接口;可將溫度信號轉換成12位數字量,溫度分辨率達0.25℃;內含熱電偶斷線檢測電路。冷端補償的溫度范圍-20℃~80℃,它的溫度分辨能力為0. 25 ℃,可以測量0℃~1023.75℃的溫度,工作電壓為3. 0~5. 5V。 MAX6675的主要特性如下: ①簡單的SPI串行口溫度值輸出; ②0℃~+1024℃的測溫范圍; ③12位0.25℃的分辨率; ④片內冷端補償; ⑤高阻抗差動輸入; ⑥熱電偶斷線檢測; ⑦單一+5V的電源電壓; ⑧低功耗特性; ⑨工作溫度范圍-20℃~+85℃; ⑩2000V的ESD信號。 該器件采用8引腳SO帖片封裝。引腳排列如圖1所示,引腳功能如下表所列。  為了正確使用MAX6675芯片,設計時還必須注意以下幾點: (1)利用輸出數據中的D2進行斷偶檢測時,熱電偶的輸入負極T·必須接地,且應盡可能地靠近MX6675的引腳地(即PIN1) (2)由于冷端溫度是由MAX6675本身檢測的因此為了提髙測量的精確度電路板的地線盡可能地大; (3)由于熱電偶信號為微弱信號,因此要盡可能地釆取措施防止噪聲千擾。可在MAX675電源與地線之間接個0.1uF的陶瓷電容。 以下是具體電路:這里只給出一路
2.2 單片機系統電路AT89C51是一種帶4K字節閃爍可編程可擦除只讀存儲器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低電壓,高性能CMOS8位微處理器,俗稱單片機。單片機的可擦除只讀存儲器可以反復擦除100次。該器件采用ATMEL高密度非易失存儲器制造技術制造,與工業標準的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃爍存儲器組合在單個芯片中,ATMEL的AT89C51是一種高效微控制器,AT89C2051是它的一種精簡版本。 主要特性:
1、與MCS-51 兼容 2、4K字節可編程閃爍存儲器 3、1000寫/擦循環數據保留時間10年 4、全靜態工作,0Hz-24Hz·三級程序存儲器鎖定 5、128*8位內部RAM32可編程I/O線 6、兩個16位定時器/計數器 7、5個中斷源 8、可編程串行通道低功耗的閑置和掉電模式 9、片內振蕩器和時鐘電路 主要管腳說明: P0口:P0口為一個8位漏級開路雙向I/O口,每腳可吸收8TTL門電流。當P1口的管腳第一次寫1時,被定義為高阻輸入。P0能夠用于外部程序數據存儲器,它可以被定義為數據/地址的第八位。 P1口:P1口是一個內部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1后,被內部上拉為高,可用作輸入,P1口被外部下拉為低電平時,將輸出電流,這是由于內部上拉的緣故。 P2口:P2口為一個內部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個TTL門電流,當P2口被寫“1”時,其管腳被內部上拉電阻拉高,且作為輸入。并因此作為輸入時,P2口的管腳被外部拉低,將輸出電流。P2口當用于外部程序存儲器或16位地址外部數據存儲器進行存取時,P2口輸出地址的高八位。 P3口:P3口管腳是8個帶內部上拉電阻的雙向I/O口,可接收輸出4個TTL門電流。當P3口寫入“1”后,它們被內部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。 以下是單片機系統的電路圖: 2.3 人機交互電路通過蜂鳴器和4顆紅色LED可以判斷被檢測者體溫是否發熱。當體溫狀況是大于37.1℃即發燒時,蜂鳴器響,四顆LED燈亮,LCD顯示發燒者的溫度;人員可以通過SOUND和STOP/RESET來控制蜂鳴器和檢測是否暫停;電源指示燈用來表示系統是否已經通電;當系統檢測斷耦時,四顆LED會對應四個熱電偶,如果出現斷耦,對應的LED會亮,LCD顯示屏上也會顯示“斷耦”字符。 以下是各個人機交換電路的設計圖: 2.4 溫度顯示電路該部分是通過LCD進行對溫度數據的顯示其使能端與P3口相連,數據輸入端與P0口相連,如下圖所示是仿真軟件中的電路: 下圖所示是實際電路中的設計,使用的是一個2.54間距20Pin的排針插座: 附系統原理圖: 3 仿真電路及硬件分析仿真系統使用Protues 8 Professional軟件進行仿真。仿真電路可以分為主控模塊、溫度采集模塊、溫度顯示模塊、聲光警報模塊和按鍵模塊。溫度采集模塊使用四顆K型熱電偶和四顆MAX6675芯片,聲光報警系統使用一個蜂鳴器和四個紅色LED,主控模塊主要采用AT89C51芯片,溫度顯示模塊使用一塊不帶中文字庫的LCD12864顯示屏,按鍵模塊由兩個帶鎖開關組成。 進過仿真測試,各個功能可以達到設計的要求。MAX6675的分辨率為0.25℃,在模擬中,可以測試出在此誤差條件下,改測量系統對溫度的采集符合設計要求。
仿真圖1:系統開機初始界面: 仿真圖2:正常測體溫,未發現發熱狀況 仿真圖3:正常測體溫,發現發熱狀況,并發出聲光報警 仿真圖4:正常測體溫,1路采集發生斷耦,未發現發熱狀況,并發出光警報 4 系統軟件設計4.1 軟件設計思路程序開始后,先初始化LCE12864顯示屏,在開機界面顯示“歡迎使用 智能溫度 檢測系統 深圳大學”的文字,延時一定時間后進行清屏工作。 下面進入while循環。讀取存儲四個MAX6675芯片上測量的K型熱電偶的溫度值并進行標度轉換,并且根據MAX6675輸出數據上的D2位是否置1來判斷是否短線,如果短線,則將輸出數據置0,并且在熱電偶對應的LED長亮,由此來判斷哪只電偶出現斷線。由于MAX6675的轉換時間的典型值是0.17s,最大值是0.22s,所以在轉換時,要加入一定時間的延遲。然后將標度轉換后的溫度數據在LCD顯示屏上顯示出。此時對4路溫度進行判斷,如果測量的體溫已經大于37.1℃則說明被測者已經發熱,37.3-38℃是低燒,38.1-40℃是高燒。此時,儀器產生聲光警報,暫停測量,引入2個外部按鍵開關中斷,如果STOP/RESET按鍵置低電位,則繼續測量,置高電位表示保持暫停轉態,方便人員進行數據記錄; 如果SOUND按鍵置低電位,表示關閉蜂鳴器。如果在測量的過程中未發現發熱狀況,人員也可以對STOP/RESET按鍵置低電位,來暫停測量,對SOUND按鍵置低電位,表示關閉蜂鳴器。 4.2 程序流程圖4.3 主要程序代碼數據獲取部分
由于MAX6675采用的是12位二進制的串行數據輸出的方式,而且,其有效的數據分別在3~~14位,因此需要進行串行數據的移位操作,MAX6675最大數值為1023.75,而AD精度為12位,即2的12次方為4096,轉換對應數,故要除4(*0.25)。轉換公式是:實際溫度=Temp_1*0.25-24.1。以下為部分軟件算法:
/***********************************************************
函數名稱:Re_Convert_1()
函數功能:讀取第一顆MAX6675芯片上的原始數據
入口參數:
出口參數:溫度Temp_1
***********************************************************/
float Re_Convert_1()
{
uchar i;
int cut_off_flag = 1;
unsigned int Temp_1;
Temp_1=0;
CS=1;
SCK=0;
_nop_();
_nop_();
CS=0;
for(i=0;i<16;i++) //獲取16位MSB
{
Temp_1<<=1; //sck置低
_nop_();
SCK=1;
if(SO1==1)//取當前值
{
Temp_1=Temp_1|0x01;
}
else
Temp_1=Temp_1|0x00;
_nop_();
SCK=0;
_nop_();
}
cut_off_flag = (Temp_1>>2)&0x0001; //當斷耦時,D2位置1
if(cut_off_flag == 1) //斷偶標志是 0的話,斷開
{
flag1 = 0;
}
else flag1 = 1;
Temp_1=Temp_1<<1; //去掉第15位
Temp_1=Temp_1>>4; //去掉第0~2位
return(Temp_1);
}
以上算法把數據左移移一位,然后再右移四位,從而得到完整的12位二進制溫度數據。
數據顯示部分
LCD上的漢字以及數據,都需要使用相應的字模軟件來對漢字和數據進行編碼,并存儲在相應的數組中,通過相應的函數調用,將所需顯示的數據,按照相應的格式顯示在LCD上,以下為部分軟件算法:
漢字顯示函數:
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列的數據輸出,左右各64個點,可顯示4個漢字
{
write_LCD_data(p); //漢字的上半部分
}
Set_page(page+1); //寫下半頁:16*8
Set_column(column*16); //控制列
for(i=0;i<16;i++) //控制16列的數據輸出
{
write_LCD_data(p[i+16]); //漢字的下半部分
}
}
數字顯示函數:
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);
}
Set_page(page+1); //顯示字符下半部分:8*8
Set_column(column);
for(i=0;i<8;i++)
{
write_LCD_data(p[i+8]);
}
}
調用方式如下:
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顯示測量溫度函數部分:(以1路為例)
void Disp_temp()
{
temp1=(int)(wendu1*10);
if(wendu1)
{
fen1=temp1%10;
temp1=temp1/10;
ge1=temp1%10;
shi1=temp1/10;
Display_ASCII(1,0,5*8,shuzi[fen1]);
Display_ASCII(1,0,3*8,shuzi[ge1]);
Display_ASCII(1,0,2*8,shuzi[shi1]);
}
else if(wendu1==0)
{
Display_ASCII(1,0,5*8,shuzi[0]);
Display_ASCII(1,0,3*8,shuzi[0]);
Display_ASCII(1,0,2*8,shuzi[0]);
}
Display_HZ(1,0,0,fuhao_1);
Display_ASCII(1,0,4*8,shuzi[13]);
Display_HZ(1,0,3,fuhao_ssd);
}
斷耦檢測函數
如果熱電偶發生斷耦標志位wendu=1,則LED長亮。
void cut_off_flag()
{
if(flag1 == 0)
{
LED1 = 1;
wendu1 = 0;
Display_HZ(1,6,3,duan);
Display_HZ(2,6,0,ou);
}
if(flag2==0)
{
LED2 = 1;
wendu2 = 0;
Display_HZ(1,6,3,duan);
Display_HZ(2,6,0,ou);
}
if(flag3==0)
{
LED3 = 1;
wendu3= 0;
Display_HZ(1,6,3,duan);
Display_HZ(2,6,0,ou);
}
if(flag4==0)
{
LED4 = 1;
wendu4 = 0;
Display_HZ(1,6,3,duan);
Display_HZ(2,6,0,ou);
}
}
發燒檢測函數
如果四個熱電偶其中有一個檢測到發燒,則暫停檢測、LED長亮、蜂鳴器響、顯示字符“發燒xx.x℃”;按STOP/RESET鍵可復位重新進行檢測。
void fever_check()//發燒檢測
{
float wendu_H;
int wenduH,fenH,geH,shiH;
if((wendu1<37.1) && (wendu2<37.1) && (wendu3<37.1) && (wendu4<37.1)) //檢測是否發燒
{
SPEAKER = 0;//蜂鳴器不響,LED不亮
LED1 = 0;
LED2 = 0;
LED3 = 0;
LED4 = 0;
}
else
{
if(SOUND == 0) //外部按鍵中斷,蜂鳴器的控制
{
SPEAKER =0;
}
else
SPEAKER = 1;//蜂鳴器響
LED1 = 1;//LED亮
LED2 = 1;
LED3 = 1;
LED4 = 1;
if((wendu1-wendu2)>0.0001)
{
wendu_H = wendu1;
}
else
{
wendu_H = wendu2;
}
if((wendu_H<wendu3)>0.001)
{
wendu_H = wendu3;
}
if((wendu_H<wendu4)>0.001)
{
wendu_H = wendu4;
}
wenduH=(int)(wendu_H*10);
fenH=wenduH%10;
wenduH=wenduH/10;
geH=wenduH%10;
shiH=wenduH/10;
Display_ASCII(1,4,6*8,shuzi[shiH]);
Display_ASCII(1,4,7*8,shuzi[geH]);
Display_ASCII(2,4,0*8,shuzi[13]);
Display_ASCII(2,4,1*8,shuzi[fenH]);
Display_HZ(1,4,1,fa);
Display_HZ(1,4,2,sao);
Display_HZ(2,4,1,fuhao_ssd);
for(;STOP == 1;) //當檢測到發燒時,暫停
{
if(SOUND == 0) //外部按鍵中斷,蜂鳴器的控制
{
SPEAKER =0;
}
else
SPEAKER = 1;//蜂鳴器響
}
ClearScreen(0);
}
for(;STOP == 0;) //外部按鍵中斷,暫停
{
}
}
實驗結果顯示將實物連接起來后的PCB電路如下所示: 圖5-1 實物圖-正面 圖5-1 實物圖-背面 6 附錄及元器件清單6.1 所用相關軟件- Keil——51系列兼容單片機C語言軟件開發系統
- ISIS——proteus仿真軟件
- Altium——Altium Designer 9 PCB繪制軟件
圖6-1 本設計所用相關軟件 6.2 元器件清單7 總結及體會(寫下總結及體會,以及對授課方式等的意見和建議。) 剛開始對于體溫檢測傳感器的選擇,不是很正確,走了一下彎路。在老師指導后才知道使用熱電堆進行體溫的檢測會更加準確合理。在熱電偶的選擇上也是查閱了好多資料,對比現存的很多設計方案,從系統的復雜性、精確度和原件價格入手,采用了采用K型熱電偶與K型熱電偶模數轉換器—MAX6675的組合。顯示器上也使用了LCD12864,可以實現中英文顯示,使用方便。 確定好方案后,在對MAX6675的串行數據進行Protues仿真讀取時,卻出現了很多小問題。MAX6675與單片機的通訊中,對片選和時鐘電平如果沒有適當延時的話會出現錯誤的數據,并且花費了很多時間才解決掉這一問題,同時出現的問題還有MAX6675芯片的輸出數據在Protues仿真和芯片數據手冊的輸出數據是不一樣的,這一點原先不知道,也是花費了很長時間才意識到Protues仿真得出的結果和實際結果存在幾十℃的偏差,這才解決掉輸出溫度誤差很大的問題。起初溫度數據的誤差大不正常還以為是時序有問題,修改了很多遍SPI通訊的代碼,在花費很長時間后才發現最初的代碼沒錯,而是Protues的問題。 在LCD12864上顯示數字和文字也出現了一個問題,本身代碼沒有問題,但是因為keil5的一個設置(Memory Model需要選擇Small,否則會出錯),會導致在代碼成功的條件下運行出錯,導致LCD顯示屏一直亂碼。也是花了一段時間梳理代碼,確保代碼沒出錯后,才解決問題。
51hei.png (7.59 KB, 下載次數: 89)
下載附件
2020-6-28 18:15 上傳
全部資料51hei下載地址:
智能體溫檢測.7z
(2.18 MB, 下載次數: 266)
2020-6-28 18:16 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|