標題: 單片機+DS18B20多點溫度測試程序+詳細教程資料 [打印本頁]
作者: 冷月楓 時間: 2020-3-30 14:22
標題: 單片機+DS18B20多點溫度測試程序+詳細教程資料
DS18B20溫度傳感器
一、簡介:
1.png (22.48 KB, 下載次數: 60)
下載附件
2020-3-30 14:12 上傳
圖示有字的一面,注意GND
和VCC不要接反。工作電壓3.0v~5.5V,采集溫度-55度到正125度,可編程溫度9-12位,精度分別是0.5度,0.25度,0.125度0.0625度,默認都是12位,12位轉換時間是750ms,9位是93.75ms,電壓負壓特性(不會因電源接反發熱燒壞)。 二、電路連接:
2.png (37.48 KB, 下載次數: 79)
下載附件
2020-3-30 14:12 上傳
接一個上拉電阻。
三、通信方式:
單總線通信:
單總線是一種具有一個總線主機和一個或若干個從機的系統。嚴格按照器件的時間要求進行復位,寫命令,讀寫數據等。整個過程在一條線上進行。
四、DS18B20的內部結構:
3.png (247.47 KB, 下載次數: 67)
下載附件
2020-3-30 14:12 上傳
64位光刻ROM,溫度傳感器,非易失性的溫度報警觸發器TH和TL,配置寄存器。出廠前ROM的排列是:開始8位產品類型標號(28H),接著48位是DS18B20全球唯一序列號,最后8位是前面56位的循環冗余校驗碼。
DS18B20存儲器:
4.png (350.65 KB, 下載次數: 62)
下載附件
2020-3-30 14:12 上傳
Byte0和Byte1分別存儲溫度寄存器的低字節和高字節,這兩個字節是只讀的。我們一般只操作這兩個字節。
5.png (256.61 KB, 下載次數: 58)
下載附件
2020-3-30 14:12 上傳
五、DS18B20的指令:
命令有兩種,一種ROM的指令,一種暫存器的指令。
6.png (788.7 KB, 下載次數: 57)
下載附件
2020-3-30 14:12 上傳
六、操作時序:
分為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();
- }
復制代碼
7.png (40.36 KB, 下載次數: 62)
下載附件
2020-3-30 14:12 上傳
2. 用兩個數組存讀出來的序列號:
8.png (88.7 KB, 下載次數: 70)
下載附件
2020-3-30 14:12 上傳
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);//小數
- }
復制代碼其他的都和單個測試是一樣的。
測試結果:
9.png (12.09 KB, 下載次數: 71)
下載附件
2020-3-30 14:12 上傳
另外附上主函數:
- /*********************************
- * @函數名: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 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者: zwf33 時間: 2021-1-11 11:57
寫得非常詳細,謝謝分享!
| 歡迎光臨 (http://m.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |