📄 shtxx.c
字号:
/******************************************************************************
**Name: SHTXX驱动程序
**note: ATmega8@1.0Mhz
**compiler: IccAVR
**Verson: v1.0
**Date: 2008.08.31
**By: Eason
******************************************************************************/
#include "main.h"
//外部全局变量,main函数中调用
//t_c: 实际温度值放大100倍的结果
//rh_true: 相对湿度值
extern uint16 t_c, rh_true;
/**************************************************************************************************
**Name:
**Function: Sclk=1 DDR=1
**Input:
**Output:
**************************************************************************************************/
void SHTXX_SCK_HIGH(void)
{
DDRC |= (1<<SHTXX_SCK_BIT);
PORTC |= (1<<SHTXX_SCK_BIT);
Delay_nmillisecond(10);
}
/**************************************************************************************************
**Name:
**Function: sclk=0 DDR=1
**Input:
**Output:
**************************************************************************************************/
void SHTXX_SCK_LOW(void)
{
DDRC |= (1<<SHTXX_SCK_BIT);
PORTC &= ~(1<<SHTXX_SCK_BIT);
Delay_nmillisecond(10);
}
/**************************************************************************************************
**Name:
**Function: DATA=1, DDR=1
**Input:
**Output:
**************************************************************************************************/
void SHTXX_DAT_1(void)
{
DDRC |= (1<<SHTXX_DAT_BIT);
Delay_nmillisecond(2);
PORTC |= (1<<SHTXX_DAT_BIT);
Delay_nmillisecond(5);
}
/**************************************************************************************************
**Name:
**Function: DATA=0, DDR=1
**Input:
**Output:
**************************************************************************************************/
void SHTXX_DAT_0(void)
{
DDRC |= (1<<SHTXX_DAT_BIT);
Delay_nmillisecond(2);
PORTC &= ~(1<<SHTXX_DAT_BIT);
Delay_nmillisecond(5);
}
/**************************************************************************************************
**Name:
**Function: SHTXX开始工作
**Input:
**Output:
**************************************************************************************************/
void SHTXX_START(void)
{
SHTXX_DAT_1();
SHTXX_SCK_LOW();
SHTXX_SCK_HIGH();
SHTXX_DAT_0();
SHTXX_SCK_LOW();
Delay_nmillisecond(5);
SHTXX_SCK_HIGH();
SHTXX_DAT_1();
SHTXX_SCK_LOW();
}
/**************************************************************************************************
**Name:
**Function: Not use
**Input:
**Output:
**************************************************************************************************/
void SHTXX_ACK(void)
{
DDRC &= ~(1<<SHTXX_DAT_BIT);
}
/**************************************************************************************************
**Name:
**Function: 初始化
**Input:
**Output:
**************************************************************************************************/
void shtxx_init(void)
{
//shtxx_temp = shtxx_humi = 0;
SHTXX_SCK_LOW();
SHTXX_DAT_1();
shtxx_reconnect();
}
/**************************************************************************************************
**Name:
**Function: 复位SHT串口
**Input:
**Output:
**************************************************************************************************/
void shtxx_reconnect(void)
{
uint8 i=0;
SHTXX_DAT_1();
SHTXX_SCK_LOW();
for(i=0;i<9;i++)
{
SHTXX_SCK_HIGH(); SHTXX_SCK_LOW();
}
SHTXX_START();
}
/**************************************************************************************************
**Name:
**Function: 复位
**Input:
**Output:
**************************************************************************************************/
uint8 shtxx_softrst(void)
{
uint8 error = 0;
shtxx_reconnect();
error += shtxx_write_byte(SHTXX_SOFT_RST);
return error;
}
/**************************************************************************************************
**Name:
**Function:
**Input:
**Output:
//写命令函数
//参数:命令类型
//返回:0成功,1失败
**************************************************************************************************/
uint8 shtxx_write_byte(uint8 cmd)
{
uint8 i,ack;
for (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;
}
/**************************************************************************************************
**Name: 读字节函数
**Function: 读取一个字节,并根据参数1:继续接收0:停止接收
**Input: 0,非0
**Output: 读取字节
**************************************************************************************************/
uint8 shtxx_read_byte(uint8 dat_crc)
{
uint8 i,dat8 = 0;
for (i=8; i>0; i--)
{
BITCLR(SHTXX_DAT_DDR, SHTXX_DAT_BIT);
SHTXX_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;
}
/**************************************************************************************************
**Name: SHT 测量
**Function: 通过mode,选择测量温度湿度,结果shtxx_data,shtxx_crc
**Input: shtxx_data 存放测量结果
shtxx_crc 存放CRC校验
mode SHTXX_MODE_TEMP SHTXX_MODE_HUMI
**Output: 0; 成功,
非0: 错误
**************************************************************************************************/
uint8 shtxx_measure(uint16 * shtxx_data,uint8 *shtxx_crc,uint8 mode)
{
uint8 error = 0;
uint16 i;
*shtxx_data=*shtxx_crc=0;
SHTXX_START();
switch (mode)
{
case SHTXX_MODE_TEMP:
error += shtxx_write_byte(SHTXX_CMD_TEMPTURE);
for (i=0; i<50; i++)
{
Delay_nmillisecond(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_data) = shtxx_read_byte(1);
*(shtxx_data) = ((*shtxx_data) << 8) + shtxx_read_byte(1);
*(shtxx_crc) = shtxx_read_byte(0);
break;
case SHTXX_MODE_HUMI:
error += shtxx_write_byte(SHTXX_CMD_HUMIDITY);
for (i=0; i<50; i++)
{
Delay_nmillisecond(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_data) = shtxx_read_byte(1);
*(shtxx_data) = ((*shtxx_data) << 8) + shtxx_read_byte(1);
*(shtxx_crc) = shtxx_read_byte(0);
break;
default:
break;
}
return error;
}
/**************************************************************************************************
**Name:
**Function: 计算温度
**Input: shtxx_temp: SHT 读出16bits 温度值
**Output: SHT 读出16bits 温度值
**************************************************************************************************/
uint16 shtxx_calc_temp(uint16 *shtxx_temp)
{
uint16 tc=0;
//温度常量放大100
tc = (*shtxx_temp); //结果除以100
return (tc);
}
/**************************************************************************************************
**Name:
**Function: 计算温度
**Input: shtxx_humi: SHT 读出16bits 湿度值
**Output: 相对湿度*100
**************************************************************************************************/
uint16 shtxx_calc_humi(uint16 *shtxx_humi)
{
uint32 rh_line = 0;
//所有湿度常量放大10,000,000
uint32 C1 = 40000000;
uint32 C2 = 405000;
uint32 C3 = 28;
uint32 T1 = 100000;
uint32 T2 = 8000;
//温度常量放大100
//t_c = (*shtxx_temp) - 4000; //结果除以100
rh_line = C2*(*shtxx_humi) - C3*(*shtxx_humi)*(*shtxx_humi) - C1;
//rh_true = (t_c/100-25)*(T1+T2*(*shtxx_humi)) + rh_line;
if (rh_line>1000000000) rh_line = 1000000000; //cut if the value is outside of
if (rh_line<1000000) rh_line = 1000000; //the physical possible range
return (rh_line/100000);
}
/**************************************************************************************************
**Name:
**Function: 16位二进制到十进制
**Input: hex16: 想转换的二进制数(无符号)
bcd: 转换后的BCD码存放位置,加0x30后为ASCII码
**Output:
**************************************************************************************************/
void hex_bcd(uint16 hex16,uint8 * bcd)
{ uint8 i;
for(i=0;i<5;i++)
*(bcd+i)='\0';
//memset(bcd32, '\0', 10);
while (hex16 >= 10000) //
{
(*(bcd+4))++;
hex16 = hex16 - 10000;
}
while (hex16 >= 1000) //
{
(*(bcd+3))++;
hex16 = hex16 - 1000;
}
while (hex16 >= 100) //
{
(*(bcd+2))++;
hex16 = hex16 - 100;
}
while (hex16 >= 10) //
{
(*(bcd+1))++;
hex16 = hex16 - 10;
}
*bcd = hex16;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -