为什么基于51单片机用gy906测温时一直显示-k3.15

img


#include"reg52.h"
#include"intrins.h" 
//************************************
#define  uint  unsigned int
#define  uchar unsigned char
#define  Nack_counter  10 
//**************端口定义************** 
//LCD 控制线接口
uchar flag0; 
sbit  RW=P2^6; 
sbit  RS=P2^5; 
sbit  LCDE=P2^7;
//mlx90614 端口定义
sbit  SCL=P1^4;//时钟线 
sbit  SDA=P1^3;//数据线 
//按键接口
sbit  key1=P1^0;
sbit  key2=P1^1;
sbit  key3=P1^2;
//蜂鸣器接口
sbit  beep=P2^0;

//************数据定义**************** 
bdata uchar flag;//可位寻址数据 
sbit bit_out=flag^7; 
sbit bit_in=flag^0; 
uchar DataH,DataL,Pecreg; 
//************函数声明***************************************** 
void   start_bit();                 //MLX90614 发起始位子程序 
void   stop_bit();                 //MLX90614 发结束位子程序 
uchar  rx_byte(void);              //MLX90614 接收字节子程序 
void   send_bit(void);             //MLX90614 发送位子程序 
void   tx_byte(uchar dat_byte);     //MLX90614 接收字节子程序 
void   receive_bit(void);           //MLX90614 接收位子程序 
void   delay(uint N);              //延时程序 
uint   memread(void);             //读温度数据 
void   init1602(void);      //LCD 初始化子程序 
void   chk_busy_flg(void);         //LCD 判断忙子程序 
void   dis_cmd_wrt(uchar cmd);     //LCD 写命令子程序 
void   dis_dat_wrt(uchar dat);       //LCD 写数据子程序 
void   display(uint Tem);           //显示子程序 
void beep_warning(int number);    //蜂鸣器报警
void too_hot(); //过热
//void out_of_range(); //超出范围
uint Tem;  //温度
 
//*************主函数******************************************* 
void main() 
{ 
 uint tem_warning=3700;
 SCL=1;
 SDA=1;
 _nop_();  
 _nop_();
 _nop_();
 _nop_();  
 SCL=0;  
 delay(1000);  
 SCL=1;  
 init1602(); 
 beep=1;

  while(1)
  {
   if(key1==0||key2==0||key3==0)
   {
    delay(1000);
    if(key1==0)//按1号键,测量温度
    {
     Tem=memread();
     //Tem+=200;//++++
     display(Tem);
//     if((Tem*2-27315<2800)||(Tem*2-27315>4700))
//     out_of_range();
     if(Tem*2-27315>tem_warning)
      beep_warning(6);
     while(!key1);
    }
    if(key2==0||key3==0)//按2/3号键,调制报警温度
    {
     int i=40;
     display((tem_warning+27315)/2);//显示当前报警温度
     while(i--)
     {
   
![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/447374976246127.jpeg "#left")


```插上传感器测温一直是-k3.15 拔了就是382.1
![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/822484976246144.jpeg "#left")

怎么读?ADC还是数字

#include "reg52.h"

#include "GY906.h"



#define  Nack_counter  10



//************ 数据定义****************

bdata uchar flag;//可位寻址数据

sbit bit_out=flag^7;

sbit bit_in=flag^0;

unsigned char DataH,DataL,Pecreg;







void delay(uint a)

{                        

        uint b;

        for(;a>0;a--)

                for(b=125;b>0;b--);

}





void i2c_Init(void)

{

        SCL=1;

        SDA=1;

        _nop_();

        _nop_();

        _nop_();

        _nop_();

        SCL=0;

        delay(1);

        SCL=1;

}



//************************************

void   start_bit(void)

{

   SDA=1;

   _nop_();_nop_();_nop_();_nop_();_nop_();

   SCL=1;

   _nop_();_nop_();_nop_();_nop_();_nop_();

   SDA=0;

   _nop_();_nop_();_nop_();_nop_();_nop_();

   SCL=0;

   _nop_();_nop_();_nop_();_nop_();_nop_();



}

//------------------------------

void   stop_bit(void)

{



   SCL=0;

   _nop_();_nop_();_nop_();_nop_();_nop_();

   SDA=0;

   _nop_();_nop_();_nop_();_nop_();_nop_();

   SCL=1;

   _nop_();_nop_();_nop_();_nop_();_nop_();

   SDA=1;

}

//--------- 发送一个字节---------

void  tx_byte(uchar dat_byte)

{

   char i,n,dat;

   n=Nack_counter;

TX_again:

   dat=dat_byte;

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

   {

     if(dat&0x80)

      bit_out=1;

     else

      bit_out=0;

     send_bit();

     dat=dat<<1;

   }

   

      receive_bit();

   if(bit_in==1)

   {

    stop_bit();

    if(n!=0)

    {n--;goto Repeat;}

    else

     goto exit;

   }

   else

    goto exit;

Repeat:

    start_bit();

    goto TX_again;

exit: ;

}

//-----------发送一个位---------

void  send_bit(void)

{

  if(bit_out==0)

  

       SDA=0;

  else

     SDA=1;

  _nop_();

  SCL=1;

  _nop_();_nop_();_nop_();_nop_();

  _nop_();_nop_();_nop_();_nop_();

  SCL=0;

  _nop_();_nop_();_nop_();_nop_();

  _nop_();_nop_();_nop_();_nop_();

}

//---------- 接收一个字节--------

uchar rx_byte(void)

{

  uchar i,dat;

  dat=0;

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

  {

    dat=dat<<1;

    receive_bit();

    if(bit_in==1)

     dat=dat+1;

  }

  send_bit();

  return dat;

}



//---------- 接收一个位----------

void receive_bit(void)

{

  SDA=1;bit_in=1;

  SCL=1;

  _nop_();_nop_();_nop_();_nop_();

  _nop_();_nop_();_nop_();_nop_();

  bit_in=SDA;

  _nop_();

  SCL=0;

  _nop_();_nop_();_nop_();_nop_();

  _nop_();_nop_();_nop_();_nop_();

}