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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

ds18b20測溫在OLED12864上顯示 求幫助

[復制鏈接]
跳轉到指定樓層
樓主
ID:426269 發表于 2019-12-13 13:10 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
請大佬指教,為什么顯示不出來溫度啊
#include "reg52.h"
#include "codetab.h"
#include "LQ12864.h"  
#include<intrins.h>
/**********************************定義變量*********************************/
sbit DS18B20_DQ=P1^4;

unsigned int Temp_Buffer = 0;
unsigned char flag_temper = 0;
//unsigned char  dis1[10];
//****************************************************
//DS18B20延時函數
//****************************************************
void DS18B20_Delay( unsigned int n )
{
        unsigned int i;
        for(i = 0 ; i < n ; i++ );
}
//****************************************************
//DS18B20寫1字節
//****************************************************
void DS18B20_Write_Byte( unsigned char dat)
{
        unsigned char i;
        for( i = 0 ; i < 8 ; i++ )
        {
                DS18B20_DQ = 0;
                _nop_();                        //延時>1us
                _nop_();
               
                DS18B20_DQ = dat&0x01;                 //先寫低位
                DS18B20_Delay(6);        //延時60~120us         
         
                DS18B20_DQ = 1;                //釋放總線
                dat >>= 1;
                _nop_();                        //延時>1us
                _nop_();        
        }               
}

//****************************************************
//DS18B20讀1字節
//****************************************************
unsigned char DS18B20_Read_Byte( )
{
        unsigned char dat=0;
        unsigned char i=0;
        for( i = 0 ; i < 8 ; i++ )
        {
                DS18B20_DQ = 0;
                _nop_();                        //延時>1us
                _nop_();
        
                dat >>= 1;               
        
                DS18B20_DQ = 1;                //釋放總線
                _nop_();                        //延時>1us
                _nop_();

        //        dat=  DS18B20_DQ;
                if( DS18B20_DQ == 1)
                {
                        dat |= 0X80;
                }
                /*else
                {
                        dat &= 0x7f;
                }                 */
                        
                DS18B20_Delay(6);        //延時60~120us                        
        }
        return (dat);               
}

//****************************************************
//DS18B20初始化
//****************************************************
void DS18B20_Init()
{
//        bit Flag_exist = 0;
        DS18B20_DQ = 1;                        //釋放總線
        _nop_();                                //延時>1us
        _nop_();

        DS18B20_DQ = 0;        
        DS18B20_Delay(50);                //延時480~960us        

        DS18B20_DQ = 1;                        //釋放總線
        DS18B20_Delay(4);                //延時15~60us

//        Flag_exist = DS18B20_DQ;
//        DS18B20_Delay(10);                //延時60~240us

//        DS18B20_DQ = 1;                        //釋放總線
//        return Flag_exist;                        
}

//**********************************************************
//讀取溫度函數,返回溫度的絕對值,并標注flag_temper,flag_temper=1表示負,flag_temper=0表示正
//**********************************************************
unsigned int Get_temp()         //讀取溫度值
{  
        float tt;
        unsigned char a,b;
        unsigned int temp;
        DS18B20_Init();
//        if( DS18B20_Init() == 0 )                //初始化
//        {

                DS18B20_Write_Byte(0xcc);          //忽略ROM指令
                DS18B20_Write_Byte(0x44);          //溫度轉換指令
        
//        DS18B20_Delay(750);                                //PROTEUS仿真需要加
                DS18B20_Init();
        //        if( DS18B20_Init() == 0 )                 //初始化
        //        {
                        DS18B20_Write_Byte(0xcc);          //忽略ROM指令
                        DS18B20_Write_Byte(0xbe);          //讀暫存器指令
                        a = DS18B20_Read_Byte();           //讀取到的第一個字節為溫度LSB
                        b = DS18B20_Read_Byte();           //讀取到的第一個字節為溫度MSB
                        temp = b;                      //先把高八位有效數據賦于temp
                        temp <<= 8;                    //把以上8位數據從temp低八位移到高八位
                        temp = temp|a;                //兩字節合成一個整型變量
                        tt = temp*0.0625;
                        temp=tt*10+0.5;
                        tt=tt+0.05;
                /*        if(temp>0xfff)
                        {
                                flag_temper=1;                                //溫度為負數
                                temp=(~temp)+1;
                        }
                        else
                        {                                                                                                                                                           
                                flag_temper=0;                                //溫度為正或者0
                        }
                        
                        tt = temp*0.0625;              //得到真實十進制溫度值
                                                        //因為DS18B20可以精確到0.0625度
                                                        //所以讀回數據的最低位代表的是0.0625度
                        temp = tt*10+0.5;               //放大十倍
                                                        //這樣做的目的將小數點后第一位也轉換為可顯示數字
                                                          //同時進行一個四舍五入操作。
                }
//        }           */
        return temp;
}
/********************(STC12C5608AD  11MHZ z=1時精確延時1ms)*******************/
void delayms(unsigned int z)
{
unsigned int x,y;
for(x=z; x>0; x--)
for(y=1848; y>0; y--);
}

/*****************************************顯示溫度****************************/
void Display_Temp()
{
        Temp_Buffer = Get_temp();                                          //讀取DS18B20的值
        OLED_WrCmd(0x80+0x40+10);                                
/*        if(flag_temper == 1)                                                //根據溫度標志位顯示溫度正負
        {
                OLED_WrDat('-');        
        }                                           */
        /*if( Temp_Buffer/1000 != 0 )                                        //如果第一位為0,忽略顯示
        {
                OLED_WrDat(Temp_Buffer/1000+0X30);           //顯示溫度百位值
        }                           */
        //OLED_WrDat(Temp_Buffer%1000/100+0X30);           //顯示溫度十位值
//        OLED_WrDat(Temp_Buffer%100/10+0X30);           //顯示溫度個位值
        OLED_WrDat('.');                                                   //顯示小數點
//        OLED_WrDat(Temp_Buffer%10+0X30);                   //顯示溫度十分位值
        OLED_WrDat('C');                                                   //顯示字符C         
               
}

/*void makerand()        
{
        unsigned int a;
        Get_temp();
        a=Get_temp();
        dis1[0]=        a%1000/100+0X30;
        dis1[1]=        a %100/10+0X30;
        dis1[2]=        a %10+0X30;

}                  */
/***********************************主函數**********************************/
void main()
{
     unsigned char i;
         OLED_Init();                                                 //OLED初始化
         OLED_P8x16Str(0,3,"Wellcome to use!");         //顯示歡迎界面
         delayms(1000);                                                         //延時
         OLED_CLS();                                                                 //清屏
         
        while(1)
         {
         Temp_Buffer = Get_temp();                                          //讀取DS18B20的值
         delayms(500);
                                 
         OLED_WrCmd(0x80+0x40+10);                                
         OLED_WrDat(Temp_Buffer%1000/100+0X30);           //顯示溫度十位值
         OLED_WrDat(Temp_Buffer%100/10+0X30);           //顯示溫度個位值
         OLED_WrDat('.');                                                   //顯示小數點
         OLED_WrDat(Temp_Buffer%10+0X30);                   //顯示溫度十分位值
         OLED_WrDat('C');
         delayms(1000);
         }
        /* while(1)
        {
                for(i=0; i<8; i++)
                        {OLED_P16x16Ch(i*16,0,i);  //點陣顯示
                        }                                            
                OLED_P16x16Ch(0,2,0);
                OLED_P16x16Ch(16,2,1);
                OLED_P16x16Ch(32,2,2);
                OLED_P16x16Ch(48,2,3);        
                OLED_P16x16Ch(64,2,4);               
                                                           //獲取并顯示溫度值
        }                                              */
//        Display_Temp();        
}


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

使用道具 舉報

沙發
ID:648281 發表于 2020-1-1 10:12 | 只看該作者
你好!
1、和你單片機硬件端口接線有關
2、和系統時鐘有關,影響延時
3、程序本身也行就不對
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕 在线观看 | 天天久久| 久久国产欧美日韩精品 | 最近中文字幕在线视频1 | 亚洲一区二区三区久久 | 伊人网在线综合 | 国产精品久久久久aaaa樱花 | 亚洲视频在线观看 | 国产精品爱久久久久久久 | 久久视频一区 | 国产精品九九视频 | 伊人免费在线 | 欧洲亚洲精品久久久久 | 色婷婷久久久久swag精品 | 精品一区二区三区在线视频 | av网站观看 | 国产精品一区二区三区四区 | 91激情视频| 国产毛片久久久 | 视频一区二区三区中文字幕 | 美女视频一区 | 国产高潮av| 91精品久久久久久久久中文字幕 | 日韩一区二区在线视频 | 性国产丰满麻豆videosex | 国产欧美精品一区二区三区 | 日韩成人在线网站 | 亚洲精品国产一区 | 中文字幕第九页 | 成人免费在线 | 午夜精品一区二区三区三上悠亚 | 日本字幕在线观看 | 国产精品永久久久久 | 国产91亚洲精品 | 久久精品一区二区三区四区 | 久久久国产精品网站 | 国产乱码精品一品二品 | 日韩毛片中文字幕 | 久久久tv | 日本成年免费网站 | 特级丰满少妇一级aaaa爱毛片 |