久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3573|回復: 8
打印 上一主題 下一主題
收起左側

這是ds18b20部分的代碼,lcd顯示總是幾千的數值,請有心人指正!!!謝謝!!!

[復制鏈接]
跳轉到指定樓層
樓主
ID:503877 發表于 2019-4-5 10:42 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 不好不壞 于 2019-4-5 11:10 編輯

void init_ds18b20()
{
        u8 i;
        bit flag;
        do
        {
        dq=1;
        _nop_();
        dq=0;
        i=103;
        while(i>0)i--;//延時
        dq=1;
        flag=dq;
        i=4;
        while(i>0)i--;
        }while(flag);
}
bit read_onebit()
{
                u8 i;
                u8 onebit;
                dq=0;
                i++;
                dq=1;
                i++;
                onebit=dq;
                i=8;while(i>0)i--;//延時
        return onebit;
}
u8 read_onebyte()
{
        u8 dat=0,a,k;
        for(a=0;a<8;a++)
        {
        k=read_onebit();
        dat=(k<<7)|(dat>>1);//循環把讀到的低位放在低位
        }
        return dat;
}
void write_onebyte(u8 dat)
{
        u8 d=0,i;        
        bit testbit;
        for(d=8;d>0;d--)
        {
                dq=dat&0x01;                //從dat最低位開始傳送
                dat>>=1;                                //移除已經傳送的最低位
                if(testbit==1)                //寫1
                {
                        dq=0;
                        _nop_();        
                        _nop_();
                        dq=1;
                        i=8;while(i>0)i--;//延時
                }
                else                        //寫0
                {
                        dq=1;
                        i=8;while(i>0)i--;
                        dq=0;
                        i++;i++;
                }
        }
}
float get_temp()
{
        u8 a,b;
        u16 temp;float tmp;
        init_ds18b20();                //初始化
        write_onebyte(0xcc);        //忽略ROM指令
        write_onebyte(0x64);
        delay_ms(10);

        init_ds18b20();                        //再度初始化
        write_onebyte(0xcc);        //忽略ROM指令
        write_onebyte(0x00);
        delay_ms(10);

        init_ds18b20();                //初始化
        write_onebyte(0xcc);        //忽略ROM指令
        write_onebyte(0x44);        //溫度轉換指令+
        delay_ms(800);

        init_ds18b20();                //初始化
        write_onebyte(0xcc);        //忽略ROM指令
        write_onebyte(0xbe);        //讀暫存器指令


        a=read_onebyte();                //第一個字節是LSB,低八位
        b=read_onebyte();                //第二個字節是MSB,高八位
        temp=b;                                        //先把高八位b裝進temp,一定是進入到temp低八位
        temp<<=8;                                //左移8次;讓B回到原位
        temp|=a;                                        //再和A相加,
        tmp=(float)(temp*0.0625);
        return tmp;
}


psb.jpg (121.01 KB, 下載次數: 97)

psb.jpg
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:213173 發表于 2019-4-5 13:22 | 只看該作者
對比一下就知道問題在哪里 ds18b20溫度LCD顯示.zip (159.01 KB, 下載次數: 34)
回復

使用道具 舉報

板凳
ID:164602 發表于 2019-4-5 13:37 | 只看該作者
18B20是12位精度的話:
正數這樣轉換:temp=tp*0.0625*100+0.5;//tp是有符號實數型變量,就是讀到的溫度值,這個計算保留兩位小數

負數這樣轉換:tp=tp-1;
                      tp=~tp;
                      temp=tp*0.0625*100+0.5;
回復

使用道具 舉報

地板
ID:503877 發表于 2019-4-5 18:17 | 只看該作者
wulin 發表于 2019-4-5 13:22
對比一下就知道問題在哪里

完全套用你的程序,顯示出負的溫度,而且整數位還在跳動,不知緣故
回復

使用道具 舉報

5#
ID:503877 發表于 2019-4-5 18:18 | 只看該作者
HC6800-ES-V2.0 發表于 2019-4-5 13:37
18B20是12位精度的話:
正數這樣轉換:temp=tp*0.0625*100+0.5;//tp是有符號實數型變量,就是讀到的溫度值 ...

試過了,還是不正常
回復

使用道具 舉報

6#
ID:503877 發表于 2019-4-5 18:28
wulin 發表于 2019-4-5 13:22
對比一下就知道問題在哪里

http://javascript:void(0)只是按照你的代碼實驗的結果,

7#
ID:213173 發表于 2019-4-6 07:03 | 只看該作者
不好不壞 發表于 2019-4-5 18:17
完全套用你的程序,顯示出負的溫度,而且整數位還在跳動,不知緣故

軟件是建立在硬件基礎上的,硬件條件不同不要直接套用,否則會出錯。
回復

使用道具 舉報

8#
ID:917252 發表于 2021-5-26 09:57 | 只看該作者
大佬們看看我的那個溫度顯示,負數部分異常怎么改呢
回復

使用道具 舉報

9#
ID:824490 發表于 2021-5-26 10:08 | 只看該作者
其實這類問題,你能在線跟蹤一下代碼,很容易發現問題的。
1、讀寫時序對不對?
2、數值轉換對不對?
3、顯示傳參對不對?
18B20的代碼還是很友善的,不行的話就多下載一些人家現成的代碼來改。
回復

使用道具 舉報

10#
ID:824490 發表于 2021-5-26 10:15 | 只看該作者
bit read_onebit()
{
                u8 i;
                u8 onebit;
                dq=0;
                i++;
                dq=1;
                i++;
                onebit=dq; ///????
                i=8;while(i>0)i--;//延時
        return onebit;////onebit永遠是1,
}
也就是說你讀出的數值都是1 ,12位剛好是4096,與你顯示的一致?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产欧美在线视频 | 亚洲一区二区三区在线视频 | 日韩欧美在线一区 | 欧美综合一区二区三区 | 久久久91精品国产一区二区三区 | 午夜天堂精品久久久久 | 国产精品美女久久久久久免费 | 久久综合久久自在自线精品自 | 三级av在线| 国产精品美女 | 免费看一级毛片 | 精品国产乱码久久久久久丨区2区 | 精品福利一区二区三区 | 欧美激情综合五月色丁香小说 | wwwxxx日本在线观看 | 日韩在线一区二区 | 欧美激情综合 | 国产日产欧产精品精品推荐蛮挑 | 国产婷婷色一区二区三区 | 夜夜干夜夜操 | 日韩aⅴ在线观看 | 在线黄 | 免费精品视频在线观看 | 久在线精品视频 | 国产美女一区二区 | 超碰免费在线 | 久久精品亚洲精品国产欧美 | 天天人人精品 | 蜜桃视频在线观看免费视频网站www | 欧美日韩综合一区 | 成人夜晚看av | 久热国产精品 | 夜夜爽99久久国产综合精品女不卡 | 成人影院免费视频 | 天天综合久久 | 欧美国产日韩在线观看成人 | 久久午夜精品 | 超碰成人在线观看 | 91久久国产综合久久91精品网站 | 秋霞电影一区二区三区 | 91精品午夜窝窝看片 |