特點(diǎn): 1. 通信方式:1-Wire單總線通信 2. 每個(gè)DS18B20都有唯一的64為序列號(hào)儲(chǔ)存在板載ROM(只讀存儲(chǔ)器)中; 3. 無(wú)需外部器件 4. 電源范圍3.0V~5.5V 5. 可以測(cè)量的范圍是-55℃~+125℃(攝氏度); 6. 在-10~+85℃范圍內(nèi)精確度為±0.5℃; 7. 溫度計(jì)分辨率可以(通過(guò)編程)設(shè)置為9~12位工作模式,12位時(shí)分辨率對(duì)應(yīng)為0.0625℃; /*這里咱們及時(shí)一下分辨率:只要器件檢測(cè)到的溫度變化超過(guò)0.0625攝氏度(12位工作模式),最小刻度值就會(huì)加1,如果設(shè)置為0.5攝氏度工作模式 ,溫度每變化0.5℃,最小刻度變化為1*/ 8. 器件內(nèi)部?jī)?nèi)置A/D轉(zhuǎn)換器; DS18B20在實(shí)際應(yīng)用中的典型接法:(兩種,本博客給大家介紹的是第二種接線的方法)
第一種: 工作在寄生于下的典型接法:DS18B20的GND和Vdd都接地,為了提高DS18B20的工作電流,在單總線上接上一個(gè)帶場(chǎng)效應(yīng)管的強(qiáng)上拉電路提供上拉電流, 
 第二種: 外部接法:先對(duì)于第一種解法相對(duì)于比較簡(jiǎn)單,可以節(jié)省單片機(jī)管腳; 
單總線時(shí)序: 1. DS18B20采用1-wire Bus所有數(shù)據(jù)都在一條線上傳輸,因此對(duì)時(shí)序要求非常嚴(yán)格以確保數(shù)據(jù)的完整性; 2. 1-wire信號(hào)類型:復(fù)位脈沖,寫0,寫1,存在脈沖,讀0,讀1;(前三是由主機(jī)發(fā)出,后三是DS18B20發(fā)出,主機(jī)采樣獲取) 3. 數(shù)據(jù)的傳輸總是從最低有效位開始;
重點(diǎn)來(lái)了:前面的東西都不看是可以的,畢竟我們拿到一個(gè)器件之后雖然了解一些基礎(chǔ)設(shè)置是必要的,但我們最重要的是知道這個(gè)動(dòng)心該怎么用; 下面將會(huì)給大家介紹一下編程的思路,也就是解決問(wèn)題的辦法。下面就是編程思路: 編程總體思路:1.初始化  2.ROM操作指令  3. DS18B20功能指令(讀暫存器,寫暫存器) 初始化時(shí)序(初始化函數(shù)): 初始化時(shí)序里包含復(fù)位DS18B20和接收DS18B20返回的存在信號(hào); 主機(jī)和DS18B20在做任何通信之前都需要對(duì)其進(jìn)行初始化。 
 下面,我們將會(huì)通過(guò)圖來(lái)寫程序: /單總線初始化時(shí)序/ bit Init_DS18B20() {         bit i;     DS = 1 ;     nop();     DS = 0;     Delay_us(75);       //拉低總線499.45us,     DS = 1;              //釋放總線     Deley_us(4);         //延時(shí)37.95us,等待讀取     i = DS;     Delay_us(20);      //141.95us     DS = 1;     nop();     return  i; } /控制器寫0和1/ 
 void write_byte(uchar dat)   //注意這里傳輸?shù)氖且粋€(gè)字節(jié); {       //產(chǎn)生一個(gè)寫時(shí)序,至少要將總線拉低1us,數(shù)據(jù)從低位向高位發(fā)送;     uchar i;     for(i=0;i<8;i++)     {         DS = 0;         nop();     //產(chǎn)生寫時(shí)序         DS = dat & 0x01;         Deley_us(10);      //76.95us         DS = 1;               //釋放總線準(zhǔn)備下一次數(shù)據(jù)寫入         nop();         dat >>= 1;    } } /讀數(shù)據(jù)/ 
 uchar read_byte() {     uchar dat,i,j;     for(i=0;i<8;i++)     {         DS = 0;         nop();  //產(chǎn)生讀時(shí)序;         DS  = 1;         nop();   //釋放總線         j = DS;         Delay_us(10);    //76.95us         DS = 1;         nop();         dat = (j<<7)|(dat>>1);      //數(shù)據(jù)從從低位傳向高位     }     return dat; }
/基于C語(yǔ)言的模塊化編程,我們通過(guò)上面的功能模塊,也即是功能函數(shù),下面咱們來(lái)寫一個(gè)主函數(shù),來(lái)調(diào)用這些功能模塊,從而實(shí)現(xiàn)邏輯器件的編程/ void main() { uint i; uchar L,M; while(1) { ds_init(); //初始化DS18B20 write_byte(0xcc); //發(fā)送忽略ROM指令 write_byte(0x44); //發(fā)送溫度轉(zhuǎn)換指令 ds_init(); //初始化DS18B20 write_byte(0xcc); //發(fā)送忽略ROM指令 write_byte(0xbe); //讀取DS18B20暫存器值; L = read_byte(); //先接收低八位; M = read_byte(); //再接收高八位; i = M; i <<= 8; i |= L; i = i*0.0625*10 + 0.5; Display(i); } } 一些重要的命令: 1. 忽略ROM指令(0xcc):當(dāng)總線上只有一個(gè)DS18B20時(shí),忽略掉對(duì)溫感的辨別,可以直接對(duì)這個(gè)溫感進(jìn)行操作,發(fā)送指令。倘若總線上有大于一個(gè)溫感,發(fā)送0xcc將會(huì)發(fā)生數(shù)據(jù)沖突; 2. 溫度轉(zhuǎn)換指令(0x44):主機(jī)告訴溫感,將溫度的模擬量,轉(zhuǎn)化為數(shù)字量保存起來(lái); 3. 讀暫存器指令(0xbe): 主機(jī)讀取溫感暫存器內(nèi)的數(shù)字值。讀取從字節(jié)0開始,一直進(jìn)行下去,知道讀完暫存器所有字節(jié),如果不想讀完所有字節(jié),控制器可以在任何時(shí)刻發(fā)出復(fù)位命令來(lái)種植讀取; 4. 寫暫存器指令(0x4e):主機(jī)向溫感暫存器寫入數(shù)據(jù),開始位置在TH寄存器(暫存器的第2個(gè)字節(jié)),接下來(lái)寫入TL寄存器(暫存器的第3個(gè)字節(jié)),最后寫入配置寄存器(暫存器的第4個(gè)字節(jié)); 5. 拷貝暫存器指令(0x48):主機(jī)將TH,TL和配置寄存器(第2,3,4字節(jié))的內(nèi)容拷貝到EEPROM中;
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注