找回密码
 立即注册

QQ登录

只需一步,快速开始

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

mlx90614跟我的单片机一直不能通讯,下面是程序,求各位大佬帮助

[复制链接]
跳转到指定楼层
楼主
ID:297539 发表于 2018-4-3 19:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大佬,我的单片机一直不能跟MLX90614t通讯,希望大家可以帮忙解决,有点急,麻烦各位了。
  1. #include"HT66F2390.h"


  2. #include"oled.h"(这是oled的程序文件,不在下面)

  3. #ifndef HW_H
  4. #define HW_H
  5. #define uchar unsigned char
  6. #define Nack 10
  7. //*******端口定义***********
  8. //mlx90614
  9. #define SDA _pf4
  10. #define SCL _pg0
  11. #define RamAccess 0x00
  12. #define AbmientTempAddr  0x03  //周围温度
  13. #define IR1Addr    0x04
  14. #define IR2Addr    0x05
  15. #define LineAbmientTempAddr 0x06     //环境温度
  16. #define LineObj1TempAddr 0x07  //目标温度,红外温度
  17. #define EepomAccess 0x20
  18. #define Mode 0x60
  19. #define ExitMode 0x61
  20. #define ReadFlag 0xf0
  21. #define LineObj2TempAddr 0x08 //eepom address  EEPROM地址
  22. int out=0, in=0;

  23. //*******函数声明**********
  24. void start_bit();       //MLX90614 发起始位子程序
  25. void stop_bit();       //MLX90614 发结束位子程序
  26. uchar rx_byte(void);      //MLX90614 接收字节子程序
  27. void send_bit(void);      //MLX90614 发送位子程序
  28. void tx_byte(uchar dat_byte);    //MLX90614 接收字节子程序
  29. void jieshou();     //MLX90614 接收位子程序  //延时程序
  30. void delay_h(unsigned int k);      //延时
  31. unsigned int memread(void);      //读温度数据
  32. void display_h(unsigned int Tem);

  33. //*********输入转换并显示*********
  34. void display_h(unsigned int Tem)
  35. {
  36. unsigned int T,a,b;
  37.     uchar c;
  38. T=Tem*2;
  39. if(T>=27315)
  40.    {
  41.    T=T-27315;
  42.    a=T/100;
  43.     b=T-a*100;
  44.   
  45.    if(a>=100)
  46.     {
  47.      c=a/100;
  48.       write_wx1(c,1,6);//oled 显示程序函数
  49.      a=a%100;
  50.      c=a/10;
  51.       write_wx1(c,7,6) ;
  52.      c=a%10;
  53.       write_wx1(c,13,6) ;
  54.     }
  55.    else if(a>=10)
  56.     {
  57.      c=a/10;
  58.      write_wx1(11,1,6);
  59.       write_wx1(c,7,6) ;
  60.      c=a%10;
  61.       write_wx1(c,13,6) ;
  62.      }
  63.    else
  64.     {
  65.     write_wx1(11,1,6);
  66.     write_wx1(11,7,6) ;
  67.     c=a%10;
  68.      write_wx1(c,13,6) ;
  69.     }
  70.      write_wx1(2,19,6) ;
  71. //分隔开
  72.    
  73.    
  74. if(b>=10)
  75.   {
  76.    b=b/10;
  77.     write_wx1(b,25,6);
  78.   }
  79.   else
  80.   {
  81.     write_wx1(0,25,6) ;
  82.   }
  83.    
  84.   }
  85.   
  86.   
  87. else
  88.    {
  89.    T=27315-T;
  90.    a=T/100;
  91.    b=T-a*100;
  92.    if(a>=10)
  93.     {
  94.      c=a/10;
  95.       write_wx1(c,7,6) ;
  96.      c=a%10;
  97.       write_wx1(c,13,6) ;
  98.      }
  99.     else
  100.     {
  101.      c=a%10;

  102.       write_wx1(c,7,6) ;
  103.     }
  104.       write_wx1(2,19,6) ;
  105. //分隔开
  106.    if(b>=10)
  107.     {
  108.      c=b/10;
  109.       write_wx1(c,25,6) ;
  110.     }
  111.    else
  112.      {
  113.       write_wx1(c,25,6) ;
  114.      }
  115.    }
  116. }

  117. void delay_h(unsigned int k)
  118. {
  119.    while(k--);
  120.    
  121.    
  122.   }
  123. //*********开始触发*******
  124. void start_bit(void)
  125. {
  126. SDA=1;
  127. delay(5);
  128. SCL=1;
  129. delay(5);
  130. SDA=0;
  131. delay(5);  
  132. SCL=0;
  133. delay(5);
  134. }
  135. //*********结束*******
  136. void stop_bit(void)
  137. {
  138. SCL=0;
  139. delay(5);
  140. SDA=0;
  141. delay(5);
  142.    SCL=1;
  143. delay(5);
  144. SDA=1;
  145. }

  146. //---------发送一个字节---------
  147. void tx_byte(uchar dat_byte)
  148. {
  149. uchar i,n,dat;
  150.   n=Nack;
  151.    
  152. TX_again:
  153.   dat=dat_byte;
  154.   
  155. for(i=0;i<8;i++)
  156.   {
  157.    if(dat&0x80)
  158.     out=1;
  159.    else
  160.    {
  161.     out=0;
  162.    }
  163.    send_bit();
  164.   
  165.    dat=dat<<1;
  166.   }
  167.    
  168.   jieshou();//
  169.   
  170.   if(in==1)//?
  171.   {
  172.          stop_bit();
  173.     if(n!=0)
  174.     {
  175.      n--;
  176.      goto Repeat;
  177.     }
  178.    
  179.     else
  180.      goto exit;
  181.    }
  182.   
  183.    else
  184.    {
  185.     goto exit;
  186.    }
  187.    
  188.    Repeat:
  189.    start_bit();
  190.    goto TX_again;
  191.    
  192.    exit:    ;
  193.     }
  194. //*********发送一个位*******
  195. void send_bit(void)
  196. {

  197. if(out==1)
  198.   SDA=1;
  199. else
  200. {
  201.   SDA=0;
  202. }
  203. delay(5);

  204. SCL=1;
  205.     delay(8);
  206. SCL=0;
  207.   delay(8);  
  208. }

  209. //----------接收一个字节--------
  210. uchar rx_byte(void)
  211. {
  212. uchar i,dat;

  213. dat=0;

  214. for(i=0;i<8;i++)
  215. {
  216.    dat=dat<<1;
  217.    jieshou();//
  218.    if(in==1)
  219.     dat=dat+1;
  220.   }
  221.   SDA=0;
  222.   send_bit();//?
  223.   
  224. return dat;
  225. }

  226. //----------接收一个位----------
  227. void jieshou()
  228. {
  229.     SDA=1;
  230.    
  231.   in=1;
  232.   SCL=1;
  233.     delay(8);
  234.   in=SDA;
  235. delay(1);
  236.   SCL=0;
  237. delay(8);
  238. }
  239. //-----------读温度--------------
  240. unsigned int memread(void)
  241. {
  242.   uchar DataH,DataL,Pecreg;
  243.    
  244.   start_bit();
  245.   
  246.   tx_byte(0x00);      //Send SlaveAddress
  247.   
  248. tx_byte(0x07);   //Send Command
  249.   start_bit();
  250.   
  251.   tx_byte(0x1);
  252.   
  253.   out=0;
  254.   DataL=rx_byte();
  255.   out=0;
  256.   DataH=rx_byte();
  257.   out=1;//
  258.   Pecreg=rx_byte();
  259.   stop_bit();
  260.   
  261. return(DataH*256+DataL);
  262. }

  263. #endif




  264. 主函数:
  265. #include "HT66F2390.h"
  266. #include"hw.h"
  267. #include"oled.h"
  268. void main()
  269. {
  270.   unsigned int tem;
  271.   
  272. _wdtc = 0xa8;
  273. _pec = 0x00;
  274. _scc = 0x00;
  275. _pfc = 0x00;
  276.     _hirc0 =0;
  277.     _hirc1 =0;
  278.    

  279. Init();
  280. qp();
  281. write_x(5,10);
  282.   
  283. SCL=1;
  284.     SDA=1;
  285.    delay(4);
  286.     SCL=0;
  287.     delay(1000);
  288.     SCL=1;   
  289. while(1)
  290. {
  291.   
  292.    
  293.   tem =memread();
  294.      display_h(tem);
  295.      delay(20);
  296. }
复制代码


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

使用道具 举报

沙发
ID:727893 发表于 2020-4-21 14:55 来自手机 | 只看该作者
楼主请问Oled.h的代码是什么
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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