請大佬指教,為什么顯示不出來溫度啊
#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();
}
|