?? 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 + -