普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 3251|回复: 1

[已解决] 有没有大佬做过A2开发板和MLX90614的温度检测

 关闭 [复制链接]

1

主题

1

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2020-1-4 23:20:54 | 显示全部楼层 |阅读模式
我仿照网上的代码写了一个,但MLX90614模块的返回温度一直是0xffff,没有改变,有没有大佬能帮忙看一下。
前面的是显示模块,没有问题,从start函数开始是MLX90614模块
#include "reg52.h"
#include "stdlib.h"   
#include<intrins.h>
typedef unsigned int uint;   
typedef unsigned char uchar;
#define Nack_number 10
void send_bit(void);
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit k1=P3^1;
sbit SCL=P1^1;
sbit SDA=P1^2;
int e=0;
bdata uchar flag1;                               //可位寻址数据
sbit bit_out=flag1^7;
sbit bit_in=flag1^0;
uchar tempH=0,tempL=0,err=0;  
uchar code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
float realtemp=0;
void delay(uint i)
{
uint j=0;
for(j=0;j<i;j++)
  _nop_();
}
void writehun(float i)
{
if(i<0)
{
  LSA=1;LSB=0;LSC=1;
  P0=0x40;
  i=-i;
}
e=i/100;
i=i-e*100;
LSA=0;LSB=0;LSC=1;
P0=smgduan[e];
e=i/10;
i=i-e*10;
LSA=1;LSB=1;LSC=0;
P0=smgduan[e];
e=i/1;
i=i-e;
LSA=0;LSB=1;LSC=0;
P0=smgduan[e]|0x80;
e=i/0.1;
i=i-e*0.1;
LSA=1;LSB=0;LSC=0;
P0=smgduan[e];
e=i/0.01;
LSA=0;LSB=0;LSC=0;
P0=smgduan[e];
}
void writede(float i)
{
if(i<0)
{
  LSA=0;LSB=0;LSC=1;;
  P0=0x40;
  i=-i;
}
e=i/10;
i=i-e*10;
LSA=1;LSB=1;LSC=0;
P0=smgduan[e];
e=i/1;
i=i-e;
LSA=0;LSB=1;LSC=0;
P0=smgduan[e]|0x80;
e=i/0.1;
i=i-e*0.1;
LSA=1;LSB=0;LSC=0;
P0=smgduan[e];
e=i/0.01;
LSA=0;LSB=0;LSC=0;
P0=smgduan[e];
}
void writesi(float i)
{
if(i<0)
{
  LSA=1;LSB=1;LSC=0;
  P0=0x40;
  i=-i;
}
e=i/1;
i=i-e;
LSA=0;LSB=1;LSC=0;
P0=smgduan[e]|0x80;
e=i/0.1;
i=i-e*0.1;
LSA=1;LSB=0;LSC=0;
P0=smgduan[e];
e=i/0.01;
LSA=0;LSB=0;LSC=0;
P0=smgduan[e];
}
void write(float i)
{
if((int)i/100!=0)
  writehun(i);
else if((int)i/10!=0)
  writede(i);
else
  writesi(i);
}
int keypress()
{
if(k1==0)
{
  delay(1000);
  if(k1==0)
   {
    while(!k1);
     P0=0X00;
    return 1;
   }
}
return 0;
}
void start(void)
{
       SDA=1;
       delay(1);
       SCL=1;
       delay(1);
       SDA=0;
       delay(1);
       SCL=0;
       delay(1);
}
void stop(void)
{
       SCL=0;
       delay(1);
       SDA=0;
       delay(1);
       SCL=1;
       delay(1);
       SDA=1;
}
void read_bit(void)
{
       SDA=1;                                                   //数据端先置1
       bit_in=1;
       SCL=1;                                                   //上升沿
       delay(0);delay(0);
       bit_in=SDA;                                              //读数据
       _nop_();
       SCL=0;
       delay(0);delay(0);
}
uchar ReadByte(void)
{
uchar i,dat;
dat=0;                                                            //初值为0
for(i=0;i<8;i++)
{
  dat=dat<<1;                                                  //左移
  read_bit();                                                  //接收一位
  if(bit_in==1)  
      dat|=0x11;
  else
   dat&=0x00;                                            //为1 时对应位加1
}
SDA=0;                                                   //发送应答信号0
send_bit();
return dat;                                              //带回接收数据
}  
void send_bit(void)
{
if(bit_out==1)
  SDA=1;                                                       //发1
else  
  SDA=0;                                                       //发0  
_nop_();_nop_();
SCL=1;                                                            //上升沿
delay(2);
SCL=0;
_nop_();_nop_();_nop_();
}
void SendByte(uchar number)
{
uchar i,n,dat;
n=Nack_number;                                                //可以重发次数
Send_again:
dat=number;
for(i=0;i<8;i++)                                        //8 位依次发送
{
  if(dat&0x80)                                            //取最高位
   bit_out=1;                                        //发1  
  else
   bit_out=0;
  SDA=0;                                        //发0
  send_bit();                                             //发送一个位
  dat=dat<<1;                                             //左移一位
}
read_bit();                                                   //接收1 位应答信号
if(bit_in==1)                                           //无应答时重发
{
  stop();
  if(n!=0)
  {
    n--;                                             //可以重发Nack_number=10 次
    goto Repeat;                                     //重发
  }
  else
  {
    goto exit;                                              //退出
  }
}
else
{
  goto exit;
}
Repeat:
start();                                                      //重新开始
goto Send_again;                                              //重发
exit: ;                                                              //退出
}
uint readtemp(void)
{   
start();
SendByte(0xB4);                                           //开始条件
//SendByte(0x00);                                    //发送从地址00
SendByte(0x07);                           //发送命令
start();                                  //开始条件
SendByte(0x01);                           //读从地址00
bit_out=0;
tempL=ReadByte();                              //读数据低字节
bit_out=0;
tempH=ReadByte();                              //读数据高字节
bit_out=1;
err=ReadByte();                                //读错误信息码
stop();                                        //停止条件
return(tempH*256+tempL);
}
void CALTEMP(uint TEMP)
{
    uint T;
    T=TEMP*2;
    T=T-27315;
    realtemp=(float)T/100;
}
void main()
{
uint temp;
SCL=1;
   SDA=1;
   _nop_();_nop_();_nop_();_nop_();
   SCL=0;
   delay(1000);
   SCL=1;
P0=0x00;
realtemp=0;
while(1)
{
  if(keypress())
  {
doagain:
   realtemp=0;
   temp=readtemp();
   CALTEMP(temp);
   while(1)
   {
    if(keypress())
     goto doagain;
    write(realtemp);
   }
  }
}
}
回复

使用道具 举报

20

主题

216

帖子

1115

积分

金牌会员

Rank: 6Rank: 6

积分
1115
发表于 2020-1-6 08:57:42 | 显示全部楼层
返回数据错误的话 大多数情况是你程序不对应模块的时序导致读取的错误 你可以找一下该模块的时序图对照程序看看是否对应
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-5-3 08:12 , Processed in 0.144924 second(s), 30 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

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