如何将LM75A温度IC与AVR接口

时间:2015-03-23 06:20:48

标签: avr i2c

我正在尝试使用i2c获取连接到atmega8微控制器的LM75A的温度数据,并使用串行通信将数据显示到docklight。我已经编写了代码,我得到的输出是

FF 7F 0F

根据数据表,如果我忽略FF,那么7F 0F将导致+125 C温度。但我不知道它是对还是错(以及为什么忽略FF)。所以我很难搞清楚我得到的输出。我认为代码是正确的但如果错误请更正。

CODE:

#ifndef F_CPU
#define F_CPU 8000000UL 
#endif

#include <avr/io.h>
#include<util/delay.h>
#include <stdio.h>

//Serial tansmit
void serial_avr(char *str)
{
UCSRB=(1<<TXEN);
UCSRC=(1<<UCSZ1)|(1<<UCSZ0)|(1<<URSEL);
UBRRL=51;

for (unsigned int i=0;str[i]!=0;i++)
{
    UDR=str[i];

    while(!(UCSRA&(1<<UDRE)));
}

_delay_ms(500);
}

void i2c_init(void)
{
 TWSR=0x00;         
 TWBR=0x47;         
TWCR=0x04;      
}
void i2c_start(void)
{
    TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
    while ((TWCR & (1 << TWINT)) == 0);
}

void i2c_write(unsigned char data)
{
    TWDR = data ;
    TWCR = (1<< TWINT)|(1<<TWEN);
    while ((TWCR & (1 <<TWINT)) == 0);
}

unsigned char i2c_read(unsigned char ackVal)
{
    TWCR = (1<< TWINT) | (1<<TWEN) | (ackVal<<TWEA);
    while (!(TWCR & (1 <<TWINT)));
    return TWDR ; 



}

void i2c_stop()
{
        TWCR = (1<< TWINT)|(1<<TWEN)|(1<<TWSTO);
}


void main(void)
{
    int i =23;
    unsigned char temp[20]; 

    i2c_init();
    i2c_start();
    i2c_write(0b10010001); //slave address for LM75A

    i2c_stop();

    i2c_init();
    i2c_start();
    i2c_write(0b00000000); //pointer register address of LM75A

    i2c_stop();

    i2c_init();
    i2c_start();
    temp[20] = i2c_read(1);

    i2c_stop();

    while(1)
    {
         serial_avr(temp);
        _delay_ms(2000);



    }


}

我正在读取数组中的温度,我得到的输出为FF 7F 0F,当我将其初始化为普通的char变量时,我得到的输出为C4。我很困惑,我不知道我在哪里错过了这一点。如果代码中有任何错误,请告诉我以及如何破解输出。??

请帮助,谢谢。!

1 个答案:

答案 0 :(得分:0)

第一个明显的错误是你如何处理数组temp[20]

您只从传感器读取一个字节,但随后从数组末尾写入值。 (数组中唯一有效的点是temp[0]temp[19]temp[20]超过了分配的内存。)您应该从传感器读取3个字节并将其存储在{{1} } temp[0]

temp[2]的下一个错误是你如何通过串口写出来的。您应该写入数组的所有字节,而不是所有字节,直到为0.您不知道数组的最后一个字节是0,因为它从来没有字符串。一个方便的事情是temp一个数组长度的值,所以你可以在数组的声明和write函数中引用它。

在解决这些问题之前,很难判断其余问题是否有效。我不知道你怎么能知道传感器的值是#define