搜索
bottom↓
回复: 25

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

[复制链接]

出0入0汤圆

发表于 2011-7-5 11:06:51 | 显示全部楼层 |阅读模式
#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)

板子是用洞洞板做的

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2011-7-5 11:11:07 | 显示全部楼层
我找到的相应资料   讨厌英文
点击此处下载 ourdev_654830J4IKMR.pdf(文件大小:809K) (原文件名:红外温度传感器_MLX90614ESF-BAA.pdf)
点击此处下载 ourdev_654831ETT6NT.PDF(文件大小:188K) (原文件名:论文 红外.PDF)

出0入0汤圆

 楼主| 发表于 2011-7-5 11:28:57 | 显示全部楼层
顶起来

出0入0汤圆

 楼主| 发表于 2011-7-5 11:56:31 | 显示全部楼层
顶起来顶起来  都没人用过吗?

出0入0汤圆

发表于 2011-7-5 12:02:46 | 显示全部楼层
是不是通信速度太快了?

出0入0汤圆

发表于 2011-7-5 13:09:03 | 显示全部楼层
mark~~

出0入0汤圆

发表于 2011-7-5 13:24:15 | 显示全部楼层
以前一个项目写的,给你参考下。



MEGA16--MLX90614ourdev_654863P898AC.rar(文件大小:100K) (原文件名:IR――t.rar)

出0入0汤圆

 楼主| 发表于 2011-7-5 13:41:54 | 显示全部楼层
谢谢楼上的几位  再顶顶

出0入0汤圆

 楼主| 发表于 2011-7-5 13:42:56 | 显示全部楼层
回复【4楼】sadf123
是不是通信速度太快了?
-----------------------------------------------------------------------

谢谢  我下午调慢试试

出0入0汤圆

 楼主| 发表于 2011-7-5 14:22:19 | 显示全部楼层
回复【6楼】0712 一笑狙
以前一个项目写的,给你参考下。
mega16--mlx90614 (原文件名:ir――t.rar)  

-----------------------------------------------------------------------

请问下  我的程序还有电路中哪里有问题吗? 显示一直是128   搞不懂了  还有  有什么办法可以测试下传感器的好坏呢?

出0入0汤圆

发表于 2011-7-5 15:11:53 | 显示全部楼层
对照这个PDF文件
查看你的程序
点击此处下载 ourdev_654889CZUA6O.pdf(文件大小:1.33M) (原文件名:mlx90614smbus.pdf)

出0入0汤圆

 楼主| 发表于 2011-7-5 17:08:56 | 显示全部楼层
回复【10楼】0712 一笑狙
对照这个pdf文件
查看你的程序
点击此处下载  (原文件名:mlx90614smbus.pdf)  

-----------------------------------------------------------------------

谢谢  资料非常好

出0入0汤圆

 楼主| 发表于 2011-7-6 08:50:32 | 显示全部楼层
   还是不行

出0入0汤圆

发表于 2011-7-6 10:01:53 | 显示全部楼层
请参考
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3990328&bbs_page_no=1&search_mode=3&search_text=cyberkyg&bbs_id=9999

出0入0汤圆

 楼主| 发表于 2011-7-6 12:01:39 | 显示全部楼层
回复【13楼】cyberkyg
请参考
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3990328&amp;bbs_page_no=1&amp;search_mode=3&amp;search_text=cyberkyg&amp;bbs_id=9999
-----------------------------------------------------------------------

没有430了  参考你的程序了   基本和我的也差不多   我还用了你那个帖子里有人回复的51程序   还是没反应  这是为什么呢?  我换了两个MLX90614ESF-BAA了  还是不行

出0入0汤圆

发表于 2011-9-14 17:57:22 | 显示全部楼层
mark,这个传感器 抗干扰 咋样?像用在开关柜里??求解释

出0入0汤圆

发表于 2011-9-23 15:41:06 | 显示全部楼层
我是按照430的那个程序,但是很奇怪的是datasheet上发读命令时,第一个addr直接发,第二个要+1再发,我的程序第二个跟第一个发的是同样的,居然也有数据回来,不知道对不对的。但是pec校验也能通过,不知道怎么回事。

出0入0汤圆

发表于 2011-10-7 21:59:01 | 显示全部楼层
温度读出来误差很大,不知道是怎么回事。很奇怪,一直都跟实际温度大概差8℃左右,调发射率也没有什么作用,我把发射率调成0.3,竟然温度还变成了负数!!!
不是发射率调低了,温度应该变大吗??
我测试的是手掌的温度,用我从市场上买回来的红外测温仪测试,是34.5℃,用mlx90615测试的是28~29℃之间。
有没有谁指教下????
多谢了!

出0入0汤圆

 楼主| 发表于 2011-10-12 16:16:59 | 显示全部楼层
呵呵 我的也不准   不过MLX90614测环境温度的时候到是很准的  就是测量对象温度时误差挺大  我用MLX90614对着嘴巴  误差还好  大概能有个35 6度的  但着对着它哈气时  温度最高居然到了44度。。

出0入0汤圆

发表于 2011-10-20 15:11:59 | 显示全部楼层
没错,环境温度还挺准的,但是目标温度却是挺差的。
我测嘴巴的温度也不对。不知道怎么回事,距离小于10mm

出0入0汤圆

发表于 2011-11-29 23:56:35 | 显示全部楼层
我在学玩这个,正好用上

出0入0汤圆

发表于 2012-2-15 13:42:54 | 显示全部楼层
脚印

出0入0汤圆

发表于 2013-5-8 20:36:09 | 显示全部楼层
ms80c51 发表于 2011-10-12 16:16
呵呵 我的也不准   不过MLX90614测环境温度的时候到是很准的  就是测量对象温度时误差挺大  我用MLX90614对 ...

师兄,调出来啊,我的也没整出来   求指导啊

出0入0汤圆

发表于 2014-11-18 12:01:32 | 显示全部楼层
这款元器件怕不怕焊接温度350℃呢?

出0入8汤圆

发表于 2015-4-3 14:13:21 | 显示全部楼层
感谢前辈的资料~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-6 20:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表