找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 341|回复: 2
收起左侧

GY906红外测温单片机程序_Keil 附MLX90614英文资料

[复制链接]
LB明 发表于 2020-7-26 23:22 | 显示全部楼层 |阅读模式
程序已经经过测试,正常运行,并且能够通过GY906读取温度数据。
下为程序代码截图:
2020-07-26_232056.png

MLX90614英文资料
51hei.png

单片机源程序如下:
  1. #include "reg52.h"
  2. #include "intrins.h"

  3. //************************************
  4. #define  uint  unsigned int
  5. #define  uchar unsigned char
  6. #define  Nack_counter  10

  7. //************** 端口定义**************
  8. //LCD 控制线接口
  9. uchar flag1;
  10. sbit  LCD_RS=P2^7;
  11. sbit  LCD_EN=P2^6;
  12. //GY906 端口定义
  13. sbit  SCL=P2^0;// 时钟线
  14. sbit  SDA=P2^1;// 数据线

  15. //************ 数据定义****************
  16. bdata uchar flag;//可位寻址数据
  17. sbit bit_out=flag^7;
  18. sbit bit_in=flag^0;
  19. uchar DataH,DataL,Pecreg;
  20. //************ 函数声明*****************************************
  21. void   IIC_Start();                 //GY906 发起始位子程序
  22. void   IIC_Stop();                 //GY906发结束位子程序
  23. uchar  GY906_RX_Byte(void);              //GY906 接收字节子程序
  24. void   GY906_tx_Bit(void);             //GY906发送位子程序
  25. void   GY906_TX_Byte(uchar dat_byte);     //GY906 接收字节子程序
  26. void   GY906_rx_Bit(void);           //GY906接收位子程序
  27. void   delay(uint N);              //延时程序
  28. uint   memread(void);             // 读温度数据
  29. void   LcdInit(void);        //LCD 初始化子程序
  30. void   LcdCheckBusy(void);         //LCD 判断忙子程序
  31. void   LcdWriteCmd(uchar cmd);     //LCD 写命令子程序
  32. void   LcdWriteData(uchar dat);       //LCD 写数据子程序
  33. void   display(uint Tem);           // 显示子程序
  34. //*************主函数*******************************************
  35. void main()
  36. {
  37.         uint Tem;
  38.         //函数部分
  39.         SCL=1;SDA=1;_nop_();
  40.         _nop_();_nop_();_nop_();
  41.         SCL=0;
  42.         delay(1000);
  43.         SCL=1;
  44.         LcdInit();
  45.         while(1)
  46.         {
  47.          Tem=memread();
  48.          display(Tem);
  49.          delay(20);
  50.         }
  51. }
  52. //*********输入转换并显示*********
  53. void display(uint Tem)
  54. {
  55. uint T,a,b;
  56. T=Tem*2;
  57.   LcdWriteCmd(0x01);//清屏
  58. if(T>=27315)
  59. {
  60.    T=T-27315;
  61.    a=T/100;
  62.    b=T-a*100;
  63. //---------------------------
  64.    if(a>=100)
  65.    {
  66.     LcdWriteData(0x30+a/100);
  67.     a=a%100;
  68.     LcdWriteData(0x30+a/10);
  69.     a=a%10;
  70.     LcdWriteData(0x30+a);
  71.    }
  72.    else if(a>=10)
  73.    {
  74.     LcdWriteData(0x30+a/10);
  75.     a=a%10;
  76.     LcdWriteData(0x30+a);
  77.    }
  78.    else
  79.    {
  80.     LcdWriteData(0x30+a);
  81.    }
  82.    LcdWriteData(0x2e);// 显示点
  83.    //---------------------------
  84.   if(b>=10)
  85.   {
  86.     LcdWriteData(0x30+b/10);
  87. //    b=b%10;
  88. //    LcdWriteData(0x30+b);
  89.   }
  90.   else
  91.   {
  92.     LcdWriteData(0x30);
  93. //    LcdWriteData(0x30+b);
  94.   }
  95. }
  96. //==========
  97. else
  98. {
  99.   T=27315-T;
  100.   a=T/100;
  101.     b=T-a*100;
  102.   LcdWriteData(0x2d);
  103. //--------------------------
  104.   if(a>=10)
  105.   {
  106.     LcdWriteData(0x30+a/10);
  107.     a=a%10;
  108.     LcdWriteData(0x30+a);
  109.   }
  110.   else
  111.   {
  112.     LcdWriteData(0x30+a);
  113.   }
  114.   LcdWriteData(0x2e);//显示点
  115. //--------------------------
  116.   if(b>=10)
  117.   {
  118.     LcdWriteData(0x30+b/10);
  119.     b=b%10;
  120.     LcdWriteData(0x30+b);
  121.   }
  122.   else
  123.   {
  124.     LcdWriteData(0x30);
  125.     LcdWriteData(0x30+b);
  126.   }
  127. }
  128. }

  129. //************************************
  130. void IIC_Start(void)
  131. {
  132.    SDA=1;
  133.    _nop_();_nop_();_nop_();_nop_();_nop_();
  134.    SCL=1;
  135.    _nop_();_nop_();_nop_();_nop_();_nop_();
  136.    SDA=0;
  137.    _nop_();_nop_();_nop_();_nop_();_nop_();
  138.    SCL=0;
  139.    _nop_();_nop_();_nop_();_nop_();_nop_();
  140. }
  141. //------------------------------
  142. void IIC_Stop(void)
  143. {

  144.    SCL=0;
  145.    _nop_();_nop_();_nop_();_nop_();_nop_();
  146.    SDA=0;
  147.    _nop_();_nop_();_nop_();_nop_();_nop_();
  148.    SCL=1;
  149.    _nop_();_nop_();_nop_();_nop_();_nop_();
  150.    SDA=1;
  151. }
  152. //--------- 发送一个字节---------
  153. void  GY906_TX_Byte(uchar dat_byte)
  154. {
  155.    char i,n,dat;
  156.    n=Nack_counter;
  157. TX_again:
  158.    dat=dat_byte;
  159.    for(i=0;i<8;i++)
  160.    {
  161.      if(dat&0x80)
  162.       bit_out=1;
  163.      else
  164.       bit_out=0;
  165.      GY906_tx_Bit();
  166.      dat=dat<<1;
  167.    }
  168.    
  169.       GY906_rx_Bit();
  170.    if(bit_in==1)
  171.    {
  172.     IIC_Stop();
  173.     if(n!=0)
  174.     {n--;goto Repeat;}
  175.     else
  176.      goto exit;
  177.    }
  178.    else
  179.     goto exit;
  180. Repeat:
  181.     IIC_Start();
  182.     goto TX_again;
  183. exit: ;
  184. }
  185. //-----------发送一个位---------
  186. void  GY906_tx_Bit(void)
  187. {
  188.   if(bit_out==0) SDA=0;
  189.   else SDA=1;
  190.   _nop_();
  191.   SCL=1;
  192.   _nop_();_nop_();_nop_();_nop_();
  193.   _nop_();_nop_();_nop_();_nop_();
  194.   SCL=0;
  195.   _nop_();_nop_();_nop_();_nop_();
  196.   _nop_();_nop_();_nop_();_nop_();
  197. }
  198. //---------- 接收一个字节--------
  199. uchar GY906_RX_Byte(void)
  200. {
  201.   uchar i,dat;
  202.   dat=0;
  203.   for(i=0;i<8;i++)
  204.   {
  205.     dat=dat<<1;
  206.     GY906_rx_Bit();
  207.     if(bit_in==1)
  208.      dat=dat+1;
  209.   }
  210.   GY906_tx_Bit();
  211.   return dat;
  212. }

  213. //---------- 接收一个位----------
  214. void GY906_rx_Bit(void)
  215. {
  216.   SDA=1;bit_in=1;
  217.   SCL=1;
  218.   _nop_();_nop_();_nop_();_nop_();
  219.   _nop_();_nop_();_nop_();_nop_();
  220.   bit_in=SDA;
  221.   _nop_();
  222.   SCL=0;
  223.   _nop_();_nop_();_nop_();_nop_();
  224.   _nop_();_nop_();_nop_();_nop_();
  225. }
  226. //------------ 延时--------------
  227. void delay(uint N)
  228. {
  229.   uint i;
  230.   for(i=0;i<N;i++)
  231.      _nop_();
  232. }
  233. //------------------------------
  234. uint memread(void)
  235. {
  236.   IIC_Start();
  237.   GY906_TX_Byte(0xB4);  //Send SlaveAddress ==============================
  238.   //GY906_TX_Byte(0x00);
  239.   GY906_TX_Byte(0x07);  //Send Command
  240.   //------------
  241.   IIC_Start();
  242.   GY906_TX_Byte(0x01);
  243.   bit_out=0;
  244.   DataL=GY906_RX_Byte();
  245.   bit_out=0;
  246.   DataH=GY906_RX_Byte();
  247.   bit_out=1;
  248.   Pecreg=GY906_RX_Byte();
  249.   IIC_Stop();
  250.   return(DataH*256+DataL);
  251. }
  252. //******************LCD 显示子函数***********************

  253. /*********************************************************/
  254. // 液晶显示初始化
  255. /*********************************************************/
  256. void LcdInit(void)        // 初始化LCD
  257. {
  258.    LcdWriteCmd(0x01);
  259.    LcdWriteCmd(0x0c);
  260.    LcdWriteCmd(0x06);
  261.    LcdWriteCmd(0x38);
  262. }

  263. void LcdCheckBusy(void) //LCD 忙标志判断
  264. {
  265.         flag1=0x80;
  266. ……………………

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

所有资料51hei提供下载:
GY906_红外测温.zip (4.12 MB, 下载次数: 23)
回复

使用道具 举报

lon7085 发表于 2020-7-27 08:50 | 显示全部楼层
感谢楼主分享,不知有没有电路图可分享,谢谢啦!
回复

使用道具 举报

DOOMSKYWR 发表于 2020-9-5 18:55 | 显示全部楼层
电路图加一
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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