我正在尝试获取LM75A的温度数据,它通过i2c连接到atmega8单片机,并通过串口通信将数据显示到码头灯光上。我已经编写了代码,我得到的输出是
FF 7F 0F根据数据表,如果我忽略FF,那么7F 0F将导致+125 C温度。但我不知道这是对还是错(以及为什么要忽略FF)。因此,我在破解我得到的输出时感到困惑。代码,我认为是正确的,但如果它是错误的,请纠正它。
代码:
#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。我很困惑,我不知道我在哪里错过了重点。如果在代码中有任何错误,那么请告诉我以及如何破解输出。
请帮帮忙,谢谢!
发布于 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的。
https://stackoverflow.com/questions/29204275
复制相似问题