找回密码
 注册

QQ登录

只需一步,快速开始

搜索

51单片机无接触测温程序源码 mlx90614+lcd1602显示

[复制链接]
eng 发表于 2021-6-20 02:20:31 | 显示全部楼层 |阅读模式
本来想着把他改成32的用oled屏显示的,一直没有时间,有程序,误差还可以,可以无接触测体温,而且还能测环境温度,后期可以自己加个人体感应模块或着超声波,
制作出来的实物图如下:
1.png
布线参考(PCB工程暂不分享,大家可以参考此图自行画)
2.png

完整程序代码-MLX90614.rar (65.33 KB, 售价: 3 E币)
部分代码:
  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. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|ELEOK |网站地图

GMT+8, 2024-4-24 08:55

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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