📄 main.c
字号:
#include "myinclude.h"#define DATA_ACK 0x01#define DATA_noACK 0x00char 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 rh_linear = 0.0; float rh_true = 0.0; float tem_true = 0.0; float dp = 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 + -