高分悬赏 谁能帮我写个程序 STH10温湿度采集的 用1602显示 STC89C52单片机写的 必须能用 高分悬赏

高分悬赏 谁能帮我写个程序 STH10温湿度采集的 用1602显示 STC89C52单片机写的 必须能用 高分悬赏,第1张

#include <iom16v.h>

#include <math.h>

#include "avrlcd3.1.c" //这是我自己写的液晶显示函数

//=====宏定义=======================================

#define DATA_1 PORTA|=0X01

#define DATA_0 PORTA&=0XFE

#define SCK_1 PORTA|=0X02

#define SCK_0 PORTA&=0XFD

#define DATA_SETINPUT DDRA&=0XFEPORTA|=0X01

#define DATA_SETOUTPUT DDRA|=0X01

#define SCK_SETINPUT DDRA&=0XFDPORTA|=0X02

#define SCK_SETOUTPUT DDRA|=0X02

#define DATA_IN (PINA&0X01)

#define noACK 0

#define ACK 1

//adr command r/w

#define STATUS_REG_W 0x06 //000 0011 0

#define STATUS_REG_R 0x07 //000 0011 1

#define MEASURE_TEMP 0x03 //000 0001 1

#define MEASURE_HUMI 0x05 //000 0010 1

#define RESET 0x1e//000 1111 0

#define TEMP 0

#define HUMI 1

//=====函数声明===============================================

void delay_ms(int t)

void s_transstart(void)

char s_write_byte(unsigned char value) //写入一个字节的命令,并且检查传感器是否正确接收了这个数据,返回值为0表示正确接收

char s_read_byte(unsigned char ack) //读一个字节的数据,并且向培盯传感器发出一个字节的“已岁游接收”信号

int s_measure(unsigned char mode) //进行一次测量

void calc_sth11(float *p_humidity ,float *p_temperature)//测量结果修正

//-----主函数-----------------------------------------------------------

void main(void)

{

float temp,humi

while(1)

{

temp = s_measure(TEMP)

humi = s_measure(HUMI)

calc_sth11(&humi,&temp)

printf("t=%f C\nh=%f %",temp,humi)//将检测结果输出到液晶屏上,

//这个函数是我自己写的,用于液晶屏的显示,不是stdio.h里的那个

delay_ms(2000)

}

}

//=====函数定义========================================

//********************************

//延时若干毫秒

//********************************

void delay_ms(int t)

{

int i,j

for(i=0i<ti++)

for(j=0j<1141j++)

}

//*******************************

//短延时

//*******************************

void delay_little(void)

{

asm("配雀和nop")

asm("nop")

asm("nop")

asm("nop")

asm("nop")

asm("nop")

}

//********************************************

//启动传输

//***********************************************

void s_transstart(void)

{

DATA_SETOUTPUT

SCK_SETOUTPUT

DATA_1

SCK_0

delay_little()

SCK_1

delay_little()

DATA_0

delay_little()

SCK_0

delay_little()

SCK_1

delay_little()

DATA_1

delay_little()

SCK_0

}

//********************************

//写入一个字节的命令,并且检查传感器是否正确接收了这个数据,返回值为0表示正确接收

//*******************************

char s_write_byte(unsigned char value)

{

unsigned char i

char error

DATA_SETOUTPUT

SCK_SETOUTPUT

SCK_0

DATA_0

for(i=0i<8i++) //发送8位数据,丛机将在上升沿读取数据

{

SCK_0

if(value&(0x80>>i))

DATA_1

else

DATA_0

delay_little()

SCK_1

delay_little()

}

SCK_0//在接下来的上升沿读取从机发送的“已收到”信号。

DATA_SETINPUT

delay_little()

SCK_1

delay_little()

error = (DATA_IN?1:0)

delay_little()

SCK_0

DATA_SETOUTPUT

return error

}

//********************************************

//读一个字节的数据,并且向传感器发出一个字节的“已接收”信号

//********************************************

char s_read_byte(unsigned char ack)

{

unsigned char i,val=0

DATA_SETINPUT

//SCK_SETOUTPUT

SCK_0

for (i=0x80i>0i>>=1) //接收8位数据

{

SCK_1

delay_little()

if (DATA_IN)

val=(val | i) //read bit

SCK_0

delay_little()

}

if(ack)

DATA_1

else

DATA_0

DATA_SETOUTPUT //发送一个ack位(0),表示是否接收到数据

delay_little()

SCK_1

delay_little()

return val

}

//***************************************************

//温湿度的计算和修正

//************************************************

void calc_sth11(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 // rh: Humidity [Ticks] 12 Bit

float t=*p_temperature// t: Temperature [Ticks] 14 Bit

float rh_lin // rh_lin: Humidity linear

float rh_true // rh_true: Temperature compensated humidity

float t_C// t_C : Temperature

t_C=t*0.01 - 40 //calc. temperature from ticks

rh_lin=C3*rh*rh + C2*rh + C1 //calc. humidity from ticks to [%RH]

rh_true=(t_C-25)*(T1+T2*rh)+rh_lin //calc. temperature compensated humidity [%RH]

if(rh_true>100)rh_true=100 //cut if the value is outside of

if(rh_true<0.1)rh_true=0.1 //the physical possible range

*p_temperature=t_C //return temperature

*p_humidity=rh_true //return humidity[%RH]

}

//************************************************

// makes a measurement (humidity/temperature) with checksum

//测量一次温度/湿度,无校验

//参数:0表示温度,1表示湿度

//**************************************************

int s_measure(unsigned char mode)

{

unsigned char a,b

s_transstart() //启动传输

switch(mode)//发送开始测量命令

{

case 0 : s_write_byte(MEASURE_TEMP)break

case 1 : s_write_byte(MEASURE_HUMI)break

default : break

}

DATA_SETINPUT

while(DATA_IN) //等待检测完成

//读取两个字节的数据

a=s_read_byte(0)

b=s_read_byte(1)

return (((int)a)<<8)+b

}

一般的湿度传感器分电阻式和电容式两种,产品的基本形式都是在基片上涂覆感湿材料形成感湿膜。空气中的水蒸汽吸附于感湿材料后,元件的阻抗、介质常数发生很大的变化。把这些参数缓码转化为电信号进行测量。STH10是电容式的。由于湿度对运察应温度有很大的变化,所以里面可能有热电阻或者热扰悄哪电偶作为感温元件。达到测量相对湿度的目的。楼主问原理的话应该就是这样了,至于做什么样的程序是单片机的吗,要控制什么,不太清楚。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12385000.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存