熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2020-12-8 21:26
正文摘要:單片機(jī)的ds18b20溫度測(cè)量仿真,就是不顯示溫度,怎么調(diào)都不行,只有亂碼,希望有大哥幫幫忙^^ |
感謝大哥們的幫助,問題已經(jīng)解決![]() |
![]() |
3201444707 發(fā)表于 2020-12-9 15:11 給你改好了,原來的程序在開發(fā)板上也不一定正常吧。 ![]() |
建議你按照如下步驟調(diào)試程序: 1、忽略文段模塊的通訊,調(diào)通數(shù)碼顯示這塊。逐位顯示0-9的所有數(shù)字,包括帶小數(shù)點(diǎn)的情況 2、第一步都跳調(diào)通了,再去調(diào)試ds18b20。由于ds18b20的口位簡單,重點(diǎn)在于時(shí)序。 第一步很重要。另外如果擔(dān)心顯示出問題。可以把取得的溫度數(shù)據(jù)直接發(fā)送到串口去顯示,看看對(duì)不對(duì)。 以下是我做過的和18B20有關(guān)的代碼,用的12M晶振,STC89C52,實(shí)測(cè)過的 // 溫度傳感器接口 sbit DQ=P3^7; //數(shù)據(jù)傳輸線接單片機(jī)的相應(yīng)的引腳 /* ******************************************************************************** ** 函數(shù)名稱 : Init_DS18B20(void) ** 函數(shù)功能 : 初始化 ******************************************************************************** */ void Init_DS18B20(void) { unsigned char x=0; DQ=1; //DQ先置高 Delay10us(60);//最小480,最大960 DQ=0; //發(fā)送復(fù)位脈沖 Delay10us(60);//最小480,最大960 DQ=1; //拉高數(shù)據(jù)線 Delay10us(6);//15-60us // x=DQ; //用X的值來判斷初始化有沒有成功,18B20存在的話X=0,否則X=1 //delay(20); while(DQ==0); DQ=1;//讓傳感器釋放總線,避免影響下一步 } /* ******************************************************************************** ** 函數(shù)名稱 : ReadOneChar() ** 函數(shù)功能 : 讀一個(gè)字節(jié) ******************************************************************************** */ unsigned char ReadOneChar() //主機(jī)數(shù)據(jù)線先從高拉至低電平1us以上,再使數(shù)據(jù)線升為高電平,從而產(chǎn)生讀信號(hào) { unsigned char dat=0; unsigned char mask,fmask; for(mask=0x01;mask!=0;mask<<=1)//一個(gè)周期需要至少60us,但采樣要在15us內(nèi)完成 { DQ=0; _nop_(); DQ=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); if(DQ==0)//讀0 { fmask=~mask; dat=dat&fmask; } else { dat|=mask; } Delay10us(5); DQ=1; } return dat; } /* ******************************************************************************** ** 函數(shù)名稱 : WriteOneChar(unsigned char dat) ** 函數(shù)功能 : 寫一個(gè)字節(jié) //一個(gè)寫周期為60-120us,主機(jī)在15--45us內(nèi)對(duì)信號(hào)采樣 ******************************************************************************** */ void WriteOneChar(unsigned char dat) { unsigned char i=0; //數(shù)據(jù)線從高電平拉至低電平,產(chǎn)生寫起始信號(hào)。15us之內(nèi)將所需寫的位送到數(shù)據(jù)線上, for(i=8;i>0;i--) //在15~60us之間對(duì)數(shù)據(jù)線進(jìn)行采樣,如果是高電平就寫1,低寫0發(fā)生。 { DQ=0; //在開始另一個(gè)寫周期前必須有1us以上的高電平恢復(fù)期。 DQ=dat&0x01; Delay10us(6);//15-60us采樣 DQ=1; dat>>=1; } delay(4); } /* ******************************************************************************** ** 函數(shù)名稱 : ReadTemperature(void) ** 函數(shù)功能 : 讀溫度值(低位放tempL;高位放tempH;) ******************************************************************************** */ void ReadTemperature(void) { Init_DS18B20(); //初始化 WriteOneChar(0xcc); //跳過讀序列號(hào)的操作 WriteOneChar(0x44); //啟動(dòng)溫度轉(zhuǎn)換 delayms(125); //轉(zhuǎn)換需要一點(diǎn)時(shí)間,延時(shí) Init_DS18B20(); //初始化 WriteOneChar(0xcc); //跳過讀序列號(hào)的操作 WriteOneChar(0xbe); //讀溫度寄存器(頭兩個(gè)值分別為溫度的低位和高位) tempL=ReadOneChar(); //讀出溫度的低位LSB tempH=ReadOneChar(); //讀出溫度的高位MSB if(tempH>0x7f) //最高位為1時(shí)溫度是負(fù) { tempL=~tempL; //補(bǔ)碼轉(zhuǎn)換,取反加一 tempH=~tempH+1; fg=0; //讀取溫度為負(fù)時(shí)fg=0 } sdate = tempL/16+tempH*16; //整數(shù)部分 xiaoshu1 = (tempL&0x0f)*10/16; //小數(shù)第一位 xiaoshu2 = (tempL&0x0f)*100/16%10;//小數(shù)第二位 xiaoshu=xiaoshu1*10+xiaoshu2; //小數(shù)兩位 } |
你從下面的鏈接下載 51單片機(jī)應(yīng)用開發(fā)25例,其中有多點(diǎn)溫度采集系統(tǒng),有程序有仿真,下圖是仿真截圖 http://www.torrancerestoration.com/bbs/dpj-54940-1.html ![]() |
主要是在開發(fā)板上能夠正常運(yùn)行,變成仿真圖就嗝屁了 |
本壇里有現(xiàn)成的直接下載一個(gè)就好 ![]() |
Powered by 單片機(jī)教程網(wǎng)