找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机MLX90614红外温度计源程序

[复制链接]
跳转到指定楼层
楼主
ID:739692 发表于 2020-9-20 22:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /***********************************************************
  2. *
  3. *   功能:利用MLX90614实现红外测温
  4. *
  5. *   平台:keil5 + STC89C52
  6. *
  7. *   作者:辟邪居士
  8. *
  9. *
  10. *   日期:2020年9月19
  11. *
  12. ************************************************************/

  13. #include"reg52.h"
  14. #include"intrins.h"
  15. //************************************
  16. #define  uint  unsigned int
  17. #define  uchar unsigned char
  18. #define delay_5t {_nop_();_nop_();_nop_();\
  19.                                         _nop_();_nop_();}                //延时5个机器周期
  20. # define LcdDB P0
  21. //************** 端口定义**************
  22. //LCD 控制线接口
  23. uchar flag1;
  24. sbit  LcdRS=P2^6;
  25. sbit  LcdRW=P2^5;
  26. sbit  LcdEN=P2^7;
  27. //************ 函数声明*****************************************
  28. void   delay(uint N);              //延时程序
  29. void LCD_show(uchar x,uchar y);
  30. void LcdBusy();
  31. void LcdwrDat(uchar dat);
  32. void LcdwrCmd(uchar cmd);
  33. void LCD_init ();
  34. void   display(uint Tem);           // 显示子程序
  35. bit    SMB_ack();                        //应答信号                                
  36. //*************主函数*******************************************
  37. //mlx90614 端口定义
  38. sbit  SCL=P1^1;// 时钟线
  39. sbit  SDA=P1^2;// 数据线
  40. //************ 数据定义****************
  41. bdata uchar flag;          //可位寻址数据
  42. sbit bit_out=flag^7;
  43. sbit bit_in=flag^0;

  44. uchar TeL;   //温度低八位
  45. uchar TeH;   //温度高八位
  46. uchar PEC;
  47. uint TEP;  //存储温度

  48. void Delay10us()                //@11.0592MHz
  49. {
  50.         unsigned char i;
  51.         i = 2;
  52.         while (--i);
  53. }
  54. void SMBus_Start()   //开始信号
  55. {
  56.         SDA = 1;
  57.         delay_5t;
  58.         SCL = 1;
  59.         delay_5t;
  60.     SDA = 0;
  61.         delay_5t;
  62.         SCL = 0;
  63.         delay_5t;
  64. }

  65. void SMBus_Stop()   //停止信号
  66. {
  67.         SCL = 0;
  68.         delay_5t;
  69.         SDA = 0;
  70.         delay_5t;
  71.         SCL = 1;
  72.         delay_5t;
  73.         SDA = 1;
  74.         
  75. }
  76. bit SMBus_writer(uchar DAT)     //写一个字节
  77. {
  78.         uchar i;
  79.         uchar temp;                                        //缓存寄存器
  80.         bit ack;                                        //定义位变量,反馈应答信号
  81.         temp = DAT;                                        //待发送字节存入缓冲寄存器
  82.         for(i = 0;i < 8;i++)                //循环发送8位数据
  83.         {
  84.                 SCL = 0;                                //拉低时钟线
  85.                 if((temp&0x80)==0x80)        //判断temp的高位是0还是1
  86.                         SDA=1;                                                        
  87.                 else
  88.                         SDA=0;                                //送出相应数据
  89.                 delay_5t ;                                //延时5个机器周期
  90.                 SCL = 1;                                //拉低时钟线
  91.                 temp = temp << 1;                //待发送数据左移一位
  92.                 delay_5t ;                                //延时5个机器周期
  93.         }
  94.         SCL = 0;                                        //拉低时钟线
  95.         ack = SMB_ack();                        //调用应答信号检测子函数
  96.         return ack;                                        //返回检测到的应答信号
  97. }
  98. /*
  99. bit SMBus_writer(uchar dat)
  100. {
  101.         bit ack1;
  102.         uchar i;
  103.         SCL = 0;
  104.         
  105.         for(i=0;i<8;i++)
  106.         {
  107.                 Delay10us();
  108.                 SDA = dat >> 7;    //将发送的数据右移7位
  109.                 dat = dat << 1;   //将发送的数据左移1位
  110.                 SCL = 1;
  111.                 Delay10us();
  112.                 SCL = 0;
  113.                
  114.         }
  115.         SDA = 1;
  116.         Delay10us();
  117.         SCL = 1;
  118.         while(SDA)   //等待从机应答信号,超过2000us,返回
  119.         {
  120.                 uint j;
  121.                 j++;
  122.                 if(j>2000)
  123.                 {
  124.                         SCL = 0;
  125.                         Delay10us();
  126.                         return 0;
  127.                 }
  128.         }
  129.         ack1 = SMB_ack();
  130.         return ack1;
  131. }
  132. */
  133. /*
  134. //---------- 接收一个位----------
  135. void receive_bit(void)
  136. {
  137.   SDA=1;bit_in=1;
  138.   SCL=1;
  139.   _nop_();_nop_();_nop_();_nop_();
  140.   _nop_();_nop_();_nop_();_nop_();
  141.   bit_in=SDA;
  142.   _nop_();
  143.   SCL=0;
  144.   _nop_();_nop_();_nop_();_nop_();
  145.   _nop_();_nop_();_nop_();_nop_();
  146. }
  147. //-----------发送一个位---------
  148. void  send_bit(void)
  149. {
  150.   if(bit_out==0)
  151.   
  152.        SDA=0;
  153.   else
  154.      SDA=1;
  155.   _nop_();
  156.   SCL=1;
  157.   _nop_();_nop_();_nop_();_nop_();
  158.   _nop_();_nop_();_nop_();_nop_();
  159.   SCL=0;
  160.   _nop_();_nop_();_nop_();_nop_();
  161.   _nop_();_nop_();_nop_();_nop_();
  162. }
  163. //---------- 接收一个字节--------
  164. uchar rx_byte(void)
  165. {
  166.   uchar i,dat;
  167.   dat=0;
  168.   for(i=0;i<8;i++)
  169.   {
  170.     dat=dat<<1;
  171.     receive_bit();
  172.     if(bit_in==1)
  173.      dat=dat+1;
  174.   }
  175.   send_bit();
  176.   return dat;
  177. }
  178. */
  179. void  send_bit(void)   //发送一位
  180. {
  181.   if(bit_out==0)
  182.   
  183.        SDA=0;
  184.   else
  185.      SDA=1;
  186.    
  187.   SCL=1;
  188.   delay_5t;
  189.   SCL=0;
  190.   delay_5t;
  191. }
  192. uchar rx_byte()    //读一个字节
  193. {
  194.         uchar i;
  195.         uchar dat;
  196.         SDA = 1;
  197.         _nop_();_nop_();
  198.         for(i=0;i<8;i++)
  199.         {
  200.                 SCL = 1;
  201.                 _nop_();
  202.                 dat = dat << 1;
  203.             dat|=SDA;
  204.                 _nop_();
  205.                 SCL = 0;
  206.                 _nop_();
  207.                
  208.         }
  209.         send_bit();   //主设备向从设备发送应答
  210.         return dat;
  211. }

  212. bit SMB_ack()    //IIC应答
  213. {
  214.         bit ack;
  215.         SDA = 1;
  216.         Delay10us();
  217.         SCL = 1;
  218.         
  219.         Delay10us();
  220.         SCL =0;
  221.     ack = SDA;
  222.         return ack;
  223. }
  224. uint MLX90614()            
  225. {
  226.         SMBus_Start();          //开始信号
  227.         SMBus_writer(0x00);     //写从设备地址

  228.         SMBus_writer(0x07);    //写命令

  229.         SMBus_Start();        //重新开始
  230.         SMBus_writer(0x01);   //写地址
  231.         
  232.         TeL = rx_byte();     //读取温度

  233.         TeH = rx_byte();        

  234.         PEC = rx_byte();
  235.         SMBus_Stop();
  236.         TEP = (TeH*256)+TeL;
  237.         //TEP = TEP * 0.02 -273.15;
  238.         return TEP;
  239. }


  240. void main()
  241. {
  242. uint Tem;
  243. SCL=1;
  244. SDA=1;
  245. delay_5t;
  246. SCL=0;
  247. delay(1000);
  248. SCL=1;
  249. LCD_init ();   //LCD初始化
  250. LCD_show(1,1); //LCD显示的位置
  251. while(1)
  252. {
  253.    Tem = MLX90614();
  254.    display(Tem);
  255.    delay(20);
  256. }
  257. }
  258. //*********输入转换并显示*********
  259. void display(uint Tem)
  260. {
  261.     uint YEP;
  262.     uint a,b;
  263.         YEP = Tem * 0.02 - 273.15;
  264.         LcdwrCmd(0x01);       //清屏
  265.         a = YEP /10;        //十位
  266.         
  267.         LcdwrDat(0x30+a);   //显示字符串
  268.         b = YEP %10;           //个位
  269.         LcdwrDat(0x30+b);   //显示字符串
  270.         
  271. }

  272. //************************************

  273. //------------ 延时--------------
  274. void   delay(uint N)
  275. {
  276.   uint i;
  277.   for(i=0;i<N;i++)
  278.   
  279.      _nop_();
  280. }
  281. //------------------------------

  282. //******************LCD 显示子函数***********************

  283. void LCD_init ()
  284. {
  285.         LcdwrCmd(0x38);
  286.         LcdwrCmd(0x0C);
  287.         LcdwrCmd(0x06);
  288.         LcdwrCmd(0x01);
  289. }


  290. void LcdwrCmd(uchar cmd)
  291. {
  292.         LcdBusy();
  293.         LcdRS = 0;
  294. ……………………

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

全部源程序: 51单片机MLX90614红外温度计.zip (40.27 KB, 下载次数: 165)

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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