|
我仿照网上的代码写了一个,但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);
}
}
}
}
|
|