找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2234|回復(fù): 10
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)DS18B20的上單復(fù)位的85℃在不影響功能的前提下怎么去除?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1084388 發(fā)表于 2023-6-15 21:49 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
PS:如果我將轉(zhuǎn)化函數(shù)和讀溫度函數(shù)放在循環(huán)里的話(不加上begin的話,可以正常顯示,包括按鍵變化溫度值都能讀出來,只是第一次運(yùn)行要跳出85℃),但是加上begin的話就只能放在循環(huán)外面,在我的認(rèn)知里,DS18B20應(yīng)該是轉(zhuǎn)化一次就可以讀溫度了吧,所以放在外面應(yīng)該不影響溫度的顯示,但是實(shí)際的運(yùn)行結(jié)果卻是只能顯示第一次的結(jié)果,如果你按鍵的話,數(shù)碼管顯示不出來。
求大佬幫幫忙

單片機(jī)源程序如下:
#include <REGX51.H>
#include <intrins.h>
#include "display.h"
#include "delay.h"
sbit DQ=P3^7;


void delay_us(unsigned char i)------------//us級(jí)延時(shí)(進(jìn)入函數(shù)11us運(yùn)行延時(shí)6us)
{
        while(i--);
}


bit DS18B20chushihua()-------------------//初始化
{
        bit n;
        DQ=1;
        _nop_();
        DQ=0;
        delay_us(80);
        DQ=1;
        delay_us(4);
        n=DQ;
        delay_us(20);
        DQ=1;
        _nop_();
        return n;
}


void writeDS18B20(unsigned char xdat)------------寫時(shí)序
{
        unsigned char j;
        for(j=0;j<8;j++)
        {
                DQ=0;
                _nop_();
                DQ=xdat&0x01;
                delay_us(10);
                DQ=1;
                xdat=xdat>>1;
//                _nop_();
        }
//        _nop_();
}


unsigned char readDS18B20()--------------------------//讀時(shí)序
{
        unsigned char j,rdat;
        for(j=0;j<8;j++)
        {
                rdat=rdat>>1;
                DQ=0;
                _nop_();
                DQ=1;
                _nop_();
                if(DQ==1)
                rdat=rdat|0x80;
                delay_us(10);
                DQ=1;
                _nop_();
}
        _nop_();
        return rdat;
}


void DS18B20_zhuanhua()----------------溫度轉(zhuǎn)化函數(shù)
{
                        DS18B20chushihua();
                        writeDS18B20(0xcc);
                        writeDS18B20(0x44);
}


unsigned int DS18B20_duwendu()-------------讀溫度
{
                unsigned int L;
                unsigned int H;
                unsigned int temp;


                DS18B20chushihua();
                writeDS18B20(0xcc);
                writeDS18B20(0xbe);
                L=readDS18B20();
                H=readDS18B20();
                H=(H<<8)|L;
                if((H&0xf800)==0xf800)
                        H=!H+1;
                temp=H*0.0625;
        return temp;
}


void main()------------主函數(shù)
{      
        unsigned int temp;
      
        DS18B20_zhuanhua();
        begin();------------------------//數(shù)碼管初始化----的函數(shù)(已延時(shí)800ms)
        while(1)
        {
                temp=DS18B20_duwendu();
                display_s(temp);-------------//顯示函數(shù)
        }
}      

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:161164 發(fā)表于 2023-6-15 22:10 | 只看該作者
讀到85的時(shí)候不顯示就可以了
或第一次讀到85就不顯示
回復(fù)

使用道具 舉報(bào)

板凳
ID:824490 發(fā)表于 2023-6-15 22:33 | 只看該作者
連讀3次,取平均值顯示就OK了
回復(fù)

使用道具 舉報(bào)

地板
ID:1084388 發(fā)表于 2023-6-15 22:53 | 只看該作者
lkc8210 發(fā)表于 2023-6-15 22:10
讀到85的時(shí)候不顯示就可以了
或第一次讀到85就不顯示

你理解錯(cuò)了,上面說的,只是跟你說我的代碼沒問題而已。我必須要數(shù)碼管初始化----,轉(zhuǎn)化函數(shù)必放在外面,但就是為什么顯示不了按鍵后的溫度值,話說while(1)不是一直在讀溫度嗎。
回復(fù)

使用道具 舉報(bào)

5#
ID:213173 發(fā)表于 2023-6-16 06:09 | 只看該作者
菜鳥9 發(fā)表于 2023-6-15 22:53
你理解錯(cuò)了,上面說的,只是跟你說我的代碼沒問題而已。我必須要數(shù)碼管初始化----,轉(zhuǎn)化函數(shù)必放在外面, ...

每次讀取溫度值之前都要發(fā)一次轉(zhuǎn)換命令
void main()//------------主函數(shù)
{      
        unsigned int temp;
       
        DS18B20_zhuanhua();
        begin();//------------------------//數(shù)碼管初始化----的函數(shù)(已延時(shí)800ms)
        while(1)
        {
                DS18B20_zhuanhua();
                temp=DS18B20_duwendu();
                display_s(temp);//-------------//顯示函數(shù)
        }
}
回復(fù)

使用道具 舉報(bào)

6#
ID:965189 發(fā)表于 2023-6-16 07:47 來自手機(jī) | 只看該作者
  begin();------------------------//數(shù)碼管初始化----的函數(shù)。這個(gè)初始化函數(shù)有問題
回復(fù)

使用道具 舉報(bào)

7#
ID:584814 發(fā)表于 2023-6-16 08:19 | 只看該作者
自己做的時(shí)候除了讀不出時(shí)顯示85其他正常。
在論壇上找的例程和自己照貓畫虎的都一樣。
回復(fù)

使用道具 舉報(bào)

8#
ID:1084388 發(fā)表于 2023-6-16 15:42 | 只看該作者
wulin 發(fā)表于 2023-6-16 06:09
每次讀取溫度值之前都要發(fā)一次轉(zhuǎn)換命令
void main()//------------主函數(shù)
{      

效果出來了,但是為什么要每次都轉(zhuǎn)化呢,我們老師也說轉(zhuǎn)化一次就行了呀,能解答一下嗎
回復(fù)

使用道具 舉報(bào)

9#
ID:213173 發(fā)表于 2023-6-16 16:35 | 只看該作者
菜鳥9 發(fā)表于 2023-6-16 15:42
效果出來了,但是為什么要每次都轉(zhuǎn)化呢,我們老師也說轉(zhuǎn)化一次就行了呀,能解答一下嗎

既然是測(cè)溫,就要不斷獲取當(dāng)前溫度值。當(dāng)然需要轉(zhuǎn)換操作。否則讀取的不是當(dāng)前溫度值。
回復(fù)

使用道具 舉報(bào)

10#
ID:1084388 發(fā)表于 2023-6-16 17:58 | 只看該作者
wulin 發(fā)表于 2023-6-16 16:35
既然是測(cè)溫,就要不斷獲取當(dāng)前溫度值。當(dāng)然需要轉(zhuǎn)換操作。否則讀取的不是當(dāng)前溫度值。

好的,謝謝您
回復(fù)

使用道具 舉報(bào)

11#
ID:1034262 發(fā)表于 2023-6-16 21:18 | 只看該作者
上電后多讀幾次但丟棄結(jié)果。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表