打印

MLX90614红外测温问题

[复制链接]
2527|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
17612466166|  楼主 | 2018-8-27 11:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MLX90614红外测温问题

用郭天祥的51开发板 测试的90614测温模块 基本测温显示成功  但是总会时不时的 显示378.21度,有大神可以帮忙解答一下吗 谢谢了
代码如下:
#include "reg52.h"
#include"intrins.h"
#define  uint  unsigned int
#define  uchar unsigned char
#define  Nack_counter  10
uchar code smg_du[] = {0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x80};//段选
uchar code smg_wei[] = {0xfe,0xfd,0xfb,0xf7};        //位选
uchar t2[5];
sbit dula=P2^6;
sbit wela=P2^7;
uchar key_t=0;
void Delay1000ms()                //@11.0592MHz
{
        unsigned char i, j, k;

        _nop_();
        i = 8;
        j = 1;
        k = 243;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}

void Timer0Init(void)                //1毫秒@11.0592MHz
{
        TMOD =0x01;                //设置定时器模式
        TL0 = (65535-1000)%256;//设置定时初值
        TH0 =(65535-1000)/256;//设置定时初值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
        ET0 = 1;
        EA = 1;
}       
//************** 端口定义**************
//mlx90614 端口定义
sbit  SCL=P1^6;// 时钟线
sbit  SDA=P1^7;// 数据线
//************ 数据定义****************
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   display(uint Tem);           // 显示子程序
//*************主函数*******************************************
void main()
{
uint Tem;
Timer0Init();
//函数部分
SCL=1;SDA=1;_nop_();
_nop_();_nop_();_nop_();
SCL=0;
delay(1000);
SCL=1;
while(1)
{
   Tem=memread();
   display(Tem);
   Delay1000ms();
}
}
//*******定时器0中断**********
void timer0() interrupt 1 using 1
{          
        static int smg_count = 0,i = 0;
    TL0 = (65535-1000)%256;//设置定时初值
        TH0 =(65535-1000)/256;//设置定时初值
        smg_count++;
        if(smg_count == 3)//3ms动态扫描
        {
                smg_count = 0;
                dula = 1;P0 = 0;dula = 0;;//消影
                dula = 1;P0 = t2[i];dula = 0;               
                wela = 1;P0 = smg_wei[i];wela = 0;
                i++;
                if(i == 3) i = 0;
        }               
}
//*********输入转换并显示*********
void display(uint Tem)
{
uint T,a,b;
T=Tem*2;
if(T>=27315)
{
   T=T-27315;
   a=T/100;
   b=T-a*100;
//---------------------------
   if(a>=100)
   {
        t2[0]=smg_du[a/100];
    a=a%100;
        t2[1]=smg_du[a/10];
    a=a%10;
        t2[2]=smg_du[a]|0x80;
        key_t=2;
        t2[3]=0x00;t2[4]=0x00;t2[5]=0x00;
   }
   else if(a>=10)
   {
        t2[0]=smg_du[a/10];
    a=a%10;
        t2[1]=smg_du[a]|0x80;
        key_t=1;
        t2[3]=0x00;t2[4]=0x00;t2[5]=0x00;
        t2[2]=0x00;
   }
   else
   {                
        t2[0]=smg_du[a]|0x80;
        key_t=0;
        t2[1]=0x00;t2[2]=0x00;t2[3]=0x00;t2[4]=0x00;t2[5]=0x00;
   }
  if(b>=10)
  {
          t2[key_t+1]=smg_du[b/10];
    b=b%10;
        t2[key_t+2]=smg_du[b];
  }
  else
  {
   t2[key_t+1]=smg_du[b];
  }
}
else
{
  T=27315-T;
  a=T/100;
    b=T-a*100;
//--------------------------
  if(a>=10)
  {
        t2[0]=smg_du[a/10];
    a=a%10;
        t2[1]=smg_du[a]|0x80;//加点
        t2[3]=0x00;t2[4]=0x00;t2[5]=0x00;
        t2[2]=0x00;
  }
  else
  {
        t2[0]=smg_du[a]|0x80;
        t2[1]=0x00;t2[2]=0x00;t2[3]=0x00;t2[4]=0x00;t2[5]=0x00;
  }
//--------------------------
  if(b>=10)
  {
    t2[key_t+1]=smg_du[b/10];
         b=b%10;
        t2[key_t+2]=smg_du[b];
  }
  else
  {
          t2[key_t+1]=smg_du[b/10];
  }
}
}

//************************************
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_();
}
//------------ 延时--------------
void   delay(uint N)
{
  uint i;
  for(i=0;i<N;i++)
  
     _nop_();
}
//------------------------------
uint memread(void)
{
  start_bit();
  tx_byte(0xB4);  //Send SlaveAddress ==============================
  //tx_byte(0x00);
  tx_byte(0x07);  //Send Command
  //------------
  start_bit();
  tx_byte(0x01);
  bit_out=0;
  DataL=rx_byte();
  bit_out=0;
  DataH=rx_byte();
  bit_out=1;
  Pecreg=rx_byte();
  stop_bit();
  return(DataH*256+DataL);
}

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

1

粉丝