请大佬指教,为什么显示不出来温度啊
#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();
}
|