日韩欧美自拍在线观看-欧美精品在线看片一区二区-高清性视频一区二区播放-欧美日韩女优制服另类-国产精品久久久久久av蜜臀-成人在线黄色av网站-肥臀熟妇一区二区三区-亚洲视频在线播放老色-在线成人激情自拍视频

輕松學(xué)PIC之溫度采集

出處:CGF2004 發(fā)布于:2011-08-29 15:45:56

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

  一、 單總線溫度傳感器DS18B20簡(jiǎn)介

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

  二、 DS18B20外形、引腳及時(shí)序

  外形及引腳如圖1 所示。

圖1 管腳排列圖

圖1 管腳排列圖

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

  1(GND):地

  2(DQ):?jiǎn)慰偩€數(shù)據(jù)輸入輸出引腳

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

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

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

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

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

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

  三、DS18B20工作過程

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

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

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

  現(xiàn)在,我們來(lái)一起看一個(gè)數(shù)字溫度通過數(shù)碼管顯示的例子,通過一個(gè)實(shí)例,相信會(huì)給大家?guī)?lái)一個(gè)感性的認(rèn)識(shí)。

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

  首先,我們來(lái)看一下增強(qiáng)型PIC 實(shí)驗(yàn)板上的DS18B20 溫度傳感器的接口電路,因?yàn)槲覀冃枰獙④浖陀布嘟Y(jié)合進(jìn)行考慮如何來(lái)編程,完成該實(shí)驗(yàn)的硬件原理圖如圖3 所示,J5 為實(shí)驗(yàn)板上溫度傳感器的接口,傳感器輸出的數(shù)據(jù)與單片機(jī)的RD5 口相連,七段數(shù)碼管D5、D7、D8組成了顯示單元,字形碼的數(shù)據(jù)通過RC 口送入,各數(shù)碼管的顯示片選信號(hào)分別不同的RA 口進(jìn)行控制。

圖3 硬件原理圖

圖3 硬件原理圖

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

  #include<pic.h> // 包含頭文件

  #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ù)個(gè)位

  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ù)碼管延時(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ù)個(gè)位,并

  點(diǎn)亮小數(shù)點(diǎn)

  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 口方向?yàn)檩敵?/FONT>

  TRISD=0x00; // 設(shè)置D 口方向?yàn)檩敵?/FONT>

  TRISC=0x00;

  PORTD=0xff;

  }

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

  {

  char presence=1;

  while(presence)

  {

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

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

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

  并保持15~60us

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

  if(DQ==1)

  presence=1;

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

  else

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

  delay(2,60); // 延時(shí)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)生寫時(shí)間隙

  if(temp==1)

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

  delay(2,7); // 延時(shí)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ù)功能: 啟動(dòng)溫度轉(zhuǎn)換函數(shù)函數(shù)

  {

  int i;

  DQ_HIGH();

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

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

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

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

  {

  display();

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

  }

  reset(); // 再次復(fù)位,等待從機(jī)應(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ù)部分個(gè)位

  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溫度傳感器插上實(shí)驗(yàn)板,如圖4 所示,然后將編譯好的HEX 通過ICD2 仿真燒寫器燒入單片機(jī)芯片,上電運(yùn)行。

圖4 DS18B20 插在增強(qiáng)型PIC 實(shí)驗(yàn)板上的樣子

圖4 DS18B20 插在增強(qiáng)型PIC 實(shí)驗(yàn)板上的樣子

  前面,我們輸入了這么長(zhǎng)一段程序后,作為初學(xué)者的讀者一定對(duì)有些語(yǔ)句會(huì)有點(diǎn)疑問,程序中的關(guān)鍵語(yǔ)句和函數(shù),請(qǐng)看程序中的注釋部份,相信很多常用的函數(shù),在前幾期的教程中大家已經(jīng)見過,不再陌生,這次的實(shí)例中,主要的是溫度轉(zhuǎn)換函數(shù),讀者朋友可以將DS18B20 的數(shù)據(jù)手冊(cè)和源程序相結(jié)合來(lái)進(jìn)行分析,由于文章篇幅有限,我們?cè)诖瞬辉傺由欤绻趯W(xué)習(xí)中碰到問題也可以登陸我們的網(wǎng)站進(jìn)行交流。

關(guān)鍵詞:輕松學(xué)PIC之溫度采集溫度采集PIC

版權(quán)與免責(zé)聲明

凡本網(wǎng)注明“出處:維庫(kù)電子市場(chǎng)網(wǎng)”的所有作品,版權(quán)均屬于維庫(kù)電子市場(chǎng)網(wǎng),轉(zhuǎn)載請(qǐng)必須注明維庫(kù)電子市場(chǎng)網(wǎng),http://www.hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。

本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。

如涉及作品內(nèi)容、版權(quán)等問題,請(qǐng)?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

PIC單片機(jī)中的佼佼者PIC16F628A掉電后數(shù)據(jù)不丟失!
廣告
OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機(jī)號(hào)碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買家服務(wù):
賣家服務(wù):
技術(shù)客服:

0571-85317607

網(wǎng)站技術(shù)支持

13606545031

客服在線時(shí)間周一至周五
9:00-17:30

關(guān)注官方微信號(hào),
第一時(shí)間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫(kù)提出的寶貴意見,您的參與是維庫(kù)提升服務(wù)的動(dòng)力!意見一經(jīng)采納,將有感恩紅包奉上哦!