摘要 本論文的主要內容是詳細敘述使用AT89C51型號單片機來進行智能數字溫度計設計的思路與相關知識的理解。詳細描述了利用數字溫度傳感器DS18B20開發測溫系統的過程,重點對傳感器在單片機下的硬件連接,軟件編程以及各模塊系統流程進行了詳盡分析,對各部分的電路也一一進行了介紹,該系統可以方便的實現溫度的采集和報警,并可以根據需要任意上下限報警溫度,它使用起來相當方便,具有精度高、量程寬、靈敏度高、體積小、功耗低等優點,適合于我們日常生活和工、農業生產中的溫度測量,也可以當做溫度處理模塊潛入其他系統中,作為其他主系統的輔助擴展。
在現在這樣的信息化時代,信息技術隨處可見,可以說是離不開我們的生活了,以后我們的生活就是在茶余飯后最多的話題就是我家的機器人性能怎么樣,我家的智能遙控電視怎么樣,我家的智能空調怎么了之類的話,本課題設計的智能數字溫度計也將是以后我們生活中離不開的必需品。 在現在這樣的信息化時代,智能化才是我們追求的更高點,智能機器人,智能電視,智能、智能…什么都是智能的,當然也包括本課題設計的智能溫度計,傳統的溫度計都有很多的缺陷,比如說水銀溫度計,他利用的就是最原始的熱脹冷縮原理,這種溫度計的最大的缺點就是誤差太大,而且讀數也不方便等等各方面的缺點,與傳統的這些相比,本課題中的智能數字溫度計就先進了很多,本設計使用起來相當方便,具有精度高、量程寬、靈敏度高、體積小、功耗低等優點,適合于我們日常生活和工、農業生產中的溫度測量,也可以當做溫度處理模塊潛入其他系統中,作為其他主系統的輔助擴展。DS18B20與STC89C51結合實現最簡溫度報警系統,該系統結構簡單,抗干擾能力強,適合于惡劣環境下進行現場溫度測量,有廣泛的應用前景。 1.1設計的目的《傳感器與測試技術》設計是機械設計制造及其自動化專業和機械電子工程專業的一個重要實踐性教學環節。該設計是在學完《傳感器與檢測技術》之后進行,通過綜合應用所學傳感器知識,將內容和前修有機結合形成系統,完成傳感器應用系統設計。 通過設計使我們能熟練查閱文獻資料,鞏固和加深對常用傳感器的結構、原理、特性的認識和基本知識的理解,提高綜合運用所學知識的能力。通過實際電路方案的分析比較論證,設計計算,元件選擇,掌握傳感器電路的分析方法和工程設計方法,達到提高學生分析問題和電路設計能力的教學目標,培養我們綜合應用知識的能力,從而掌握智能檢測(或儀表)系統設計的基本思想和方法,為后續的學習和工作奠定了基礎。
1.2設計的任務和要求針對某特定場合(如存儲倉)在常壓下對溫度的要求,選用合適的測試方法設計溫度智能儀表,要求具有存儲、顯示和報警功能,且溫度檢測精度為0.2℃。 要求: 1.理解在常壓下對溫度測量的基本原理和方法,分析建立設計需要的參數范圍。 2.根據溫度檢測要求,設計滿足給定任務要求的智能溫度表總體方案。 3.選擇合適的傳感器、信號處理電路、執行器,進行詳細設計。對測試模塊、顯示模塊、報警模塊等進行設計和系統集成。 4.說明所設計的溫度一體化智能儀表工作原理和工作過程。 5.對設計結果進行必要的分析。 1.3設計的意義我們已經進入了信息化的時代,智能化才是我們追求的更高點。傳統的溫度計都有很多的缺陷,比如說水銀溫度計,他利用的就是最原始的熱脹冷縮原理,這種溫度計的最大的缺點就是誤差太大,而且讀數也不方便等等各方面的缺點,與傳統的這些相比,本設計較好地克服了這些缺點,本設計中的智能數字溫度計選用AT89C51型號的單片機作為主要的控制程序,具有存儲、顯示和報警功能,且具有較高的溫度檢測精度。 1.4國內外現狀及水平國外對溫度控制技術研究較早,始于20世紀70年代。先是采用模擬式的組合儀表,采集現場信息并進行指示、記錄和控制。80年代末出現了分布式控制系統。目前正開發和研制計算機數據采集控制系統的多因子綜合控制系統。現在世界各國的溫度測控技術發展很快,一些國家在實現自動化的基礎上正向著完全自動化、無人化的方向發展。 我國對于溫度測控技術的研究較晚,始于20世紀80年代。我國工程技術人員在吸收發達國家溫度測控技術的基礎上,才掌握了溫度室內微機控制技術,該技術僅限于對溫度的單項環境因子的控制。我國溫度測控設施計算機應用,在總體上正從消化吸收、簡單應用階段向實用化、綜合性應用階段過渡和發展。在技術上,以單片機控制的單參數單回路系統居多,尚無真正意義上的多參數綜合控制系統,與發達國家相比,存在較大差距。我國溫度測量控制現狀還遠遠沒有達到工廠化的程度,生產實際中仍然有許多問題困擾著我們,存在著裝備配套能力差,產業化程度低,環境控制水平落后,軟硬件資源不能共享和可靠性差等缺點。
2.1方案設計與論證
2.1.1方案一由于本設計是測溫電路,可以使用熱敏電阻之類的器件利用其感溫效應,在將隨被測溫度變化的電壓或電流采集過來,進行A/D轉換后,就可以用單片機進行數據的處理,在顯示電路上,就可以將被測溫度顯示出來,這種設計需要用到A/D轉換電路,感溫電路比較麻煩; 圖2-1-1利用熱敏電阻測溫度的框圖 2.1.2方案二采用AT89S52作為系統處理器對采集的溫度信號進行處理,溫度的范圍是0~100度。溫度傳感器TC1047首先將溫度信號轉化成電壓信號,再經過信號處理,最后送到TLC5510進行A/D轉換,最后將結果通過數碼管顯示出來[1]; 圖2-1-2 利用溫度傳感器TC1047采集溫度的框圖 2.1.3方案三采用數字溫度傳感器DS18B20采集溫度,溫度測量范圍為-55~125℃,通過AT89S52處理信號,不需要進行A/D轉換,其自身可將模擬信號轉化成數字信號,然后再通過數碼管輸出結果。 圖2-1-3采用數字溫度傳感器DS18B20采集溫度
方案一雖經濟但由于要用到A/D轉換,所以電路比較復雜,不利于硬件連線,所以不采用此方案;方案二測量溫度精度高、能耗低,電路比方案一簡單,但成本價太高,所以不采用此方案;方案三中溫度測量精度更高,無需進行A/D轉換,且DS18B20芯片的管腳簡單,無需外圍硬件設備即可進行溫度測量,與單片機交換信息僅需一根I/O口線,占用微處理器的端口較少,可以節省大量的引線和邏輯電路,完全符合本設計的要求,因此采用此方案。 2.2工作原理本設計選用AT89C51作為整個控制系統的核心部分,通過DS18B20采集溫度,通過三個按鍵:模式切換鍵、加鍵和減鍵。模式切換鍵可以切換正常顯示,上限溫度設定狀態,下限溫度設定狀態,當實測溫度高于設定的上限值,蜂鳴器報警和LED紅燈閃爍報警,當實測溫度高于設定的下限值,蜂鳴器報警和LED黃燈閃爍報警,系統可以方便的實現溫度的采集和報警,并可以根據需要任意上下限報警溫度,它使用起來相當方便,具有精度高、量程寬、靈敏度高、體積小、功耗低等優點,適合于我們日常生活和工、農業生產中的溫度測量,也可以當做溫度處理模塊潛入其他系統中,作為其他主系統的輔助擴展。
3.1單片機的選型及簡介CPU是整個控制部分的核心。在考慮經濟性和滿足需求的前提下,本設計選用AT89C51作為整個控制系統的核心部分,它的內部含有可以進行系統的編程的存儲器。Flash存儲器功能比較強大,在對它進行編程時不僅可以在線操作,也可以使用一般的方法進行操作。編好的程序主要存儲在芯片中,它的功能比較強大。所以,選用AT89C51作為本設計的控制中心。器件管腳圖如圖3-1:
圖3-1 AT89C51管腳圖 AT89C51簡介:單片機的可擦除只讀存儲器可以反復擦除1000次。該器件采用ATMEL高密度非易失存儲器制造技術制造,與工業標準的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃速存儲器組合在單個芯片中,ATMEL的AT89C51是一種高效微控制器,AT89C051是它的一種精簡版本。AT89C51單片機為很多嵌入式控制系統提供了一種靈活性高且價廉的方案。外形及引腳排列如圖所示。 3.2最小系統模塊在這次設計中,根據課題的需要采用的是ATMEL公司51系列單片機AT89C51芯片作為控制芯片。在實際運用中如果只用單片機芯片是沒有辦法達到所設計的目的,還要有相配套的電路,這樣才能組成一個完整的控制系統達到設計的要求。在本次設計中主要采用AT89C51芯片和相配套的電路來組成所需要的模塊進行研究,模塊中一些具體的參數主要是選用P3口作1602的命令數據控制、時鐘、讀寫控制、和使能控制接口,P2口作按鍵掃描接口,P2.3作DS18B20的總線接口。P2.5,P2.7作報警控制接口。其電路連接圖3-2如下:
圖3-2 數據處理及控制模塊 3.3溫度傳感器設計 3.3.1溫度傳感器簡介DS18B20可以設定9~12位的分辨率,其精確度比較高。為了滿足實際的工作需要也可以采用比較小的封閉方式和相對較寬的電壓。設定的分辨率及報警溫度存儲在EPROM中,掉電后不會丟失。 溫度傳感器DS18B20引腳如圖3-3所示 圖3-3 DS18B20TO-92封裝溫度傳感器 引腳功能說明: VDD :可選電源腳,電源電壓范圍3~5.5V。 DQ :數據輸入/輸出腳。漏極開路,常態下高電平。 GND :為接地電源腳。 DS18B20的組成部分主要包括:光刻64位ROM、溫度傳感器、非揮發的溫度報警觸發器TH和TL、配置寄存器這四部分,它們在其內部按照一定得結構進行排列。 光刻64位ROM它的序列號排列是有一定規律的,一般情況下排在首位的是8位不同類型的產品標簽,之后是DS18B20的序列48位序列號,排在最后的是前面所有序列號的校驗碼,我們通過總結可以知道64光刻ROM的作用是保證每個DS18B20都不一樣,這樣就可以滿足總線連接多個DS18B20的要求。 DS18B20溫度傳感器主要包括的高速內存非常容易丟失,內存RAM主要有八個字節組成,這八個字節所包含的內容有很大的區別。其中第一個字節是是低八位,第二個字節是高八位,第三個和第四個字節是最高和最低位的的非易失性復制,第五個字節是結構寄存器的非易失性復制,第三,第四,第五個字節在每次上電復位時刷新內容。六,七,八個字節用于內部計算。第九個字節是冗余測試。E2RAM的主要作用是為了儲存高溫與低溫觸發TH、TL。 通過DS18B20的通信協議,我們知道主機在對其進行控制時溫度實現轉換主要由三個步驟構成。分別是每次讀寫DS18B20時都要進行重新設置,完成設置之后需要發送一個指令,只有把相應的指令發送之后才能對其進行相關的操作。CPU在收到重新設置的要求之后需要先下拉后釋放,經歷一定的時間之后就可以完成對信號的復位。 3.3.2 溫度傳感器與單片機的連接 溫度傳感器在和單機片進行連接時所使用的接口型號是P2.0,這種接口在單機片中屬于高位地址線。P2端口是一個帶內部上拉電阻的8位雙向I/O,另外它在輸出緩沖時可以帶動4個邏輯門電路。P2端口的工作不受外界干擾,即使在對程序進行編寫和檢查時,它也能夠正常工作。圖3-4所示就是DSl8820組成情況。
圖3-4 DS18B20和單片機的接口連接 3.4LCD顯示模塊在這種模塊內部存放的字符是有不同的字符組成的,這些字符主要包括:英文字母、常用的數學符號和阿拉伯數字,不同的字符所具有的代碼也不一樣。就拿英文字母來說大寫的A所代表的是41h,如果使用顯示器進行發送時,模塊上顯示的是41h,但是在液晶顯示器上看到的卻是字母A。 1602液晶模塊的控制器主要有11條指令,數量眾多的控制指令可以更好地完成對程序的控制,滿足其工作需要。 采用的LCD1602液晶模塊是標準16針插座,接口電路如圖3.6所示 圖3.6 顯示電路的連接圖 3.5系統硬件的總體框圖系統硬件的總體框圖如圖3.7所示
圖3.7 系統硬件的總體框圖 第四章 軟件設計
4.1 軟件介紹
4.1.1 編程軟件Keil軟件:單片機開發中離不開軟件,我們寫的匯編語言源程序要變為CPU可以執行的機器碼有兩種方法,一種是手工匯編,另一種是機器匯編,目前已極少使用手工匯編的方法了。機器匯編是通過匯編軟件將源程序變為機器碼,用于MCS-51單片機的匯編軟件有早期的A51,隨著單片機開發技術的不斷發展,從普遍使用匯編語言到逐漸使用高級語言開發,單片機的開發軟件也在不斷發展,Keil軟件是目前最流行開發MCS-51系列單片機的軟件,這從近年來各仿真機廠商紛紛宣布全面支持Keil即可看出。Keil提供了包括C編譯器、宏匯編、連接器、庫管理和一個功能強大的仿真調試器等在內的完整開發方案,通過一個集成開發環境(uVision)將這些部份組合在一起。 4.1.2 繪圖軟件Proteus軟件是英國Lab Center Electronics公司出版的EDA工具軟件(該軟件中國總代理為廣州風標電子技術有限公司)。它不僅具有其它EDA工具軟件的仿真功能,還能仿真單片機及外圍器件。它是目前比較好的仿真單片機及外圍器件的工具。雖然目前國內推廣剛起步,但已受到單片機愛好者、從事單片機教學的教師、致力于單片機開發應用的科技工作者的青睞。Proteus可提供的仿真元器件資源:仿真數字和模擬、交流和直流等數千種元器件,有30多個元件庫。.Proteus可提供的仿真儀表資源 :示波器、邏輯分析儀、虛擬終端、SPI調試器、I2C調試器、信號發生器、模式發生器、交直流電壓表、交直流電流表。理論上同一種儀器可以在一個電路中隨意的調用。除了現實存在的儀器外,Proteus還提供了一個圖形顯示功能,可以將線路上變化的信號,以圖形的方式實時地顯示出來,其作用與示波器相似,但功能更多。這些虛擬儀器儀表具有理想的參數指標,例如極高的輸入阻抗、極低的輸出阻抗。這些都盡可能減少了儀器對測量結果的影響。Proteus可提供的調試手段 Proteus提供了比較豐富的測試信號用于電路的測試。這些測試信號包括模擬信號和數字信號。
4.2程序設計DS18B20讀取溫度的流程圖如下圖4-1:
圖4-1DS18B20讀取溫度的流程圖
溫度數據處理流程圖如下4-5:
圖4-2 溫度數據處理流程圖
第五章 調試5.1開機溫度測試運行程序,數碼管顯示設定溫度值。 圖5.1開機溫度測試
5.2設置溫度測試三個按鍵:模式切換鍵、加鍵和減鍵。模式切換鍵可以切換正常顯示,上限溫度設定狀態,下限溫度設定狀態。通過加鍵和減鍵設定溫度,通過切換鍵可以切換成正常狀態。
圖5.2設置溫度測試
5.3 報警測試當實測溫度高于設定的上限值,蜂鳴器報警和LED紅燈閃爍報警,如圖5.3所示。當實測溫度高于設定的下限值,蜂鳴器報警和LED黃燈閃爍報警,如圖5.4所示
圖5.3上限報警調試
圖5.4設置溫度測試 結 論本文的主要內容是對單機片的組成要素進行了詳細的介紹,重點知識主要包括AT89C51型號單片機與DS18B20型號數字溫度傳感器的主要結構和作用,數字溫度計主要由DS18B20與AT89C51單片機、LCD1602構成,有超溫報警功能。 通過本次設計使我們小組在專業知識方面有了很大的提高,同時也使我們認識到自身的不足之處。單機片設計的主要內容是硬件設施的挑選、電路的設計和程序的完成,硬件的選擇有點麻煩,但是硬件是其他部分的關鍵,硬件選好了后面的部分就輕松的多,還有電路的設計,怎么樣設計才能達到最佳的效果,還有程序的完成,這是一連串的過程,需要不斷地思考,測試完善,這次設計也是我們對所學知識的一次綜合應用,在發現問題,解決問題的這一過程中使我們受益匪淺。只有善于思考,不斷地改進,以一個科學嚴謹認真的態度去對待,才能有所成果,C51單片機是現在最基礎最簡單的單片機,本設計結構簡單,應用性較強,能夠較好地實現相應的功能。以后我們會更加深入地學習與單片機、電子電路、C語言的相關知識,對相關的理論進行思考和摸索,更好地掌握這些知識。
- #include<reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
-
- uchar smg_dm[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x63,0x39,0x00}; //共陰數碼管0-9 O C 全滅 段碼表
- uchar smg_dm1[]={0xbf,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,}; //0. 1. 2.----9.段碼表
- uchar smg_wm[]={0Xef,0Xdf,0xbf,0x7f}; //位選
-
- uchar Display_buffer[4]={0,0,0,0}; //數碼管顯示緩存
-
- sbit LED=P3^7; //高溫度報警指示燈
- sbit LED1=P3^5; //低溫度報警指示燈
- sbit BEEP=P3^6; //蜂鳴器
-
- sbit key1=P2^0;
- sbit key2=P2^1;
- sbit key3=P2^2;
- sbit DQ=P2^3; //DS18B20 總線 精度1
-
- uint temp1; //上限溫度
- uint temp2; //下限溫度
- uchar keynum;
- uchar flagkey=0;
- uchar flag=0;
- uint num;
- uint temp; //數碼管溫度顯示變量
- void keyscan(); //按鍵掃描程序
- void smg_display_ds18b20();//數碼管溫度顯示函數
- void display(); //溫度顯示
- void display1(); //按鍵設置溫度顯示
- void delay_ms(uint z); //ms延時子程序
- void delay_us(uint t); //延時子程序
- void init_ds18b20(void); // ds18b20初始化
- void write_byte(uchar dat); //寫字節
- uchar read_byte(void); //讀字節
- uint readtemperature(void); //讀數據
-
- void keyscan()
- {
- if(key1==0)
- {
- delay_ms(10);
- if(key1==0)
- {
- keynum++;
- keynum=keynum%3;
- switch(keynum)
- {
- case 0:flagkey=0;break;
- case 1:flagkey=1;break;
- case 2:flagkey=2;break;
- }
- }
- while(!key1);
- }
- if(flagkey==1) //設置上限
- {
- if(key2==0)
- {
- delay_ms(10);
- if(key2==0)
- {
- //flag1=1;
- #if 1
- temp1=temp1+10;
- if(temp1==100)
- {
- temp1=0;
- }
-
-
- #endif
- }
- while(!key2);
- }
- if(key3==0)
- {
- delay_ms(10);
- if(key3==0)
- {
- // flag1=2;
- #if 1
- temp1=temp1-10;
- if(temp1==0)
- {
- temp1=100;
- }
-
- #endif
- }
- while(!key3);
- }
- // display1();
- }
- if(flagkey==2) //設置下限
- {
- if(key2==0)
- {
- delay_ms(10);
- if(key2==0)
- {
- //flag1=1;
- #if 1
-
- temp2=temp2+10;
- if(temp2==100)
- {
- temp2=0;
- }
-
- #endif
- }
- while(!key2);
- }
- if(key3==0)
- {
- delay_ms(10);
- if(key3==0)
- {
- // flag1=2;
- #if 1
- temp2=temp2-10;
- if(temp2==0)
- {
- temp2=100;
- }
- #endif
- }
- while(!key3);
- }
- }
- display1();
-
- }
-
-
- void main()//主程序
- {
- TMOD=0X01;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- EA=1;
- ET0=1;
- TR0=1;
- temp1=345; //上限溫度
- temp2=305; //下限溫度
- while(1)
- {
- keyscan();
- // if(flagkey==1)
- // {
- if(temp>=temp1&&flagkey==0) //250是實際的數值 //flagkey==0 設置狀態蜂鳴器和LED都不起作用
- {
- // LED=0;
- if(flag==1)
- {
- BEEP=0;// 開始報警
- LED=0;
- LED1=1;
- flag=0; // 退出if語句
- }
- else
- {
- BEEP=1; //關閉報警 實現以0.5S的時間間隔來報警 時間和自己設定
- LED=1;
- LED1=1;
- }
- }
- else if(temp<=temp2&&flagkey==0)
- {
- // LED=0;
- if(flag==1)
- {
- BEEP=0;// 開始報警
- LED1=0;
- LED=1;
- flag=0; // 退出if語句
- }
- else
- {
- BEEP=1; //關閉報警 實現以0.5S的時間間隔來報警 時間和自己設定
- LED1=1;
- LED=1;
- }
- }
- else
- {
- LED=1;
- LED1=1;
- BEEP=1;
- }
- // }
-
-
- if(flagkey==0) //上電 顯示DS18B20測出的溫度 有按鍵按下退出這個顯示
- {
- display(); //溫度顯示
- }
- }
- }
-
- void time0() interrupt 1
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- num++;
- if(num==10) //0.5S到
- {
- num=0;
- flag=1; //進去蜂鳴器報警
- }
- }
-
- void display1() //設置數碼管顯示
- {
- #if 1
- uchar i;
- //Display_buffer[0]=12; //也可以硬件不接
- if(flagkey==1)
- {
- Display_buffer[0]=temp1/1000;
- Display_buffer[1]=temp1%1000/100;
- Display_buffer[2]=temp1%1000%100/10;
- Display_buffer[3]=temp1%10; //251 結果余1
- }
- if(flagkey==2)
- {
- Display_buffer[0]=temp2/1000;
- Display_buffer[1]=temp2%1000/100;
- Display_buffer[2]=temp2%1000%100/10;
- Display_buffer[3]=temp2%10; //251 結果余1
- }
- for(i=0;i<=3;i++)
- {
- if(i==2)
- {
- P2=smg_wm[i];//選位碼
- P1=smg_dm1[Display_buffer[i]];//選段碼
- delay_ms(5);
- P1=0X00;//消影
- }
- else
- {
- P2=smg_wm[i];//選位碼
- P1=smg_dm[Display_buffer[i]];//選段碼
- delay_ms(5);
- P1=0X00;//消影
- }
- }
- #endif
- }
-
-
-
- void display() //
- {
- temp=readtemperature(); //讀出溫度值
- smg_display_ds18b20(); //數碼管上顯示
- }
-
- void smg_display_ds18b20() //DS18B20的采樣回來的數值 數碼管顯示的延時是1ms,延時時間長一點的顯示會不正常
- {
- #if 1
- uchar i;
- //Display_buffer[0]=12; //也可以硬件不接
- Display_buffer[0]=temp/1000;
- Display_buffer[1]=temp%1000/100;
- Display_buffer[2]=temp%1000%100/10;
- Display_buffer[3]=temp%10; //251 結果余1
- for(i=0;i<=3;i++)
- {
- if(i==2)
- {
- P2=smg_wm[i];//選位碼
- P1=smg_dm1[Display_buffer[i]];//選段碼
- delay_ms(5);
- P1=0X00;//消影
- }
- else
- {
- P2=smg_wm[i];//選位碼
- P1=smg_dm[Display_buffer[i]];//選段碼
- delay_ms(5);
- P1=0X00;//消影
- }
- }
- #endif
- }
-
- ///////////////////////延時////////////////////////////////////
- void delay_ms(uint z) //延時子程序
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
-
- void delay_us(uint t)
- {
- while(t--);
- }
-
-
-
- /////////////////////DS18B20部分 根據18B20規格書的時序來進行讀寫操作//////////////////////////
- void init_ds18b20(void) //根據18B20時序寫
- {
- uchar n;
- DQ=1;
- delay_us(8);
- DQ=0;
- delay_us(80);
- DQ=1;
- delay_us(8);
- n=DQ;
- delay_us(14);
- }
- ///////////////////////////////
- void write_byte(uchar dat) //寫字節
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- DQ=0;
- DQ=dat&0x01;
- delay_us(8);
- DQ=1;
- dat>>=1;
- }
- delay_us(8);
- }
- //////////////////////////////////
- uchar read_byte(void) //讀字節
- {
- uchar i,value;
- for(i=0;i<8;i++)
- {
- DQ=0;
- value>>=1;
- DQ=1;
- if(DQ)
- value|=0x80;
- delay_us(4);
- }
- return value;
- }
- ////////////////////////////
- uint readtemperature(void) //讀溫度 //uchar 只有255
- {
- uchar a,b;
- uint val;
- float f_val;
- init_ds18b20();
- write_byte(0xcc); //跳過ROM
- write_byte(0x44); // 啟動溫度測量
- delay_us(300); //適當延時
- init_ds18b20(); //
- write_byte(0xcc);
- write_byte(0xbe); //讀取溫度寄存器
- a=read_byte(); //連續讀兩個字節數據。讀低8位
- b=read_byte(); //讀高8位
- ///////////////////////////////////////////////////
-
- ///////////////////////////////////////////////////
- #if 1 //精度為0.1
- …………
- …………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
附錄二 原理圖
以上的Word格式文檔51黑下載地址:
基于單片機的智能溫度表設計.docx
(530.87 KB, 下載次數: 71)
2018-10-14 10:08 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|