我正在尝试使用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
。我很困惑,我不知道我在哪里错过了这一点。如果代码中有任何错误,请告诉我以及如何破解输出。??
请帮助,谢谢。!
答案 0 :(得分:0)
第一个明显的错误是你如何处理数组temp[20]
。
您只从传感器读取一个字节,但随后从数组末尾写入值。 (数组中唯一有效的点是temp[0]
到temp[19]
。temp[20]
超过了分配的内存。)您应该从传感器读取3个字节并将其存储在{{1} } temp[0]
。
temp[2]
的下一个错误是你如何通过串口写出来的。您应该写入数组的所有字节,而不是所有字节,直到为0.您不知道数组的最后一个字节是0,因为它从来没有字符串。一个方便的事情是temp
一个数组长度的值,所以你可以在数组的声明和write函数中引用它。
在解决这些问题之前,很难判断其余问题是否有效。我不知道你怎么能知道传感器的值是#define
。