温度传感器DS18B20的使用
(1)DS18B20原理:
a、測溫范圍-55℃~+125℃,在-10~+85℃時精度為±0.5℃。
b、可編程的分辨率為9~12位,對應的可分辨溫度分別為0.5℃、0.25℃、0.125℃和0.0625℃,可實現高精度測溫。
c、內部結構:
d、溫度轉換規則:DS18B20的核心功能是它可以直接讀出數字的溫度數值。溫度傳感器的精度為用戶可編程的9,10,11或12位,分別以0.5℃,0.25℃,0.125℃和0.0625℃增量遞增。在上電狀態下默認的精度為12位。DS18B20啟動后保持低功耗等待狀態,當需要執行溫度測量和AD轉換時,總線控制器必須發出[44h]命令。轉換完以后,產生的溫度數據以兩個字節的形式被存儲到高速暫存器的溫度寄存器中,DS18B20繼續保持等待狀態。
這是12位轉化后得到的12位數據,存儲在DS18B20的兩個8位的RAM中,高字節的前5位是符號位,如果測得的溫度大于0,這5位為‘0’,只要將測到的數值乘以0.0625即可得到實際溫度;如果溫度小于0,這5位為‘1’,測到的數值需要先減1再取反再乘以0.0625即可得到實際溫度。
e、DS18B20溫度傳感器的內部存儲器包括一個高度的暫存器RAM和一個非易失性的可電擦除的EEPROM,后者存放高溫度和低溫度觸發器TH、TL和結構寄存器。
f、存儲器的第4位為配置寄存器,其組織見圖8,用戶可按表3所示設置R0和R1位來設定DS18B20的精度。上電默認設置:R0=1、R1=1(12位精度)。注意:精度和轉換時間之間有直接的關系。暫存器的位7和位0-4被器件保留,禁止寫入。
(2)配置過程:
DS18B20初始化
(1)數據線拉到低電平“0”。
(2).延時480微妙(該時間的時間范圍可以從480到960微妙)。
(3).數據線拉到高電平“1”。
(4).延時等待80微妙。如果初始化成功則在15到60微妙時間內產生一個由DS18B20所返回的低電平“0”.根據該狀態可以來確定它的存在,但是應注意不能無限的進行等待,不然會使程序進入死循環,所以要進行超時判斷。
(5).若CPU讀到了數據線上的低電平“0”后,還要做延時,其延時的時間從發出的高電平算起(第(3)步的時間算起)最少要480微妙。
DS18B20寫時序
(1).數據線先置低電平“0”
(2).延時15微妙。
(3).按從低位到高位的順序發送數據(一次只發送一位)。
(4).延時60微妙。
(5).將數據線拉到高電平。
(6).重復1~5步驟,直到發送完整的字節。
(7).最后將數據線拉高。
DS18B20讀時序
(1).將數據線拉低“0”。
(2).延時1微妙。
(3).將數據線拉高“1”,釋放總線準備讀數據。
(4).延時10微妙。
(5).讀數據線的狀態得到1個狀態位,并進行數據處理。
(6).延時45微妙。
(7).重復1~7步驟,直到讀完一個字節。
(3)數碼管顯示源代碼:
/*主函數*/ #include "reg52.h" #include"temp.h" typedef unsigned int u16; typedef unsigned char u8; sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4; char num=0; u8 DisplayData[8]; u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void delay(u16 i) {while(i--); } void datapros(int temp) {float tp; if(temp< 0) {DisplayData[0] = 0x40; temp=temp-1;temp=~temp;tp=temp;temp=tp*0.0625*100+0.5; }else{ DisplayData[0] = 0x00;tp=temp;temp=tp*0.0625*100+0.5; }DisplayData[1] = smgduan[temp % 10000 / 1000];DisplayData[2] = smgduan[temp % 1000 / 100];DisplayData[3] = smgduan[temp % 100 / 10];DisplayData[4] = smgduan[temp % 10 / 1];} void DigDisplay() {u8 i;for(i=0;i<6;i++){switch(i) {case(0):LSA=1;LSB=1;LSC=1; break;case(1):LSA=0;LSB=1;LSC=1; break;case(2):LSA=1;LSB=0;LSC=1; break;case(3):LSA=0;LSB=0;LSC=1; break;case(4):LSA=1;LSB=1;LSC=0; break;case(5):LSA=0;LSB=1;LSC=0; break;}P0=DisplayData[i];delay(100); P0=0x00;} } void main() { while(1){datapros(Ds18b20ReadTemp());DigDisplay(); } } /*DS18B20配置*/ #include"temp.h" void Delay1ms(uint y) {uint x;for( ; y>0; y--){for(x=110; x>0; x--);} } uchar Ds18b20Init() {uchar i;DSPORT = 0; i = 70; while(i--);/DSPORT = 1; i = 0;while(DSPORT) {Delay1ms(1);i++;if(i>5){return 0;}}return 1; } void Ds18b20WriteByte(uchar dat) {uint i, j;for(j=0; j<8; j++){DSPORT = 0; i++;DSPORT = dat & 0x01; i=6;while(i--);DSPORT = 1;dat >>= 1;} } uchar Ds18b20ReadByte() {uchar byte, bi;uint i, j; for(j=8; j>0; j--){DSPORT = 0;i++;DSPORT = 1;i++;i++;bi = DSPORT;byte = (byte >> 1) | (bi << 7); i = 4; while(i--);} return byte; } void Ds18b20ChangTemp() {Ds18b20Init();Delay1ms(1);Ds18b20WriteByte(0xcc); Ds18b20WriteByte(0x44); } void Ds18b20ReadTempCom() { Ds18b20Init();Delay1ms(1);Ds18b20WriteByte(0xcc); Ds18b20WriteByte(0xbe); } int Ds18b20ReadTemp() {int temp = 0;uchar tmh, tml;Ds18b20ChangTemp(); Ds18b20ReadTempCom(); tml = Ds18b20ReadByte(); tmh = Ds18b20ReadByte();temp = tmh;temp <<= 8;temp |= tml;return temp; }總結
以上是生活随笔為你收集整理的温度传感器DS18B20的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 详解液晶面板制造全过程
- 下一篇: 液晶面板里面有些什么配件_一张图看懂液晶