乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      PIC單片機之溫度采集

       共同成長888 2020-06-24

      大家好, 通過前一期的學習, 我們已經(jīng)對ICD2 仿真燒寫器和增強型PIC 實驗板的使用方法及學習方式有所了解與熟悉,學會了如何用單片機來控制發(fā)光管、繼電器、蜂鳴器、按鍵、數(shù)碼管、RS232 串口、步進電機等資源,體會到了學習板的易用性與易學性,看了前幾期實例,當你實驗成功后一定很興奮,很有成就感吧!現(xiàn)在我們就趁熱打鐵,再向上跨一步,一起來學習一下DS18B20 數(shù)字溫度傳感器的工作原理及使用方法,這樣我們用單片機來讀取溫度數(shù)值,可以做出很多溫控方面的小產(chǎn)品來,如溫度計,溫度控制繼電器的應(yīng)用系統(tǒng)。

      一、 單總線溫度傳感器DS18B20簡介

      DS18B20 是DALLAS 公司生產(chǎn)的單總線式數(shù)字溫度傳感器,它具有微型化、低功耗、高性能、搞干擾能力強、易配處理器等優(yōu)點,特別適用于構(gòu)成多點溫度測控系統(tǒng),可直接將溫度轉(zhuǎn)化成串行數(shù)字信號(提供9 位二進制數(shù)字)給單片機處理,且在同一總線上可以掛接多個傳感器芯片。它具有3 引腳TO - 92 小體積封裝形式,溫度測量范圍為- 55℃~+ 125℃,其工作電源既可在遠端引入,也可采用寄生電源方式產(chǎn)生,多個DS18B20 可以并聯(lián)到3 根或2 根線上,CPU只需一根端口線就能與多個DS18B20 通信,占用微處理器的端口較少,可節(jié)省大量的引線和邏輯電路。以上特點使DS18B20 非常適用于遠距離多點溫度檢測系統(tǒng)。

      二、 DS18B20外形、引腳及時序

      外形及引腳如圖1 所示。

      圖1 管腳排列圖

      圖1 管腳排列圖

      在TO-92 和SO-8 的封裝中引腳有所不同,具體差別請查閱有關(guān)手冊,在TO-92 封裝中引腳分配如下:

      1(GND):地

      2(DQ):單總線數(shù)據(jù)輸入輸出引腳

      3(VDD):可選的電源引腳(在某些應(yīng)用場合可以不接)

      單總線有一個主機,能夠控制一個或多個從機設(shè)備。主機可以是微處理器,從機可以是單總線器件,它們之間的數(shù)據(jù)交換只通過一條信號線。

      當只有一個從機設(shè)備時,系統(tǒng)可按單節(jié)點系統(tǒng)操作;當有多個從設(shè)備時,系統(tǒng)則按多節(jié)點系統(tǒng)操作。主機或從機通過一個漏極開路或三態(tài)端口連接到這個數(shù)據(jù)線,以允許設(shè)備在不發(fā)送數(shù)據(jù)時能夠釋放總線,而讓其它設(shè)備使用總線,其內(nèi)部等效電路圖如圖2 所示。單總線通常要求接一個約為4.7K 左右的上拉電阻,這樣,當總線空閑時,其狀態(tài)為高電平。主機和從機之間的通信可以通過三個步驟完成,分別是初始化單總線器件、識別單總線器件、數(shù)據(jù)交換。由于它們是主從結(jié)構(gòu),只有主機呼號從機時,從機才能應(yīng)答,因此主機訪問單總線器件時都必須嚴格遵循單總線命令序列。如果出現(xiàn)序列混亂,單總線器件將不響應(yīng)主機。

      圖2 內(nèi)部等效電路圖

      圖2 內(nèi)部等效電路圖

      所有單總線器件的讀、寫時序至少需要60μS,且每兩個獨立的時序間至少需要1μS的恢復(fù)時間。在寫時序中,主機將在拉低總線15μS 之內(nèi)釋放總線,并向單總線器件寫“1”;如果主機拉低總線后能保持至少60μS 的低電平,則向總線器件寫“0”。單總線器件僅在主機發(fā)出讀時序時才向主機傳輸數(shù)據(jù),所以,當主機向單總線器件發(fā)出讀數(shù)據(jù)命令后,必須馬上產(chǎn)生讀時序,以便單總線器件能傳輸數(shù)據(jù)。

      三、DS18B20工作過程

      DS18B20 內(nèi)部的“低溫度系數(shù)振蕩器”頻率隨溫度變小,振蕩信號送計數(shù)器1,“高溫度系數(shù)振蕩器”振蕩頻率隨溫度變化,振蕩信號送計數(shù)器2。兩者的計數(shù)差與溫度成正比。DS18B20內(nèi)部的溫度寄存器中的溫度值以9 位數(shù)據(jù)格式表示,最高位為符號位,其余8 位以二進制補碼形式表示溫度值。測溫結(jié)束時,這9 位數(shù)據(jù)轉(zhuǎn)存到暫存存儲器的前兩個字節(jié)中,符號位占用第一字節(jié),8 位溫度數(shù)據(jù)占據(jù)第二字節(jié)。但因符號位擴展成高8 位,所以最后以16 位補碼形式讀出。

      DS18B20 內(nèi)部的比較器以四舍五入的量化方式確定溫度寄存器的最低有效位。四舍五入最大量化誤差為±1/2LSB,即0.25℃。

      而一般模擬量輸出的溫度傳感器我們還需要加上一個AD 模數(shù)轉(zhuǎn)換電路才可以將數(shù)據(jù)傳給單片機,但是DS18B20 的輸出口可以直接和單片機I/O 口相連,我們只需要操作單片機的一個I/O 口,就可以獲得溫度值了,使用更加簡單、方便。

      現(xiàn)在,我們來一起看一個數(shù)字溫度通過數(shù)碼管顯示的例子,通過一個實例,相信會給大家?guī)硪粋€感性的認識。

      四、溫度采集應(yīng)用實例

      首先,我們來看一下增強型PIC 實驗板上的DS18B20 溫度傳感器的接口電路,因為我們需要將軟件和硬件相結(jié)合進行考慮如何來編程,完成該實驗的硬件原理圖如圖3 所示,J5 為實驗板上溫度傳感器的接口,傳感器輸出的數(shù)據(jù)與單片機的RD5 口相連,七段數(shù)碼管D5、D7、D8組成了顯示單元,字形碼的數(shù)據(jù)通過RC 口送入,各數(shù)碼管的顯示片選信號分別不同的RA 口進行控制。

      圖3 硬件原理圖

      圖3 硬件原理圖

      對于單片機軟件的編程,我們使用MPLabIDE 軟件來進行C 語言編程,它是我們的編程環(huán)境,同時我們可以通過使用ICD2 仿真燒寫器和增強型PIC 實驗板連接進行程序的仿真調(diào)試和燒寫步驟,具體的操作步驟,我們已經(jīng)在前幾期做了詳細的說明和介紹,在此就不再重復(fù)說明,讀者朋友可以參閱以前的文章或直接登陸我們的網(wǎng)站查看資料?,F(xiàn)在我們可以輸入程序代碼進行調(diào)試了,我們在MPLab IDE 軟件中新建工程,加入源程序代碼,同時進行芯片型號的選擇和配置位的設(shè)置,我們實驗所用的芯片型號為PIC16F877A。編寫的程序代碼如下:

      #include// 包含頭文件

      #define uch unsigned char // 宏定義

      # define DQ RD5 // 端口定義

      # define DQ_DIR TRISD5 // 端口定義

      # define DQ_HIGH() DQ_DIR =1

      # define DQ_LOW() DQ = 0; DQ_DIR = 0

      // 設(shè)置數(shù)據(jù)口為輸出

      // 變量定義

      unsigned char TLV=0; // 采集到的溫度高8 位

      unsigned char THV=0; // 采集到的溫度低8 位

      unsigned char TZ=0;

      // 轉(zhuǎn)換后的溫度值整數(shù)部分

      unsigned char TX=0; // 轉(zhuǎn)換后的溫度值小數(shù)部分

      unsigned int wd; // 轉(zhuǎn)換后的溫度值BCD 碼形式

      unsigned char shi; // 整數(shù)十位

      unsigned char ge; // 整數(shù)個位

      unsigned char shifen; // 十分位

      unsigned char baifen; // 百分位

      unsigned char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

      // 共陰LED 段碼表 0-9 的顯示代碼

      void delay(char x,char y)

      // 函數(shù)功能: 數(shù)碼管延時子程序

      {

      char z;

      do{

      z=y;

      do{;}while(--z);

      }while(--x);

      }

      void display() // 函數(shù)功能: 數(shù)碼管顯示子程序

      {

      TRISA=0X00; // 設(shè)置A 口全為輸出

      PORTC=table[shi]; // 顯示整數(shù)十位

      PORTA=0xEF;

      delay(10,70);

      PORTC=table[ge]&0x7F; // 顯示整數(shù)個位,并

      點亮小數(shù)點

      PORTA=0xDF;

      delay(10,70);

      PORTC=table[shifen]; // 顯示小數(shù)十分位

      PORTA=0xFB;

      delay(10,70);

      PORTC=table[baifen]; // 顯示小數(shù)百分位

      }

      void init() // 函數(shù)功能: 系統(tǒng)初始化函數(shù)

      {

      ADCON1=0x07; // 設(shè)置A 口為普通數(shù)字口

      TRISA=0x00; // 設(shè)置A 口方向為輸出

      TRISD=0x00; // 設(shè)置D 口方向為輸出

      TRISC=0x00;

      PORTD=0xff;

      }

      reset(void) // 復(fù)位DS18B20 函數(shù)函數(shù)

      {

      char presence=1;

      while(presence)

      {

      DQ_LOW() ; // 主機拉至低電平

      delay(2,70); // 延時503us

      DQ_HIGH(); // 釋放總線等電阻拉高總線,

      并保持15~60us

      delay(2,8); // 延時70us

      if(DQ==1)

      presence=1;

      // 沒有接收到應(yīng)答信號,繼續(xù)復(fù)位

      else

      presence=0; // 接收到應(yīng)答信號

      delay(2,60); // 延時430us

      }

      }

      void write_byte(uch val)

      // 寫18b20 寫字節(jié)函數(shù)函數(shù)

      {

      uch i;

      uch temp;

      for(i=8;i>0;i--)

      {

      temp=val&0x01; // 最低位移出

      DQ_LOW();

      NOP();

      NOP();

      NOP();

      NOP();

      NOP();

      // 從高拉至低電平, 產(chǎn)生寫時間隙

      if(temp==1)

      DQ_HIGH(); // 如果寫1, 拉高電平

      delay(2,7); // 延時63us

      DQ_HIGH();

      NOP();

      NOP();

      val=val》1; // 右移一位

      }

      }

      uch read_byte(void)

      // 函數(shù)功能:18b20 讀字節(jié)函數(shù)函數(shù)

      {

      uch i;

      uch value=0; // 讀出溫度

      static bit j;

      for(i=8;i>0;i--)

      {

      value》=1;

      DQ_LOW();

      NOP();

      NOP();

      NOP();

      NOP();

      NOP();

      NOP(); //6us

      DQ_HIGH(); // 拉至高電平

      NOP();

      NOP();

      NOP();

      NOP();

      NOP(); //4us

      j=DQ;

      if(j) value|=0x80;

      delay(2,7); //63us

      }

      return(value);

      }

      void get_temp()

      // 函數(shù)功能: 啟動溫度轉(zhuǎn)換函數(shù)函數(shù)

      {

      int i;

      DQ_HIGH();

      reset(); // 復(fù)位等待從機應(yīng)答

      write_byte(0xCC); // 忽略ROM 匹配

      write_byte(0x44); // 發(fā)送溫度轉(zhuǎn)化命令

      for(i=20;i>0;i--)

      {

      display();

      // 調(diào)用多次顯示函數(shù),確保溫度轉(zhuǎn)換完成所需要的時間

      }

      reset(); // 再次復(fù)位,等待從機應(yīng)答

      write_byte(0xCC); // 忽略ROM 匹配

      write_byte(0xBE); // 發(fā)送讀溫度命令

      TLV=read_byte(); // 讀出溫度低8 位

      THV=read_byte(); // 讀出溫度高8 位

      DQ_HIGH(); // 釋放總線

      TZ=(TLV》4)|(THV《4)&0x3f;

      // 溫度整數(shù)部分

      TX=TLV《4; // 溫度小數(shù)部分

      if(TZ>100)

      TZ/100; // 不顯示百位

      ge=TZ%10; // 整數(shù)部分個位

      shi=TZ/10; // 整數(shù)十位

      wd=0;

      if (TX & 0x80)

      wd=wd+5000;

      if (TX & 0x40)

      wd=wd+2500;

      if (TX & 0x20)

      wd=wd+1250;

      if (TX & 0x10)

      wd=wd+625;

      // 以上4 條指令把小數(shù)部分轉(zhuǎn)換為BCD 碼形式

      shifen=wd/1000; // 十分位

      baifen=(wd%1000)/100; // 百分位

      NOP();

      }

      void main() // 主函數(shù)

      {

      init(); // 調(diào)用系統(tǒng)初始化函數(shù)

      while(1)

      {

      get_temp(); // 調(diào)用溫度轉(zhuǎn)換函數(shù)

      display(); // 調(diào)用結(jié)果顯示函數(shù)

      }

      }

      編好程序后,讀者朋友可以先將DS18B20溫度傳感器插上實驗板,如圖4 所

      [1] [2]
      關(guān)鍵字:PIC單片機  溫度采集 編輯:什么魚 引用地址:http://news./mcu/ic487157.html 本網(wǎng)站轉(zhuǎn)載的所有的文章、圖片、音頻視頻文件等資料的版權(quán)歸版權(quán)所有人所有,本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認版權(quán)者。如果本網(wǎng)所選內(nèi)容的文章作者及編輯認為其作品不宜公開自由傳播,或不應(yīng)無償使用,請及時通過電子郵件或電話通知我們,以迅速采取適當措施,避免給雙方造成不必要的經(jīng)濟損失。

      上一篇:PIC單片機之步進電機
      下一篇:PIC單片機之數(shù)碼管

      • 關(guān)注eeworld公眾號
        快捷獲取更多信息

      • 關(guān)注eeworld服務(wù)號
        享受更多官方福利

      0

      推薦閱讀

      PIC單片機之I2C通信(主模式)
      (ACK)    當接收方接收完一個字節(jié)的數(shù)據(jù)就要告訴對方我收到了。接收方如果接收到數(shù)據(jù)則控制數(shù)據(jù)線輸出低電平。否則為高電平。    5,停止     沒有下一個字節(jié)要發(fā)送,最后時鐘線變?yōu)楦唠娖胶螅瑪?shù)據(jù)線從低電平變?yōu)楦唠娖?。代表?shù)據(jù)發(fā)送停止。    實例講解: 使用單片機使用 RSM2257 電子音量控制芯片來控制音量。一個按鍵按下,聲音變大,一個按鍵按下,聲音變小。在加上一個按鍵,控制一個LED亮滅的程序。而且音量掉電保存。    介紹RSM2257.    子地址 
      發(fā)表于 2020-04-25
      PIC單片機之I2C通信(主模式)
      PIC單片機學習遇到的一些問題
      1、中斷優(yōu)先級中斷優(yōu)先級的設(shè)置雖然能夠比較合理的管理資源,但是如果在中斷里寫太多內(nèi)容會導致另一個中斷可能永遠進不去的現(xiàn)象。比如在定時器中斷里定20ms,但是中斷里面處理的代碼量太多超過20ms,則會出現(xiàn)另一個中斷優(yōu)先級低的剛等待定時器執(zhí)行完要開始執(zhí)行時,定時時間到了又進定時中斷。如此循環(huán)低優(yōu)先級的中斷永遠也進不去。(給低優(yōu)先級中斷IE位重新復(fù)位可以在短時間無視優(yōu)先級執(zhí)行,不過過一段時間也會出現(xiàn)上述情況。作者親身試過的bug)2、AD采樣出現(xiàn)波動大的問題有時程序出現(xiàn)AD采樣的數(shù)值波動大往往是因為可能這時候的供電情況不同,可能你跟原先狀態(tài)比關(guān)閉了什么開啟了什么。如開關(guān)GPS、開關(guān)功放導致的。3、XC編譯器與系統(tǒng)不兼容問題由于系統(tǒng)與編譯器
      發(fā)表于 2020-03-23
      PIC單片機的學習——時鐘的配置
      一、概念Fcy是CPU時鐘,F(xiàn)osc晶振頻率。Fcy = Fosc/2,也就是CPU時鐘是晶振頻率的1/2。二、寄存器的配置例子如下:    //系統(tǒng)時鐘初始化 產(chǎn)生55.296M //11.0592M晶振    // Fosc= Fin*M/(N1*N2), Fcy=Fosc/2    // Fosc= 11.0592M*60/(2*3)=110.592Mhz for 11.0592M input clock    // Fcy= Fosc/2 = 55.296MHZ     PLLFBD = 58;  &nbs
      發(fā)表于 2020-03-23
      PIC單片機軟件平臺----MPLAB IDE和MPLAB X IDE
      這里主要是針對PIC18單片機開發(fā)平臺,當然對于16位或32位單片機的開發(fā)平臺是一樣的,只是編譯器不一樣。PIC18單片機有兩個開發(fā)平臺,一個是MPLAB IDE,對應(yīng)的編譯器為MPLAB C Compiler for PIC18 MCUs.exe;一個是MPLAB X IDE,對應(yīng)的編譯器為xc8-v2.00-full-install-windows-installer.exe。下載鏈接如下:https://download.csdn.net/download/euxnijuoh/10889265
      發(fā)表于 2020-03-17
      PIC單片機輸出比較(PWM)模塊介紹
      在Android紅外遙控器項目中使用了輸出比較OC1(PWM)模塊來產(chǎn)生38KHz PWM脈沖,脈沖占空比與紅外信號發(fā)射距離以及產(chǎn)品功耗有關(guān)。其中占空比越大,發(fā)射距離越遠,功耗越大。紅外載波的占空比一般在1/3左右。將輸出比較模塊配置為PWM 操作,需要以下步驟:1.將OCx輸出配置為可用的外設(shè)引腳選擇引腳之一。2.計算所需的占空比并將計算結(jié)果裝入 OCxR 寄存器。3.計算所需的周期并將計算結(jié)果裝入 OCxRS 寄存器。4.選擇當前的 OCx 作為同步源,方法是把 0x1F寫入SYNCSEL<4:0>(OCxCON2<4:0>),把 0 寫入OCTRIG (OCxCON2<7>)。5.通過寫 O
      發(fā)表于 2020-03-17
      PIC單片機驅(qū)動LCD模塊的設(shè)計
      (Thevenin)等效電路進行模擬。對于VLCD3和VLCD0,戴維南電阻為0;如它不為0的兩種情況,即對于VLCD2和VLCD1。電路可以簡化為如下圖所示的電路。RSW是段多路開關(guān)的電阻;RCOM是公共多路開關(guān)的電阻。對于戴維南電阻不為0的情況,戴維南電壓等于2/3 VDD或1/3 VDD。戴維南電阻等于梯形電阻網(wǎng)絡(luò)上部和下部的串聯(lián)電阻,其估算電阻的等效電路見右圖所示。例如.可以用RC電路來模擬單個像素的驅(qū)動器,在該電路中電壓在0V~VLCD2之間切換。對于LCD和PIC單片機,可以估算段和公共開關(guān)電路的電阻分別大約為4.7kΩ和0.4kΩ??梢钥吹?,經(jīng)過像素的電壓從0變?yōu)閂TH的時間將取決于像素的電容和總電阻,而梯形電阻網(wǎng)絡(luò)戴維南電阻
      發(fā)表于 2020-03-11
      PIC單片機驅(qū)動LCD模塊的設(shè)計   

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多