久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5352|回復: 4
打印 上一主題 下一主題
收起左側

我的單片機DS18B20智能溫度表設計

[復制鏈接]
跳轉到指定樓層
樓主
ID:409329 發表于 2018-10-14 10:09 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

本論文的主要內容是詳細敘述使用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語言的相關知識,對相關的理論進行思考和摸索,更好地掌握這些知識。


  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. uchar smg_dm[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x63,0x39,0x00}; //共陰數碼管0-9 O C 全滅              段碼表
  5. uchar smg_dm1[]={0xbf,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,}; //0. 1. 2.----9.段碼表
  6. uchar smg_wm[]={0Xef,0Xdf,0xbf,0x7f};      //位選

  7. uchar Display_buffer[4]={0,0,0,0};                //數碼管顯示緩存

  8. sbit LED=P3^7;  //高溫度報警指示燈
  9. sbit LED1=P3^5;  //低溫度報警指示燈
  10. sbit BEEP=P3^6;  //蜂鳴器

  11. sbit key1=P2^0;
  12. sbit key2=P2^1;
  13. sbit key3=P2^2;
  14. sbit DQ=P2^3;  //DS18B20 總線 精度1

  15. uint temp1; //上限溫度
  16. uint temp2; //下限溫度
  17. uchar keynum;
  18. uchar flagkey=0;
  19. uchar flag=0;
  20. uint num;
  21. uint temp;              //數碼管溫度顯示變量
  22. void keyscan();              //按鍵掃描程序
  23. void smg_display_ds18b20();//數碼管溫度顯示函數
  24. void display();                                //溫度顯示
  25. void display1();                            //按鍵設置溫度顯示
  26. void delay_ms(uint z);  //ms延時子程序
  27. void delay_us(uint t);              //延時子程序
  28. void init_ds18b20(void); //              ds18b20初始化
  29. void write_byte(uchar dat);                //寫字節
  30. uchar read_byte(void);                    //讀字節
  31. uint readtemperature(void);  //讀數據

  32. void keyscan()
  33. {
  34.               if(key1==0)
  35.               {
  36.               delay_ms(10);
  37.               if(key1==0)
  38.               {
  39.                             keynum++;
  40.                             keynum=keynum%3;
  41.                             switch(keynum)
  42.                             {
  43.                                           case 0:flagkey=0;break;
  44.                                           case 1:flagkey=1;break;            
  45.                                           case 2:flagkey=2;break;
  46.                             }
  47.               }
  48.               while(!key1);
  49.               }
  50.               if(flagkey==1)                 //設置上限
  51.               {
  52.                             if(key2==0)
  53.                             {
  54.                                           delay_ms(10);
  55.                                           if(key2==0)
  56.                                           {
  57.                                           //flag1=1;
  58.                                           #if 1
  59.                                           temp1=temp1+10;
  60.                                                         if(temp1==100)
  61.                                                         {
  62.                                                                       temp1=0;
  63.                                                         }

  64.                                          
  65.                                           #endif
  66.                                           }
  67.                                           while(!key2);            
  68.                             }
  69.                             if(key3==0)
  70.                                           {
  71.                                                         delay_ms(10);
  72.                                                         if(key3==0)
  73.                                                         {
  74.                                                         // flag1=2;
  75.                                                         #if 1
  76.                                                         temp1=temp1-10;
  77.                                                                       if(temp1==0)
  78.                                                                       {
  79.                                                                                     temp1=100;
  80.                                                                       }

  81.                                                         #endif
  82.                                                         }
  83.                                                         while(!key3);            
  84.                                           }
  85.               //              display1();
  86.               }
  87.                             if(flagkey==2)              //設置下限
  88.                             {
  89.                                           if(key2==0)
  90.                             {
  91.                                           delay_ms(10);
  92.                                           if(key2==0)
  93.                                           {
  94.                                           //flag1=1;
  95.                                           #if 1

  96.                                           temp2=temp2+10;
  97.                                                         if(temp2==100)
  98.                                                         {
  99.                                                                       temp2=0;
  100.                                                         }
  101.                                          
  102.                                           #endif
  103.                                           }
  104.                                           while(!key2);            
  105.                             }
  106.                             if(key3==0)
  107.                                           {
  108.                                                         delay_ms(10);
  109.                                                         if(key3==0)
  110.                                                         {
  111.                                                         // flag1=2;
  112.                                                         #if 1
  113.                                                         temp2=temp2-10;
  114.                                                                       if(temp2==0)
  115.                                                                       {
  116.                                                                                     temp2=100;
  117.                                                                       }
  118.                                                         #endif
  119.                                                         }
  120.                                                         while(!key3);            
  121.                                           }
  122.                             }
  123.                             display1();

  124. }


  125. void main()//主程序
  126. {
  127.     TMOD=0X01;
  128.               TH0=(65536-50000)/256;
  129.               TL0=(65536-50000)%256;
  130.     EA=1;
  131.     ET0=1;
  132.               TR0=1;
  133.               temp1=345;              //上限溫度
  134.               temp2=305;              //下限溫度
  135.               while(1)
  136.                             {            
  137.                               keyscan();
  138.                             // if(flagkey==1)
  139.                             // {
  140.                                             if(temp>=temp1&&flagkey==0)  //250是實際的數值   //flagkey==0 設置狀態蜂鳴器和LED都不起作用
  141.                                              {
  142.                                                           // LED=0;
  143.                                                            if(flag==1)
  144.                                                            {
  145.                                                                                        BEEP=0;//  開始報警
  146.                                                                                     LED=0;
  147.                                                                                     LED1=1;
  148.                                                                                     flag=0;              // 退出if語句
  149.                                                            }
  150.                                                            else
  151.                                                            {
  152.                                                                                        BEEP=1;              //關閉報警 實現以0.5S的時間間隔來報警 時間和自己設定
  153.                                                                                     LED=1;
  154.                                                                                     LED1=1;
  155.                                                            }               
  156.                                              }
  157.                                              else if(temp<=temp2&&flagkey==0)
  158.                                              {
  159.                                                            //  LED=0;
  160.                                                            if(flag==1)
  161.                                                            {
  162.                                                                                        BEEP=0;//  開始報警
  163.                                                                                     LED1=0;
  164.                                                                                     LED=1;
  165.                                                                                     flag=0;              // 退出if語句
  166.                                                            }
  167.                                                            else
  168.                                                            {
  169.                                                                                        BEEP=1;              //關閉報警 實現以0.5S的時間間隔來報警 時間和自己設定
  170.                                                                                     LED1=1;
  171.                                                                                     LED=1;
  172.                                                            }
  173.                                              }
  174.                                              else
  175.                                              {
  176.                                                            LED=1;
  177.                                                            LED1=1;
  178.                                                            BEEP=1;
  179.                                              }
  180.                             //  }
  181.                            

  182.                                if(flagkey==0) //上電 顯示DS18B20測出的溫度 有按鍵按下退出這個顯示
  183.                                {
  184.                                             display();                            //溫度顯示
  185.                                }
  186.                             }
  187. }

  188. void time0() interrupt 1
  189. {
  190.       TH0=(65536-50000)/256;
  191.                 TL0=(65536-50000)%256;
  192.                 num++;            
  193.       if(num==10) //0.5S到
  194.                 {
  195.                   num=0;
  196.                             flag=1;              //進去蜂鳴器報警
  197.                 }
  198. }

  199. void display1()                //設置數碼管顯示
  200. {
  201.               #if 1
  202.               uchar i;
  203.               //Display_buffer[0]=12;  //也可以硬件不接
  204.               if(flagkey==1)
  205.               {
  206.               Display_buffer[0]=temp1/1000;
  207.               Display_buffer[1]=temp1%1000/100;
  208.               Display_buffer[2]=temp1%1000%100/10;
  209.               Display_buffer[3]=temp1%10;              //251 結果余1
  210.               }
  211.               if(flagkey==2)
  212.               {
  213.               Display_buffer[0]=temp2/1000;
  214.               Display_buffer[1]=temp2%1000/100;
  215.               Display_buffer[2]=temp2%1000%100/10;
  216.               Display_buffer[3]=temp2%10;              //251 結果余1
  217.               }
  218.               for(i=0;i<=3;i++)
  219.                             {            
  220.                               if(i==2)
  221.                               {
  222.                                                           P2=smg_wm[i];//選位碼
  223.                                                         P1=smg_dm1[Display_buffer[i]];//選段碼
  224.                                                         delay_ms(5);
  225.                                                         P1=0X00;//消影
  226.                               }
  227.                               else
  228.                               {            
  229.                                                         P2=smg_wm[i];//選位碼
  230.                                                         P1=smg_dm[Display_buffer[i]];//選段碼
  231.                                                         delay_ms(5);
  232.                                           P1=0X00;//消影
  233.                             }
  234.                   }
  235.               #endif
  236. }



  237. void display()  //
  238. {
  239.               temp=readtemperature();              //讀出溫度值
  240.               smg_display_ds18b20();               //數碼管上顯示            
  241. }
  242.                                          
  243. void smg_display_ds18b20()              //DS18B20的采樣回來的數值 數碼管顯示的延時是1ms,延時時間長一點的顯示會不正常
  244. {
  245.   #if 1
  246.               uchar i;
  247.               //Display_buffer[0]=12;  //也可以硬件不接
  248.               Display_buffer[0]=temp/1000;
  249.               Display_buffer[1]=temp%1000/100;
  250.               Display_buffer[2]=temp%1000%100/10;
  251.               Display_buffer[3]=temp%10;              //251 結果余1
  252.               for(i=0;i<=3;i++)
  253.                             {            
  254.                               if(i==2)
  255.                               {
  256.                                                           P2=smg_wm[i];//選位碼
  257.                                                         P1=smg_dm1[Display_buffer[i]];//選段碼
  258.                                                         delay_ms(5);
  259.                                                         P1=0X00;//消影
  260.                               }
  261.                               else
  262.                               {            
  263.                                                         P2=smg_wm[i];//選位碼
  264.                                                         P1=smg_dm[Display_buffer[i]];//選段碼
  265.                                                         delay_ms(5);
  266.                                               P1=0X00;//消影
  267.                             }
  268.                   }
  269.               #endif
  270. }

  271. ///////////////////////延時////////////////////////////////////
  272. void delay_ms(uint z)  //延時子程序
  273. {
  274.    uint x,y;
  275.    for(x=z;x>0;x--)
  276.                  for(y=110;y>0;y--);
  277. }

  278. void delay_us(uint t)
  279. {
  280.               while(t--);
  281. }



  282. /////////////////////DS18B20部分 根據18B20規格書的時序來進行讀寫操作//////////////////////////
  283. void init_ds18b20(void)   //根據18B20時序寫
  284. {
  285.   uchar n;
  286.   DQ=1;
  287.   delay_us(8);
  288.   DQ=0;
  289.   delay_us(80);
  290.   DQ=1;
  291.   delay_us(8);
  292.   n=DQ;
  293.   delay_us(14);
  294. }
  295. ///////////////////////////////
  296. void write_byte(uchar dat)               //寫字節
  297. {
  298.               uchar i;
  299.               for(i=0;i<8;i++)
  300.               {
  301.                             DQ=0;  
  302.                             DQ=dat&0x01;
  303.                             delay_us(8);  
  304.                             DQ=1;
  305.                             dat>>=1;
  306.               }
  307.               delay_us(8);
  308. }
  309. //////////////////////////////////
  310. uchar read_byte(void)               //讀字節
  311. {
  312.               uchar i,value;
  313.               for(i=0;i<8;i++)
  314.               {
  315.                             DQ=0;
  316.                             value>>=1;
  317.                             DQ=1;
  318.                             if(DQ)  
  319.                             value|=0x80;  
  320.                             delay_us(4);
  321.               }
  322.               return value;
  323. }
  324. ////////////////////////////
  325. uint readtemperature(void)   //讀溫度                            //uchar 只有255
  326. {
  327.     uchar a,b;
  328.               uint val;
  329.               float f_val;
  330.               init_ds18b20();
  331.               write_byte(0xcc); //跳過ROM
  332.               write_byte(0x44); // 啟動溫度測量
  333.               delay_us(300); //適當延時
  334.               init_ds18b20();  //
  335.               write_byte(0xcc);
  336.               write_byte(0xbe);  //讀取溫度寄存器
  337.               a=read_byte();                             //連續讀兩個字節數據。讀低8位
  338.               b=read_byte();                             //讀高8位
  339. ///////////////////////////////////////////////////

  340. ///////////////////////////////////////////////////
  341.               #if 1 //精度為0.1
  342.     …………
  343. …………
  344. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

附錄二 原理圖


以上的Word格式文檔51黑下載地址:

基于單片機的智能溫度表設計.docx (530.87 KB, 下載次數: 71)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:548367 發表于 2019-12-31 12:05 | 只看該作者
真是太感謝這樣的分享了  ,希望能下載一下
回復

使用道具 舉報

板凳
ID:682512 發表于 2020-1-7 02:25 來自觸屏版 | 只看該作者
你好,程序有匯編語言版本的嘛
回復

使用道具 舉報

地板
ID:867100 發表于 2020-12-25 10:37 來自觸屏版 | 只看該作者
怎么實現不了
回復

使用道具 舉報

5#
ID:868660 發表于 2020-12-27 10:56 來自觸屏版 | 只看該作者
可以呀,這個太牛了,要是樓主能傳個仿真給我們學習一下就更好了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 羞羞色在线观看 | 日本一二三区电影 | 久久久久国产一级毛片高清网站 | 精品一二三区 | 一级欧美日韩 | www.99re5.com | 五月婷婷色 | 九九国产| 精品在线一区二区 | 99热欧美| 久久人人网 | 国产免费福利小视频 | 伊人久久大香线 | 精品二| 欧美自拍一区 | 久久国产欧美日韩精品 | 久久99视频 | 亚洲欧美日韩精品久久亚洲区 | 亚洲天堂av一区 | 成人福利电影 | 一区二区视频在线 | 国产一区二区三区四区五区3d | 国产在线www | 综合色播 | 亚洲欧美日韩在线一区二区 | 五月综合激情在线 | 一区网站 | 亚洲精品国产电影 | 在线日韩视频 | 午夜在线| 精品久久久久久中文字幕 | 成av在线 | 欧美午夜精品久久久久久浪潮 | 精品久久久久久久久久 | 国产视频精品区 | 日韩高清一区 | 成人欧美一区二区三区在线观看 | 久久综合一区二区 | 一区二区日韩 | 亚洲小视频 | 成人精品国产 |