有用过mlx90614ESF-BAA 非接触式红外温度传感器的吗?帮我看看我的程序跟电路,为什么没

2020-01-20 19:07发布

#include<at89x51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define Nack_number 10

                                                                                        //mlx90614端口定义
sbit SCK=P1^0;                                                                //时钟线
sbit SDA=P1^1;                                                                //数据线


sbit LED3 = P0^5;                            //数码管位驱动
sbit LED2 = P0^6;                            //数码管位驱动
sbit LED1 = P0^7;                            //数码管位驱动

uchar convert[10]={0x05,0xDD,0x46,0x54,0x9C,0x34,0x24,0x5D,0x04,0x14},xm0,xm1,xm2,buffer[3];//0~9段码
//************数据定义****************************************************
bdata uchar flag1;                                                        //可位寻址数据
sbit bit_out=flag1^7;
sbit bit_in=flag1^0;
uchar tempH,tempL,err;

//**************************  LCD1602  ***********************************
//向LCD写入命令或数据*****************************************************
#define LCD_COMMAND                        0                              //命令
#define LCD_DATA                        1                              // 数据
#define LCD_CLEAR_SCREEN        0x01                      // 清屏
#define LCD_HOMING                  0x02                      // 光标返回原点
//设置显示模式******* 0x08+   *********************************************
#define LCD_SHOW                        0x04                    //显示开
#define LCD_HIDE                        0x00                    //显示关
#define LCD_CURSOR                        0x02                         //显示光标
#define LCD_NO_CURSOR                0x00                    //无光标
#define LCD_FLASH                        0x01                    //光标闪动
#define LCD_NO_FLASH                0x00                    //光标不闪动
//设置输入模式********** 0x04+ ********************************************
#define LCD_AC_UP                        0x02                     //光标右移 AC+
#define LCD_AC_DOWN                        0x00                      //默认 光标左移 AC-
#define LCD_MOVE                        0x01                      //画面可平移
#define LCD_NO_MOVE                        0x00                      //默认 画面不移动

//**************************  mlx90614  ***********************************
//command mode  命令模式
#define RamAccess        0x00                                        //对RAM操作
#define EepomAccess        0x20                                        //对EEPRAM操作
#define        Mode                0x60                                        //进入命令模式
#define ExitMode        0x61                                        //退出命令模式
#define        ReadFlag        0xf0                                        //读标志
#define EnterSleep        0xff                                        //进入睡眠模式
//ram address        read only RAM地址(只读)
#define AbmientTempAddr                0x03                        //周围温度
#define        IR1Addr                                0x04
#define        IR2Addr                                0x05
#define LineAbmientTempAddr        0x06                          //环境温度
/*0x0000        0x4074         16500         0.01/单元
     -40           125*/
#define LineObj1TempAddr        0x07                        //目标温度,红外温度
/*0x27ad-0x7fff         0x3559 22610        0.02/单元
  -70.01-382.19  0.01   452.2*/
#define        LineObj2TempAddr        0x08
//eepom address  EEPROM地址
#define TObjMaxAddr                0x00                                //测量范围上限设定
#define TObjMinAddr                0x01                                //测量范围下限设定
#define PWMCtrlAddr                0x02                                //PWM设定
#define TaRangeAddr                0x03                                //环境温度设定
#define KeAddr                        0x04                                //频率修正系数
#define ConfigAddr                0x05                                //配置寄存器
#define SMbusAddr                0x0e                                //器件地址设定
#define Reserverd1Addr        0x0f                                //保留
#define Reserverd2Addr        0x19                                //保留
#define ID1Addr                        0x1c                                //ID地址1
#define ID2Addr                        0x1d                                //ID地址2
#define ID3Addr                        0x1e                                //ID地址3
#define ID4Addr                        0x1f                                //ID地址4

//************函数声明*****************************************************
void start();                                                                 //MLX90614发起始位子程序
void stop();                                                                 //MLX90614发结束位子程序
uchar ReadByte(void);                                                 //MLX90614接收字节子程序
void send_bit(void);                                                 //MLX90614发送位子程序
void SendByte(uchar number);                                 //MLX90614接收字节子程序
void read_bit(void);                                                 //MLX90614接收位子程序
void delay(uint N);                                                 //延时程序
uint readtemp(void);                                                 //读温度数据
void init1602(void);                                                 //LCD初始化子程序
void busy(void);                                                         //LCD判断忙子程序
void cmd_wrt(uchar cmd);                                         //LCD写命令子程序
void dat_wrt(uchar dat);                                         //LCD写数据子程序
void display(uint Tem);                                         //显示子程序
void Print(uchar *str);                                         //字符串显示程序
void delayscan(i);

void timeToBuffer()                                                                                                                                     
{                                                                                                                                                                                                                                                                                                                  //
        buffer[0]=convert[xm2];                                                                                                         
        buffer[1]=convert[xm1];                                                                                                         
        buffer[2]=convert[xm0];                                                                                                                                                                                                                                                          //
}               

void delayscan(i)                                                                                                                                         
{                                                                                                                                                                 
    while(--i);                                                                                                                                         
}                       

void scanLED()                             //显示功能模块
{
        P2=buffer[0];
        LED1=0;
        delayscan(1);
        LED1=1;
        delayscan(50);
        P2=buffer[1];
        LED2=0;
        delayscan(1);
        LED2=1;
        delayscan(50);
        P2=buffer[2];
        LED3=0;
        delayscan(1);
        LED3=1;
        delayscan(50);
}                                       

//*************主函数*******************************************
void main()
{
        uint Tem,yy;                                                                //温度变量
        SCK=1;
        SDA=1;
        delay(4);
        SCK=0;
        delay(1000);
        SCK=1;
        while(1)
        {
                Tem=readtemp();                                                //读取温度
                display(Tem);                                                //显示温度
                timeToBuffer();       
            for (yy=0;yy<1000;yy++)                 
                scanLED();   //延时   
        }
}


//*********输入转换并显示*********
void display(uint Tem)
{
        uint T,a,b;
        T=60000;//Tem*2;
        if(T>=27315)                                                        //温度为正
        {
                T=T-27315;                                                        //
                a=T/100;                                                        //温度整数
                b=T-a*100;                                                        //温度小数
                xm2=a%100/10;                        //显示温度十位
                xm1=a%10;                                //显示温度个位
                xm0=b/10;                                        //显示温度小数点后第1位数
        }
}
//************************************
void start(void)                                                        //停止条件是 SCK=1时,SDA由1到0
{
        SDA=1;
        delay(4);
        SCK=1;
        delay(4);
        SDA=0;
        delay(4);
        SCK=0;
        delay(4);
}
//------------------------------
void stop(void)                                                                //停止条件是 SCK=1时,SDA由0到1
{
        SCK=0;
        delay(4);
        SDA=0;
        delay(4);
        SCK=1;
        delay(4);
        SDA=1;
}
//---------发送一个字节---------
void SendByte(uchar number)
{
        uchar i,n,dat;
        n=Nack_number;                                                        //可以重发次数
Send_again:
        dat=number;
        for(i=0;i<8;i++)                                                 //8位依次发送
        {
                if(dat&0x80)                                                   //取最高位
                {
                        bit_out=1;                                            //发1
                }
                else
                {
                        bit_out=0;                                            //发0
                }               
                send_bit();                                                    //发送一个位
                dat=dat<<1;                                                    //左移一位
        }       
        read_bit();                                                           //接收1位 应答信号
        if(bit_in==1)                                                     //无应答时重发
        {
                stop();
                if(n!=0)
                {
                        n--;                                                    //可以重发Nack_number=10次
                        goto Repeat;                                        //重发
                }
                else
                {
                        goto exit;                                                //退出
                }               
        }
        else
        {
                goto exit;
        }               
Repeat:
        start();                                                                //重新开始
        goto Send_again;                                                //重发
        exit: ;                                                                        //退出
}
//-----------发送一个位---------
void send_bit(void)
{
        if(bit_out==1)
        {
                SDA=1;                                                           //发1
        }       
        else
        {
                SDA=0;                                                           //发0
        }
        _nop_();
        SCK=1;                                                                   //上升沿
        delay(4);delay(4);
        SCK=0;
        delay(4);delay(4);
}
//----------接收一个字节--------
uchar ReadByte(void)
{
        uchar i,dat;
        dat=0;                                                                        //初值为0
        for(i=0;i<8;i++)
        {
                dat=dat<<1;                                                        //左移
                read_bit();                                                        //接收一位
                if(bit_in==1)
                {
                        dat=dat+1;                                                //为1时对应位加1
                }               
        }
        SDA=0;                                                                        //发送应答信号0
        send_bit();
        return dat;                                                                //带回接收数据
}
//----------接收一个位----------
void read_bit(void)
{
        SDA=1;                                                                        //数据端先置1
        bit_in=1;
        SCK=1;                                                                        //上升沿
        delay(4);delay(4);
        bit_in=SDA;                                                                //读数据
        _nop_();
        SCK=0;
        delay(4);delay(4);
}


//------------------------------
uint readtemp(void)
{
        SCK=0;
        start();                                                                 //开始条件
        SendByte(0x00);                                                 //发送从地址00
        SendByte(0x07);                                                 //发送命令
        start();                                                                 //开始条件
        SendByte(0x01);                                                 //读从地址00
        bit_out=0;
        tempL=ReadByte();                                                //读数据低字节
        bit_out=0;
        tempH=ReadByte();                                                //读数据高字节
        bit_out=1;
        err=ReadByte();                                                        //读错误信息码
        stop();                                                                        //停止条件
        return(tempH*256+tempL);
}

//------------延时--------------
void delay(uint n)
{
        uint j;
        for(j=0;j<n;j++)
        {
                _nop_();
        }
}



(原文件名:wdcj.jpg)

板子是用洞洞板做的
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
25条回答
yanrz
2020-01-23 04:36
温度读出来误差很大,不知道是怎么回事。很奇怪,一直都跟实际温度大概差8℃左右,调发射率也没有什么作用,我把发射率调成0.3,竟然温度还变成了负数!!!
不是发射率调低了,温度应该变大吗??
我测试的是手掌的温度,用我从市场上买回来的红外测温仪测试,是34.5℃,用mlx90615测试的是28~29℃之间。
有没有谁指教下????
多谢了!

一周热门 更多>