標(biāo)題: 單片機DS18B20多路溫度采集顯示 Proteus仿真程序 [打印本頁]
作者: Lxy18 時間: 2021-10-15 23:27
標(biāo)題: 單片機DS18B20多路溫度采集顯示 Proteus仿真程序
本帖最后由 Lxy18 于 2021-10-31 23:51 編輯
認(rèn)真學(xué)習(xí)了DS18B20的手冊,發(fā)現(xiàn)DS18B20單總線實現(xiàn)多路采集,需要讀取ROM指令,通過ROM指令讀取指定的DS18B20溫度。操作相當(dāng)麻煩,參考了CSDN的例子,最后還是沒搞出來
。后來就想能不能把8個DS18B20連接到8個IO口上,然后就是分別讀取8個IO口的溫度數(shù)據(jù),這樣的話就需要8個驅(qū)動程,理論可行,需要的程序相當(dāng)多,所以這樣也不可行。然后就想,如果用一個驅(qū)動程序,在函數(shù)中改變總線變量定義的IO口,也就是改變變量的地址,查找很多資料后,發(fā)現(xiàn)這根本不可能。
最后,就想有沒有一種芯片可以一個IO口選通8個口,經(jīng)過一番努力之后,果然有,74HC4051,8通道模擬多路選擇器/多路分配器,帶有3個數(shù)字選擇端(S0至S2),1個低有效使能端(E),8個獨立輸入/輸出端(Y0至Y7)和1個公共輸入/輸出端(Z)。
然后就是畫仿真,寫程序了。經(jīng)過測試后非常好用,程序也非常簡單。
仿真截圖.png (37.43 KB, 下載次數(shù): 123)
下載附件
2021-10-15 23:18 上傳
主程序如下,只實現(xiàn)了基本的8路溫度采集,溫度報警、串口什么的都沒加。
- /******************************************************************************
- 單片機八路溫度采集系統(tǒng)
- *******************************************************************************/
- #include <reg52.h>
- #include "delay.h"
- #include "lcd1602.h"
- #include "DS18B20.h"
- #define uchar unsigned char //對數(shù)據(jù)類型定義
- #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]; //數(shù)組變量存放溫度數(shù)據(jù)
- /*****************************************************************************/
- /***************************函數(shù)聲明******************************************/
- void HC4051_CH(uchar ch);//HC4051通道選擇函數(shù)
- /******************************************************************************
- * 函 數(shù) 名 : 主函數(shù)
- * 函數(shù)功能 :
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- 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 //負(fù)溫度
- {
- Temp[i]=-Temp[i]; //將負(fù)數(shù)轉(zhuǎn)換為正數(shù)
- Temp_Str[0]='-'; //顯示“—”號
- Temp_Str[1]=((int)Temp[i]%100)/10+48; //提取溫度個、十位
- Temp_Str[2]=(int)Temp[i]%10+48;
- Temp[i]=-Temp[i]; //將溫度恢復(fù)
- }
- LcdShowStr(0+4*(i%4),i/4,Temp_Str);//將溫度顯示在LCD上
- }
- Delay_Ms(30);
- }
- }
- /******************************************************************************
- * 函 數(shù) 名 : HC4051_CH(uchar ch)
- * 函數(shù)功能 : HC4051通道選擇函數(shù)
- * 輸 入 : ch:選擇的通道
- * 輸 出 : 無
- *******************************************************************************/
- void HC4051_CH(uchar ch)
- {
- HC4051_A=ch%2;
- HC4051_B=(ch%4)/2;
- HC4051_C=ch/4;
- }
復(fù)制代碼
作者: perseverance51 時間: 2021-10-31 20:18
采用74HC4051思路方法不錯。學(xué)習(xí)學(xué)習(xí)!
作者: Lxy18 時間: 2021-10-31 23:33
發(fā)現(xiàn)被人拿到咸魚賣了,30元一個
作者: 123156fsadf 時間: 2021-11-3 15:07
可以直接把八路都接到一根引腳的,然后用ID的方式去讀不同芯片的溫度
作者: vscos 時間: 2021-12-13 07:27
這都有人買呀
作者: vscos 時間: 2021-12-13 07:38
不是程序多,是那個程序要改成多端口的,你是從網(wǎng)上抄來的吧!網(wǎng)上那個只能用一個端口,你要是只改函數(shù)名,就想用肯定多了,你要將程序的函數(shù)都改成有參數(shù)的,調(diào)用時通過參數(shù)確定用那個端口,這樣可以減少代碼量
作者: Lxy18 時間: 2022-1-20 11:40
程序原創(chuàng)的!!io作為函數(shù)參數(shù),就不可能實現(xiàn),我也想過這樣。現(xiàn)在單總線ROM方式已經(jīng)搞出來了。
作者: Lxy18 時間: 2022-1-20 11:45
按你所說,用8個IO口接8個18B20,溫度讀取函數(shù)設(shè)置通道選擇參數(shù)(IO口不能作為參數(shù)輸入),那在函數(shù)中如何根據(jù)輸入的通道切換操作的IO口?
作者: lkc8210 時間: 2022-1-20 14:29
對~
但I(xiàn)O口的讀寫不能直接P00 = 1 或 if(P00)
要參考arduino的寫法
- void digitalWrite(char PinNum, bit Command){
- if(Command){
- P0 |= 0x01 << PinNum;
- }else{
- P0 &= ~(0x01 << PinNum);
- }
- }
- bit digitalRead(char PinNum){
- if(P0 & (0x01<<PinNum))
- return 1;
- else
- return 0;
- }
復(fù)制代碼
作者: Lxy18 時間: 2022-3-14 08:50
原來如此,學(xué)到了學(xué)到了。
作者: 1192833874 時間: 2022-4-6 20:47
這兩個函數(shù)什么意思啊
,能吧根據(jù)參數(shù)選擇IO口寫具體點嗎,單片機,求求大佬解惑了
作者: 1192833874 時間: 2022-4-6 21:19
哦,就是把所有的P0^n=i;換成digitalWrite(n,i)。P0^n換成digitalRead(n),是嗎?
我這樣做了,可是出錯了呀,數(shù)據(jù)讀不出來
作者: 1192833874 時間: 2022-4-6 21:21
- #include "reg52.h"
- void digitalWrite(char PinNum, bit Command){
- if(Command){
- P1 |= 0x01 << PinNum;
- }else{
- P1 &= ~(0x01 << PinNum);
- }
- }
- bit digitalRead(char PinNum){
- if(P1 & (0x01<<PinNum))
- return 1;
- else
- return 0;
- }
- //單總線延時函數(shù)
- void Delay_OneWire(unsigned int t){
- while(t--);
- }
- //通過單總線向DS18B20寫一個字節(jié)
- void Write_DS18B20(unsigned char N,unsigned char dat){
- unsigned char i;
- for(i=0;i<8;i++){
- digitalWrite(N,0);
- digitalWrite(N,dat&0x01);
- Delay_OneWire(5);
- digitalWrite(N,1);
- dat >>= 1;
- }
- Delay_OneWire(5);
- }
- //從DS18B20讀取一個字節(jié)
- unsigned char Read_DS18B20(unsigned char N){
- unsigned char i;
- unsigned char dat;
-
- for(i=0;i<8;i++){
- digitalWrite(N,0);
- dat >>= 1;
- digitalWrite(N,1);
- if(digitalRead(N)){
- dat |= 0x80;
- }
- Delay_OneWire(5);
- }
- return dat;
- }
- //DS18B20設(shè)備初始化
- bit init_ds18b20(unsigned char N){
- bit initflag = 0;
-
- digitalWrite(N,1);
- Delay_OneWire(12);
- digitalWrite(N,0);
- Delay_OneWire(80);
- digitalWrite(N,1);
- Delay_OneWire(10);
- initflag = digitalRead(N);
- Delay_OneWire(5);
-
- return initflag;
- }
- unsigned int rd_temperature(unsigned char N){
- unsigned char low, high;
- init_ds18b20(N); // 初始化
- Write_DS18B20(N,0xCC); // 跳過ROM
- Write_DS18B20(N,0x44); // 啟動溫度轉(zhuǎn)換
- init_ds18b20(N);
- Write_DS18B20(N,0xCC);
- Write_DS18B20(N,0xBE); // 讀取寄存器
- low = Read_DS18B20(N); // 低字節(jié)
- high = Read_DS18B20(N); // 高字節(jié)
- return (high<<8)+low;
- }
復(fù)制代碼 就這個代碼,rd_temperature函數(shù)讀數(shù)據(jù)
作者: 陳123456礊 時間: 2024-1-25 15:34
太感謝了,DIY小玩意就做關(guān)于這個的方向,只不過是需要將讀取的八路溫度數(shù)據(jù)傳輸?shù)絣abview上位機進(jìn)行檢測,作者是否對labview上位機有研究?
作者: kmsj 時間: 2024-1-25 17:47
單片機的應(yīng)用思路,就是要用好單片機的內(nèi)部資源包括程序讓外圍電路越簡單越好,樓主增加74HC4051讓單片機編程變的簡單的思路完全背離了單片機應(yīng)用的基本思路,肯定是不可取的。雖然74HC4051只是幾毛錢,但是,增加了74HC4051電路就復(fù)雜了,增加74HC4051讀寫8個18B20,依然用掉單片機的4個I/O口,相當(dāng)于用4個I/O口換取8個18B20的讀寫,還增加了一片74HC4051,一點也不劃算。單片機讀取8個18B20溫度的正確編程思路只有兩個,一個是用8個I/O口連接8個18B20,編程思路是同時對8個18B20做初始化和跳過ROM指令的操作,然后把8個18B20的溫度讀出來,另一個是8個18B20的8個單總線接單片機的一個I/O口,用匹配ROM的方法把每一個18B20的溫度讀出來,無論是8個I/O口接8個18B20還是8個18B20的8個單總線接單片機的一個I/O口,都可以用細(xì)化到步的編程方法,提高單片機的CPU應(yīng)用率,頂多是讀取溫度的時間慢一點而已(最多慢零點零幾秒到零點幾秒),溫度是一個漸變的過程,讀取溫度的時間慢一點對絕大多數(shù)的溫度控制毫無影響。個人意見,僅供參考。
作者: 陳123456礊 時間: 2024-1-25 20:15
請教一下關(guān)于lcd1602的代碼怎樣編寫
作者: Lxy18 時間: 2024-1-26 11:25
前面已經(jīng)說明,最開始匹配rom的程序沒做出來,所以才選擇這個方案,雖然增加了io口,增加了一個芯片,但是可以實現(xiàn)功能,而且相對于匹配rom替換DS18B20不需要重新讀取rom,不需要修改程序。各有優(yōu)缺點。工程角度肯定考慮成本,但是這僅僅是學(xué)習(xí)交流使用,交作品用的。
作者: kmsj 時間: 2024-1-26 18:35
如果僅僅是交作品混學(xué)分,就沒有討論的意義了,就算是交作品混學(xué)分,用匹配ROM或者8個I/O口讀出8個18B20的溫度,你的老師為你負(fù)責(zé)的話,得到的學(xué)分更高才對,最關(guān)鍵可以提高自己的編程水平。
作者: xiaogan_gu 時間: 2024-2-18 20:58
可以并行一次性讀取8個DS18B20里的數(shù)據(jù)放入8個單元的數(shù)組里,然后對這些數(shù)據(jù)進(jìn)行處理就可以了。這個方法程序簡單,不需要多余的電路,也不用讀ID,就是要占用8個IO口。
作者: 陳123456礊 時間: 2024-2-25 10:59
可以分享一下全套源碼嗎?
歡迎光臨 (http://m.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
噜噜噜噜狠狠狠7777视频
|
欧美成人影院
|
一区在线视频
|
国产精品国产三级国产aⅴ浪潮
|
中文字幕av色
|
久久香蕉网
|
亚洲一区二区黄
|
在线不卡视频
|
粉色午夜视频
|
999久久久
|
久精品视频
|
国产精品欧美一区二区三区
|
日韩一区二区三区在线
|
99视频在线免费观看
|
久久精品二区亚洲w码
|
北条麻妃99精品青青久久
|
国产日韩中文字幕
|
久久久久久亚洲精品
|
欧美色综合天天久久综合精品
|
91成人在线
|
亚洲欧洲日韩精品 中文字幕
|
毛片日韩|
欧美综合国产精品久久丁香
|
午夜午夜精品一区二区三区文
|
成人在线|
成人性视频在线
|
精品色|
精品视频一区二区三区四区
|
日韩在线电影
|
日一区二区
|
国产成人免费视频网站高清观看视频
|
精品日韩一区
|
91在线视频观看
|
亚洲久久一区
|
亚洲第一av|
久国产视频
|
精品www
|
欧美亚州
|
成人影院免费视频
|
成人九色
|
中文字幕日本一区二区
|