单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:28774|回复:20

GY-906红外测温MLX90614源码与资料

 [复制链接]
ID:236933发表于 2018-6-27 21:56|显示全部楼层
GY906红外测温模块资料
0.png

MLX90614 系列红外测温模块的原理及应用
南京航空航天大学  曾德志
摘要:  MLX90614 系列模块是一组通用的红外测温模块。在出厂前该模块已进行校验及线
性化,具有非接触、体积小、精度高,成本低等优点。被测目标温度和环境温度能通过单通
道输出,并有两种输出接口,适合于汽车空调、室内暖气、家用电器、手持设备以及医疗设
备应用等。本文以MLX90614AAA为例介绍其原理和应用。

1 引言
一般来说,测温方式可分为接触式和非接触式,接触式测温只能测量被测物体与测温传
感器达到热平衡后的温度,所以响应时间长,且极易受环境温度的影响;而红外测温是根据
被测物体的红外辐射能量来确定物体的温度,不与被测物体接触,具有影响动被测物体温度
分布场,温度分辨率高、响应速度快、测温范围广、不受测温上限的限制、稳定性好等特点,
近年来在家庭自动化、汽车电子、航空和军事上得到越来越广泛的应用。
0.png


单片机源程序如下:
  1. #include"at89x52.h"
  2. #include"intrins.h"
  3. //************************************
  4. #define  uint  unsigned int
  5. #define  uchar unsigned char
  6. #define  Nack_counter  10
  7. //************** 端口定义**************
  8. //LCD 控制线接口
  9. uchar flag1;
  10. sbit  RS=P0^7;
  11. sbit  RW=P0^6;
  12. sbit  LCDE=P0^5;
  13. //mlx90614 端口定义
  14. sbit  SCL=P1^6;// 时钟线
  15. sbit  SDA=P1^7;// 数据线
  16. //************ 数据定义****************
  17. bdata uchar flag;//可位寻址数据
  18. sbit bit_out=flag^7;
  19. sbit bit_in=flag^0;
  20. uchar DataH,DataL,Pecreg;
  21. //************ 函数声明*****************************************
  22. void   start_bit();             //MLX90614 发起始位子程序
  23. void   stop_bit();             //MLX90614发结束位子程序
  24. uchar  rx_byte(void);           //MLX90614 接收字节子程序
  25. void   send_bit(void);         //MLX90614发送位子程序
  26. void   tx_byte(uchar dat_byte);     //MLX90614 接收字节子程序
  27. void   receive_bit(void);         //MLX90614接收位子程序
  28. void   delay(uint N);           //延时程序
  29. uint   memread(void);         // 读温度数据
  30. void   init1602(void);       //LCD 初始化子程序
  31. void   chk_busy_flg(void);       //LCD 判断忙子程序
  32. void   dis_cmd_wrt(uchar cmd);     //LCD 写命令子程序
  33. void   dis_dat_wrt(uchar dat);     //LCD 写数据子程序
  34. void   display(uint Tem);         // 显示子程序
  35. //*************主函数*******************************************
  36. void main()
  37. {
  38. uint Tem;
  39. //函数部分
  40. SCL=1;SDA=1;_nop_();
  41. _nop_();_nop_();_nop_();
  42. SCL=0;
  43. delay(1000);
  44. SCL=1;
  45. init1602();
  46. while(1)
  47. {
  48.    Tem=memread();
  49.    display(Tem);
  50.    delay(20);
  51. }
  52. }
  53. //*********输入转换并显示*********
  54. void display(uint Tem)
  55. {
  56. uint T,a,b;
  57. T=Tem*2;
  58.   dis_cmd_wrt(0x01);//清屏
  59. if(T>=27315)
  60. {
  61.    T=T-27315;
  62.    a=T/100;
  63.    b=T-a*100;
  64. //---------------------------
  65.    if(a>=100)
  66.    {
  67.    dis_dat_wrt(0x30+a/100);
  68.    a=a%100;
  69.    dis_dat_wrt(0x30+a/10);
  70.    a=a%10;
  71.    dis_dat_wrt(0x30+a);
  72.    }
  73.    else if(a>=10)
  74.    {
  75.    dis_dat_wrt(0x30+a/10);
  76.    a=a%10;
  77.    dis_dat_wrt(0x30+a);
  78.    }
  79.    else
  80.    {
  81.    dis_dat_wrt(0x30+a);
  82.    }
  83.    dis_dat_wrt(0x2e);// 显示点
  84.    //---------------------------
  85.   if(b>=10)
  86.   {
  87.    dis_dat_wrt(0x30+b/10);
  88. //   b=b%10;
  89. //   dis_dat_wrt(0x30+b);
  90.   }
  91.   else
  92.   {
  93.    dis_dat_wrt(0x30);
  94. //   dis_dat_wrt(0x30+b);
  95.   }
  96. }
  97. //==========
  98. else
  99. {
  100.   T=27315-T;
  101.   a=T/100;
  102.    b=T-a*100;
  103.   dis_dat_wrt(0x2d);
  104. //--------------------------
  105.   if(a>=10)
  106.   {
  107.    dis_dat_wrt(0x30+a/10);
  108.    a=a%10;
  109.    dis_dat_wrt(0x30+a);
  110.   }
  111.   else
  112.   {
  113.    dis_dat_wrt(0x30+a);
  114.   }
  115.   dis_dat_wrt(0x2e);//显示点
  116. //--------------------------
  117.   if(b>=10)
  118.   {
  119.    dis_dat_wrt(0x30+b/10);
  120.    b=b%10;
  121.    dis_dat_wrt(0x30+b);
  122.   }
  123.   else
  124.   {
  125.    dis_dat_wrt(0x30);
  126.    dis_dat_wrt(0x30+b);
  127.   }
  128. }
  129. }

  130. //************************************
  131. void   start_bit(void)
  132. {
  133.    SDA=1;
  134.    _nop_();_nop_();_nop_();_nop_();_nop_();
  135.    SCL=1;
  136.    _nop_();_nop_();_nop_();_nop_();_nop_();
  137.    SDA=0;
  138.    _nop_();_nop_();_nop_();_nop_();_nop_();
  139.    SCL=0;
  140.    _nop_();_nop_();_nop_();_nop_();_nop_();

  141. }
  142. //------------------------------
  143. void   stop_bit(void)
  144. {

  145.    SCL=0;
  146.    _nop_();_nop_();_nop_();_nop_();_nop_();
  147.    SDA=0;
  148.    _nop_();_nop_();_nop_();_nop_();_nop_();
  149.    SCL=1;
  150.    _nop_();_nop_();_nop_();_nop_();_nop_();
  151.    SDA=1;
  152. }
  153. //--------- 发送一个字节---------
  154. void  tx_byte(uchar dat_byte)
  155. {
  156.    char i,n,dat;
  157.    n=Nack_counter;
  158. TX_again:
  159.    dat=dat_byte;
  160.    for(i=0;i<8;i++)
  161.    {
  162.      if(dat&0x80)
  163.      bit_out=1;
  164.      else
  165.      bit_out=0;
  166.      send_bit();
  167.      dat=dat<<1;
  168.    }
  169.   
  170.      receive_bit();
  171.    if(bit_in==1)
  172.    {
  173.    stop_bit();
  174.    if(n!=0)
  175.    {n--;goto Repeat;}
  176.    else
  177.      goto exit;
  178.    }
  179.    else
  180.    goto exit;
  181. Repeat:
  182.    start_bit();
  183.    goto TX_again;
  184. exit: ;
  185. }
  186. //-----------发送一个位---------
  187. void  send_bit(void)
  188. {
  189.   if(bit_out==0)
  190.   
  191.      SDA=0;
  192.   else
  193.      SDA=1;
  194.   _nop_();
  195.   SCL=1;
  196.   _nop_();_nop_();_nop_();_nop_();
  197.   _nop_();_nop_();_nop_();_nop_();
  198.   SCL=0;
  199.   _nop_();_nop_();_nop_();_nop_();
  200.   _nop_();_nop_();_nop_();_nop_();
  201. }
  202. //---------- 接收一个字节--------
  203. uchar rx_byte(void)
  204. {
  205.   uchar i,dat;
  206.   dat=0;
  207.   for(i=0;i<8;i++)
  208.   {
  209.    dat=dat<<1;
  210.    receive_bit();
  211.    if(bit_in==1)
  212.      dat=dat+1;
  213.   }
  214.   send_bit();
  215.   return dat;
  216. }

  217. //---------- 接收一个位----------
  218. void receive_bit(void)
  219. {
  220.   SDA=1;bit_in=1;
  221.   SCL=1;
  222.   _nop_();_nop_();_nop_();_nop_();
  223.   _nop_();_nop_();_nop_();_nop_();
  224.   bit_in=SDA;
  225.   _nop_();
  226.   SCL=0;
  227.   _nop_();_nop_();_nop_();_nop_();
  228.   _nop_();_nop_();_nop_();_nop_();
  229. }
  230. //------------ 延时--------------
  231. void   delay(uint N)
  232. {
  233.   uint i;
  234.   for(i=0;i<N;i++)
  235.   
  236.      _nop_();
  237. }
  238. //------------------------------
  239. uint memread(void)
  240. {
  241.   start_bit();
  242.   tx_byte(0xB4);  //Send SlaveAddress ==============================
  243.   //tx_byte(0x00);
  244.   tx_byte(0x07);  //Send Command
  245.   //------------
  246.   start_bit();
  247.   tx_byte(0x01);
  248.   bit_out=0;
  249.   DataL=rx_byte();
  250.   bit_out=0;
  251.   DataH=rx_byte();
  252.   bit_out=1;
  253.   Pecreg=rx_byte();
  254.   stop_bit();
  255.   return(DataH*256+DataL);
  256. }
  257. //******************LCD 显示子函数***********************
  258. void init1602(void)       // 初始化LCD
  259. {
  260.    dis_cmd_wrt(0x01);
  261.    dis_cmd_wrt(0x0c);
  262.    dis_cmd_wrt(0x06);
  263.    dis_cmd_wrt(0x38);
  264.   
  265.    }

  266. void chk_busy_flg(void) //LCD 忙标志判断
  267. {
  268.    flag1=0x80;
  269.   while(flag1&0x80)
  270. {
  271.    P2=0xff;
  272.    RS=0;
  273.    RW=1;
  274.    LCDE=1;
  275. ……………………

  276. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
0.png
所有资料51hei提供下载:
GY-906红外测温MLX90614资料.rar(2.26 MB, 下载次数: 527)

评分

黑币 +50
收起理由
+ 50
共享资料的黑币奖励!

查看全部评分

ID:492564发表于 2019-4-12 15:12|显示全部楼层
芯片接到51单片机,需要在控制口加上拉电阻么
ID:694443发表于 2020-2-17 19:58|显示全部楼层
mark一下
ID:430492发表于 2020-2-19 17:07|显示全部楼层
支持一下,感谢分享!
ID:386890发表于 2020-3-7 10:53|显示全部楼层
MARK一下.
ID:703871发表于 2020-3-7 16:02|显示全部楼层
大侠,温度读出来0XFF,是哪里的问题!时序对了很详细,因该没有错啊!
ID:707019发表于 2020-3-19 10:54|显示全部楼层
MARK一下.
ID:713194发表于 2020-4-7 01:05|显示全部楼层
我想问一下,这个是最基本的测温并且在显示屏上显示温度吗?没有其他的功能了吧,比如超出上下限温度范围就会报警的功能,求大神回答一下呀!
ID:734587发表于 2020-4-23 15:34|显示全部楼层
感谢分享
ID:701198发表于 2020-4-26 09:35|显示全部楼层
好漂亮,如果再配上电路图就更完美了。
ID:739068发表于 2020-4-27 10:04|显示全部楼层
感谢分享
ID:731294发表于 2020-5-18 11:11|显示全部楼层
fafaaaa 发表于 2020-4-7 01:05
我想问一下,这个是最基本的测温并且在显示屏上显示温度吗?没有其他的功能了吧,比如超出上下限温度范围就 ...

这个只需要加模块就行,可以自己弄
ID:771500发表于 2020-6-6 21:32|显示全部楼层
请问各位大佬,为什么ARDUINO CODE里面的测试程序编译时会出现如下报错:
Arduino:1.8.12 (Windows 10), 开发板:"Arduino Uno"

C:\Users\15595\AppData\Local\Temp\cczEVT9j.ltrans0.ltrans.o: In function `global constructors keyed to 65535_0_mlxtest.ino.cpp.o.1887':

< artificial>:(.text.startup+0x5e): undefined reference to `Adafruit_MLX90614::Adafruit_MLX90614(unsigned char)'

C:\Users\15595\AppData\Local\Temp\cczEVT9j.ltrans0.ltrans.o: In function `setup':

C:\Users\15595\Desktop\工程实践\GY-906\GY-906\ARDUINO CODE\MLX90614\examples\mlxtest/mlxtest.ino:32: undefined reference to `Adafruit_MLX90614::begin()'

C:\Users\15595\AppData\Local\Temp\cczEVT9j.ltrans0.ltrans.o: In function `loop':

C:\Users\15595\Desktop\工程实践\GY-906\GY-906\ARDUINO CODE\MLX90614\examples\mlxtest/mlxtest.ino:36: undefined reference to `Adafruit_MLX90614::readAmbientTempC()'

C:\Users\15595\Desktop\工程实践\GY-906\GY-906\ARDUINO CODE\MLX90614\examples\mlxtest/mlxtest.ino:37: undefined reference to `Adafruit_MLX90614::readObjectTempC()'

collect2.exe: error: ld returned 1 exit status

exit status 1

头文件里的函数明明都定义好了啊
ID:782564发表于 2020-6-20 12:47|显示全部楼层
对后期的学习非常有用
ID:785017发表于 2020-6-20 15:27|显示全部楼层
怎样通过红外传感器实现测体温呢
ID:305755发表于 2020-7-7 16:11|显示全部楼层
我按照这个GY906红外测温的代码分享,实现了一下我的测温装置,LCD1602一直显示382.1,我想请问各位大佬问题可能出在哪了呢?
ID:81138发表于 2020-7-24 14:25|显示全部楼层
如何连接液晶屏32x24的
ID:838624发表于 2020-11-4 08:54|显示全部楼层
xw836833095 发表于 2020-7-7 16:11
我按照这个GY906红外测温的代码分享,实现了一下我的测温装置,LCD1602一直显示382.1,我想请问各位大佬问 ...

请问您解决了吗
我也是一直显示同样的数,不管红外测温仪连没连都一样
ID:535176发表于 2021-1-14 11:09|显示全部楼层
JingXia_wang 发表于 2020-11-4 08:54
请问您解决了吗
我也是一直显示同样的数,不管红外测温仪连没连都一样

对的,我的也是这样,大佬们解决了吗
ID:765937发表于 2021-3-4 06:05|显示全部楼层
冷月枫 发表于 2021-1-14 11:09
对的,我的也是这样,大佬们解决了吗

这个程序这么显示,八成是电压不够,你是不是只用串口供电带了一个测温模块,一个1602,一个51
。。。。那带不动,加个正儿八经的电源试试
ID:959619发表于 2021-8-9 14:12|显示全部楼层
mark,学习

手机版|小黑屋|51黑电子论坛|51黑电子论坛6群QQ管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网