DS18B20数字温度传感器
目錄
一、基礎(chǔ)知識(shí)
1、基礎(chǔ)介紹:
2、DS18B20特點(diǎn):
3、單總線時(shí)序
4、相關(guān)操作時(shí)序
5、部分ROM指令
二、相關(guān)代碼?
?1、 使用步驟(單點(diǎn)總線情況)
2、 代碼展示
數(shù)字溫度傳感器你會(huì)用了嗎?會(huì)自己敲代碼了嗎?
一、基礎(chǔ)知識(shí)
1、基礎(chǔ)介紹:
?首先當(dāng)然要知道它的用處啦!它是我們社會(huì)生活中不可缺少的"測(cè)溫計(jì)”,溫控大棚,高鐵上的溫度顯示等等都離不開(kāi)它的身影!
? ?DS18B20數(shù)字溫度傳感器是DALLAS公司生產(chǎn)的單總線器件,用它組成的一個(gè)測(cè)溫系統(tǒng)具有線路簡(jiǎn)單、體積小的特點(diǎn),在一根通信線上可以掛多個(gè)數(shù)字溫度傳感器,十分方便。超小的體積,超低的硬件開(kāi)銷(xiāo),抗干擾能力強(qiáng),精度高,附加能力強(qiáng),使其更加受歡迎。
2、DS18B20特點(diǎn):
- 通信采用1-Wire接口(單線傳輸,只有一根數(shù)據(jù)線)
- 每個(gè)DS18B20都有唯一的64位序列碼儲(chǔ)存在板載ROM中(防止一條線上多個(gè)設(shè)備無(wú)法知曉是哪個(gè)設(shè)備)
- 無(wú)需外部元件
- 可從數(shù)據(jù)線供電,電源范圍為3.0~5.5V
- 可測(cè)量的溫度范圍為-55~+125
- 在-10~+85范圍內(nèi)精確度為0.5? ? ? ?
3、單總線時(shí)序
? ? ? ?其采用1-Wire Bus所有數(shù)據(jù)都在一條線上傳輸,因此單總線協(xié)議對(duì)時(shí)序要求非常嚴(yán)格以確保數(shù)據(jù)的完整性。
? ? ? ? 單總線信號(hào)類(lèi)型:復(fù)位脈沖、存在脈沖、寫(xiě)0、寫(xiě)1、讀0、讀1。所有這些信號(hào)除存在脈沖DS18B20發(fā)出和讀數(shù)據(jù)的以外信號(hào)都由總線控制器發(fā)出。
數(shù)據(jù)傳輸從最低位開(kāi)始(與IIC通信從最高位傳輸不同)?
4、相關(guān)操作時(shí)序
? ? ? ? ? ? 初始化時(shí)序:包含復(fù)位DS18B20和接收DS18B20返回的存在信號(hào)。主機(jī)與DS18B20做任何通訊前都要對(duì)其初始化。
? ? ? ? ? ? 寫(xiě)時(shí)序:分為寫(xiě)1與寫(xiě)0,通過(guò)控制單總線高低電平持續(xù)時(shí)間從而把邏輯1或邏輯0寫(xiě)DS18B20中。
? ? ? ? ? ? 讀時(shí)序:分為讀0時(shí)序和讀1時(shí)序。 總線控制器通過(guò)讀取DS18B20控制的總線高低電平接收DS18B20數(shù)據(jù)。
5、部分ROM指令
? ? ? ?忽略ROM指令(CCh)? ? 該指令允許總線控制器不提供64位ROM編碼就使用功能指令。單點(diǎn)總線情況下使用此命令可以使器件無(wú)需發(fā)回64位ROM編碼(即只用發(fā)送這一條,其它4條ROM指令不用去發(fā)送),從而大大降低時(shí)間成本,但是隊(duì)友多器件忽略ROM指令會(huì)使得多機(jī)同時(shí)發(fā)送信號(hào),總線發(fā)生數(shù)據(jù)沖突。
? ? ? ? 溫度轉(zhuǎn)換指令(44h)? ? ? 這條命令用以啟動(dòng)一次溫度轉(zhuǎn)換。溫度轉(zhuǎn)換指令被執(zhí)行,產(chǎn)生的溫度轉(zhuǎn)換結(jié)果數(shù)據(jù)以2個(gè)字節(jié)的形式被存儲(chǔ)在高速寄存器中,而后DS18B20保持等待狀態(tài)。
? ? ? ? 讀寄存器指令(BEh)? ? ?該命令讀取暫存器的內(nèi)容,讀取從字節(jié)0開(kāi)始,一直進(jìn)行下去,直到讀完寄存器所有字節(jié),如果不想讀完所有字節(jié),控制器可以發(fā)出復(fù)位指令停止讀取。
? ? ? ?寫(xiě)暫存器指令(4Eh)? ? ? 該命令向DS18B20暫存器寫(xiě)入數(shù)據(jù),開(kāi)始位置在TH寄存器(暫存器第二個(gè)字節(jié)),接下來(lái)寫(xiě)入TL寄存器(暫存器第3個(gè)字節(jié)),最后寫(xiě)入配置寄存器(暫存區(qū)的第4個(gè)字節(jié))
? ? ? ? ? ? 拷貝暫存器指令(48h)? ? ?這條命令將TH、TL和配置寄存器(第2、3、4字節(jié))的內(nèi)容拷貝到EEPROM中(使用戶設(shè)置的值斷電不會(huì)丟失)?
二、相關(guān)代碼?
?1、 使用步驟(單點(diǎn)總線情況)
? ? ? ? ?初始化->ROM操作指令->DS18B20功能指令? 溫度轉(zhuǎn)換指令? ?讀取暫存器指令
2、 代碼展示
#include <reg52.h> #include <intrins.h>#define uchar unsigned char #define uint unsigned intsbit DS = P3^7; //DS18B20單總線 sbit LA=P2^2; sbit LB=P2^3; sbit LC=P2^4; //數(shù)碼管段選void delay2(unsigned int z) //延時(shí)函數(shù)2,delay(1000)=1s {unsigned int x,y;for(x=z;x>0;x--)for(y=120;y>0;y--); }unsigned char smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; void timefrist() {EA = 1; //打開(kāi)總開(kāi)關(guān)ET0 = 1; //中斷函數(shù)0的開(kāi)關(guān)TR0 = 1; //打開(kāi)定時(shí)器0開(kāi)關(guān)TMOD = 0x01; //模式一,定時(shí)模式TH0 = 0xED; //這里改值了,到上限就5ms(改初值)TL0 = 0xFF; //開(kāi)關(guān)、模式、賦初值 } unsigned char miao=0; void DigDisplay(unsigned char h) {unsigned char a=h%10;unsigned char b=h/10%10;unsigned char c=h/100;static unsigned char wei=0;switch(wei){case 0: LA=1;LB=1;LC=1;P0 = smgduan[c];break;case 1: LA=0;LB=1;LC=1;P0 = smgduan[b];break;case 2: LA=1;LB=0;LC=1;P0 = smgduan[a];break;}wei++;if(wei==3){wei = 0;} }void Delay_us(char us) //執(zhí)行一次us--所需6.5us 進(jìn)入一次函數(shù)11.95us {while(us--); }bit ds_init() {bit i;DS=1;_nop_();DS=0;Delay_us(75); //拉低總線499.45us 掛在總線上的DS18B20將會(huì)全部被復(fù)位DS=1; //釋放總線Delay_us(4); //37.95us 讀取18B20存在信號(hào)i = DS; //將返回的值存放在i中Delay_us(20); //141.95usDS=1; //釋放總線_nop_(); //小延時(shí)使其穩(wěn)定return i; }//寫(xiě)一個(gè)字節(jié) void write_byte(uchar dat) {uchar i;for(i=0;i<8;i++){DS = 0;_nop_(); //產(chǎn)生寫(xiě)時(shí)序DS = dat & 0x01;Delay_us(10); //76.95usDS = 1; //釋放總線準(zhǔn)備下一次數(shù)據(jù)寫(xiě)入_nop_();dat >>= 1;} }uchar read_byte() {uchar i,j,dat;for(i=0;i<8;i++){DS = 0;_nop_(); //產(chǎn)生讀時(shí)序DS = 1;_nop_(); //釋放總線j = DS;Delay_us(10); //76.95usDS = 1;_nop_();dat = (j<<7) | (dat>>1);}return dat; }void main() {uint i; //用于存放兩個(gè)字節(jié)uchar L,M;//用于存儲(chǔ)溫度的低字節(jié)和高字節(jié)timefrist(); //定時(shí)器0初始while(1){ds_init(); //初始化DS18B20write_byte(0xcc); //發(fā)送跳躍ROM指令(忽略ROM指令)write_byte(0x44); //發(fā)送溫度轉(zhuǎn)換指令 (溫度將被存在高速寄存器中,再將其讀出來(lái))ds_init(); //初始化DS18B20write_byte(0xcc); //發(fā)送跳躍ROM指令(忽略ROM指令)write_byte(0xbe); //讀取DS18B20暫存器值L = read_byte(); //讀取高速暫存器第一個(gè)字節(jié)(即溫度的低位)M = read_byte(); //讀取高速暫存器第二個(gè)字節(jié)(即溫度的高位)i = M;i<<=8; i |= L; //將L,M都寫(xiě)入一個(gè)數(shù)i中i = i * 0.0625 * 10 + 0.5; //將i換算為實(shí)際溫度(同時(shí)將小數(shù)點(diǎn)右移一位 實(shí)際意義為保留小數(shù)點(diǎn)一位且四舍五入)delay2(2000); //延時(shí)一秒,速度太快miao = i; //將i的數(shù)值賦值給miao并將其顯示出來(lái)} }//定時(shí)器中斷函數(shù) void timer0() interrupt 1 {TH0 = 0xED; //重新定義5ms初始值TL0 = 0xFF;DigDisplay(miao); //顯示,不斷5ms顯示就是動(dòng)態(tài)顯示 }負(fù)數(shù)要設(shè)置判斷語(yǔ)句,且其以補(bǔ)碼形式存放,我們需要取反加一
總結(jié)
以上是生活随笔為你收集整理的DS18B20数字温度传感器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 麻将胡牌算法——C#
- 下一篇: Lync 小技巧-41-Lync 201