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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4690|回復: 12
打印 上一主題 下一主題
收起左側(cè)

為什么單片機DS18B20程序一直顯示0°C

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1011399 發(fā)表于 2022-3-28 20:21 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
為什么DS18B20在LCD12864上顯示,溫度一直是0°C,求大佬們幫忙看看,謝謝了

單片機源程序如下:
#include "DS18B20.h"
#include<intrins.h>

uchar flag_temper = 0;

//****************************************************
//DS18B20延時函數(shù)
//****************************************************
void DS18B20_Delay(uint n )
{
        uint i;
        for(i = 0 ; i < n ; i++ );
}
//****************************************************
//DS18B20寫1字節(jié)
//****************************************************
void DS18B20_Write_Byte( uchar dat)
{
        uchar i;
        for( i = 0 ; i < 8 ; i++ )
        {
                DS18B20_DQ = 0;
                _nop_();                        //延時>1us
                _nop_();
                DS18B20_DQ = dat&0x01;                 //先寫低位
                dat >>= 1;
                DS18B20_Delay(6);        //延時60~120us
                DS18B20_DQ = 1;                //釋放總線
                _nop_();                        //延時>1us
                _nop_();        
        }               
}

//****************************************************
//DS18B20讀1字節(jié)
//****************************************************
uchar DS18B20_Read_Byte( )
{
        uchar dat,i;
        for( i = 0 ; i < 8 ; i++ )
        {
                DS18B20_DQ = 0;
                _nop_();                        //延時>1us
                _nop_();               
                DS18B20_DQ = 1;                //釋放總線
                _nop_();                        //延時>1us
                _nop_();
                dat >>= 1;
                if( DS18B20_DQ == 1)
                {
                        dat |= 0X80;
                }
                else
                {
                        dat &= 0x7f;
                }

                DS18B20_Delay(6);        //延時60~120us                        
        }
        return dat;               
}

//****************************************************
//DS18B20初始化
//****************************************************
bit DS18B20_Init()
{
        bit Flag_exist = 1;
        DS18B20_DQ = 1;                        //釋放總線
        _nop_();                                //延時>1us
        _nop_();
        DS18B20_DQ = 0;        
        DS18B20_Delay(50);                //延時480~960us        
        DS18B20_DQ = 1;                        //釋放總線
        DS18B20_Delay(3);                //延時15~60us
        Flag_exist = DS18B20_DQ;
        DS18B20_Delay(10);                //延時60~240us
        DS18B20_DQ = 1;                        //釋放總線
        return Flag_exist;                        
}

//**********************************************************
//讀取溫度函數(shù),返回溫度的絕對值,并標注flag_temper,flag_temper=1表示負,flag_temper=0表示正
//**********************************************************
uint Get_temp(void)         //讀取溫度值
{  
        float tt;
        uchar a,b;
        uint temp;
        if( DS18B20_Init() == 0 )                //初始化
        {
                DS18B20_Write_Byte(0xcc);          //忽略ROM指令
                DS18B20_Write_Byte(0x44);          //溫度轉(zhuǎn)換指令
                if( DS18B20_Init() == 0 )                 //初始化
                {
                        DS18B20_Write_Byte(0xcc);          //忽略ROM指令
                        DS18B20_Write_Byte(0xbe);          //讀暫存器指令
                        a = DS18B20_Read_Byte();           //讀取到的第一個字節(jié)為溫度LSB
                        b = DS18B20_Read_Byte();           //讀取到的第一個字節(jié)為溫度MSB
                        temp = b;                      //先把高八位有效數(shù)據(jù)賦于temp
                        temp <<= 8;                    //把以上8位數(shù)據(jù)從temp低八位移到高八位
                        temp = temp|a;                //兩字節(jié)合成一個整型變量
                        if(temp>0xfff)
                        {
                                flag_temper=1;                                //溫度為負數(shù)
                                temp=(~temp)+1;
                        }
                        else
                        {                                                                                                                                                           
                                flag_temper=0;                                //溫度為正或者0
                        }
                        
                        tt = temp*0.0625;              //得到真實十進制溫度值
                                                        //因為DS18B20可以精確到0.0625度
                                                        //所以讀回數(shù)據(jù)的最低位代表的是0.0625度
                        temp = tt*100;               //放大百倍
                                                        //這樣做的目的將小數(shù)點也轉(zhuǎn)換為可顯示數(shù)字
                }
        }
        return temp;
}









#include"lcd12864.h"

/*******************************************************************************
* 函 數(shù) 名         : LCD12864_Delay1ms
* 函數(shù)功能                   : 延時1MS
* 輸    入         : c
* 輸    出         : 無
*******************************************************************************/
void LCD12864_Delay1ms(uint c)
{
        uint j,k;
        for(j=c; j>0; j--)
                for(k=114; k>0; k--);
}

/*******************************************************************************
* 函 數(shù) 名         : LCD12864_Busy
* 函數(shù)功能                   : 檢測LCD是否忙
* 輸    入         : 無
* 輸    出         : 1或0(1表示不忙,0表示忙)
*******************************************************************************/
uchar LCD12864_Busy(void)
{
        uchar i = 0;

        LCD12864_RS = 0;           //選擇命令
        LCD12864_RW = 1;        //選擇讀取
        LCD12864_EN = 1;
        LCD12864_Delay1ms(1);
        while((LCD12864_DATAPORT & 0x80) == 0x80)        //檢測讀取到的值
        {
                i++;
                if(i > 100)
                {
                        LCD12864_EN = 0;
                        return 0;           //超過等待時間返回0表示失敗
                }
        }
        LCD12864_EN = 0;
        return 1;
}

/*******************************************************************************
* 函 數(shù) 名         : LCD12864_WriteCmd
* 函數(shù)功能                   : 寫命令
* 輸    入         : cmd
* 輸    出         : 無
*******************************************************************************/

void LCD12864_WriteCmd(uchar cmd)
{
        uchar i;
        i = 0;
        while( LCD12864_Busy() == 0)
        {
                LCD12864_Delay1ms(1);
                i++;
                if( i>100)
                {
                        return;           //超過等待退出
                }        
        }
        LCD12864_RS = 0;     //選擇命令
        LCD12864_RW = 0;     //選擇寫入
        LCD12864_EN = 0;     //初始化使能端
        LCD12864_DATAPORT = cmd;   //放置數(shù)據(jù)
        LCD12864_EN = 1;                   //寫時序
        LCD12864_Delay1ms(5);
        LCD12864_EN = 0;                                            
}

/*******************************************************************************
* 函 數(shù) 名         : LCD12864_WriteData
* 函數(shù)功能                   : 寫數(shù)據(jù)
* 輸    入         : dat
* 輸    出         : 無
*******************************************************************************/
void LCD12864_WriteData(uchar dat)
{
        uchar i;
        i = 0;
        while( LCD12864_Busy() == 0)
        {
                LCD12864_Delay1ms(1);
                i++;
                if( i>100)
                {
                        return;           //超過等待退出
                }        
        }

        LCD12864_RS = 1;     //選擇數(shù)據(jù)
        LCD12864_RW = 0;     //選擇寫入
        LCD12864_EN = 0;     //初始化使能端
        LCD12864_DATAPORT = dat;   //放置數(shù)據(jù)
        LCD12864_EN = 1;                   //寫時序
        LCD12864_Delay1ms(5);
        LCD12864_EN = 0;                                                                    
}

/*******************************************************************************
* 函 數(shù) 名         : LCD12864_ReadData
* 函數(shù)功能                   : 讀取數(shù)據(jù)
* 輸    入         : 無
* 輸    出         : 讀取到的8位數(shù)據(jù)
*******************************************************************************/
#ifdef LCD12864_PICTURE

uchar LCD12864_ReadData(void)
{
        uchar i, readValue;
        i = 0;
        while( LCD12864_Busy() == 0)
        {
                LCD12864_Delay1ms(1);
                i++;
                if( i>100)
                {
                        return 0;           //超過等待退出
                }        
        }
        LCD12864_RS = 1;       //選擇命令
        LCD12864_RW = 1;
        LCD12864_EN = 0;
        LCD12864_Delay1ms(1);  //等待
        LCD12864_EN = 1;
        LCD12864_Delay1ms(1);
        readValue = LCD12864_DATAPORT;
        LCD12864_EN = 0;
        return readValue;
}

#endif

/*******************************************************************************
* 函 數(shù) 名         : LCD12864_Init
* 函數(shù)功能                   : 初始化LCD12864
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
void LCD12864_Init()
{
        LCD12864_PSB = 1;          //選擇并行輸入
        LCD12864_RST = 1;          //復位
        LCD12864_WriteCmd(0x30);  //選擇基本指令操作
        LCD12864_WriteCmd(0x0c);  //顯示開,關(guān)光標
        LCD12864_WriteCmd(0x01);  //清除LCD12864的顯示內(nèi)容
}

/*******************************************************************************
* 函 數(shù) 名         : LCD12864_ClearScreen
* 函數(shù)功能                   : 在畫圖模式下,LCD12864的01H命令不能清屏,所以要自己寫一個清
*                  * 屏函數(shù)
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
#ifdef LCD12864_PICTURE

void LCD12864_ClearScreen(void)
{
        uchar i,j;
        LCD12864_WriteCmd(0x34);          //開啟拓展指令集
        for(i=0;i<32;i++)                          //因為LCD有縱坐標32格所以寫三十二次
        {
                LCD12864_WriteCmd(0x80+i);                  //先寫入縱坐標Y的值
                LCD12864_WriteCmd(0x80);                  //再寫入橫坐標X的值
                for(j=0;j<32;j++)                  //橫坐標有16位,每位寫入兩個字節(jié)的的數(shù)據(jù),也
                {                                                  //就寫入32次以為當寫入兩個字節(jié)之后橫坐標會自
                        LCD12864_WriteData(0xFF);          //動加1,所以就不用再次寫入地址了。
                }
        }
        LCD12864_WriteCmd(0x36);         //0x36擴展指令里面打開繪圖顯示
        LCD12864_WriteCmd(0x30);         //恢復基本指令集
}

#endif
/*******************************************************************************
* 函 數(shù) 名         : LCD12864_SetWindow
* 函數(shù)功能                   : 設置在基本指令模式下設置顯示坐標。注意:x是設置行,y是設置列
* 輸    入         : x, y
* 輸    出         : 無
*******************************************************************************/
void LCD12864_SetWindow(uchar x, uchar y)
{
        uchar pos;
        if(x == 0)           // 第一行的地址是80H
        {
                x = 0x80;
        }
        else if(x == 1)  //第二行的地址是90H
        {
                x = 0x90;        
        }
        else if(x == 2)  //第三行的地址是88H
        {
                x = 0x88;
        }
        else if(x == 3)
        {
                x = 0x98;
        }
        
        pos = x + y;
        LCD12864_WriteCmd(pos);
}


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

使用道具 舉報

沙發(fā)
ID:584814 發(fā)表于 2022-3-29 08:18 | 只看該作者
多是網(wǎng)上抄的程序應該沒問題,但并不表示運行沒問題。
不同的單片機運行速度不一樣,所以延時的時長也有區(qū)別,需要按實調(diào)整。
回到問題:一直顯示0極大可能是讀不出數(shù)據(jù),一般程序與單片機協(xié)調(diào)問題居多,不排除硬件接錯。
回復

使用道具 舉報

板凳
ID:161164 發(fā)表于 2022-3-29 16:34 | 只看該作者
一直顯示0可能是初始化不成功
Flag_exist保持為1
同意沙發(fā)的說法
請檢查DS18B20的各個延時時間
回復

使用道具 舉報

地板
ID:625730 發(fā)表于 2022-3-30 10:04 | 只看該作者
顯示值是0,是沒把ds18b20里的數(shù)據(jù)讀出來,把main函數(shù)貼出來,有時是延時不夠造成的。
回復

使用道具 舉報

5#
ID:1006510 發(fā)表于 2022-3-30 14:45 | 只看該作者
問題可能:1.程序問題(大多數(shù)網(wǎng)上程序復制下了是要微調(diào)的),這就要求你做到移植而非復制;2.延時問題,一些采樣器件對延時是有要求的,要確保延時是正確的,可以看一下官方手冊;3.硬件電路問題,剛開始經(jīng)常會出現(xiàn)仿真能用,但是實物有問題。這時候不要慌張,一點一點排除錯誤,可以測通斷,測電壓,檢查一下PCB畫原理圖或是連線,通過不斷的縮小范圍,找到問題所在。這個回答是一般錯誤檢查的步驟,希望對你有用。
回復

使用道具 舉報

6#
ID:941205 發(fā)表于 2022-3-30 16:38 | 只看該作者
用PROTEUS搭個電路仿真吧這樣你能快速找到問題。
回復

使用道具 舉報

7#
ID:480627 發(fā)表于 2022-4-8 18:25 | 只看該作者
在復位成功后加一個亮燈啊或聲音提示啊,看看是不是復位成為了。。然后再查讀寫的步驟和延時,要是18B20接線長一些的話,對時序更嚴格。。
回復

使用道具 舉報

8#
ID:956669 發(fā)表于 2022-4-9 21:49 來自手機 | 只看該作者
ds18b20就是單總線協(xié)議,極有可能是時序不對導致數(shù)據(jù)就沒讀好,你可以先自己設一個數(shù)據(jù),看看能不能顯示,要是可以顯示,那就是讀的問題,建議看看數(shù)據(jù)手冊對應時序,先調(diào)一個簡單的復位,看看ds18b20有沒有響應工作
回復

使用道具 舉報

9#
ID:382454 發(fā)表于 2022-4-9 22:28 | 只看該作者
網(wǎng)上抄的程序也要自己重新整理過,你這樣肯定是亂七八招的。單片機也不知什么型號,時序頻率等等。。。。。。。。。!
回復

使用道具 舉報

10#
ID:1012747 發(fā)表于 2022-4-10 09:57 | 只看該作者
移植要考慮目標的硬件環(huán)境和源程序的硬件環(huán)境的區(qū)別。
回復

使用道具 舉報

11#
ID:139866 發(fā)表于 2022-4-10 14:30 | 只看該作者
用示波器測一下波形不就什么都知道了
回復

使用道具 舉報

12#
ID:166475 發(fā)表于 2022-4-10 15:27 來自手機 | 只看該作者
無外乎時序不對
回復

使用道具 舉報

13#
ID:166475 發(fā)表于 2022-4-10 15:28 來自手機 | 只看該作者
用邏輯分析儀測一下就曉得了
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲高清视频在线 | 欧美国产精品一区二区三区 | av片免费 | 欧美精品在线一区二区三区 | 国产一区二区在线91 | 成人性视频免费网站 | 国产成人一区二区 | 亚洲欧美综合 | 国产精品资源在线 | 国产一区二区三区四区五区加勒比 | 三级成人在线 | 日韩欧美网 | 国产欧美精品 | 新超碰97 | 国产精品久久久久久久久久久免费看 | 久久免费精品 | 国产精品久久久久久一区二区三区 | 成人av观看 | 97视频人人澡人人爽 | 2一3sex性hd| 欧美一级片在线观看 | 久久久久av | 国产一区二区三区免费 | 伊人久久综合影院 | 久久久久久久一区二区三区 | 亚洲精品久久久久中文字幕欢迎你 | 日韩不卡一区二区 | 久久国产精品久久久久久 | 国产精品视频久久久久久 | 日韩在线视频一区二区三区 | 精品久久国产 | 二区不卡 | 一级黄色裸片 | 国产乱人伦精品一区二区 | 亚洲二区在线 | 91在线精品秘密一区二区 | 亚洲精品一区二区三区中文字幕 | 欧美日韩久久 | 超碰人人在线 | 国产精品亚洲一区二区三区在线 | 色综合网站 |