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