找回密码
 立即注册

QQ登录

只需一步,快速开始

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

MLX90614+单片机制作的简易体外温度测量

[复制链接]
跳转到指定楼层
楼主


单片机源程序如下:
  1. #include"reg52.h"
  2. #include"intrins.h"
  3. #define  uint  unsigned int
  4. #define  uchar unsigned char
  5. #define  Nack_counter  10
  6. uchar num;
  7. signed char alarm=30; //默认为30摄氏度报警
  8. signed char tempalarm=0;
  9. unsigned char szl[3];
  10. //************** 端口定义**************
  11. //LCD 控制线接口
  12. uchar flag1;
  13. sbit  RS=P0^7;
  14. sbit  RW=P0^6;
  15. sbit  LCDE=P0^5;
  16. //按键接口
  17. sbit key1=P0^0;
  18. sbit key2=P0^1;
  19. sbit key3=P0^2;
  20. //蜂鸣器报警接口
  21. sbit buzzer= P1^5;          
  22. //mlx90614 端口定义
  23. sbit  SCL=P1^6;// 时钟线
  24. sbit  SDA=P1^7;// 数据线
  25. //************ 数据定义****************
  26. bdata uchar flag;//可位寻址数据
  27. sbit bit_out=flag^7;
  28. sbit bit_in=flag^0;
  29. uchar DataH,DataL,Pecreg,t,num;
  30. //************ 函数声明*****************************************
  31. void   start_bit();                 //MLX90614 发起始位子程序
  32. void   stop_bit();                 //MLX90614发结束位子程序
  33. uchar  rx_byte(void);              //MLX90614 接收字节子程序
  34. void   send_bit(void);             //MLX90614发送位子程序
  35. void   tx_byte(uchar dat_byte);     //MLX90614 接收字节子程序
  36. void   receive_bit(void);           //MLX90614接收位子程序
  37. void   delay(uint N);              //延时程序
  38. uint   memread(void);             // 读温度数据
  39. void   init1602(void);            //LCD 初始化子程序
  40. void   chk_busy_flg(void);         //LCD 判断忙子程序
  41. void   dis_cmd_wrt(uchar cmd);     //LCD 写命令子程序
  42. void   dis_dat_wrt(uchar dat);       //LCD 写数据子程序
  43. void   display(uint Tem);           // 显示子程序
  44. void   baojing(void);                                  //报警子程序

  45. //*************主函数*******************************************
  46. void main()
  47. {
  48. uint Tem,k;  //函数部分
  49. SCL=1;
  50. SDA=1;
  51. _nop_(); _nop_();_nop_();_nop_();
  52. SCL=0;
  53. delay(1000);
  54. SCL=1;
  55. init1602();
  56. while(1)
  57. {            if(!key1)
  58.   {
  59.      delay(4000);
  60.          if(!key1&&alarm<125)
  61.          {        delay(4000);
  62.             alarm++;
  63.                 delay(4000);
  64.      }
  65.   }
  66.    if(!key3)
  67.    {  
  68.      delay(4000);
  69.      if(!key3&&alarm>0)
  70.          {  
  71.             delay(4000);
  72.           alarm--;
  73.           delay(4000);
  74.          }
  75.    }
  76.          dis_cmd_wrt(0x80);   
  77.      dis_dat_wrt('T');
  78.          dis_dat_wrt(':');
  79.          dis_cmd_wrt(0x80+0x40);   
  80.      dis_dat_wrt('E');
  81.          dis_dat_wrt(':');
  82.      szl[0]=alarm/100+0x30;
  83.          szl[1]=alarm%100/10+0x30;
  84.          szl[2]=alarm%100%10+0x30;
  85.              dis_cmd_wrt(0x80+0x43);
  86.                  for(k=0;k<3;k++)
  87.                  {
  88.                   dis_dat_wrt(szl[k]);
  89.                   delay(10);
  90.                  }
  91.          dis_cmd_wrt(0x80+0x48);   
  92.      dis_dat_wrt(0xdf);
  93.          dis_dat_wrt('C');
  94.      dis_cmd_wrt(0x88);   
  95.      dis_dat_wrt(0xdf);
  96.          dis_dat_wrt('C');
  97.    Tem=memread();
  98.    display(Tem);
  99.    delay(20);
  100.    tempalarm=num;
  101.    baojing();  
  102. }
  103. }
  104. //*************报警控制*******************************************
  105. void baojing(void)
  106. {  
  107.   if(tempalarm>=alarm)//报警判断
  108.   {
  109.         for(t=0;t<4;t++)
  110.         {       
  111.         buzzer=0;//打开报警蜂鸣器
  112.         delay(2000);
  113.         buzzer=1;
  114.         delay(2000);
  115.         }
  116.   }   
  117. }
  118. void delay_nms(unsigned int n)
  119. {
  120.         unsigned int j=0;
  121.         unsigned char i=0;
  122.         for(j=0;j<n;j++)
  123.         {
  124.                 for(i=0;i<120;i++)
  125.                 {
  126.                         _nop_();
  127.                 }
  128.         }
  129. }

  130. //*********输入转换并显示*********
  131. void display(uint Tem)
  132. {
  133. uint T,a,b;
  134. T=Tem*2;
  135. if(!key2)
  136. {
  137.     delay(20);
  138.         if(!key2)
  139.          {  
  140.            delay(20);
  141.            T=(0.1923*(T*0.01-273.15)+29.9250)*100+27315;  //人体体温补偿
  142.           
  143.           }
  144.   }
  145.   dis_cmd_wrt(0x83);  //初始显示位置
  146. if(T>=27315)
  147. {
  148.    T=T-27315;
  149.    a=T/100;
  150.    num=a;
  151.    b=T-a*100;
  152. //---------------------------
  153.    if(a>=100)
  154.    {
  155.     dis_dat_wrt(0x30+a/100);
  156.     a=a%100;
  157.     dis_dat_wrt(0x30+a/10);
  158.     a=a%10;
  159.     dis_dat_wrt(0x30+a);
  160.    }
  161.    else if(a>=10)
  162.    {
  163.     dis_dat_wrt(0x30+a/10);
  164.     a=a%10;
  165.     dis_dat_wrt(0x30+a);
  166.    }
  167.    else
  168.    {
  169.     dis_dat_wrt(0x30+a);
  170.    }
  171.    dis_dat_wrt(0x2e);// 显示点
  172.    //---------------------------
  173.   if(b>=10)
  174.   {
  175.     dis_dat_wrt(0x30+b/10);
  176.     b=b%10;  
  177.   }
  178.   else
  179.   {
  180.     dis_dat_wrt(0x30);  
  181.   }


  182. }
  183. //==========
  184. else
  185. {
  186.   T=27315-T;
  187.   a=T/100;
  188.   num=a;
  189.   b=T-a*100;
  190.   dis_dat_wrt(0x2d);
  191. //--------------------------
  192.   if(a>=10)
  193.   {
  194.     dis_dat_wrt(0x30+a/10);
  195.     a=a%10;
  196.     dis_dat_wrt(0x30+a);
  197.   }
  198.   else
  199.   {
  200.     dis_dat_wrt(0x30+a);
  201.   }
  202.     dis_dat_wrt(0x2e);//显示点
  203. //--------------------------
  204.   if(b>=10)
  205.   {
  206.     dis_dat_wrt(0x30+b/10);
  207.     b=b%10;
  208.     dis_dat_wrt(0x30+b);
  209.   }
  210.   else
  211.   {
  212.     dis_dat_wrt(0x30);
  213.     dis_dat_wrt(0x30+b);
  214.   }
  215.   
  216. }
  217. }

  218. //************************************
  219. void   start_bit(void)
  220. {
  221.    SDA=1;
  222.    _nop_();_nop_();_nop_();_nop_();_nop_();
  223.    SCL=1;
  224.    _nop_();_nop_();_nop_();_nop_();_nop_();
  225.    SDA=0;
  226.    _nop_();_nop_();_nop_();_nop_();_nop_();
  227.    SCL=0;
  228.    _nop_();_nop_();_nop_();_nop_();_nop_();

  229. }
  230. //------------------------------
  231. void   stop_bit(void)
  232. {

  233.    SCL=0;
  234.    _nop_();_nop_();_nop_();_nop_();_nop_();
  235.    SDA=0;
  236.    _nop_();_nop_();_nop_();_nop_();_nop_();
  237.    SCL=1;
  238.    _nop_();_nop_();_nop_();_nop_();_nop_();
  239.    SDA=1;
  240. }
  241. //--------- 发送一个字节---------
  242. void  tx_byte(uchar dat_byte)
  243. {
  244.    char i,n,dat;
  245.    n=Nack_counter;
  246. TX_again:
  247.    dat=dat_byte;
  248.    for(i=0;i<8;i++)
  249.    {
  250.      if(dat&0x80)
  251.       bit_out=1;
  252.      else
  253.       bit_out=0;
  254.      send_bit();
  255.      dat=dat<<1;
  256.    }
  257.    
  258.       receive_bit();
  259.    if(bit_in==1)
  260.    {
  261.     stop_bit();
  262.     if(n!=0)
  263.     {n--;goto Repeat;}
  264.     else
  265.      goto exit;
  266.    }
  267.    else
  268.     goto exit;
  269. Repeat:
  270.     start_bit();
  271.     goto TX_again;
  272. exit: ;
  273. }
  274. //-----------发送一个位---------
  275. void  send_bit(void)
  276. {
  277.   if(bit_out==0)
  278.   
  279.   SDA=0;
  280.   else
  281.   SDA=1;
  282.   _nop_();
  283.   SCL=1;
  284.   _nop_();_nop_();_nop_();_nop_();
  285.   _nop_();_nop_();_nop_();_nop_();
  286.   SCL=0;
  287.   _nop_();_nop_();_nop_();_nop_();
  288.   _nop_();_nop_();_nop_();_nop_();
  289. }
  290. //---------- 接收一个字节--------
  291. uchar rx_byte(void)
  292. {
  293.   uchar i,dat;
  294.   dat=0;
  295.   for(i=0;i<8;i++)
  296.   {
  297.     dat=dat<<1;
  298.     receive_bit();
  299.     if(bit_in==1)
  300.     dat=dat+1;
  301.   }
  302.   send_bit();
  303.   return dat;
  304. }

  305. //---------- 接收一个位----------
  306. void receive_bit(void)
  307. {
  308.   SDA=1;bit_in=1;
  309.   SCL=1;
  310.   _nop_();_nop_();_nop_();_nop_();
  311.   _nop_();_nop_();_nop_();_nop_();
  312.   bit_in=SDA;
  313.   _nop_();
  314.   SCL=0;
  315.   _nop_();_nop_();_nop_();_nop_();
  316.   _nop_();_nop_();_nop_();_nop_();
  317. }
  318. //------------ 延时--------------
  319. void   delay(uint N)
  320. {
  321.   uint i;
  322.   for(i=0;i<N;i++)  
  323.      _nop_();
  324. }
  325. //------------------------------
  326. uint memread(void)
  327. {
  328.   start_bit();
  329.   tx_byte(0xB4);  //Send SlaveAddress ==============================
  330.   tx_byte(0x07);  //Send Command
  331.   //------------
  332.   start_bit();
  333.   tx_byte(0x01);
  334.   bit_out=0;
  335.   DataL=rx_byte();
  336.   bit_out=0;
  337.   DataH=rx_byte();
  338.   bit_out=1;
  339.   Pecreg=rx_byte();
  340.   stop_bit();
  341.   return(DataH*256+DataL);
  342. }
  343. //******************LCD 显示子函数***********************
  344. void init1602(void)        // 初始化LCD
  345. {
  346.    dis_cmd_wrt(0x01);
  347.    dis_cmd_wrt(0x0c);
  348.    dis_cmd_wrt(0x06);
  349.    dis_cmd_wrt(0x38);
  350.    
  351. ……………………

  352. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有程序51hei提供下载:
温度测量.zip (12.65 KB, 下载次数: 63)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:869708 发表于 2021-1-1 22:36 | 只看该作者
我用51单片机做调试,晶振是用11.0592M,发现这个程序使用不了,返回值都是255
回复

使用道具 举报

板凳
ID:959370 发表于 2021-8-11 16:19 | 只看该作者
可以分享一下原理图吗
回复

使用道具 举报

地板
ID:953538 发表于 2021-8-12 08:26 | 只看该作者
把原理图补上就好了,配置齐全了。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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