用c语言编写基于sht10传感器的仓库温湿度监测系统的程序,单片机远程仓库湿度监测系统仿真max487+sht11源程序+电路原理图...

本文介绍了一种利用SHT11传感器进行温湿度测量,并通过LCD1602显示器展示测量结果的方法。重点讲解了SHT11的数据读取与时序控制、数值转换及线性补偿算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

//SHT11温度+湿度传感器,测量结果用LCD1602显示

//操作的关键部分是1.对照SHT11的时序图操作

//                                  2.数值的转换

//                                  3.对SHT11的误差进行线性补偿

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

#include

#include

#include

sbit SCK=P2^4;

sbit DATA=P2^5;

sbit LCD_RS=P2^0;

sbit LCD_EN=P2^2;

unsigned char RH_H,RH_L;                        //接收的湿度的高位数据和低位数据

unsigned int i,j;

unsigned char dispbuf[4];

void delay(unsigned int z)

{

unsigned int x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void write_GETRH(unsigned char GETRH)

{

LCD_RS=0;

P0=GETRH;

delay(1);

LCD_EN=1;

delay(1);

LCD_EN=0;

}

void write_DATA(unsigned char *date)

{

unsigned char n;

for(n=0;n<0x40;n++)

{

if(date[n]=='*')break;                //检测,如果字符输入"*",就终止

LCD_RS=1;

P0=date[n];

delay(5);

LCD_EN=1;

delay(5);

LCD_EN=0;

}

}

void init()

{

LCD_EN=0;

write_GETRH(0x38);

write_GETRH(0x0c);

write_GETRH(0x06);

write_GETRH(0x01);

}

//在SCK上发送n个脉冲信号

void nSCKPulse(unsigned int n)

{

for(i=n;i>0;i--)

{

SCK=0;

SCK=1;

}

}

//启动SHT11

void STARTSHT11()

{

SCK=1;

DATA=0;

SCK=0;

SCK=1;

DATA=1;

SCK=0;

}

//获得湿度数据

void GETRH(unsigned char GETRH)                                //测量湿度

{

unsigned char bei=0x80;

DATA=1;

SCK=0;        //下面可以开始

for(i=8;i>0;i--)

{

if(GETRH&bei)

{

DATA=1;

SCK=1;

SCK=0;

}

else

{

DATA=0;

SCK=1;

SCK=0;

}

bei=bei/2;

}

}

//对SHT11进行读操作

void READSHT11()

{

unsigned char temp;

RH_H=0;

RH_L=0;

for(i=0;i<4;i++)        //4个脉冲没数据

{

SCK=1;

SCK=0;

}

for(i=4;i>0;i--)        //接收RH高4位数据

{

SCK=1;

temp=0x01;

if(DATA==1)

{

temp=(temp<

RH_H=RH_H+temp;

}

SCK=0;

}

DATA=0;                                //拉低

SCK=1;

SCK=0;

DATA=1;                                //释放

for(i=8;i>0;i--)        //接收RH低4位数据

{

SCK=1;

temp=0x01;

if(DATA==1)

{

temp=(temp<

RH_L=RH_L+temp;

}

SCK=0;

}

P1=RH_H;

P3=RH_L;

DATA=0;                                //拉低

SCK=1;

SCK=0;

DATA=1;                                //释放(不做CRC校验,就此结束)

}

//阶乘函数

long FACTORIAL(int n)

{

long nn=1;

for(;n>0;n--)

{

nn=10*nn;

}

return(nn);

}

//SHT11的补偿算法

void COMPENSATIONSHT()

{

unsigned long ii;

char m;

ii=((((RH_H*256+RH_L)-221)*318878)/100000);

if(ii>5000)

{

ii=ii+((10000-ii)*620/5000);

}

else

{

ii=ii+ii*620/5000;

}

//  printf("%f\n",ii);

for(m=4;m>=0;m--)

{

if(m==1)

{

write_DATA(".*");

}

LCD_RS=1;

P0=(int)(ii/FACTORIAL(m))+0x30;

if(m==4&P0==0x30)

{

P0=0x20;

}

if(m==4&P0==0x31)

{

write_DATA("100.00*");

break;

}

if(m==3&P0==0x30)

{

P0=0x20;

}

delay(5);

LCD_EN=1;

delay(5);

LCD_EN=0;

ii=ii-((int)(ii/FACTORIAL(m)))*FACTORIAL(m);

}

write_DATA("%*");

}

void InitUart(void)

{

SCON = 0x50;                                  //工作方式1

TMOD = 0x21;

PCON = 0x00;

TH1 = 0xfd;                                   //使用T1作为波特率发生器

TL1 = 0xfd;

TI = 1;

TR1 = 1;                                      //启动T1                                                //启动T1

}

void main()

{

init();

InitUart();

write_GETRH(0x80+0x03);                        //放第一行字符的位置

write_DATA("Humidity*");

write_GETRH(0x80+0x42);                        //放第二行字符的位置

write_DATA("%RH*");

while(1)

{

nSCKPulse(10);                                //复位

STARTSHT11();                                //启动

GETRH(0x05);                                //测湿度命令

SCK=1;

while(DATA);                        //ack为低成功,继续

SCK=0;                                        //一直都为低

DATA=1;

while(DATA);                        //等待300毫秒

READSHT11();

write_GETRH(0x80+0x47);        //放第二行字符的位置

COMPENSATIONSHT();                                //数值转换+显示

putchar(0x02);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值