找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2170|回复: 1
打印 上一主题 下一主题
收起左侧

单片机MLX90614测温代码

[复制链接]
跳转到指定楼层
楼主
  1. #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
  2. #include<stdio.h>                 
  3. #include<intrins.h>
  4. #include "delay.h"
  5. #include "1602.h"
  6. #include "mlx90614.h"

  7. sbit buzzer=P1^0; //引脚定义
  8. sbit key1=P2^0;
  9. sbit key2=P2^1;

  10. unsigned long time_20ms;  //定时计数
  11. char dis0[16];                          //液晶数组显示暂存
  12. char dis1[16];
  13. unsigned int setNum = 37; //设置值
  14. //---------------------------------------
  15. //Name: CALTEMP           
  16. //Temperature data is T=(Data)*0.02-273.15
  17. //---------------------------------------
  18. bit rekey =0;//防止按键重复按下
  19. bit disFlag =0;//更新显示标志
  20. unsigned int  Tem;           //温度
  21. float objTemp,envTemp;         //物体温度和环境温度

  22. void Init_Timer0(void);         //函数声明

  23. void main (void)
  24. {   
  25.         Init_Timer0();        //定时器0初始化
  26.                      
  27.         LCD_Init();           //初始化液晶
  28.         DelayMs(20);          //延时有助于稳定
  29.         LCD_Clear();

  30.         while (1)         //主循环
  31.         {
  32.                 if(disFlag==1)           //显示标志
  33.                 {
  34.                         Tem=ReadObjectTemp();         //读取实物温度
  35.                         objTemp=(float)(Tem)*0.02-273.15;
  36.        
  37.                         Tem=ReadEnvironTemp();         //读取环境温度
  38.                         envTemp=(float)(Tem)*0.02-273.15;

  39.                         sprintf(dis0,"E: %4.1f'C   ",envTemp);//打印温度值
  40.                         LCD_Write_String(0,0,dis0);//显示
  41.                         sprintf(dis1,"O:%5.1f'C   %3d  ",objTemp,setNum);//打印温度设置值
  42.                         LCD_Write_String(0,1,dis1);//显示

  43.                         if(objTemp>setNum)
  44.                         {buzzer =0;        }        //温度高蜂鸣器鸣叫
  45.                         else
  46.                         {buzzer=1;}                //温度低 停止
  47.                         disFlag = 0;

  48.                 }

  49.                 if((key1 == 0)||(key2 == 0))   //有按键按下
  50.                 {
  51.                          if(rekey == 0)
  52.                         {
  53.                                 DelayMs(10);
  54.                                 if(key1 == 0)  //按键1按下
  55.                                 {
  56.                                         rekey =1;        //防止重复按下
  57.                                         if(setNum<200) setNum++;          //++
  58.                                 }
  59.                                 else if((key2 == 0))//按键2按下
  60.                                 {
  61.                                          rekey =1;        //防止重复按下
  62.                                         if(setNum>0) setNum--;                //--
  63.                                 }
  64.                         }
  65.                 }
  66.                 else
  67.                 {
  68.                         rekey = 0;         //防止重复按下
  69.                 }                                       
  70.         }
  71. }


  72. void Init_Timer0(void)
  73. {
  74.         TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
  75.         TH0=(65536-20000)/256;                  //重新赋值 20ms
  76.         TL0=(65536-20000)%256;
  77.         EA=1;            //总中断打开
  78.         ET0=1;           //定时器中断打开
  79.         TR0=1;           //定时器开关打开
  80. }

  81. void Timer0_isr(void) interrupt 1
  82. {
  83.         TH0=(65536-20000)/256;                  //重新赋值 20ms
  84.         TL0=(65536-20000)%256;       
  85.         time_20ms++;
  86.         if(time_20ms%20==0)          //定时更新显示
  87.         {disFlag = 1;}
  88. }
复制代码
  1. #include "mlx90614.h"


  2. #define Nack_counter 10

  3. //************数据定义****************

  4. unsigned char bit_out=1;
  5. unsigned char bit_in=1;

  6. unsigned char DataH,DataL,Pecreg;

  7. void start_bit(void)
  8. {
  9.         SDA=1;
  10.         _nop_();_nop_();_nop_();_nop_();_nop_();
  11.         SCL=1;
  12.         _nop_();_nop_();_nop_();_nop_();_nop_();
  13.         SDA=0;
  14.         _nop_();_nop_();_nop_();_nop_();_nop_();
  15.         SCL=0;
  16.         _nop_();_nop_();_nop_();_nop_();_nop_();
  17. }

  18. void stop_bit(void)
  19. {
  20.         SCL=0;
  21.         _nop_();_nop_();_nop_();_nop_();_nop_();
  22.         SDA=0;
  23.         _nop_();_nop_();_nop_();_nop_();_nop_();
  24.         SCL=1;
  25.         _nop_();_nop_();_nop_();_nop_();_nop_();
  26.         SDA=1;
  27. }


  28. //---------发送一个字节---------
  29. void tx_byte(unsigned char dat_byte)
  30. {
  31.         char i,n,dat;
  32.         n=Nack_counter;

  33.         dat=dat_byte;
  34.         for(i=0;i<8;i++)
  35.         {
  36.                 if(dat&0x80)
  37.                 bit_out=1;
  38.                 else
  39.                 bit_out=0;
  40.                 send_bit();
  41.                 dat=dat<<1;
  42.         }
  43.         receive_bit();
  44.         if(bit_in==1)
  45.         {
  46.                 stop_bit();
  47.                 if(n!=0)
  48.                 {n--;}
  49.                 else
  50.                         return;
  51.         }
  52.         else
  53.                 return;
  54.         start_bit();
  55.         tx_byte(dat_byte);                //函数自身回调
  56. }

  57. ////---------发送一个字节---------
  58. //void tx_byte(unsigned char dat_byte)
  59. //{
  60. //        char i,n,dat;
  61. //        n=Nack_counter;
  62. //        TX_again:
  63. //        dat=dat_byte;
  64. //        for(i=0;i<8;i++)
  65. //        {
  66. //                if(dat&0x80)
  67. //                bit_out=1;
  68. //                else
  69. //                bit_out=0;
  70. //                send_bit();
  71. //                dat=dat<<1;
  72. //        }
  73. //        receive_bit();
  74. //        if(bit_in==1)
  75. //        {
  76. //                stop_bit();
  77. //                if(n!=0)
  78. //                {n--;goto Repeat;}
  79. //                else
  80. //                goto exit;
  81. //        }
  82. //        else
  83. //        goto exit;
  84. //        Repeat:
  85. //        start_bit();
  86. //        goto TX_again;
  87. //        exit: ;
  88. //}
  89. //-----------发送一个位---------
  90. void send_bit(void)
  91. {
  92.         if(bit_out==0)
  93.                 SDA=0;
  94.         else
  95.                 SDA=1;
  96.         _nop_();
  97.         SCL=1;
  98.         _nop_();_nop_();_nop_();_nop_();
  99.         _nop_();_nop_();_nop_();_nop_();
  100.         SCL=0;
  101.         _nop_();_nop_();_nop_();_nop_();
  102.         _nop_();_nop_();_nop_();_nop_();
  103. }
  104. //----------接收一个字节--------
  105. unsigned char rx_byte(void)
  106. {
  107.         unsigned char i,dat;
  108.         dat=0;
  109.         for(i=0;i<8;i++)
  110.         {
  111.                 dat=dat<<1;
  112.                 receive_bit();
  113.                 if(bit_in==1)
  114.                 dat=dat+1;
  115.         }
  116.         send_bit();
  117.         return dat;
  118. }
  119. //----------接收一个位----------
  120. void receive_bit(void)
  121. {
  122.         SDA=1;bit_in=1;
  123.         SCL=1;
  124.         _nop_();_nop_();_nop_();_nop_();
  125.         _nop_();_nop_();_nop_();_nop_();
  126.         bit_in=SDA;
  127.         _nop_();
  128.         SCL=0;
  129.         _nop_();_nop_();_nop_();_nop_();
  130.         _nop_();_nop_();_nop_();_nop_();
  131. }

  132. //------------------------------
  133. unsigned int ReadObjectTemp(void)
  134. {
  135.         start_bit();
  136.         tx_byte(0x00); //Send SlaveAddress
  137.         tx_byte(0x07); //Send Command
  138.         start_bit();
  139.         tx_byte(0x01);
  140.         bit_out=0;
  141.         DataL=rx_byte();
  142.         bit_out=0;
  143.         DataH=rx_byte();
  144.         bit_out=1;
  145.         Pecreg=rx_byte();
  146.         stop_bit();
  147.         return(DataH*256+DataL);
  148. }

  149. unsigned int ReadEnvironTemp(void)
  150. {
  151.         start_bit();
  152.         tx_byte(0x00); //Send SlaveAddress
  153.         tx_byte(0x06); //Send Command
  154.         start_bit();
  155.         tx_byte(0x01);
  156.         bit_out=0;
  157.         DataL=rx_byte();
  158.         bit_out=0;
  159.         DataH=rx_byte();
  160.         bit_out=1;
  161.         Pecreg=rx_byte();
  162.         stop_bit();
  163.         return(DataH*256+DataL);
  164. }


  165. //---------------------------------------
  166. //Name: CALTEMP           
  167. //Temperature data is T=(Data)*0.02-273.15

  168. //Tem=ReadObjectTemp();
  169. //objTemp=(float)(Tem)*0.02-273.15;
  170. //sprintf(tab_up,"O:%5.2f %05d ",objTemp,Tem);//打印温度值
  171. //LCD_Write_String(0,0,tab_up);//显示第一行
  172. //
  173. //Tem=ReadEnvironTemp();
  174. //envTemp=(float)(Tem)*0.02-273.15;
  175. //sprintf(tab_dw,"E:%5.2f %05d ",envTemp,Tem);//打印温度值
  176. //LCD_Write_String(0,1,tab_dw);//显示第一行
  177. //
  178. //DelayMs(200);
复制代码



代码下载: 精准测温MLX90614.zip (79.45 KB, 下载次数: 47)

评分

参与人数 1黑币 +20 收起 理由
admin + 20 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1072769 发表于 2023-4-19 17:33 | 只看该作者
这个是包含温度补偿的吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

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