本帖最后由 Lxy18 于 2021-10-31 23:51 編輯
認真學習了DS18B20的手冊,發現DS18B20單總線實現多路采集,需要讀取ROM指令,通過ROM指令讀取指定的DS18B20溫度。操作相當麻煩,參考了CSDN的例子,最后還是沒搞出來 。后來就想能不能把8個DS18B20連接到8個IO口上,然后就是分別讀取8個IO口的溫度數據,這樣的話就需要8個驅動程,理論可行,需要的程序相當多,所以這樣也不可行。然后就想,如果用一個驅動程序,在函數中改變總線變量定義的IO口,也就是改變變量的地址,查找很多資料后,發現這根本不可能。 最后,就想有沒有一種芯片可以一個IO口選通8個口,經過一番努力之后,果然有,74HC4051,8通道模擬多路選擇器/多路分配器,帶有3個數字選擇端(S0至S2),1個低有效使能端(E),8個獨立輸入/輸出端(Y0至Y7)和1個公共輸入/輸出端(Z)。 然后就是畫仿真,寫程序了。經過測試后非常好用,程序也非常簡單。
仿真截圖.png (37.43 KB, 下載次數: 123)
下載附件
2021-10-15 23:18 上傳
主程序如下,只實現了基本的8路溫度采集,溫度報警、串口什么的都沒加。
- /******************************************************************************
- 單片機八路溫度采集系統
- *******************************************************************************/
- #include <reg52.h>
- #include "delay.h"
- #include "lcd1602.h"
- #include "DS18B20.h"
- #define uchar unsigned char //對數據類型定義
- #define uint unsigned int
- /****************************端口定義******************************************/
- /*----74HC4051端口定義------------*/
- sbit HC4051_A=P2^0;
- sbit HC4051_B=P2^1;
- sbit HC4051_C=P2^2;
-
- /****************************定義變量******************************************/
- float Temp[8]; //溫度變量
- uchar Temp_Str[3]; //數組變量存放溫度數據
- /*****************************************************************************/
- /***************************函數聲明******************************************/
- void HC4051_CH(uchar ch);//HC4051通道選擇函數
- /******************************************************************************
- * 函 數 名 : 主函數
- * 函數功能 :
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void main()
- {
- uchar i;
- Lcd1602_Init(); //1602初始化
- Lcd1602_Write_Cmd(0x01); //清屏
- for(i=0;i<8;i++) //8個溫度傳感器初始化
- {
- HC4051_CH(i); //選擇通道
- DS18B20_Init(); //溫度傳感器初始化
- }
- while(1)
- {
- for(i=0;i<8;i++) //讀取8路溫度傳感器溫度值
- {
- HC4051_CH(i); //選擇通道
- Temp[i]=DS18B20_ReadTemp(); //讀取溫度值
- if(Temp[i]>0) //正溫度
- {
- Temp_Str[0]=(int)Temp[i]/100+48; //提取溫度百、十、個位
- Temp_Str[1]=((int)Temp[i]%100)/10+48;
- Temp_Str[2]=(int)Temp[i]%10+48;
- }
- else //負溫度
- {
- Temp[i]=-Temp[i]; //將負數轉換為正數
- Temp_Str[0]='-'; //顯示“—”號
- Temp_Str[1]=((int)Temp[i]%100)/10+48; //提取溫度個、十位
- Temp_Str[2]=(int)Temp[i]%10+48;
- Temp[i]=-Temp[i]; //將溫度恢復
- }
- LcdShowStr(0+4*(i%4),i/4,Temp_Str);//將溫度顯示在LCD上
- }
- Delay_Ms(30);
- }
- }
- /******************************************************************************
- * 函 數 名 : HC4051_CH(uchar ch)
- * 函數功能 : HC4051通道選擇函數
- * 輸 入 : ch:選擇的通道
- * 輸 出 : 無
- *******************************************************************************/
- void HC4051_CH(uchar ch)
- {
- HC4051_A=ch%2;
- HC4051_B=(ch%4)/2;
- HC4051_C=ch/4;
- }
復制代碼
|