找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2662|回复: 4
收起左侧

MLX90614非接触式红外体温计的单片机驱动程序

[复制链接]
ID:722616 发表于 2020-4-5 00:30 | 显示全部楼层 |阅读模式
非接触式红外体温计

单片机源程序如下:
  1. #include<reg52.h>
  2. #include"MLX906.h"
  3. #include"LCD1602.h"
  4. #include"EEPROM.h"
  5. #include"I2C.h"
  6. #include"WT558D.h"
  7. #include"USART.h"
  8. sbit red =P3^3;
  9. sbit green =P3^4;
  10. sbit blue =P3^5;
  11. sbit key =P3^6;
  12. uchar tab[] ="Temp:";
  13. int main()
  14. {        
  15.         uchar i;
  16.         uint wendu;                  //存储读取的值
  17.         uint xiaoshu,zhengshu;        //存储小数和整数
  18.         uchar ge,shi,bai,fyi,fer; //存储个,十,百,分数的第一位,分数的第二位
  19.         double num;
  20.         UsartInit();
  21.         Lcd_init();
  22.         for(i=0;i<5;i++)
  23.         {
  24.                 write_data(tab[i]);
  25.         }
  26.         bai = EEPROM_read_data(0);
  27.         shi = EEPROM_read_data(1);
  28.         ge = EEPROM_read_data(2);
  29.         fyi = EEPROM_read_data(3);
  30.         fer = EEPROM_read_data(4);
  31.         if(bai!=0)
  32.         {
  33.                 write_data(bai+0x30);
  34.         }
  35.         write_data(shi+0x30);        
  36.         write_data(ge+0x30);        
  37.         write_data(0x2e);        
  38.         write_data(fyi+0x30);        
  39.         write_data(fer+0x30);
  40.         write_data(0xdf);
  41.         write_data('C');
  42.         write_com(0x85);
  43.         key=1;
  44.         while(1)
  45.         {
  46.                 if(key==0)
  47.                 {
  48.                         delay(10);
  49.                         if(key==0)
  50.                         {        
  51.                                 wendu=read_temp();
  52.                                 wendu=wendu*2;
  53.                                 if(wendu>=27315)
  54.                                 {
  55.                                          wendu=wendu-27315+530;         //530是进行温度补偿
  56.                                          zhengshu=wendu/100;           //整数部分
  57.                                          xiaoshu=wendu-zhengshu*100; //小数部分
  58.                                          bai = zhengshu/100;
  59.                                          shi = zhengshu%100/10;
  60.                                          ge = zhengshu%10;
  61.                                          fyi = xiaoshu/10;
  62.                                          fer = xiaoshu%10;

  63.                                          num = wendu*1.0/100;
  64.                                          EEPROM_write_data(0,bai);
  65.                                          delay(20);
  66.                                          EEPROM_write_data(1,shi);
  67.                                          delay(20);
  68.                                          EEPROM_write_data(2,ge);
  69.                                          delay(20);
  70.                                          EEPROM_write_data(3,fyi);
  71.                                          delay(20);
  72.                                          EEPROM_write_data(4,fer);
  73.                                          delay(20);
  74.                                 }
  75.                                 if(bai!=0)
  76.                                 {
  77.                                         write_data(bai+0x30);
  78.                                 }
  79.                                 write_data(shi+0x30);        
  80.                                 write_data(ge+0x30);        
  81.                                 write_data(0x2e);        
  82.                                 write_data(fyi+0x30);        
  83.                                 write_data(fer+0x30);
  84.                                 write_data(0xdf);


  85.                                 //write_data('C');               
  86.                         }while(!key);
  87.                         write_com(0x85);
  88.                         if(num<36.0)
  89.                         {
  90.                                 blue = 0;
  91.                                 red = 1;
  92.                                 green = 1;
  93.                         }
  94.                         else if(num>=36.0&&num<=38.0)
  95.                         {
  96.                                 green = 0;
  97.                                 red = 1;
  98.                                 blue = 1;
  99.                         }
  100.                         else if(num>38.0)
  101.                         {
  102.                                 red = 0;
  103.                                 green =1;
  104.                                 blue = 1;
  105.                         }

  106.                         //语音播报
  107.                         
  108.                         Send_oneline(shi*10);
  109.                         WT558D_Delay1ms(500);
  110.                         if(ge!=0)
  111.                         {
  112.                         Send_oneline(ge);
  113.                         WT558D_Delay1ms(300);
  114.                         }
  115.                         Send_oneline(56);
  116.                         WT558D_Delay1ms(300);
  117.                         Send_oneline(fyi);
  118.                         WT558D_Delay1ms(300);
  119.                         Send_oneline(fer);
  120.                         WT558D_Delay1ms(600);
  121.                         if(num<36.0)
  122.                         {
  123.                                 Send_oneline(58);
  124.                         }
  125.                         else if(num>=36.0&&num<=38.0)
  126.                         {
  127.                                 Send_oneline(59);
  128.                         }
  129.                         else if(num>38.0)
  130.                         {
  131.                                 Send_oneline(57);
  132.                         }

  133.                 }
  134.         }
  135.         

  136. }


  137. //串口中断
  138. void serial() interrupt 4
  139. {
  140.         uint wendu;                  //存储读取的值
  141.         uint xiaoshu,zhengshu;        //存储小数和整数
  142.         uchar ge,shi,bai,fyi,fer; //存储个,十,百,分数的第一位,分数的第二位
  143.         double num;
  144.         uchar start = Usart_Read();
  145.         if(start =='s')
  146.         {
  147.                         wendu=read_temp();
  148.                         wendu=wendu*2;
  149.                         if(wendu>=27315)
  150.                         {
  151.                                  wendu=wendu-27315+530;         //530是进行温度补偿
  152.                                  zhengshu=wendu/100;           //整数部分
  153.                                  xiaoshu=wendu-zhengshu*100; //小数部分
  154.                                  bai = zhengshu/100;
  155.                                  shi = zhengshu%100/10;
  156.                                  ge = zhengshu%10;
  157.                                  fyi = xiaoshu/10;
  158.                                  fer = xiaoshu%10;

  159.                                  Usart_Write(shi+0x30);
  160.                                  Usart_Write(ge+0x30);
  161.                                  Usart_Write('.');
  162.                                  Usart_Write(fyi+0x30);
  163.                                  Usart_Write(fer+0x30);
  164.                                  num = wendu*1.0/100;
  165.                                  EEPROM_write_data(0,bai);
  166.                                  delay(20);
  167.                                  EEPROM_write_data(1,shi);
  168.                                  delay(20);
  169.                                  EEPROM_write_data(2,ge);
  170.                                  delay(20);
  171.                                  EEPROM_write_data(3,fyi);
  172.                                  delay(20);
  173.                                  EEPROM_write_data(4,fer);
  174.                                  delay(20);
  175.                         }
  176.                         if(bai!=0)
  177.                         {
  178.                                 write_data(bai+0x30);
  179.                         }
  180.                         write_data(shi+0x30);        
  181.                         write_data(ge+0x30);        
  182.                         write_data(0x2e);        
  183.                         write_data(fyi+0x30);        
  184.                         write_data(fer+0x30);
  185.                         write_data(0xdf);


  186.                         //write_data('C');               
  187.                 }while(!key);
  188.                 write_com(0x85);
  189.                 if(num<36.0)
  190.                 {
  191.                         blue = 0;
  192.                         red = 1;
  193.                         green = 1;
  194.                 }
  195.                 else if(num>=36.0&&num<=38.0)
  196.                 {
  197.                         green = 0;
  198.                         red = 1;
  199.                         blue = 1;
  200.                 }
  201.                 else if(num>38.0)
  202.                 {
  203.                         red = 0;
  204.                         green =1;
  205.                         blue = 1;
  206.                 }

  207.                 //语音播报
  208.                
  209.                 Send_oneline(shi*10);
  210.                 WT558D_Delay1ms(500);
  211.                 if(ge!=0)
  212.                 {
  213.                 Send_oneline(ge);
  214.                 WT558D_Delay1ms(300);
  215.                 }
  216.                 Send_oneline(56);
  217.                 WT558D_Delay1ms(300);
  218.                 Send_oneline(fyi);
  219.                 WT558D_Delay1ms(300);
  220.                 Send_oneline(fer);
  221.                 WT558D_Delay1ms(600);
  222.                 if(num<36.0)
  223.                 {
  224.                         Send_oneline(58);
  225.                 }
  226.                 else if(num>=36.0&&num<=38.0)
  227.                 {
  228.                         Send_oneline(59);
  229.                 }
  230.                 else if(num>38.0)
  231.                 {
  232.                         Send_oneline(57);
  233.                 }
  234. }
复制代码

所有资料51hei提供下载:
总程序.rar (73.09 KB, 下载次数: 53)
回复

使用道具 举报

ID:1 发表于 2020-4-6 01:34 | 显示全部楼层
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

ID:809629 发表于 2020-7-30 11:30 来自手机 | 显示全部楼层
有成套的干货就好了
回复

使用道具 举报

ID:622100 发表于 2020-9-2 20:56 | 显示全部楼层
原理图有木有?草图也行呀
回复

使用道具 举报

ID:65956 发表于 2020-9-3 10:05 | 显示全部楼层
我有个疑问了解一下,第1是这个程序是51单片机是吗?如是的话你在中断里有个定义双精度的变量,请问此单片机支持吗?第2是你中断里处理太多事了,我建议中断里作的事情越短越好,把事情放在主函数里去作,这样效率会高点。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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