久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4303|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91视频a| 欧美成人h版在线观看 | 免费黄色片在线观看 | 欧美一区二区三区小说 | 一区二区三区av | aaaaaa大片免费看最大的 | 综合久久99| 九九久久精品 | 国产高清在线精品 | 成人午夜免费视频 | 国产乱人伦 | 国产在线观看不卡一区二区三区 | 国产污视频在线 | 国产精品久久久久久久岛一牛影视 | 日韩av一区二区在线观看 | 国内精品一区二区 | 黄色一级免费 | 91欧美| 久久成人精品视频 | 不卡的av一区 | 亚洲综合视频 | 欧美精品在线一区 | 3p视频在线观看 | 日本午夜在线视频 | 九色国产 | 91欧美激情一区二区三区成人 | 亚洲国产片 | 免费激情 | 久久99久久99久久 | 高清免费在线 | 国产偷录视频叫床高潮对白 | 久久99精品久久久久久秒播九色 | 国产精品久久久久久婷婷天堂 | av永久免费 | 久草视频网站 | 91欧美激情一区二区三区成人 | 91在线色视频 | 久久久人成影片免费观看 | 日韩不卡在线 | 欧美无乱码久久久免费午夜一区 | av在线免费观看不卡 |