|
我用的是430单片机,时钟8M
程序如下
我现在的问题是读出的温度老是a3.60
湿度老是00.0
请问是我在计算时的问题还是其他什么问题
谢谢 指教
/****************************************************/
#include <msp430x14x.h>
#include "cry1602.h"
//uchar *s1 = "temp: 00.0 'C";
//uchar *s2 = "humi: 00.0 %RH";
#define SCK_L P6DIR|=BIT0;P6OUT&=~BIT0
#define SCK_H P6DIR|=BIT0;P6OUT|=BIT0
#define DATA_L P6DIR|=BIT1;P6OUT&=~BIT1
#define DATA_H P6DIR|=BIT1;P6OUT|=BIT1
#define DATA_in P6DIR&=~BIT1;_NOP() //设数据位输入
#define DATA_out P6DIR|=BIT1;_NOP() //设数据位输出
#define DATA_if P6IN&BIT1 //判断SDA高还是低电平
#define ACK_no 0
#define ACK_yes 1
#define sht10_w 0x06 //000 0011 0写状态寄存器
#define sht10_r 0x07 //000 0011 1读状态寄存器
#define get_temperature 0x03 //000 0001 1获取温度
#define get_humidity 0x05 //000 0010 1获取湿度
#define sht10_rst 0x1e //000 1111 0复位
static void InitOsc(void);
static void InitPorts(void);
union
{
unsigned int i;
//unsigned char i;
float f;
}
humi_val,temp_val;
/****************启动传输****************/
void sht10_start(void)
// _____ ________
// DATA: |_______|
// ___ ___
// SCK : ___| |___| |______
{
DATA_H; //P2DIR|=BIT1;P2OUT|=BIT1
SCK_L; //P2DIR|=BIT0;P2OUT&=~BIT0
_NOP();
SCK_H; //P2DIR|=BIT0;P2OUT|=BIT0
DATA_L; //P2DIR|=BIT1;P2OUT&=~BIT1
_NOP();
SCK_L; //P2DIR|=BIT0;P2OUT&=~BIT0
_NOP();_NOP();_NOP();
SCK_H; //P2DIR|=BIT0;P2OUT|=BIT0
_NOP();
DATA_H; //P2DIR|=BIT1;P2OUT|=BIT1
_NOP();
SCK_L; //P2DIR|=BIT0;P2OUT&=~BIT0
}
/****************写状态寄存器****************/
char sht10_write(unsigned char value)
{
unsigned char i;
unsigned char error; //P2IN&BIT1 //判断SDA高还是低电平
DATA_out;
_NOP();_NOP();_NOP();
DATA_H;
//for(i=0x80;i>0;i/=2)
for(i=0x80;i>0;i=i>>1)
{
if(i&value)
{
DATA_H;
}
else DATA_L;
SCK_H;
_NOP();_NOP();_NOP();
SCK_L; //产生一下降沿
}
DATA_H;
SCK_H; //数据送完的结束标志.
DATA_in; //P2DIR&=~BIT1;_NOP() //设数据位输入
_NOP();_NOP();_NOP();
error=DATA_if;
SCK_L;
DATA_out;
_NOP();_NOP();_NOP();
DATA_H;
return error; //P2IN&BIT1 //判断SDA高还是低电平
}
/****************读状态寄存器****************/
char sht10_read(unsigned char ack)
{
unsigned char i,value=0;
DATA_out;
_NOP();_NOP();_NOP();
DATA_H;
_NOP();_NOP();_NOP();
DATA_in;
_NOP();_NOP();_NOP();
//for(i=0x80;i>0;i/=2)
for(i=0x80;i>0;i=i>>1)
{
SCK_H;
// DATA_in;
_NOP(); _NOP(); _NOP();
if(DATA_if==1)
value=(value|i);
_NOP(); _NOP(); _NOP();
SCK_L;
}
DATA_out;
_NOP(); _NOP(); _NOP();
if(ack)
{
DATA_L;
}
else
DATA_H;
_NOP(); _NOP(); _NOP(); _NOP();
SCK_H;
_NOP();_NOP();_NOP();
SCK_L;
DATA_H;
return value;
}
/****************通讯连接复位****************/
void sht10_con_rst(void)
// _____________________________________________________ ________
// DATA: |_______|
// _ _ _ _ _ _ _ _ _ ___ ___
// SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______| |___| |______
{
unsigned char i;
DATA_out;
DATA_H;
_NOP();
SCK_L;
for(i=0;i<9;i++)
{
SCK_H;
_NOP();_NOP();_NOP();_NOP();
SCK_L;
}
sht10_start();
}
/****************软复位****************/
char sht10_soft_rst(void)
{
unsigned char error=0;
sht10_con_rst();
error+=sht10_write(sht10_rst);
return error;
}
/****************温度湿度测量****************/
char get(unsigned char *value,unsigned char *check_sum,unsigned char mode)
{
unsigned char error=0;
unsigned int i;
sht10_start();
switch(mode)
{
case 1:error=sht10_write(get_humidity);
break;
case 2:error=sht10_write(get_temperature); //#define get_temperature 0x03 //000 0001 1
//#define get_humidity 0x05 //000 0010 1
break;
default:break;
}
DATA_in;
_NOP();_NOP(); _NOP();_NOP();
for (i=0;i<30000;i++) if(DATA_if==0) break;
if(DATA_if==1) error+=1;
*value=sht10_read(ACK_yes);
*(value+1)=sht10_read(ACK_yes);
*check_sum=sht10_read(ACK_no);
return error;
}
/****************补偿及输出温度和相对湿度计算****************/
void calculate_sht10(float *p_humidity ,float *p_temperature)
{
const float C1=-4.0; // for 12 Bit 湿度修正公式
const float C2=+0.0405; // for 12 Bit 湿度修正公式
const float C3=-0.0000028; // for 12 Bit 湿度修正公式
const float T1=+0.01; // for 14 Bit @ 5V 温度修正公式
const float T2=+0.00008; // for 14 Bit @ 5V 温度修正公式
float rh=*p_humidity;
float t=*p_temperature;
float rh_lin;
float rh_true;
float t_C;
t_C=t*0.01-40; //补偿温度
rh_lin=C3*rh*rh+C2*rh+C1; //相对湿度非线性补偿
rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; //相对湿度对于温度依赖性补偿
if(rh_true>100)rh_true=100; //湿度最大修正
if(rh_true<0.1)rh_true=0.1; //湿度最小修正
*p_temperature=t_C; //返回温度结果
*p_humidity=rh_true; //返回湿度结果
}
static void InitOsc(void)
{
WDTCTL = WDTPW + WDTHOLD; // stop watchdog timer
BCSCTL1 |= XTS; // XT1 as high-frequency
__bic_SR_register(OSCOFF); // turn on XT1 oscillator
do{
IFG1 &= ~OFIFG; // Clear OFIFG
delay(); // Wait ~130us
} while (IFG1 & OFIFG); // Test oscillator fault flag
BCSCTL2 = SELM_3; // set XT1 as MCLK SELM_3(0xc0,11000000)
}
//------------------------------------------------------------------------------
// Local function prototypes
//------------------------------------------------------------------------------
static void InitPorts(void)
{
P1SEL = 0;
P1OUT = 0; // switch all unused ports to output
P1DIR = 0xff; // (Rem.: ports 3 & 5 are set in "cs8900.c")
P2SEL = 0;
P2OUT = 0;
P2DIR = 0xff;
P4OUT = 0;
P4DIR = 0xff;
P6SEL = 0x00; // use P6.7 for the ADC module
P6OUT = 0;
P6DIR = 0xff; // all output except P6.7
}
//------------------------------------------------------------------------------
void main(void)
{
/* 以下添加LCD与温湿度程序初始变量定义部分*/
unsigned char num[10]={'0','1','2','3','4','5','6','7','8','9'};
unsigned char error,check_sum;
unsigned char HUMI,TEMP;
uchar FirstLine[]="temp: 10.0 'C";
uchar TwoLine[]= "humi: 10.0 %RH";
/* 结束添加LCD与温湿度程序初始变量定义部分*/
InitOsc();
InitPorts();
/* 以下添加LCD与温湿度程序初始化部分*/
HUMI=0x01;
TEMP=0x02;
P6DIR = 0xff;
WDTCTL=WDTPW+WDTHOLD;
LcdReset();
Delay_ms(1);
DispStr(0,0,FirstLine);
DispStr(0,1,TwoLine);
Delay_ms(1);
sht10_con_rst();
/* 结束添加LCD与温湿度程序初始化部分*/
P6DIR = 0xff;
while (1) // repeat forever
{
/* 以下添加LCD与温湿度程序无限循环(主体)部分*/
error=0;
error+=get((unsigned char*)&humi_val.i,&check_sum,HUMI);//湿度测量
error+=get((unsigned char*)&temp_val.i,&check_sum,TEMP);//温度测量
if(error!=0) sht10_con_rst(); //如果发生错误,系统复位
else
{
humi_val.f=(float)humi_val.i; //转换为浮点数
temp_val.f=(float)temp_val.i; //转换为浮点数
calculate_sht10(&humi_val.f,&temp_val.f); //修正相对湿度及温度
// calculate_sht10(&temp_val.f,&humi_val.f);
temp_val.i=(int)temp_val.f*10;
humi_val.i=(int)humi_val.f*10;
Disp1Char(7,0,num[temp_val.i/100]);
// Disp1Char(7,1,num[humi_val.i/100]);
Delay_ms(5);
Disp1Char(8,0,num[(temp_val.i%100)/10]);
Delay_ms(5);
// Disp1Char(8,1,num[(humi_val.i%100)/10]);
Delay_ms(5);
Disp1Char(10,0,num[temp_val.i%10]);
// Disp1Char(10,1,num[humi_val.i%10]);
}
Delay_ms(10000);
//Delay_ms(60000);
//等待足够长的时间,等待下一次采集
/* 结束LCD与温湿度程序无限循环(主体)部分*/
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|