MLX90614红外测温问题
用郭天祥的51开发板 测试的90614测温模块 基本测温显示成功 但是总会时不时的 显示378.21度,有大神可以帮忙解答一下吗 谢谢了
代码如下:
#include "reg52.h"
#include"intrins.h"
#define uint unsigned int
#define uchar unsigned char
#define Nack_counter 10
uchar code smg_du[] = {0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x80};//段选
uchar code smg_wei[] = {0xfe,0xfd,0xfb,0xf7}; //位选
uchar t2[5];
sbit dula=P2^6;
sbit wela=P2^7;
uchar key_t=0;
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Timer0Init(void) //1毫秒@11.0592MHz
{
TMOD =0x01; //设置定时器模式
TL0 = (65535-1000)%256;//设置定时初值
TH0 =(65535-1000)/256;//设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1;
EA = 1;
}
//************** 端口定义**************
//mlx90614 端口定义
sbit SCL=P1^6;// 时钟线
sbit SDA=P1^7;// 数据线
//************ 数据定义****************
bdata uchar flag;//可位寻址数据
sbit bit_out=flag^7;
sbit bit_in=flag^0;
uchar DataH,DataL,Pecreg;
//************ 函数声明*****************************************
void start_bit(); //MLX90614 发起始位子程序
void stop_bit(); //MLX90614发结束位子程序
uchar rx_byte(void); //MLX90614 接收字节子程序
void send_bit(void); //MLX90614发送位子程序
void tx_byte(uchar dat_byte); //MLX90614 接收字节子程序
void receive_bit(void); //MLX90614接收位子程序
void delay(uint N); //延时程序
uint memread(void); // 读温度数据
void display(uint Tem); // 显示子程序
//*************主函数*******************************************
void main()
{
uint Tem;
Timer0Init();
//函数部分
SCL=1;SDA=1;_nop_();
_nop_();_nop_();_nop_();
SCL=0;
delay(1000);
SCL=1;
while(1)
{
Tem=memread();
display(Tem);
Delay1000ms();
}
}
//*******定时器0中断**********
void timer0() interrupt 1 using 1
{
static int smg_count = 0,i = 0;
TL0 = (65535-1000)%256;//设置定时初值
TH0 =(65535-1000)/256;//设置定时初值
smg_count++;
if(smg_count == 3)//3ms动态扫描
{
smg_count = 0;
dula = 1;P0 = 0;dula = 0;;//消影
dula = 1;P0 = t2[i];dula = 0;
wela = 1;P0 = smg_wei[i];wela = 0;
i++;
if(i == 3) i = 0;
}
}
//*********输入转换并显示*********
void display(uint Tem)
{
uint T,a,b;
T=Tem*2;
if(T>=27315)
{
T=T-27315;
a=T/100;
b=T-a*100;
//---------------------------
if(a>=100)
{
t2[0]=smg_du[a/100];
a=a%100;
t2[1]=smg_du[a/10];
a=a%10;
t2[2]=smg_du[a]|0x80;
key_t=2;
t2[3]=0x00;t2[4]=0x00;t2[5]=0x00;
}
else if(a>=10)
{
t2[0]=smg_du[a/10];
a=a%10;
t2[1]=smg_du[a]|0x80;
key_t=1;
t2[3]=0x00;t2[4]=0x00;t2[5]=0x00;
t2[2]=0x00;
}
else
{
t2[0]=smg_du[a]|0x80;
key_t=0;
t2[1]=0x00;t2[2]=0x00;t2[3]=0x00;t2[4]=0x00;t2[5]=0x00;
}
if(b>=10)
{
t2[key_t+1]=smg_du[b/10];
b=b%10;
t2[key_t+2]=smg_du[b];
}
else
{
t2[key_t+1]=smg_du[b];
}
}
else
{
T=27315-T;
a=T/100;
b=T-a*100;
//--------------------------
if(a>=10)
{
t2[0]=smg_du[a/10];
a=a%10;
t2[1]=smg_du[a]|0x80;//加点
t2[3]=0x00;t2[4]=0x00;t2[5]=0x00;
t2[2]=0x00;
}
else
{
t2[0]=smg_du[a]|0x80;
t2[1]=0x00;t2[2]=0x00;t2[3]=0x00;t2[4]=0x00;t2[5]=0x00;
}
//--------------------------
if(b>=10)
{
t2[key_t+1]=smg_du[b/10];
b=b%10;
t2[key_t+2]=smg_du[b];
}
else
{
t2[key_t+1]=smg_du[b/10];
}
}
}
//************************************
void start_bit(void)
{
SDA=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
}
//------------------------------
void stop_bit(void)
{
SCL=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=1;
}
//--------- 发送一个字节---------
void tx_byte(uchar dat_byte)
{
char i,n,dat;
n=Nack_counter;
TX_again:
dat=dat_byte;
for(i=0;i<8;i++)
{
if(dat&0x80)
bit_out=1;
else
bit_out=0;
send_bit();
dat=dat<<1;
}
receive_bit();
if(bit_in==1)
{
stop_bit();
if(n!=0)
{n--;goto Repeat;}
else
goto exit;
}
else
goto exit;
Repeat:
start_bit();
goto TX_again;
exit: ;
}
//-----------发送一个位---------
void send_bit(void)
{
if(bit_out==0)
SDA=0;
else
SDA=1;
_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
SCL=0;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
//---------- 接收一个字节--------
uchar rx_byte(void)
{
uchar i,dat;
dat=0;
for(i=0;i<8;i++)
{
dat=dat<<1;
receive_bit();
if(bit_in==1)
dat=dat+1;
}
send_bit();
return dat;
}
//---------- 接收一个位----------
void receive_bit(void)
{
SDA=1;bit_in=1;
SCL=1;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
bit_in=SDA;
_nop_();
SCL=0;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
//------------ 延时--------------
void delay(uint N)
{
uint i;
for(i=0;i<N;i++)
_nop_();
}
//------------------------------
uint memread(void)
{
start_bit();
tx_byte(0xB4); //Send SlaveAddress ==============================
//tx_byte(0x00);
tx_byte(0x07); //Send Command
//------------
start_bit();
tx_byte(0x01);
bit_out=0;
DataL=rx_byte();
bit_out=0;
DataH=rx_byte();
bit_out=1;
Pecreg=rx_byte();
stop_bit();
return(DataH*256+DataL);
} |