Zigbee2012 发表于 2013-5-8 20:20:03

红外测温MLX90614BAA +STC89LE52!从机无响应

//************************************
#defineuintunsigned int
#defineuchar unsigned char
#defineNack_number10
#defineIIC_counter60
//**************端口定义**************


sbit FM=P2^7;//蜂鸣器位定义

//mlx90614端口定义
sbitSCK=P1^1;//时钟线
sbitSDA=P1^0;//数据线 P10



void start(void);
void stop(void);
void SendByte(uchar number);
void send_bit(void);
uchar ReadByte(void);
void read_bit(void);
uint readtemp(void);
void delay(uint n);
void main(void)
{
        SCK=1;
        SDA=1;
        delay(4);
        SCK=0;
        delay(10000);
        SCK=1;
                  while(1)
               {
                Tem=readtemp();
        //        CALTEMP(Tem);
                LCD_putc(0,0,Tem/10000+'0');
                LCD_putc(1,0,Tem/1000%10+'0');
                LCD_putc(2,0,Tem/100%10+'0');
                LCD_putc(3,0,Tem/10%10+'0');
                LCD_putc(4,0,Tem%10+'0');

                _Tem = Tem;
                _Tem *= 10;
                _Tem = _Tem/50 - 2731;

                LCD_putc(6,5,_Tem/1000+'0');
                LCD_putc(7,5,_Tem/100%10+'0');
                LCD_putc(8,5,_Tem/10%10+'0');
                LCD_putc(9,5,_Tem%10+'0');
                        }
}
void start(void)       //停止条件是 SCK=1时,SDA 由1到0
{
SDA=1;
delay(4);
SCK=1;
delay(4);
SDA=0;
delay(4);
SCK=0;
delay(4);
}
//------------------------------
void stop(void)      //停止条件是 SCK=1时,SDA 由0到1
{
SCK=0;
delay(4);
SDA=0;
delay(4);
SCK=1;
delay(4);SDA=1;
}
//---------发送一个字节---------
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;         //发 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: ;         //退出
}
//-----------发送一个位---------
void send_bit(void)
{
if(bit_out==1)
{   SDA=1;          //发 1
}
else
{
SDA=0;          //发 0
}
_nop_();
SCK=1;         //上升沿
delay(4);delay(4);
SCK=0;
delay(4);delay(4);
}
//----------接收一个字节--------
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=dat+1;      //为1 时对应位加1
}    }
SDA=0;         //发送应答信号 0
send_bit();
return dat;      //带回接收数据
}
//----------接收一个位----------
void read_bit(void)
{
SDA=1;         //数据端先置 1
bit_in=1;
SCK=1;         //上升沿
delay(4);delay(4);
bit_in=SDA;      //读数据
_nop_();
SCK=0;
delay(4);delay(4);
}


//------------------------------
uint readtemp(void)
{
SCK=0;
start();         //开始条件
SendByte(0x00);       //发送从地址 00SendByte(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 delay(uint n)
{
uint j;
for(j=0;j<n;j++)
{
_nop_();
}
}


有哪位大神写过!求指导啊。。。。

68336016 发表于 2013-8-14 10:20:36

我是将官网的PIC例子下载下来,稍微修改了下IO口这些控制,在STM32上正常工作了。
看了上面STC的例子,跟PIC的基本也是一样

iop 发表于 2013-8-14 10:44:06

网上有现成的STC的例子

cafppla1 发表于 2013-12-22 21:51:51

调试出来没?这个玩意有什么需要注意的地方?老是不行
页: [1]
查看完整版本: 红外测温MLX90614BAA +STC89LE52!从机无响应