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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機(jī)+18b20程序無法顯示溫度

[復(fù)制鏈接]
回帖獎勵 20 黑幣 回復(fù)本帖可獲得 20 黑幣獎勵! 每人限 1 次
跳轉(zhuǎn)到指定樓層
樓主
怎么將18b20的溫度顯示到屏幕上 單片機(jī)用的stc15f2k602
//////////////////////////////////////////////////////////////////////////////////         
//本程序只供學(xué)習(xí)使用,未經(jīng)作者許可,不得用于其它任何用途

//  文 件 名   : main.c
//  版 本 號   : v2.0
//  作    者   : HuangKai
//  生成日期   : 2014-0101
//  最近修改   :
//  功能描述   : OLED 4接口演示例程(51系列)
//              說明:
//              ----------------------------------------------------------------
//              GND    電源地
//              VCC  接5V或3.3v電源
//              D0   P1^0(SCL)
//              D1   P1^1(SDA)
//              RES  接P12
//              DC   接P13
//              CS   接P14               
//              ----------------------------------------------------------------
// 修改歷史   :
// 日    期   :
//All rights reserved
//******************************************************************************/
#include "STC15Fxxx.H"//調(diào)用stc15f系列頭文件,下載地址:  http://pan.baidu.com/s/1eRUbjLS
#include "oled.h"
#include "bmp.h"

#define ds18b20_io P20   //P2.0口作為數(shù)據(jù)讀取接口
void  Delay3us();                                   //22.1184M晶振精確延時30微秒
void  Delay6us();                                   //22.1184M晶振精確延時30微秒
void  Delay24us();                              //22.1184M晶振精確延時40微秒
void  Delay30us();                              //22.1184M晶振精確延時40微秒
void  Delay300us();                             //22.1184M晶振精確延時40微秒
void  Delay600us();                             //22.1184M晶振精確延時30毫秒
void    Delay1000ms();                          //22.1184M晶振精確延時1000毫秒

bit  ds18b20_init();                                //初始化ds18b20
u8   ds18b20_read_one_char();               //從ds18b20讀取一個字節(jié)
void ds18b20_write_one_char(u8 dat);//向ds18b20寫入一個字節(jié)
void ds18b20_ready_read_temp();         //準(zhǔn)備讀取數(shù)據(jù)
u16  ds18b20_read_temp_val();               //讀取數(shù)據(jù),返回溫度值,返回實(shí)際值的100倍,且萬位為符號位,例:12556為-25.56度,2556為25.56度
u8 high,low;
//變量定義

u16 datas=12345;//測試用
float f_temp ;//溫度數(shù)據(jù)
u16 d2,d1,d0,temp;//測試


int main(void)
         {
                        OLED_Init();                        //初始化OLED  
                        OLED_Clear();//清屏
                        ds18b20_io = 1;//18b20先高電平
                        OLED_DrawBMP(0,0,128,8,BMP1);
                        delay_ms(1000);
                        OLED_Clear();
                        while(1)
                        {
                        datas=ds18b20_read_temp_val();//
                        if(datas/10000 == 1)  //如果萬位為1,則表示溫度為負(fù)
                        f_temp=datas*0.0625;  //溫度在寄存器中為12位 分辨率位0.0625°
                        datas=f_temp*10+0.5;  //精確到十分位,四舍五入
                        d2=datas/100;  //顯示數(shù)據(jù):十位
                        d1=datas%100/10;  //顯示數(shù)據(jù):個位
                        d0=datas%10;  //顯示數(shù)據(jù):十分位
                      Delay1000ms();
                        OLED_ShowCHinese(0,2,6);//當(dāng)
                        OLED_ShowCHinese(16,2,7);//前
                        OLED_ShowCHinese(32,2,8);//溫
                        OLED_ShowCHinese(48,2,9);//度
                        OLED_ShowNum(76,2,d2,1,16);
                        OLED_ShowNum(92,2,d1,1,16);
                        OLED_ShowNum(108,2,d0,1,16);
                        OLED_ShowCHinese(112,0,1);//滿電
                        }
        }
        
        //ds18b20初始化
bit ds18b20_init()
{
    u8 init_success_tag=0;
    ds18b20_io=1;//拉高
    Delay6us();//6us
    ds18b20_io=0;//拉低
    Delay600us();//600us
    ds18b20_io=1;//拉高
    Delay30us();//30us
    init_success_tag=ds18b20_io;
    Delay600us();//600us
    return init_success_tag;
}

//讀取一個字節(jié)
u8 ds18b20_read_one_char()
{
    u8 i=0;
    u8 dat=0;
    for(i=0;i<8;i++)
    {
        ds18b20_io=1;//拉高
        NOP1();
        ds18b20_io=0;//拉低
        dat>>=1;
        NOP1();
        ds18b20_io=1;//拉高
        Delay6us();//6us
        if(ds18b20_io==1)
            dat|=0x80;
        else
            dat|=0x00;
        Delay24us();//24us
    }
    return (dat);
}

//向傳感器寫入一個字節(jié)
void ds18b20_write_one_char(u8 dat)
{
    u8 i=0;
    for(i=0;i<8;i++)
    {
        ds18b20_io=1;//拉高
        NOP1();
        ds18b20_io=0;//拉低
        ds18b20_io=dat&0x01;
        Delay30us();//30us
        ds18b20_io=1;//拉高
        Delay3us();//3us
        dat>>=1;
    }
    Delay6us();
    Delay6us();//12us
}

//準(zhǔn)備讀取一個溫度值
void ds18b20_ready_read_temp()
{
    ds18b20_init();                          //初始化
    ds18b20_write_one_char(0xcc);//忽略讀序列號
    ds18b20_write_one_char(0x44);//啟動溫度轉(zhuǎn)換
    Delay300us();                                   //300us,等待轉(zhuǎn)換完畢
    ds18b20_init();                          //初始化
    ds18b20_write_one_char(0xcc);//忽略讀序列號
    ds18b20_write_one_char(0xbe);//讀取溫度寄存器
}

//讀取數(shù)據(jù),返回溫度值,返回實(shí)際值的100倍,且萬位為符號位,例:12556
u16 ds18b20_read_temp_val()
{
    u16 temp_16_bit=0;
    u8  temp_L=0;
    u8  temp_H=0;
    ds18b20_ready_read_temp();
    temp_L=ds18b20_read_one_char();//讀取溫度低八位
    temp_H=ds18b20_read_one_char();//讀取溫度高八位
    if(temp_H>0x7f)
    {
        temp_L=~temp_L;                    //補(bǔ)碼轉(zhuǎn)換,取反加一
        temp_H=~temp_H+1;  
        temp_16_bit=100;
    }
    temp_16_bit=temp_16_bit+temp_H*16+temp_L/16;
    temp_16_bit=temp_16_bit*100;
    temp_16_bit=temp_16_bit+((temp_L&0x0f)*10/16)*10;
    temp_16_bit=temp_16_bit+(temp_L&0x0f)*100/16%10;
    return (u16)(temp_16_bit);
}

void Delay3us()     //@22.1184MHz
{
    unsigned char i;

    i = 14;
    while (--i);
}

void Delay6us()     //@22.1184MHz
{
    unsigned char i;

    _nop_();
    _nop_();
    _nop_();
    i = 30;
    while (--i);
}

void Delay24us()        //@22.1184MHz
{
    unsigned char i, j;

    _nop_();
    _nop_();
    _nop_();
    i = 1;
    j = 128;
    do
    {
        while (--j);
    } while (--i);
}

void Delay30us()        //@22.1184MHz
{
    unsigned char i, j;

    i = 1;
    j = 162;
    do
    {
        while (--j);
    } while (--i);
}

void Delay300us()       //@22.1184MHz
{
    unsigned char i, j;

    i = 7;
    j = 113;
    do
    {
        while (--j);
    } while (--i);
}

void Delay600us()       //@22.1184MHz
{
    unsigned char i, j;

    _nop_();
    _nop_();
    _nop_();
    i = 13;
    j = 229;
    do
    {
        while (--j);
    } while (--i);
}

void Delay1000ms()      //@22.1184MHz
{
    unsigned char i, j, k;

    _nop_();
    _nop_();
    i = 85;
    j = 12;
    k = 155;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}         
        
        

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

使用道具 舉報

沙發(fā)
ID:57657 發(fā)表于 2023-7-17 06:10 | 只看該作者
先用示波器或邏輯分析儀檢測 Delay類 函數(shù)時間是否正確。
回復(fù)

使用道具 舉報

板凳
ID:161164 發(fā)表于 2023-7-17 11:44 | 只看該作者

回復(fù)

使用道具 舉報

地板
ID:190152 發(fā)表于 2023-7-17 12:40 來自手機(jī) | 只看該作者
感謝各位已經(jīng)解決了,18B20程序沒有問題。是讀取的16位溫度數(shù)據(jù)到oled設(shè)置問題
回復(fù)

使用道具 舉報

5#
ID:190152 發(fā)表于 2023-7-17 12:41 來自手機(jī) | 只看該作者
npn 發(fā)表于 2023-7-17 06:10
先用示波器或邏輯分析儀檢測 Delay類 函數(shù)時間是否正確。

原程序是18b20串口溫度顯示。正常沒有問題。我想做一個溫度計(jì)加了個顯示屏改改代碼
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 一级黄色绿像片 | 欧美亚洲另类在线 | 中文字幕亚洲一区二区三区 | 日韩成人在线视频 | 亚洲精品视频在线观看免费 | 亚洲精品国产精品国自产在线 | www.国产视频| 韩日精品视频 | 免费观看一级特黄欧美大片 | 91视频88av | 精品成人 | 久久精品国产久精国产 | 操操操操操 | 成人免费视频观看视频 | 狠狠亚洲| 91一区二区三区在线观看 | 久久综合婷婷 | 特级丰满少妇一级aaaa爱毛片 | 国产一区二区三区亚洲 | 亚洲一区国产精品 | 日韩日韩日韩日韩日韩日韩日韩 | a级毛片国产 | 色爽女 | 蜜桃特黄a∨片免费观看 | 日韩电影一区二区三区 | 狠狠操电影 | 99久久婷婷国产综合精品电影 | 日本a级大片 | 精品亚洲一区二区三区 | 国产精品毛片一区二区在线看 | 一区二区三区影院 | 成人精品在线观看 | 嫩草视频在线 | 综合视频在线 | 国产精品s色 | 三区在线观看 | 精品久久久久久亚洲综合网站 | 亚洲欧洲精品成人久久奇米网 | 精品www | 一级黄a视频 | 日韩欧美在线观看视频 |