用DS18B20测量温度,不管DS18B20怎么调节,LCD温度就是不变

源代码如下:

#include<reg51.h>

#include<intrins.h>

#include<absacc.h>

#define uchar unsigned char

#define uint unsigned int

#define BUSY 0x80

 

void Delay(uint);

void init_LCD(void);

void LCD_Command(uchar,uchar);

void LCD_Data(uchar);

void ReadyLCD(void);

void Display_char(uchar,uchar,uchar);

void Display_str(uchar,uchar,uchar code *Data);

void Change(void);

void Display(void);

void init_18B20(void);

uchar Read_18B20(void);

void Write_18B20(uchar);

void Read_temp(void);

void Delay_us(uchar i);

void Key_scan(void);

void Key_set(void);

void Key_inc(void);

void Key_dec(void);

void Alarm(void);

 

sbit LCD_RS=P2^0;

sbit LCD_RW=P2^1;

sbit LCD_EN=P2^2;

sbit DQ=P1^7;

sbit Normal=P2^4;

sbit Alarm_H=P2^5;

sbit Alarm_L=P2^6;

sbit Alarm_BEEP=P2^7;

 

uchar Set_flag=0;

uchar Temp_mea,Temp_set1,Temp_set2;

uchar Temp_high_1,Temp_high_2;

uchar Temp_low_1,Temp_low_2;

uchar Temp_true_1,Temp_true_2;

 

extern uchar code str0[]={"High: C Low: C"};

extern uchar code str1[]={"Mode: Deg: C"};

extern uchar code str2[]={" Hellow!! "};

extern uchar code str3[]={"0123456789"};

extern uchar code mode[]={"NHL"};

 

/********主程序********/

void main(void)

{

 P1=0xff;

 P2|=0x70;

 P2&=0x7f;

 Temp_set1=90; //上限报警温度初值90

 Temp_set2=10; //下限报警温度初值10

 Delay(500); //延时500ms启动

 init_LCD(); //LCD初始化

 init_18B20(); //DS18B20初始化

 Display_str(0,0,str2); //开机界面

 Display_str(0,1,str2); //开机界面

 Delay(2000);

 Display_str(0,0,str0);

 Display_str(0,1,str1);

 while(1)

 {

  Key_scan(); //扫描键盘

  Read_temp(); //读取温度

  Change();

  Display(); //显示

  Alarm(); //指示灯与报警程序

  Delay(1000);

 }

}

 

/********延时kms********/

void Delay(uint k)

{

 uint i,j;

 for(i=0;i<k;i++)

 {

  for(j=0;j<60;j++)

  {

   ;

  }

 }

}

/********显示模块********/

/********LCD初始化********/

void init_LCD(void)

{

 P0=0;

 Delay(15);

 LCD_Command(0x38,0);

 Delay(5);

 LCD_Command(0x38,0);

 Delay(5);

 LCD_Command(0x38,0);

 Delay(5);

 LCD_Command(0x38,1); //8位数据传送,2行显示,5*7字形

 LCD_Command(0x08,1); //关闭显示

 LCD_Command(0x01,1); //清屏

 LCD_Command(0x06,1); //显示光标右移设置

 LCD_Command(0x0c,1); //显示屏打开,光标不显示不闪烁

}

 

/********写指令数据到LCD********/

void LCD_Command(uchar LC,uchar BC)

{

 if(BC) ReadyLCD();

 P0=LC;

 LCD_RS=0; //选中指令寄存器

 LCD_RW=0; //写模式

 LCD_EN=1;

 _nop_();

 _nop_();

 _nop_();

 LCD_EN=0;

}

 

/********写显示数据到LCD********/

void LCD_Data(uchar LD)

{

 ReadyLCD();

 P0=LD;

 LCD_RS=1; //选中数据寄存器

 LCD_RW=0; //写模式

 LCD_EN=1;

 _nop_();

 _nop_();

 _nop_();

 LCD_EN=0;

}

 

/********检测LCD忙状态********/

void ReadyLCD(void)

{

 P0=0xff;

 LCD_EN=1;

 LCD_RS=0;

 LCD_RW=1;

 _nop_();

 while(P0&BUSY)

 {

  LCD_EN=0;

  _nop_();

   _nop_();

  LCD_EN=1;

  _nop_();

   _nop_();

 }

  LCD_EN=0;

}

 

/********显示一个字符********/

void Display_char(uchar X,uchar Y,uchar Data)

{

 Y&=0x01;

 X&=0x0f;

 if(Y) X|=0x40;

 X|=0x80;

 LCD_Command(X,0);

 LCD_Data(Data);

}

 

/********显示一串字符********/

void Display_str(uchar X,uchar Y,uchar code *Data)

{

 uchar List=0;

 Y&=0x01;

 X&=0x0f;

 while(X<16)

 {

  Display_char(X,Y,Data[List]);

  List++;

  X++;

 }  

}

 

/********显示字型转换********/

void Change(void)

{

 Temp_high_1=Temp_set1/10; 

 Temp_high_2=Temp_set1%10;

 Temp_low_1=Temp_set2/10;

 Temp_low_2=Temp_set2%10;

 Temp_true_1=Temp_mea/10;

 Temp_true_2=Temp_mea%10;

}

 

/********显示子程序********/

void Display(void)

{

 Display_char(5,0,str3[Temp_high_1]);

 Display_char(6,0,str3[Temp_high_2]);

 Display_char(13,0,str3[Temp_low_1]);

 Display_char(14,0,str3[Temp_low_2]);

 Display_char(5,1,mode[Set_flag]);

 Display_char(13,1,str3[Temp_true_1]);

 Display_char(14,1,str3[Temp_true_2]);

}

 

/********温度测量模块********/

/********DS18B20初始化********/

void init_18B20(void)

{

 uchar x=0;

 DQ=1; //DQ复位

 Delay_us(4); //延时

 DQ=0; //将DQ拉低

 Delay_us(250); //精确延时大于480us

 DQ=1; //拉高总线

 Delay_us(40);

 x=DQ;

 Delay_us(20);

}

 

/********从DS18B20读取一个字节数据********/

uchar Read_18B20(void)

{

 uchar i=0;

 uchar dat=0;

 for(i=8;i>0;i--)

 {

  DQ=0;

  _nop_();

  dat>>=1;

  DQ=1;

  Delay_us(1);

  if(DQ) dat|=0x80;

  Delay_us(10);

 }

return(dat);

}

 

 

/********向DS18B20写入一个字节数据********/

void Write_18B20(uchar dat)

{

 uchar i=0;

 for(i=8;i>0;i--)

 {

  DQ=0;

  _nop_(); 

  DQ=dat&0x01;

  Delay_us(10);

  DQ=1;

  dat>>=1;

  Delay_us(10);

 }

}

 

/********从DS18B20读取温度********/

void Read_temp(void)

{

 uchar a=0;

 uchar b=0;

 uchar t=0;

 init_18B20();

 Write_18B20(0xcc);

 Write_18B20(0x44);

 init_18B20();

 Write_18B20(0xcc);

 Write_18B20(0xbe);

 a=Read_18B20();

 b=Read_18B20();

 t=b;

 t<<=8;

 t=t|a; 

  Temp_mea=t*(0.0625);

}

 

/********精确延时********/

void Delay_us(uchar i)

{

  while(--i);

}

 

/********键盘扫描程序********/

void Key_scan(void)

{

 uchar temp;

 P1=0xff;

 if(P1!=0xff)

 {

  Delay(20); //延时消抖

  if(P1!=0xff)

  {

   temp=P1;

   switch(temp)

   {

    case 0xfe:Key_set();break; //P1.0按下,功能选择

    case 0xfd:Key_inc();break; //P1.1按下,数字加一

    case 0xfb:Key_dec();break; //P1.2按下,数字减一

    default:break;

   }

  }

 }

}

 

/********工作模式子程序********/

void Key_set(void)

{

 Set_flag++;

if(Set_flag>=3) //Set_flag=1,设定上限值

  Set_flag=0; //Set_flag=2,设定下限值

}

 

/********按键加一子程序********/

void Key_inc(void)

{

 switch(Set_flag)

 {

  case 1:Temp_set1++;

         if(Temp_set1>=99) Temp_set1=99;break;

  case 2:Temp_set2++;

         if(Temp_set2>=Temp_set1) Temp_set2=Temp_set1;break;

  default:break;

 }

}

 

/********按键减一子程序********/

void Key_dec(void)

{

 //Delay(150);

 switch(Set_flag)

 {

  case 1:Temp_set1--;

         if(Temp_set1<=Temp_set2) Temp_set1=Temp_set2;break;

  case 2:Temp_set2--;

         if(Temp_set2<=1) Temp_set2=1;break;

  default:break;

 }

}

 

/********报警和指示程序********/

void Alarm(void)

{

 uchar High;

 uchar Low;

 High=Temp_set1+5;

 Low=Temp_set2-5;

 if(Temp_mea>High)

 {

  Normal=1;

  Alarm_H=0;

  Alarm_L=1;

  Alarm_BEEP=1;

  }

 else 

 {if(Temp_mea<Low)

  {

   Normal=1;

   Alarm_H=1;

   Alarm_L=0;

   Alarm_BEEP=1;

  }

  else

  {

   Normal=0;

   Alarm_H=1;

   Alarm_L=1;

   Alarm_BEEP=0;

    }

 }

}

/********从DS18B20读取温度********/

void Read_temp(void)

{
 uchar a=0;

 uchar b=0;

 uchar t=0;

 init_18B20();

 Write_18B20(0xcc);

 Write_18B20(0x44);

 init_18B20();

 Write_18B20(0xcc);

 Write_18B20(0xbe);

 a=Read_18B20();

 b=Read_18B20();

 t=b;

 t<<=8;

 t=t|a; 

  Temp_mea=t*(0.0625);//!

}

char和浮点计算这里有问题,t的类型不对,至少应该是16位,而且和浮点混合运算的话可能会丢失精度

uint Temp_mea;//这个不能uchar
void Read_temp(void)

{
 uchar a=0;

 uchar b=0;

 uint t=0;//这个不可以是uchar

 init_18B20();

 Write_18B20(0xcc);

 Write_18B20(0x44);

 init_18B20();

 Write_18B20(0xcc);

 Write_18B20(0xbe);

 a=Read_18B20();

 b=Read_18B20();

 t=b;

 t<<=8;

 t=t|a; 

  Temp_mea=((float)t)*(0.0625);//!

}

重要的是你要知道为什么

a,b都是8位,你要把两个8位数组合成16位的,所以t的类型不可以是8位