为什么基于51单片机用gy-906测温时一直显示-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--)
     {
   

最关键的display函数你藏起来了

详细代码就不看了,说个思路吧:
1,调试读写寄存器的功能,看是否符合手册描述,
2,试一下读取温度值,结合手册计算一下是否正确。
3,调试一下显示函数,看是否可以正确显示输入值。