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

標題: ds18b20測溫在OLED12864上顯示 求幫助 [打印本頁]

作者: a1123612249    時間: 2019-12-13 13:10
標題: ds18b20測溫在OLED12864上顯示 求幫助
請大佬指教,為什么顯示不出來溫度啊
#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();        
}



作者: 51hei**1140    時間: 2020-1-1 10:12
你好!
1、和你單片機硬件端口接線有關
2、和系統時鐘有關,影響延時
3、程序本身也行就不對




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 黑人巨大精品欧美一区二区一视频 | 日韩欧美一区二区三区四区 | 亚洲国产免费 | 国产 日韩 欧美 中文 在线播放 | 亚洲综合五月天婷婷 | 午夜在线小视频 | 欧美一区免费 | 免费成人高清在线视频 | 国产99久久| 久久99精品国产麻豆婷婷 | 日本精品一区二区三区在线观看视频 | 亚洲成人午夜在线 | 久久精品国产99国产精品 | 国产色黄| 91精品久久久久久久久久 | 精品一区二区久久 | 日韩电影一区 | 久久综合狠狠综合久久综合88 | 亚洲成人免费视频在线 | 欧美一区二区三区 | 欧美亚洲国产一区二区三区 | 国产成人精品a视频一区www | 九九久久这里只有精品 | 国产成人在线一区二区 | 成人在线免费视频 | 九九在线视频 | 欧美一区二区三区 | 亚洲精品专区 | 国产免费av在线 | 欧美黄色网 | 黄色在线免费观看视频网站 | 久久久精彩视频 | 欧美日韩精品一区二区三区四区 | ww 255hh 在线观看 | 爱草在线| 99精品国产一区二区青青牛奶 | 美女福利视频网站 | 日韩成人免费视频 | 欧美黄在线观看 | 国产一二三区在线 | 精品二区|