最近在用mlx90614实现非接触红外线测量,但出现了问题。想向各位大神求助一下。
问题是用以下程序为什么无法写入地址。
#include<reg52.h>
#include<intrins.h>//************************************
#define uint unsigned int
#define uchar unsigned char
#define Nack_counter 10
//**************端口定义**************
//LCD 控 制线接口
sbit BF = P0^7;
sbit EN = P2^5;
sbit RS = P1^0;
sbit RW = P1^1;
sbit SCL=P2^1;//时钟线
sbit SDA=P2^0;//数据线
//************数据定义****************
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); //延时程序
void delay5ms(void);//延时5ms
//void memread(void); //读温度数据
//void wait(void);
//void w_dat(unsigned char dat);
//void w_cmd(unsigned char cmd);
//void Init_LCD1602(void);
//void write_hexnum(unsigned char n);
//void display_num(unsigned char num);
//*************主函数*******************************************
void main()
{
SP=0x50;
SCL=1;
SDA=1;
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
delay(1000);
SCL=1;
//Init_LCD1602();
while(1)
{
start_bit();
tx_byte(0x00); //Send SlaveAddress
tx_byte(0x2e); //Send Command //------------
tx_byte(0x51);
bit_out=0;
tx_byte(0x00);
bit_out=1;
Pecreg=rx_byte();
stop_bit();
delay(50000);
}
}
//************************************
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_();
}
void delay5ms(void)
{
unsigned char i,j,k;
for(i=5;i>0;i--)
for(j=2;j>0;j--)
for(k=250;k>0;k--);
}