📄 hct11.c
字号:
#include "myinclude.h"
#define DATA_ACK 0x01
#define DATA_noACK 0x00
char s_softreset(void);
char s_read_statusreg(unsigned int *p_value);
void start_cale(void); //开始加热
void stop_cale(void); //停止加热
void init_wdt(void); //初始化定时器
float com_dp(float t0,float r0);
void main(void)
{
unsigned int tem = 0x0000;
unsigned int rh = 0x0000;
float dp=0.0;
float rh_linear = 0.0;
float rh_true = 0.0;
float tem_true = 0.0;
init();
while(1)
{
tem = read_t();
rh = read_rh();
rh_linear = (0.0405 * (float)rh) + ((-2.8 * 0.000001) * rh * rh) - 4;
tem_true = (0.01 * (float)tem) - 39.64;
rh_true = ((float)tem_true - 25.0) * (0.01 + (0.00008 * (float)rh)) + rh_linear;
dp = com_dp(tem_true,rh_true);
// tem = (int)(dp * 100);
// rh = (int)(rh_linear * 100);
// tem = (int)(tem_true * 100);
_BIS_SR(CPUOFF); // Enter LPM0
}
}
/*名称:读取温度 */
/*输入:无 */
/*返回:温度值,数据是int型,温度是 */
/* 从传感器读回来的值,未做处理 */
int read_t(void)
{
unsigned int ret_t = 0x0000;
unsigned char temp0 = 0x00;
unsigned char temp1 = 0x00;
unsigned int i;
sck_start();
send_data(MEA_T);
P2DIR &= ~DATA;
temp0 = P2IN & DATA;
for(i=0;i<0xFFF0;i++)
{
if(temp0!=DATA)
{
i = 0xFFFF;
break;
}
}
temp0 = read_su(DATA_ACK);
temp1 = read_su(DATA_ACK);
ret_t = (((unsigned int)(temp0 & 0x3F)) << 0x08) | ((unsigned int)temp1);
return ret_t;
}
/*名称:读取湿度 */
/*输入:无 */
/*返回:湿度值,数据是int型,湿度是 */
/* 从传感器读回来的值,未做处理*/
int read_rh(void)
{
unsigned int ret_rh = 0x0000;
unsigned char temp0 = 0x00;
unsigned char temp1 = 0x00;
unsigned int i;
sck_start();
send_data(MEA_RH);
P2DIR &= ~DATA;
temp0 = P2IN & DATA;
for(i=0;i<0xFFF0;i++)
{
if(temp0!=DATA)
{
i = 0xFFFF;
break;
}
}
temp0 = read_su(DATA_ACK);
temp1 = read_su(DATA_ACK);
ret_rh = (((unsigned int)(temp0 & 0x0F)) << 0x08) | ((unsigned int)temp1);
return ret_rh;
}
/*名称:sck信号线启动 */
/*输入:无 */
/*返回:无 */
/*功能:在传感器信号复位后再此通讯*/
/* 前要发送的信号 */
void sck_start(void)
{
P2OUT |= DATA_H;
P2OUT &= SCK_L;
P2DIR |= SCK | DATA;
P2OUT |= SCK_H;
P2OUT &= DATA_L;
P2OUT &= SCK_L;
P2OUT |= SCK_H;
P2OUT |= DATA_H;
P2OUT &= SCK_L;
}
/*名称:发送数据 */
/*输入:要发送的数据,数据是uchar型*/
/*返回:是否成功,成功为1,不成功为*/
/* 0 ,char型返回 */
/*功能:向传感器发送数据,包括对传 */
/* 感器操作的命令 */
char send_data(unsigned char com)
{
unsigned char i;
unsigned char error = 0x00;
P2OUT &= SCK_L;
P2DIR |= SCK | DATA;
for(i=0;i<8;i++)
{
if((com & BIT7)==BIT7)
{
P2OUT |= DATA_H;
}
else
{
P2OUT &= DATA_L;
}
com = com << 0x01;
P2OUT |= SCK_H;
P2OUT &= SCK_L;
}
P2OUT |= DATA_H;
P2OUT |= SCK_H;
P2DIR &= ~DATA;
error = P2IN & DATA;
P2OUT &= SCK_L;
return error;
}
/*名称:读取传感器数据 */
/*输入:输入ACK信号,是否启 */
/* 用crc校验,ACK是bit */
/* 信号,但输入是char型 */
/*返回:从传感器中读取的数据 */
/* 数据类型是uchar */
/*功能:从传感器读取回来的值 */
unsigned char read_su(unsigned char ack)
{
unsigned char temp = 0x00;
unsigned char i;
P2OUT &= SCK_L;
P2OUT |= DATA_H;
P2DIR |= SCK | DATA;
P2DIR &= ~DATA;
for(i=0;i<8;i++)
{
P2OUT |= SCK_H;
temp = temp << 0x01;
temp |= P2IN & DATA;
P2OUT &= SCK_L;
}
P2OUT &= ~DATA_ACK;
P2OUT |= SCK_H;
P2DIR |= DATA | SCK;
P2OUT &= SCK_L;
P2OUT |= DATA_H;
return temp;
}
/*名称:传感器信号线复位 */
/*输入:无 */
/*返回:无 */
/*功能:对传感器信号进行 */
/* 复位 */
void reset_su(void)
{
unsigned char j;
P2OUT |= DATA_H;
P2OUT &= SCK_L;
P2DIR |= DATA | SCK;
for(j=0;j<10;j++)
{
P2OUT |= SCK_H;
P2OUT &= SCK_L;
}
sck_start();
}
/*名称:开始加热函数 */
/*输入:无 */
/*返回:无 */
/*功能:使用传感器内部加热功能 */
/* 开始加热 */
void start_cale(void)
{
unsigned char temp = 0x00;
send_data(RD_RAM);
temp = read_su(DATA_ACK);
temp |= CALE_BIT;
send_data(WR_RAM);
send_data(temp);
}
/*名称:停止加热函数 */
/*输入:无 */
/*返回:无 */
/*功能:使用传感器内部加热功能 */
/* 停止加热 */
void stop_cale(void)
{
unsigned char temp = 0x00;
send_data(RD_RAM);
temp = read_su(DATA_ACK);
temp &= ~CALE_BIT;
send_data(WR_RAM);
send_data(temp);
}
/*名称:露点计算函数 */
/*输入:温度,湿度,都是浮点型 */
/*返回:露点值,浮点型 */
float com_dp(float t0,float r0)
{
double logew = 0.0;
double dp0 = 0.0;
logew = 0.66077 + (7.5 * (double)t0 /(237.3 + (double)t0)) + log10((double)r0) - 2;
dp0 = (0.66077 - logew) * 237.3 / (logew - 8.16077);
return (float)dp0;
}
/*名称:传感器初始化 */
/*输入:无 */
/*返回:无 */
/*功能:对传感器进行 */
/* 初始化 */
void init_su(void)
{
reset_su();
send_data(WR_RAM);
send_data(0x00);
}
/*名称:初始化定时器 */
/*输入:无 */
/*返回:无 */
/*功能:对定时器进行初始化 */
void init_wdt(void)
{
// WDTCTL = 0X00;
WDTCTL = WDT_ADLY_250 | WDTTMSEL; // Set Watchdog Timer to exactly 250ms
IE1 |= WDTIE; // Enable WDT interrupt
_EINT(); // Enable interrupts
}
/*名称:初始化 */
/*输入:无 */
/*返回:无 */
/*功能:cpu上电初始化*/
void init(void)
{
init_wdt();
init_su();
}
/*名称:软件复位传感器 */
/*输入:无 */
/*返回:是否复位成功, */
/* 成功是1,不成功 */
/* 是0,是char型 */
/* 2007年03月22日新增加 */
char s_softreset(void)
{
unsigned char error = 0x00;
reset_su();
error += send_data(RESET);
return error;
}
/*名称:读传感器内部寄存器函数 */
/*输入:存储读回来的传感器内部 */
/* 的寄存器的值 */
/*返回:是否读取成功,成功是1,*/
/* 不成功是0,是char型 */
char s_read_statusreg(unsigned int *p_value)
{
unsigned char error = 0x00;
sck_start();
error = send_data(RD_RAM);
*p_value = (unsigned int)(read_su(DATA_ACK));
*p_value = ((*p_value) << 0x08) & 0xF0;
*p_value |= (unsigned int)(read_su(DATA_ACK));
return error;
}
// Watchdog Timer interrupt service routine
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void)
{
_NOP();
_BIC_SR_IRQ(CPUOFF); // Clear CPUOFF bit from 0(SR)
}
/*名称:延时函数 */
/*输入:延时的周期数 */
/*返回:无 */
void dele(unsigned int dddd)
{
unsigned int dele_n;
for(dele_n=0x0000;dele_n>=dddd;dele_n++)
{
reset_su();
_NOP();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -