DS18B20溫度傳感器 一、簡介:
圖示有字的一面,注意GND 和VCC不要接反。工作電壓3.0v~5.5V,采集溫度-55度到正125度,可編程溫度9-12位,精度分別是0.5度,0.25度,0.125度0.0625度,默認都是12位,12位轉換時間是750ms,9位是93.75ms,電壓負壓特性(不會因電源接反發熱燒壞)。 二、電路連接: 接一個上拉電阻。 三、通信方式: 單總線通信: 單總線是一種具有一個總線主機和一個或若干個從機的系統。嚴格按照器件的時間要求進行復位,寫命令,讀寫數據等。整個過程在一條線上進行。 四、DS18B20的內部結構: 64位光刻ROM,溫度傳感器,非易失性的溫度報警觸發器TH和TL,配置寄存器。出廠前ROM的排列是:開始8位產品類型標號(28H),接著48位是DS18B20全球唯一序列號,最后8位是前面56位的循環冗余校驗碼。 DS18B20存儲器: Byte0和Byte1分別存儲溫度寄存器的低字節和高字節,這兩個字節是只讀的。我們一般只操作這兩個字節。 五、DS18B20的指令: 命令有兩種,一種ROM的指令,一種暫存器的指令。 六、操作時序: 分為4個步驟: 1. 復位:單片機發一個低電平給DS18B20,DS18B20返回一個低電平給單片機,完成喚醒握手。 2. 發送ROM命令 3. 發送暫存器指令 4. 發送數據或接受數據 單個溫度測試代碼: 多點測試:(兩個) 步驟: 1. 先讀出每個傳感器的唯一ROM序列; - /*********************************
- * @函數名:DS18B20_Read_64Rom
- * @描 述:讀64位的ROM 唯一標識
- * @說 明:
- * @參 數:*buffer 讀出的8個字節的數據
- * @返回值:無
- *********************************/
- void DS18B20_Read_64Rom(uchar *buffer)
- {
- uchar i;
- DS18B20_Reset();//復位
- DS18B20_Write_Com(0x33);//讀64位ROM
- for(i=0;i<8;i++) //讀取64個字節
- buffer[i]=DS18B20_Read_Data();
- }
復制代碼2. 用兩個數組存讀出來的序列號: 3.寫入ROm序列號,并啟動轉換溫度: - /*********************************
- * @函數名:DS18B20_Write_Rom
- * @描 述:寫64ROM
- * @說 明:發送匹配ROM命令 0x55再寫入8字節的ROM
- * @參 數:*buffer 要發送的存放ROM的數組
- * @返回值:無
- *********************************/
- void DS18B20_Write_Rom(uchar *buffer)
- {
- uchar i;
- DS18B20_Write_Com(0x55); //ROM匹配
- for(i = 0;i < 8;i++)
- DS18B20_Write_Com(buffer[i]); //寫入8個字節的ROM
- }
- /*********************************
- * @函數名:DS18B20_Handle
- * @描 述:溫度處理
- * @說 明:1. 復位 2.發送ROM命令 3.發送暫存器指令 讀RAM 4.數據
- * @參 數:無
- * @返回值:無
- *********************************/
- void DS18B20_Handle(uchar *buffer)
- {
- uchar xdata value_High,value_Low;
- float num;//保存小數
- DS18B20_Reset();//復位
- //DS18B20_Write_Com(0xcc);//發送指令CCH,跳過ROM操作
- //DS18B20_Write_Com(0x33);//讀64位ROM
- DS18B20_Write_Rom(buffer); //匹配ROM 并寫入64ROM
- DS18B20_Write_Com(0x44);//發送指令44H,啟動溫度轉換
- Delay10us();
- DS18B20_Reset();//復位
- DS18B20_Write_Rom(buffer); //匹配ROM 并寫入64ROM
- DS18B20_Write_Com(0xbe);//發送指令BEH,讀取9字節RAM數據的前兩個數據
- Delay10us();
- value_Low=DS18B20_Read_Data();//先讀低字節Byte0
- value_High=DS18B20_Read_Data();//高字節Byte1
- value_High<<=4;//整數的高3位
- value_High+=(value_Low&0xf0)>>4;//整數的低4位
- DS18B20_Buffer[0]=value_High;//整數
- num=(value_Low&0x0f)*0.0625;//小數
- DS18B20_Buffer[1]=(uchar)(num*100);//小數
- }
復制代碼其他的都和單個測試是一樣的。 測試結果: 另外附上主函數: - /*********************************
- * @函數名:main
- * @描 述:main函數,程序入口
- * @說 明:
- * @參 數:無
- * @返回值:無
- *********************************/
- void main()
- {
- //uchar a[8];//存放讀出來的ROM
- Uart1_Init();//串口初始化
- Send_String("多點溫度測試:\n");
- while(1)
- {
- DS18B20_Handle(DS18B20_Rom1);
- printf("溫度1:%bd.%bd",DS18B20_Buffer[0],DS18B20_Buffer[1]);//串口打印溫度
- putchar_End();//換行
- // DS18B20_Read_64Rom(a);
- // Send_String(a);
- Delay1000ms();
- DS18B20_Handle(DS18B20_Rom2);
- printf("溫度2:%bd.%bd",DS18B20_Buffer[0],DS18B20_Buffer[1]);//串口打印溫度
- Delay1000ms();
- putchar_End();//換行
- }
- }
-
復制代碼DS18B20程序和資料:
DS18B20.zip
(4.21 MB, 下載次數: 113)
2020-3-30 14:21 上傳
點擊文件名下載附件
|