
DS18B20是一種很常用的數(shù)字溫度傳感器,溫度檢測(cè)范圍是-55~+125度,手冊(cè) 說明在-10~+85度范圍內(nèi)檢測(cè)誤差為±0.5度,作者在自己的產(chǎn)品中隨機(jī)抽樣驗(yàn)證 了幾只傳感器,在-25度誤差0.1度,+25度與+50度誤差小于0.1度,可見這種傳感 器實(shí)際精度是很高的,傳感器引腳如圖19-1所示,工作電壓范圍是3.0~5.5V,通 常使用+5V,電源接反或接錯(cuò)一般是不會(huì)損壞傳感器的,對(duì)于單只DS18B20的使用,我們按圖19-2連接即可。


電路和介紹詳見:http://www.zg4o1577.cn/bbs/dpj-47286-1.html(在這貼附件中可下載完整的源碼壓縮包)
- //單只DS18B20的溫度檢測(cè),測(cè)溫范圍-55 —— +125度,1602液晶顯示。
- #include "STC15W4K.H"
- #include "DS18b20.h"
- #include "myfun.h"
- #include "LCD1602.h"
- bit flag; // flag=0表示正溫,flag=1表示負(fù)溫。
- unsigned char baiw,shiw,gew; // 百位、十位、個(gè)位 ASCII碼
- unsigned char point_1,point_2,point_3,point_4; // 小數(shù)點(diǎn)后1、2、3、4位ASCII碼
-
- //****************溫度數(shù)據(jù)處理函數(shù)************************/
- void gettemp() //讀取溫度值
- {
- unsigned int temp0,temp1,temp; // 存放小數(shù)、整數(shù)、符號(hào),10000倍小數(shù)值
- unsigned char temh,teml; // 存放原始高字節(jié)與低字節(jié)
- temp=DS18B20_ReadTemperature(); // 從18B20中讀取2字節(jié)原始溫度值
- flag=0;
- if ((temp&0xf800)!=0) // 如果是負(fù)溫,將補(bǔ)碼取反加1變?yōu)樵a
- {
- temp=~temp +1;
- flag=1;
- }
- temh=temp/256; // 高字節(jié)(5位符號(hào)+3位數(shù)據(jù))
- teml=temp%256; // 低字節(jié)(4位整數(shù)+4位小數(shù))
-
- temp0=teml&0x0F; // 4 位小數(shù)
- temp1=(temh<<4)|(teml>>4); // 8 位整數(shù)(最高一位符號(hào)0不用管)
- baiw=temp1/100+48; // 百位ASCII碼
- shiw=(temp1%100)/10+48; // 十位 ASCII碼
- gew=(temp1%100)%10+48; // 個(gè)位 ASCII碼
- temp=temp0*625; // 將結(jié)果中的小數(shù)乘以分辨溫度0.0625
- // 擴(kuò)大10000倍進(jìn)行輸出,不用浮點(diǎn),同樣可以保留4位小數(shù)精度
- point_1=temp/1000+48; // 小數(shù)點(diǎn)后1位ASCII碼
- point_2=(temp%1000)/100+48; // 小數(shù)點(diǎn)后2位ASCII碼
- point_3=(temp%100)/10+48; // 小數(shù)點(diǎn)后3位ASCII碼
- point_4=temp%10+48; // 小數(shù)點(diǎn)后4位ASCII碼
- }
- void port_mode() // 端口模式
- {
- P0M1=0x00; P0M0=0x00;P1M1=0x00; P1M0=0x00;P2M1=0x00; P2M0=0x00;P3M1=0x00; P3M0=0x00;
- P4M1=0x00; P4M0=0x00;P5M1=0x00; P5M0=0x00;P6M1=0x00; P6M0=0x00;P7M1=0x00; P7M0=0x00;
- }
- void main()
- {
- unsigned char xPos,yPos;
- unsigned char *s="Now temp is:";
- port_mode(); // 所有IO口設(shè)為準(zhǔn)雙向弱上拉方式。
- xPos=0; // xPos表示水平右移字符數(shù)(0-15)
- yPos=0; // yPos表示垂直下移字符數(shù)(0-1)
- delay100ms(); // 等待LCD1602上電時(shí)內(nèi)部復(fù)位
- LCD1602_Init();
- WriteString(xPos,yPos,s); // X坐標(biāo)、Y坐標(biāo)、字符串,屏幕左上角為坐標(biāo)原點(diǎn)
- DS18B20_SetResolution(3); //設(shè)置DS18B20的分辨率為12位(默認(rèn)值,新器件可以不作任何設(shè)置)
- while(1)
- {
- gettemp();
- if(flag) // 負(fù)溫度
- {
- WriteChar(0,1,'-');
- }
- if(!flag) // 正溫度
- {
- WriteChar(0,1,'+');
- }
- WriteChar(1,1,baiw);
- WriteChar(2,1,shiw);
- WriteChar(3,1,gew);
- WriteChar(4,1,'.');
- WriteChar(5,1,point_1);
- WriteChar(6,1,point_2);
- WriteChar(7,1,point_3);
- WriteChar(8,1,point_4);
- SetCur(NoCur); // 有顯示無光標(biāo)
- }
- }
復(fù)制代碼
ds18b20.c
|