#include "shtxx.h"
void shtxx_init(void)
{
shtxx_temp = shtxx_humi = 0;
SHTXX_SCK_LOW();
SHTXX_DAT_1();
shtxx_reconnect();
}
void shtxx_reconnect(void)
{
SHTXX_DAT_1();
SHTXX_SCK_LOW();
for(uint8 i=0; i<9; i++)
{
SHTXX_SCK_HIGH(); SHTXX_SCK_LOW();
}
SHTXX_START();
}
uint8 shtxx_SOFtrst(void)
{
uint8 error = 0;
shtxx_reconnect();
error += shtxx_write_byte(SHTXX_SOFT_RST);
return error;
}
//写命令函数
//参数:命令类型
//返回:0成功,1失败
uint8 shtxx_write_byte(uint8 cmd)
{
uint8 ack;
for (uint8 i=8; i>0; i--)
{
if (BITCHK(cmd, (i-1))) //trans ’1’
{
SHTXX_DAT_1();
SHTXX_SCK_HIGH(); SHTXX_SCK_LOW();
}
else //trans ’0’
{
SHTXX_DAT_0();
SHTXX_SCK_HIGH(); SHTXX_SCK_LOW();
}
}
//SHTxx 会以下述方式表示已正确地接收到指令:
//在第8 个SCK 时钟的下降沿之后,将DATA 下拉为低电平(ACK 位)。
//在第9 个SCK 时钟的下降沿之后,释放DATA(恢复高电平)。
BITCLR(SHTXX_DAT_DDR, SHTXX_DAT_BIT);
SHTXX_SCK_HIGH();
ack = BITCHK(SHTXX_DAT_PIN, SHTXX_DAT_BIT);
SHTXX_SCK_LOW();
return ack;
}
uint8 shtxx_read_byte(uint8 dat_crc)
{
uint8 dat8 = 0;
for (uint8 i=8; i>0; i--)
{
BITCLR(SHTXX_DAT_DDR, SHTXX_DAT_BIT);
c4680504cSHTXX_SCK_HIGH();
if (BITCHK(SHTXX_DAT_PIN, SHTXX_DAT_BIT))
BITSET(dat8, (i-1));
SHTXX_SCK_LOW();
}
if (dat_crc)
{
SHTXX_DAT_0();
SHTXX_SCK_HIGH(); SHTXX_SCK_LOW();
}
else
{
SHTXX_DAT_1();
SHTXX_SCK_HIGH(); SHTXX_SCK_LOW();
}
SHTXX_DAT_1();
return dat8;
}
int8 shtxx_measure(uint8 mode)
{
uint8 error = 0;
SHTXX_START();
switch (mode)
{
case SHTXX_MODE_TEMP:
error = shtxx_write_byte(SHTXX_CMD_TEMPTURE);
for(uint16 i=0; i<65535; i++)
{
_delay_us(5);
BITCLR(SHTXX_DAT_DDR, SHTXX_DAT_BIT);
if (!(BITCHK(SHTXX_DAT_PIN, SHTXX_DAT_BIT))) break;
}
BITCLR(SHTXX_DAT_DDR, SHTXX_DAT_BIT);
if (BITCHK(SHTXX_DAT_PIN, SHTXX_DAT_BIT)) error += 1;
shtxx_temp = shtxx_read_byte(1);
shtxx_temp = (shtxx_temp << 8) + shtxx_read_byte(1);
shtxx_crc = shtxx_read_byte(0);
break;
case SHTXX_MODE_HUMI:
error = shtxx_write_byte(SHTXX_CMD_HUMIDITY);
for(uint16 i=0; i<65535; i++)
{
_delay_us(5);
BITCLR(SHTXX_DAT_DDR, SHTXX_DAT_BIT);
if (!(BITCHK(SHTXX_DAT_PIN, SHTXX_DAT_BIT))) break;
}
BITCLR(SHTXX_DAT_DDR, SHTXX_DAT_BIT);
if (BITCHK(SHTXX_DAT_PIN, SHTXX_DAT_BIT)) error += 1;
上一篇:AVR定时器T1中断示例程序