首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何实现LM75A温度集成电路与AVR的接口

如何实现LM75A温度集成电路与AVR的接口
EN

Stack Overflow用户
提问于 2015-03-23 14:20:48
回答 1查看 1.3K关注 0票数 0

我正在尝试获取LM75A的温度数据,它通过i2c连接到atmega8单片机,并通过串口通信将数据显示到码头灯光上。我已经编写了代码,我得到的输出是

代码语言:javascript
复制
FF 7F 0F

根据数据表,如果我忽略FF,那么7F 0F将导致+125 C温度。但我不知道这是对还是错(以及为什么要忽略FF)。因此,我在破解我得到的输出时感到困惑。代码,我认为是正确的,但如果它是错误的,请纠正它。

代码:

代码语言:javascript
复制
#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。我很困惑,我不知道我在哪里错过了重点。如果在代码中有任何错误,那么请告诉我以及如何破解输出。

请帮帮忙,谢谢!

EN

回答 1

Stack Overflow用户

发布于 2015-03-24 05:17:57

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

您只需从传感器读取一个字节,但随后将该值写出数组的末尾。(阵列中唯一有效的点是temp[0]temp[19]temp[20]已超过分配的内存。)您应该从传感器读取3个字节,并将它们存储在temp[0]temp[2]中。

temp的下一个错误是如何在串行上写出它。您应该写入数组的所有字节,而不是0之前的所有字节。你不知道数组的最后一个字节是0,因为它里面从来没有字符串。一种方便的做法是写一个数组长度的值,这样您就可以在数组的声明和#define函数中引用它。

除非您解决了这些问题,否则很难判断其他问题是否正常工作。我不明白你怎么知道来自传感器的值是FF 7F 0F的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29204275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档