基于單片機的數字溫度計設計
摘要
隨著現代信息技術的飛速發展和傳統工業改造的逐步實現.能夠獨立工作的溫度檢測和顯示系統應用于諸多領域。傳統的溫度檢測以熱敏電阻為溫度敏感元件。熱敏電阻的成本低,但需后續信號處理電路,而且可靠性相對較差,測溫準確度低,檢測系統也有一定的誤差。與傳統的溫度計相比,這里設計的數字溫度計具有讀數方便,測溫范圍廣,測溫精確,數字顯示,適用范圍寬等特點。選用AT89S52型單片機作為主控制器件,DSl8B20作為測溫傳感器通過4位共陽極LED數碼管串口傳送數據,實現溫度顯示。通過DSl8B20直接讀取被測溫度值,進行數據轉換,該器件的物理化學性能穩定,線性度較好,在0℃~100℃最大線性偏差小于0.1℃。該器件可直接向單片機傳輸數字信號,便于單片機處理及控制。另外,該溫度計還能直接采用測溫器件測量溫度,從而簡化數據傳輸與處理過程。
目錄
1 概述 4
1.1課題名稱 4
1.2課題要求4
1.3設計的目的意義4
2 系統總體方案及硬件設計 5
2.1單片機的選擇5
2.2溫度傳感器的介紹6
2.3溫度傳感器與單片機的連接8
2.4復位信號及外部復位電路8
2.5單片機與報警電路9
2.6顯示電路9
3 軟件設計 10
4 Proteus軟件仿真 12
4.1 仿真圖 12
4.2仿真結果分析13
5 總結體會 14
參考文獻 15
附錄 1 程序源代碼 15
附錄 2 系統原理圖23
1概述 1.1課題名稱 基于單片機的數字溫度計的設計 1.2課題要求 1)基本范圍-50℃~110℃ 2)精度誤差小于0.5℃ 3)LED數碼直讀顯示 4)可以設定溫度的上下限報警功能 1.3設計目的和意義 溫度數我們日常生產和生活中實時在接觸到的物理量,但是它是看不到的,僅憑感覺只能感覺到大概的溫度值,傳統的指針式的溫度計雖然能指示溫度,但是精度低,使用不夠方便,顯示不夠直觀,數字溫度計的出現可以讓人們直觀的了解自己想知道的溫度到底是多少度。 數字溫度計采用溫度敏感元件也就是溫度傳感器(如鉑電阻,熱電偶,半導體,熱敏電阻等),將溫度的變化轉換成電信號的變化,如電壓和電流的變化,溫度變化和電信號的變化有一定的關系,如線性關系,一定的曲線關系等,這個電信號可以使用模數轉換的電路即AD轉換電路將模擬信號轉換為數字信號,數字信號再送給處理單元,如單片機或者PC機等,處理單元經過內部的軟件計算將這個數字信號和溫度聯系起來,成為可以顯示出來的溫度數值,如25.0攝氏度,然后通過顯示單元,如LED,LCD或者電腦屏幕等顯示出來給人觀察。這樣就完成了數字溫度計的基本測溫功能。 數字溫度計根據使用的傳感器的不同,AD轉換電路,及處理單元的不同,它的精度,穩定性,測溫范圍等都有區別,這就要根據實際情況選擇符合規格的數字溫度計。數字溫度計有手持式,盤裝式,及醫用的小體積的等等。 另外作為電氣工程及其自動化的學生,通過基于單片機數字溫度計的設計可以提高自己理論聯系實際的能力,可以更好的掌握所學的專業理論只是,也培養了自己的動手能力,同時,也培養了信息搜集能力和分析問題解決問題的能力 2系統總體設計方案及硬件設計 作為對專業理論知識學習后的實踐環節,我選擇了自行設計基于AT89S52單片機的數字溫度計。設計原理框圖如,圖 1。  圖 1 數字溫度計原理框圖 2.1 單片機的選擇 AT89S52是一種低功耗、高性能CMOS 8位微控制器,具有8K 在系統可編程Flash 存儲器。使用Atmel 公司高密度非易失性存儲器技術制造,與工業80C51 產品指令和引腳完全兼容。片上Flash允許程序存儲器在系統可編程,亦適于常規編程器。在單芯片上,擁有靈巧的8 位CPU和在系統可編程Flash,使得AT89S52在眾多嵌入式控制應用系統中得到廣泛應用。Protues仿真軟件中用AT89C51代替AT89S52,單片機小系統的電路圖如圖2所示。 圖2 單片機小系統電路 AT89S52主要性能 1、與MCS-51單片機產品兼容; 2、8K字節在系統可編程Flash存儲器; 3、1000次擦寫周期; 4、全靜態操作:0Hz-33MHz; 5、三級加密程序存儲器; 6、32個可編程I/O口線; 7、三個16位定時器/計數器; 8、六個中斷源; 9、全雙工UART串行通道; 10、低功耗空閑和掉電模式; 11、掉電后中斷可喚醒; 12、看門狗定時器; 13、雙數據指針; 14、掉電標識符 。 2.2 溫度傳感器介紹DS18B20可以程序設定9~12位的分辨率,精度為±0.5°C。可選更小的封裝方式,更寬的電壓適用范圍。分辨率設定,及用戶設定的報警溫度存儲在EPROM中,掉電后依然保存。 圖3 溫度傳感器 引腳功能說明: NC :空引腳,懸空不使用; VDD :可選電源腳,電源電壓范圍3~5.5V。當工作于寄生電源時,此引腳必須接地。 DQ :數據輸入/輸出腳。漏極開路,常態下高電平。 GND :為電源地 DS18B20內部結構主要由四部分組成:64位光刻ROM、溫度傳感器、非揮發的溫度報警觸發器TH和TL、配置寄存器。 光刻ROM中的64位序列號是出廠前被光刻好的,它可以看作是該DS18B20的地址序列碼。64位光刻ROM的排列是:開始8位(28H)是產品類型標號,接著的48位是該DS18B20自身的序列號,最后8位是前面56位的循環冗余校驗碼(CRC=X8+X5+X4+1)。光刻ROM的作用是使每一個DS18B20都各不相同,這樣就可以實現一根總線上掛接多個DS18B20的目的。 DS18B20中的溫度傳感器可完成對溫度的測量,以12位轉化為例:用16位符號擴展的二進制補碼讀數形式提供,以0.0625℃/LSB形式表達,其中S為符號位。 這是12位轉化后得到的12位數據,存儲在18B20的兩個8比特的RAM中,二進制中的前面5位是符號位,如果測得的溫度大于0,這5位為0,只要將測到的數值乘于0.0625即可得到實際溫度;如果溫度小于0,這5位為1,測到的數值需要取反加1再乘于0.0625即可得到實際溫度。例如+125℃的數字輸出為07D0H,+25.0625℃的數字輸出為0191H,-25.0625℃的數字輸出為FF6FH,-55℃的數字輸出為FC90H。 DS18B20溫度傳感器的內部存儲器包括一個高速暫存RAM和一個非易失性的可電擦除的E2RAM,后者存放高溫度和低溫度觸發器TH、TL和結構寄存器。 暫存存儲器包含了8個連續字節,前兩個字節是測得的溫度信息,第一個字節的內容是溫度的低八位,第二個字節是溫度的高八位。第三個和第四個字節是TH、TL的易失性拷貝,第五個字節是結構寄存器的易失性拷貝,這三個字節的內容在每一次上電復位時被刷新。第六、七、八個字節用于內部計算。第九個字節是冗余檢驗字節。 該字節各位的意義如下: TM R1 R0 1 1 1 1 1 低五位一直都是1 ,TM是測試模式位,用于設置DS18B20在工作模式還是在測試模式。在DS18B20出廠時該位被設置為0,用戶不要去改動。R1和R0用來設置分辨率,如表1所示:(DS18B20出廠時被設置為12位) 表1 DS18B20溫度轉換時間表
根據DS18B20的通訊協議,主機控制DS18B20完成溫度轉換必須經過三個步驟:每一次讀寫之前都要對DS18B20進行復位,復位成功后發送一條ROM指令,最后發送RAM指令,這樣才能對DS18B20進行預定的操作。復位要求主CPU將數據線下拉500微秒,然后釋放,DS18B20收到信號后等待16~60微秒左右,后發出60~240微秒的存在低脈沖,主CPU收到此信號表示復位成功。 2.3 溫度傳感器與單片機的連接DS18B20采用外部電源供電方式,在外部電源供電方式下,DS18B20工作電源由VCC引腳接入,此時I/O線不需要強上拉,不存在電源電流不足的問題,可以保證轉換精度,同時在總線上理論可以掛接任意多個DS18B20傳感器,組成多點測溫系統。注意:在外部供電的方式下,DS18B20的GND引腳不能懸空 ,否則不能轉換溫度,讀取的溫度總是85℃。 圖4 DS18B20接線 2.4 復位信號及外部復位電路 該復位信號高電平有效,其有效時間應持續24個振蕩脈沖周期即兩個機器周期以上。若使用頻率為12 MHz的晶體振蕩器,則復位信號持續時間應超過2μs才完成復位操作。 圖 5 復位電路 2.5 單片機與報警電路報警電路分為兩部分,一部分是蜂鳴器聲音報警,另一部分是發光二極管放光報警。具體情況如下: 接通電源,兩個(紅色,黃色)發光二極管都不亮,當溫度超過上線設定值(如38攝氏度)時,紅色二極管亮,同時蜂鳴器也報警;當溫度低于下限設定值時(如5攝氏度)時,黃色二極管亮,同時蜂鳴器也開始報警。
圖6 蜂鳴器報警 圖7 發光二極管報警 2.6 顯示電路采用技術成熟的5461AS共陰4位數碼管 0.56英寸紅色。LED顯示分為靜態顯示和動態顯示。這里采用靜態顯示,系統通過單片機的串行口來實現靜態顯示。串行口為方式零狀態,即工作在移位寄存器方式,波特率為振蕩頻率的1/12。當器件執行任何一條將SBUF作為目的寄存器的命令時,數據便開始從RXD端發送。在寫信號有效時,相隔一個機器周期后發送控制端SEND有效,即允許RXD發送數據,同時允許從TXD端輸出移位脈沖。圖8為顯示電路的連接圖。 圖 8 數碼顯示連接圖 3 軟件設計 DSl8820的主要數據元件有:64位激光Lasered ROM,溫度靈敏元件和非易失性溫度告警觸發器TH和TL。DSBl820可以從單總線獲取電源,當信號線為高電平時,將能量貯存在內部電容器中;當單信號線為低電平時,將該電源斷開,直到信號線變為高電平重新接上寄生(電容)電源為止。此外,還可外接5 V電源,給DSl8820供電。DSl8820的供電方式靈活,利用外接電源還可增加系統的穩定性和可靠性。圖9為讀取數據流程圖。 圖9 讀取數據的流程圖 讀出溫度數據后,LOW的低四位為溫度的小數部分,可以精確到0.0625℃,LOW的高四位和HIGH的低四位為溫度的整數部分,HIGH的高四位全部為1表示負數,全為0表示正數。所以先將數據提取出來,分為三個部分:小數部分、整數部分和符號部分。小數部分進行四舍五入處理:大于0.5℃的話,向個位進1;小于0.5℃的時候,舍去不要。當數據是個負數的時候,顯示之前要進行數據轉換,將其整數部分取反加一。還因為DS18B20最低溫度只能為-55℃,所以可以將整數部分的最高位換成一個“-”,表示為負數。圖10為溫度數據處理程序的流程圖。 圖10 溫度數據處理流程圖
4Proteus軟件仿真 仿真過程相當順利,需要注意原件的選取,尤其是數碼管顯示塊的共陰、共陽,還有就是電阻的選取,太大太小都會影響實驗效果。在仿真中不存在焊接的問題,所以接線只要引腳接口正確就是沒問題的。另外就是程序的調試,相當重要。 4.1 仿真圖
圖 11 當溫度為上下限之間時的仿真情況  圖 12 溫度在溫度下限設定值以下的仿真圖  圖 13 溫度在溫度上限設定值以上的仿真圖
4.2仿真結果分析 溫度在上下限設定值范圍內是,放光二極管都是不亮的,當實際溫度值,低于設定下限時,黃色放光二極管亮;當實際溫度高于上限設定值時,紅色發光二極管亮。 原因,通過程序控制P1.0(紅色放光二極管) P1.1(黃色發光二極管),度在上下限設定值范圍內是,P1.0,P1.1都是低電平,故發光二極管不會亮,當實際溫度值,低于設定下限時,P1.0 為低電平P1.1為高電平,故黃色放光二極管亮;當實際溫度高于上限設定值時,P1.0為高電平P1.1為低電平,故紅色發光二極管亮。
5 總結與體會作為一名電氣工程及其自動化大三學生,我覺得做單片機課程設計是很有意義的,而且也是必要的。在做這次課程設計的過程中,我感觸最深的當屬查閱大量的設計資料了。為了讓自己的設計更加完善,查閱這方面的實際資料是十分必要的,也是必不可少的。 其次,在這次課程設計中,我們運用了以前學過的專業課知識,如:proteus仿真、C語言、模擬和數字電路知識等。雖然過去我從未獨立應用過他們,但在學習的過程中帶著問題去學我發現效率很高,這是我做這次課程設計的又一收獲。 最后,要做好一個課程設計,就必須做到:在設計程序之前,對所用單片機的內部結構有一個系統的了解,知道該單片機有哪些資源;要有一個清晰的思路和一個完整的軟件流程圖;在設計程序時,不能妄想一次將整個程序設計好,反復修改、不斷改進是程序設計的必經之路;要養成注釋程序的好習慣,這樣為資料的保留和交流提供了方便;在設計中遇到的問題要記錄,以免下次遇到同樣的問題。 在這次的課程設計中,我真正的意識到,在以后的學習中,要理論聯系實際,把我們所學的理論知識用到實際當中,學習單片機更是如此,程序只有在經常寫與讀的過程中才能提高,這就是這次課程設計的最大收獲。 - /******************************************************************
- 程序名稱:DS18B20溫度測量、報警系統
- 簡要說明:DS18B20溫度計,溫度測量范圍0~99.9攝氏度
- 可設置上限報警溫度、下限報警溫度
- 即高于上限值或者低于下限值時蜂鳴器報警
- 默認上限報警溫度為38℃、默認下限報警溫度為5℃
- 報警值可設置范圍:最低上限報警值等于當前下限報警值
- 最高下限報警值等于當前上限報警值
- 將下限報警值調為0時為關閉下限報警功能
- ******************************************************************/
- #include <AT89X52.h>
- #include "DS18B20.h"
- #define uint unsigned int
- #define uchar unsigned char //宏定義
- #define SET P3_1 //定義調整鍵
- #define DEC P3_2 //定義減少鍵
- #define ADD P3_3 //定義增加鍵
- #define BEEP P3_7 //定義蜂鳴器
- bit shanshuo_st; //閃爍間隔標志
- bit beep_st; //蜂鳴器間隔標志
- sbit DIAN = P0^7; //小數點
- uchar x=0; //計數器
- signed char m; //溫度值全局變量
- uchar n; //溫度值全局變量
- uchar set_st=0; //狀態標志
- signed char shangxian=38; //上限報警溫度,默認值為38
- signed char xiaxian=5; //下限報警溫度,默認值為5
- uchar code LEDData[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};
- unsigned int ReadTemperature(void);
-
- /*****延時子程序*****/
- void Delay(uint num)
- {
- while( --num );
- }
-
- /*****初始化定時器0*****/
- void InitTimer(void)
- {
- TMOD=0x1;
- TH0=0x3c;
- TL0=0xb0; //50ms(晶振12M)
- }
-
- /*****定時器0中斷服務程序*****/
- void timer0(void) interrupt 1 using 0
- {
- TH0=0x3c;
- TL0=0xb0;
- x++;
- }
-
- /*****外部中斷0服務程序*****/
- void int0(void) interrupt 0 using 1
- {
-
- EX0=0; //關外部中斷0
- if(DEC==0&&set_st==1)
- {
- shangxian--;
- if(shangxian<xiaxian)shangxian=xiaxian;
- }
- else if(DEC==0&&set_st==2)
- {
- xiaxian--;
- if(xiaxian<0)xiaxian=0;
- }
- }
-
- /*****外部中斷1服務程序*****/
- void int1(void) interrupt 2 using 2
- {
- EX1=0; //關外部中斷1
- if(ADD==0&&set_st==1)
- {
- shangxian++;
- if(shangxian>99)shangxian=99;
- }
- else if(ADD==0&&set_st==2)
- {
- xiaxian++;
- if(xiaxian>shangxian)xiaxian=shangxian;
- }
- }
-
- /*****讀取溫度*****/
- void check_wendu(void)
- {
- uint a,b,c;
- c=ReadTemperature()-5; //獲取溫度值并減去DS18B20的溫漂誤差
- a=c/100; //計算得到十位數字
- b=c/10-a*10; //計算得到個位數字
- m=c/10; //計算得到整數位
- n=c-a*100-b*10; //計算得到小數位
- if(m<0){m=0;n=0;} //設置溫度顯示上限
- if(m>99){m=99;n=9;} //設置溫度顯示上限
- }
-
- /*****顯示開機初始化等待畫面*****/
- Disp_init()
- {
- P0 = 0x40; //顯示-
- P2 = 0xf7;
- Delay(200);
- P2 = 0xfb;
- Delay(200);
- P2 = 0xfd;
- Delay(200);
- P2 = 0xfe;
- Delay(200);
-
- P2 = 0xff; //關閉顯示
- }
-
- /*****顯示溫度子程序*****/
- Disp_Temperature() //顯示溫度
- { P2 = 0xf7;
- P0 =0x39; //顯示C
-
- Delay(300);
- P2 = 0xfb;
- P0 =LEDData[n]; //顯示個位
-
- Delay(300);
- P2 = 0xfd;
- P0 =LEDData[m%10]; //顯示十位
- DIAN = 1; //顯示小數點
-
- Delay(300);
- P2 = 0xfe;
- P0 =LEDData[m/10]; //顯示百位
-
- Delay(300);
-
- P2 = 0xff; //關閉顯示
- }
-
- /*****顯示報警溫度子程序*****/
- Disp_alarm(uchar baojing)
- {P2 = 0xf7;
- P0 =0x39; //顯示C
-
- Delay(200);
- P2 = 0xfb;
- P0 =LEDData[baojing%10]; //顯示十位
-
- Delay(200);
- P2 = 0xfd;
- P0 =LEDData[baojing/10]; //顯示百位
-
- Delay(200);
- P2 = 0xfe;
- if(set_st==1)P0 =0x76;
- else if(set_st==2)P0 =0x38; //上限H、下限L標示
-
- Delay(200);
-
- P2 = 0xff; //關閉顯示
- }
-
- /*****報警子程序*****/
- void Alarm()
- { unsigned int i;
- {
- for(i=0;i<200;i++)//喇叭發聲的時間循環,改變大小可以改變發聲時間長短
- {
- Delay(80);//參數決定發聲的頻率,估算值
- BEEP=!BEEP;
- }
- BEEP=1; //喇叭停止工作,間歇的時間,可更改
- Delay(20000);
-
- }
- }
-
- /*****主函數*****/
- void main(void)
- {
- uint z;
- InitTimer(); //初始化定時器
- EA=1; //全局中斷開關
- TR0=1;
- ET0=1; //開啟定時器0
- IT0=1;
- IT1=1;
- check_wendu();
- check_wendu();
- for(z=0;z<300;z++)
- {
- Disp_init();
- }
- while(1)
- {
- if(SET==0)
- {
- Delay(2000);
- do{}while(SET==0);
- set_st++;x=0;shanshuo_st=1;
- if(set_st>2)set_st=0;
- }
- if(set_st==0)
- {
- EX0=0; //關閉外部中斷0
- EX1=0; //關閉外部中斷1
- check_wendu();
-
- Disp_Temperature();
-
- if(m>=shangxian)
- P1_0=0;
- else
- P1_0=1;
- if(m<xiaxian)
- P1_1=0;
- else
- P1_1=1;
- if((m>=shangxian)||(m<xiaxian))
- {
- Alarm(); //報警檢測
- }
- }
- else if(set_st==1)
- {
- BEEP=1; //關閉蜂鳴器
- EX0=1; //開啟外部中斷0
- EX1=1; //開啟外部中斷1
- if(x>=10){shanshuo_st=~shanshuo_st;x=0;}
- if(shanshuo_st) {Disp_alarm(shangxian);}
- }
- else if(set_st==2)
- {
- BEEP=1; //關閉蜂鳴器
- EX0=1; //開啟外部中斷0
- EX1=1; //開啟外部中斷1
- if(x>=10){shanshuo_st=~shanshuo_st;x=0;}
- if(shanshuo_st) {Disp_alarm(xiaxian);}
- }
- }
- }
- /*****END**
復制代碼
附錄 2 系統原理圖
完整的Word格式文檔51黑下載地址:
基于單片機的數字溫度計課程設計.doc
(575 KB, 下載次數: 30)
2018-10-30 14:56 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|