SHT11程序代码
基于51单片机的DHT11温湿度系统(已调试成功,无需置疑)

/*系统名:基于51单片机的DHT11温湿度系统系统使用说明:通过无线蓝牙进行数据传输,上位机需通过蓝牙调试软件向系统发送命令获取信息,若要获取当前温度、湿度,则发送“?Z”即可。
系统将会自动回复当前温度和湿度。
注意事项:蓝牙需设置成主从模式(即通过AT命令设置蓝牙名和密码相同,再设置成主从模式)蓝牙灯同步闪烁代表蓝牙连接成功。
*/#include "reg51.h"# include <intrins.h>typedef unsigned char BYTE;typedef unsigned int WORD;#define uint unsigned int#define uchar unsigned char/************辅助全局变量块*****************/char t,buf[6],buf_cnt;bit sec,flag,send_flag;/*sec:秒信号;flag:串行口接收到命令标志;send_flag:回复数据标志*//************辅助全局变量块*****************//*************DHT11变量块*******************/sbit io=P3^2; //DHT11数据端接单片机的P3^2口typedef bit BOOL;//此声明一个布尔型变量即真或假uchar data_byte;uchar RH,RL,TH,TL; //TH保存温度,RH保存湿度/*************DHT11变量块*******************///*******************************延时函数*******************************************void delay(uchar ms){uchar i;while(ms--)for(i=0;i<100;i++);}void delay1()//一个for循环大概需要8个多机器周期 一个机器周期为1us 晶振为12MHz 也就是说本函数延时8us多 此延时函数必须德稍微精确一点{uchar i;for(i=0;i<1;i++);}void delay1ms(char t){int i,j;for(i=0;i<t;i++)for(j=0;j<1000;j++);}//***************************延时函数*****************************************//**************************DHT11模块***************************************** void start()//开始信号{io=1;delay1();io=0;delay(25);// 主机把总线拉低必须大于18ms 保证DHT11能检测到起始信号io=1; //发送开始信号结束后 拉高电平延时20-40usdelay1();//以下三个延时函数差不多为24us 符合要求delay1();delay1();}uchar receive_byte()//接收一个字节//{uchar i,temp;for(i=0;i<8;i++)//接收8bit的数据{while(!io);//等待50us的低电平开始信号结束delay1();//开始信号结束之后 延时26us-28us 以下三个延时函数delay1();delay1();temp=0;//时间为26us-28us 表示接收的为数据'0'if(io==1)temp=1; //如果26us-28us之后 还为高电平 则表示接收的数据为'1'while(io);//等待数据信号高电平 '0'为26us-28us '1'为70usdata_byte<<=1;//接收的数据为高位在前 右移data_byte|=temp;}return data_byte;}void receive()//接收数据{uchar T_H,T_L,R_H,R_L,check,num_check,i;start();//开始信号//io=1; //主机设为输入 判断从机 DHT11 响应信号if(!io)//判断从机是否有低电平响应信号//{while(!io);//判断从机发出 80us 的低电平响应信号是否结束//while(io);//判断从机发出 80us 的高电平是否结束 如结束则主机进入数据接收状态R_H=receive_byte();//湿度高位R_L=receive_byte();//湿度低位T_H=receive_byte();//温度高位T_L=receive_byte();//温度低位check=receive_byte();//校验位io=0; //当最后一bit数据接完毕后 从机拉低电平50us//for(i=0;i<7;i++)//差不多50us的延时delay1();io=1;//总线由上拉电阻拉高 进入空闲状态num_check=R_H+R_L+T_H+T_L;if(num_check==check)//判断读到的四个数据之和是否与校验位相同{RH=R_H;RL=R_L;TH=T_H;TL=T_L;check=num_check;}}}//***************************DHT11模块**********************************//**************************中断服务函数块*******************************void ComSer() interrupt 4 //串行口中断服务函数(串口数据接收){if(RI){t=SBUF;buf[buf_cnt++]=t;RI=0;if(t=='Z'){flag=1;buf_cnt=0;}}}//********************************中断服务函数********************************* //************************串行口字符(字符串)发送块************************** void putchar(unsigned char n){SBUF=n;while(!TI);TI=0;}void puts(unsigned char *q){while(*q)putchar(*q++);}void Enter() //换行函数{putchar(0x0d);putchar(0x0a);}void DispNum(unsigned char n){unsigned char t[8]={0};t[0]=n/10+'0';t[1]=n%10+'0';t[2]=0;puts(t);Enter();}//************************串行口字符(字符串)发送块*****************//********************************串行口请求判断块********************void Dill(){if(buf[0]=='?'){delay1ms(50);send_flag=1;}}//********************************串行口请求判断块**************************** //********************************初始化函数块***************************void init_com() //寄存器初始化函数{SCON=0x50; //串行口工作方式0,多机通信,允许接收IE|=0X90; //定时器T1和总中断允许PCON=0X80; //SMOD为1TMOD|=0X21; //T1工作在方式2,T0工作在方式1TH1=250; //T1高八位赋值TR1=1; //T1打开TR0=1; //T0关闭}//********************************初始化函数块*********************void main(){init_com();while(1){receive(); //读取温湿度if(send_flag)//接收到询问{send_flag=0;puts("Wendu:");DispNum(TH);puts("Shidu:");DispNum(RH);Enter();}if(flag){flag=0;ES=0;Dill();ES=1;}}}。
SHT-11传感器特性及设定

SHT-11引脚图其引脚说明如下:(1)GND:接地端;(2)DATA:双向串行数据线;(3)SCK:串行时钟输入;(4)VDD电源端:0.4~5.5V电源端;(5~8)NC:空管脚。
SHT11温湿度传感器的主要特性如下:●将温湿度传感器、信号放大调理、A/D转换、I2C总线接口全部集成于一芯片(CMOSensTM技术);●可给出全校准相对湿度及温度值输出;●带有工业标准的I2C总线数字输出接口;●具有露点值计算输出功能;●具有卓越的长期稳定性;●湿度值输出分辨率为14位,温度值输出分辨率为12位,并可编程为12位和8位;●小体积(7.65×5.08×23.5mm),可表面贴装;●具有可靠的CRC数据传输校验功能;●片内装载的校准系数可保证100%互换性;●电源电压范围为2.4~5.5V;●电流消耗,测量时为550μA,平均为28μA,休眠时为3μA。
SHT-11输出特性(1)湿度值输出SHT11可通过I2C总线直接输出数字量湿度值,其相对湿度数字输出特性曲线如图3所示。
由图3可看出,SHT11的输出特性呈一定的非线性,为了补偿湿度传感器的非线性,可按如下公式修正湿度值:RHlinear=c1+c2SORH+c3SORH2式中,SORH为传感器相对湿度测量值,系数取值如下:12位:SORH:c1=-4,c2=0.0405,c3=-2.8×10-68位:SORH:c1=-4,c2=0.648,c3=-7.2×10-4(2)温度值输出由于SHT11温度传感器的线性非常好,故可用下列公式将温度数字输出转换成实际温度值:T=d1+d2SOT0.01,当温度传感器的分辨率为12位时,04。
(3)露点计算空气的露点值可根据相对湿度和温度值来得出,具体的计算公式如下:LogEW=(0.66077+7.5T/(237.3+T)+[log10(RH)-2]Dp=[(0.66077-logEW)×237.3]/(logEW-8.16077)3.2命令与接口时序SHT11传感器共有5条用户命令,具体命令格式见表1所列。
DHT11程序代码【范本模板】

//现象是循环显示温度和湿度各显示三秒(小数位显示0)//若需将dht11。
c和其他的硬件结合使用,只需在需用到温湿度值的文件加下面声明//extern int wendu, shidu;(wendu是温度值,shidu是湿度值,比实际的温湿度值扩大了十倍) //一、//文件名保存为main.c/********************************************************************************************///除了dht11的接口外,其他的电路原理图与天祥的C51板对应//现象是循环显示温度和湿度各显示三秒#include ”dht11。
h”#include <reg52。
h>sbit DULA = P2^6; //数码管位定义sbit WELA = P2^7;static unsigned char flag; //中断计数标志static unsigned char code array[]= {//数码管编码0x3f,0x06,0x5b,0x4f,0x6,0x6d,0x7d,0x07,0x7f,0x6f};extern int wendu,shidu;static void InitTime(void);void Delay_1ms(unsigned int ms);static void SMG_Display(unsigned int value);int main(void){unsigned char mark = 0;//先等上电稳定Delay_1ms(1000);//因为读一次数据dht11才会触发一次采集数据.//即在先使用数据时采集一次数据ReadTempAndHumi();//因为在两次采集数据需一定的时间间隔,这里还可减少Delay_1ms(3000);//设定定时器InitTime();while(1){//三秒读一次温湿度if(flag == 60){flag = 0;mark++;/*//读温湿度,可检测函数调用是否失败,//函数返回OK(1)表示成功,返回EROR(0)表示失败//OK和EROR是在dht11。
单片机温度湿度控制程序(dht11)

1、温度湿度控制主程序(单片机)#include<reg52.h>#include "dht11.h"#define uchar unsigned char#define uint unsigned intsbit beep=P2^3;sbit k1=P3^2;sbit k2=P3^3;sbit k3=P3^6;sbit k4=P3^7;sbit rs=P3^5;sbit lcden=P3^4;uchar table0[]="T:00.00 TM:00.0 ";//初始化液晶温度实测值以及门限值缓存uchar table1[]="H:00.00 HM:00.0 ";//初始化液晶湿度实测值以及门限值缓存uchar table3[]="This is T/H test";//系统开机显示内容初始化缓存uchar table4[]="Result is coming";//系统开机显示内容初始化缓存static uchar flag;extern int temp_value,humi_value;void Delay_1ms(uint ms);uint TM,HM;void delay(uint x)//{uint a,b;for(a=x;a>0;a--)for(b=10;b>0;b--);}void delay1(uint x)//延时程序{uint a,b;for(a=x;a>0;a--)for(b=100;b>0;b--);}void write_com(uchar com)//液晶写指令操作{P0=com;rs=0;lcden=0;delay(10);lcden=1;delay(10);lcden=0;}void write_date(uchar date)//液晶写数据操作{P0=date;rs=1;lcden=0;delay(10);lcden=1;delay(10);lcden=0;}void init()//液晶初始化{write_com(0x38);delay(1);write_com(0x0c);delay(1);write_com(0x06);delay(1);write_com(0x01);delay(1);}void LCD_Display(uchar buff1[],uchar buff2[])//液晶显示程序{uchar aa;init();//液晶初始化write_com(0x80+16);//写入第一行数据指令delay(1);for(aa=0;aa<16;aa++)//写入第一行待显示数据{write_date(buff1[aa]);}write_com(0xc0+16); //写入第二行数据指令for(aa=0;aa<16;aa++)//写入第一行待显示数据{write_date(buff2[aa]);}for(aa=0;aa<16;aa++){write_com(0x18);delay(1);}}void Tem_Ch(uchar AA,uchar nn)//T门限数值替换{switch(AA){case 0:table0[nn]='0';break;case 1:table0[nn]='1';break;case 2:table0[nn]='2';break;case 3:table0[nn]='3';break;case 4:table0[nn]='4';break;case 5:table0[nn]='5';break;case 6:table0[nn]='6';break;case 7:table0[nn]='7';break;case 8:table0[nn]='8';break;case 9:table0[nn]='9';break;}}void Hum_Ch(uchar BB,uchar mm)//H门限数值替换{switch(BB){case 0:table1[mm]='0';break;case 1:table1[mm]='1';break;case 2:table1[mm]='2';break;case 3:table1[mm]='3';break;case 4:table1[mm]='4';break;case 5:table1[mm]='5';break;case 6:table1[mm]='6';break;case 7:table1[mm]='7';break;case 8:table1[mm]='8';break;case 9:table1[mm]='9';break;}}///////////void YZ_Resh()//门限值更新{uchar A1,A2,A3;A1=TM/10;//取十位A2=TM%10;//取个位A3=0;Tem_Ch(A1,11);//写入对应的液晶显示缓存Tem_Ch(A2,12);//写入对应的液晶显示缓存Tem_Ch(A3,14);//写入对应的液晶显示缓存A1=HM/10;A2=HM%10;A3=0;Hum_Ch(A1,11);Hum_Ch(A2,12);Hum_Ch(A3,14);}void key_test()//按键检测/*根据按键的检测结果进行温度湿度门限值的设定*/{bit kk1;bit kk2;bit kk3;bit kk4;uchar temp;k1=0;k2=1;k3=1;k4=1;kk1=k1;kk2=k2;kk3=k3;kk4=k4;if(kk3!=1){delay1(100);if(kk3!=1)//若可开=0且持续一段时间后任然为0,则执行有关操作{temp=P3;//按键一操作TM=TM+1;//提高温度门限值YZ_Resh();////更新液晶显示缓存的门限值LCD_Display(table0,table1);//液晶显示数值}}if(kk4!=1){delay1(100);if(kk4!=1){temp=P3;//按键二操作TM=TM-1;//降低温度门限值YZ_Resh();////更新液晶显示缓存的门限值LCD_Display(table0,table1);//液晶显示数值}}k1=1;k2=0;k3=1;k4=1;kk1=k1;kk2=k2;kk3=k3;kk4=k4;if(kk3!=1){delay1(100);if(kk3!=1){temp=P3;//按键三操作HM=HM+1;//提高湿度门限YZ_Resh();//更新液晶显示缓存的门限值LCD_Display(table0,table1);//液晶显示数值}}if(kk4!=1){delay1(100);if(kk4!=1){temp=P3;//按键四操作HM=HM-1;//降低湿度门限YZ_Resh();//更新液晶显示缓存的门限值LCD_Display(table0,table1);//液晶显示数值}}}void TempAndHumi_Resh()//更新液晶显示缓存中的温度湿度数值/*根据测得的结果将液晶显示缓存中的数据进行替换*/{uchar ge,shi,bai;ge=temp_value%10;shi=temp_value%100/10;bai=temp_value%1000/100;Tem_Ch(bai,2);Tem_Ch(shi,3);Tem_Ch(ge,5);ge=humi_value%10;shi=humi_value%100/10;bai=humi_value%1000/100;Hum_Ch(bai,2);Hum_Ch(shi,3);Hum_Ch(ge,5);}void beep_control()//警报状态控制函数/*如果实测温度超过门限值则报警*/{if(temp_value>(TM*10)){beep=0;}else{if(humi_value>(HM*10)){beep=0;}else{beep=1;}}}void main(){uint m=0;TM=25;//设定温度初始门限值:25°CHM=50;//设定湿度初始门限值:50%YZ_Resh();//更新液晶显示缓存的门限值beep=1;//关闭蜂鸣器LCD_Display(table3,table4);//显示系统本系统信息while(1){key_test();//监测按键状态,并根据对应按键改变温度湿度门限值,并显示if (m<100)//循环计时,3秒钟{m++;Delay_1ms(30);}else//当m=100时即为3秒时间到,则进行温度湿度数据采集{m=0;ReadTempAndHumi();//采集温度湿度数据TempAndHumi_Resh();//更新液晶显示缓存中的温度湿度数值LCD_Display(table0,table1);//显示当前温度湿度实测值以及门限值}beep_control();//根据门限值以及实测值进行警报状态设置}}#include <reg52.h>#include "dht11.h"#define uchar unsigned char#define uint unsigned int#define NUMBER 20#define SIZE 5sbit dht11=P2^2;static uchar status;static uchar value_array[SIZE];//定义存放DHT11采集的5个字节的数组int temp_value,humi_value;static uchar ReadValue(void);extern void Delay_1ms(uint ms)//毫秒延时,延时时间为ms毫秒{uint x,y;for(x=ms;x>0;x--){for(y=124;y>0;y--);}}static void Delay_10us(void)//10微秒延时{uchar i;i--;i--;i--;i--;i--;i--;}static uchar ReadValue(void)//读一个字节数据的程序{uchar count,value=0,i;status=OK;//设定标志位正常状态for(i=8;i>0;i--){value<<=1;//高位在前进行接收数据count=0;while(dht11==0&&count++<NUMBER);if(count>=NUMBER)//若大于最大数值则出错{status=ERROR;//设定错误标志return 0;//函数执行过程发生错误就退出函数}Delay_10us();//进行30us的延时Delay_10us();Delay_10us();if(dht11!=0)//再次检测是否为高电平{value++;//进入本函数说明信号为1,则进行自加while(dht11!=0&&count++<NUMBER){dht11=1;}if(count>=NUMBER){status=ERROR;return 0;}}}return(value);//返回读取的结果}extern uchar ReadTempAndHumi(void)//读取一次温度湿度数据,共5个字节{uchar i=0,check_value=0,count=0;EA=0;dht11=0;//拉低数据线20msDelay_1ms(20);dht11=1;//释放数据线,以用于检测低电平应答信号Delay_10us();//延时40usDelay_10us();Delay_10us();Delay_10us();if(dht11!=0)//检测应答信号,应答信号为低电平{EA=1;//无低电平。
51单片机 DHT11温控程序可设置温度值

51单片机+DHT11温控程序-可设置温度值基于51单片机的温湿度测量控制程序,使用DHT11数字传感器,用1602液晶屏显示,按键定义如下:sbit key_1=P0^1; //确定按键sbit key_2=P0^2; //按键加sbit key_3=P0^3; // 按键减本程序中用到的头文件 12c5a.h下载:/f/12c5a.rar#include "12c5a.H"#include "intrins.h"unsigned char codenum[]={"0123456789"};//显示字符存储unsigned char codestart_char[]={"Loading...."};unsigned char code t_char[]={"NOW TEMPIS"};unsigned char *pnum=num;unsigned int bbb,ccc,temp,temp_high,temp_low;#define ADC_POWER0x80//ADC power control bit#define ADC_FLAG0x10//ADC complete flag#define ADC_START0x08//ADC start control bit#define ADC_SPEEDLL0x00//540 clocks#define ADC_SPEEDL0x20//360 clocks#define ADC_SPEEDH0x40//180 clocks#define ADC_SPEEDHH0x60//90 clockssbit RS=P3^4; //数据命令选择端sbit RW=P3^5; //读写控制端sbit E=P3^6;//使能信号控制端//sbit key_0=P0^0; //设置按键sbit key_1=P0^1; //确定按键sbit key_2=P0^2; //按键加sbit key_3=P0^3; // 按键减sbit P04=P0^4;sbit P05=P0^5;sbit P06=P0^6;void key_temphigh();void key_templow();void key_scan();void delay_1602(unsigned int a);void init_1602(void);void WR_data_1602(unsigned char adata,unsigned char i);void process(unsigned int shuju);void Delay(unsigned char n){int x;while (n--){x = 500;while (x--);}}void init_ADC(void){P1ASF=0xFF;ADC_RES = 0;ADC_RESL = 0;ADC_CONTR = 0x88;Delay(2);}unsigned int GetResult(void){unsigned char m,n;unsigned int aaa;init_ADC();while (!(ADC_CONTR & ADC_FLAG));//Wait complete flagADC_CONTR =0x80;//Close ADCm=ADC_RES;n=ADC_RESL;aaa=m*4+n;return aaa;}void start_init(void){unsigned char i;WR_data_1602(0x80,0);//显示在第一行for(i=0;i;temp_high-5) {P04=1;P05=0;P06=1;}//上限25else if(temp<temp_low+5) {P04=0;P05=1;P06=1;} // 下限20else {P04=1;P05=1;P06=0;}}void init_1602(void) //初始化{WR_data_1602(0x38,0);WR_data_1602(0x01,0);WR_data_1602(0x06,0);WR_data_1602(0x0c,0);}void WR_data_1602(unsigned char adata,unsigned char i) //写数据i=1,写指令i=0{P2=adata;RS=i;RW=0;E=1;delay_1602(1);E=0;RW=1;RS=0;void process(unsigned int shuju)//显示数据处理{unsigned int a,b,c,d;a=shuju/1000;b=(shuju%1000)/100;c=(shuju%100)/10;d=shuju%10;if(a==0&&b!=0){WR_data_1602(0xc2,0);WR_data_1602(*(pnum+b),1);WR_data_1602(*(pnum+c),1);WR_data_1602('.',1);WR_data_1602(*(pnum+d),1);WR_data_1602('C',1);}if(a==0&&b==0){WR_data_1602(0xc2,0);WR_data_1602(*(pnum+c),1);WR_data_1602('.',1);WR_data_1602(*(pnum+d),1);WR_data_1602('C',1);WR_data_1602(' ',1);}//WR_data_1602(0xc1,0);//显示在第二行//WR_data_1602(' ',1);//WR_data_1602(*(pnum+a),1); //WR_data_1602(*(pnum+b),1); //WR_data_1602(*(pnum+c),1); //WR_data_1602('.',1);//WR_data_1602(*(pnum+d),1); //WR_data_1602('C',1);delay_1602(1);}void main()//主函数{unsigned int mm;init_1602();//初始化start_init();mm=GetResult();temp_high=250;temp_low=90;while(1){key_scan();baojing();ccc=GetResult(); temp=ccc*5.0;process(temp); delay_1602(10); }}。
sht11中文资料_数据手册_参数

万联芯城专注电子元器件配单服务,只售原装 现货库存,万联芯城电子元器件全国供应,专为终端生产,研发 企业提供现货物料,价格优势明显,万联芯城电子元器件BOM配套 业务,客户提交物料清单,商城进行报价,整单采购可享优惠价 ,订单最快可当天发出,为客户节省采购时间,提高生产效率, 点击进入万度传感器-露点完全校准,数字输出-优秀的长期稳定不需要外部组件-超低功耗表面挂载或4-pin完全互换小尺寸自动功率downSHT1x / SHT7x产品SummaryThe SHTxx是单个芯片相对湿度副多传感器模块组成一个calibrateddigital输出。工业 CMOS工艺与专利微加工(CMOSens®技术)的应用,SHT11确保最高的可靠性和优良的长期稳定性。SHT11该装置包括用于相对湿度的电 容式聚合物传感元件和带隙温度传感器。两者都无缝地连接到一个14位模拟到数字转换器和一个串行接口电路在同一芯片上。这导致 了优越的信号质量,快速的响应时间和对外部干扰(EMC)不敏感,在一个非常有竞争力的价格。每个SHTxx都在一个精密的湿度室中单 独校准,并以一个冷镜湿度计作为参考。校准系数被编程到OTPmemory中。这些系数在测量过程中用于内部校准传感器发出的信号。2 线串行接口和内部电压调节,方便快捷的系统集成。它的小尺寸和低功耗使其成为最苛刻的应用程序的最终选择。该设备以表面可安 装的LCC(无铅芯片载体)或可插入的4针单线式封装方式提供。可根据客户要求提供特定的包装选项。1应用程序hvac_automotive_消费 品_气象站_加湿器_除湿器2.2.1串行时钟输入(SCK) SCK用于同步ena单片机与SHTxx之间的通信。SHT11由于接口是完全静态逻辑的, 所以不存在最小的SCKfrequency.2.2.2串行数据(data)数据三态引脚用于在设备内外传输数据。数据在下降沿后发生变化,在串行时钟 SCK上升沿上是有效的。在传输过程中,当SCK高时,数据线必须保持稳定。为了避免信号争用,微控制器应该只驱动低数据。外部上 拉电阻(例如10 kΩ)需要把信号高。(见图2)微控制器的I/O电路中经常包含有上拉电阻。见表5详细IO特征。(1)每个SHTxx测试完全在RH 精度规格25°C (77°F)和48°C (118.4°F)(2)默认的测量分辨率的14位(温度)和12位(湿度)可以减少到12和8位状态寄存器。2.2.3发送命 令启动传输时,必须发出“传输开始”顺序。它包括在SCK高时降低数据行,然后在SCK上降低脉冲,在SCK高时再次提高数据。接下 来的命令由三个地址位(目前只支持“000”)和五个命令位组成。SHTxx通过在第8个SCK时钟下降沿后将数据引脚拉低(ACK位)来指示 正确接收命令。数据线在第9个SCK时钟的下降边缘后被释放(并上升)。SHT11表2SHTxx命令列表2.2.4测量顺序(RH和T)在发出测量命令 (RH为“00000101”,温度为“00000011”)后,控制器必须等待测量完成。对于8/12/14位的测量,这大约需要11/55/210毫秒。与内部振 荡器的速度相比,精确的时间间隔可达±15%。为了表示测量完成,SHTxx向下拉数据线并进入空闲模式。在重新启动SCK读取数据之 前,控制器必须等待这个“数据就绪”信号。测量数据被存储到读出,因此控制器可以继续执行其他任务并方便地读出。然后传输两 个字节的测量数据和一个字节的CRCchecksum。uC必须通过将数据线拉低来识别每个字节。所有值都是MSB优先,右对齐。(例如,第 5个SCK是msb,对于一个12位的值,对于一个8位的结果,SHT11不使用第一个字节)。通信在rc数据的确认位之后终止。如果不使用 CRC-8校验和,控制器可以在测量数据sb之后通过保持ack高电平终止通信。测量和通信结束后,设备自动返回睡眠模式。警告:为了使 自热温度保持在0.1℃以下,shtxxi的激活时间不应超过10%(例如:max。如果与设备失去通信,以下信号序列将重置其串行接口:在保持数 据高的同时,切换sck9或更多次。这之后必须在下一个命令之前执行“传输开始”顺序。此序列仅重置接口。状态寄存器保存其内容。 图4连接复位顺序2.2.6 CRC-8校验和计算整个数字传输由8位校验和保护。它确保任何错误的数据可以被检测和消除。有关如何计算结 直肠癌的资料,请参阅申请须知“CRC-8校验和计算”。
51单片机+DHT11温控程序-可设置温度值
51单片机+DHT11温控程序-可设置温度值基于51 单片机的温湿度测量控制程序,使用DHT11 数字传感器,用1602液晶屏显示,按键定义如下:sbit key_1=P0;//确定按键sbit key_2=P0 ; //按键加sbit key_3=P0;//按键减本程序中用到的头文件12c5a.h 下载:51hei/f/12c5a.rar#include “12c5a.H”#include“intrins.h”unsigned char code num[]={“0123456789”};//显示字符存储unsigned char code start_char[]={“Loading....”};unsigned char code t_char[]={“NOW TEMP IS”};unsigned char *pnum=num;unsigned int bbb,ccc,temp,temp_high,temp_low;#define ADC_POWER 0x80 //ADC power control bit#define ADC_FLAG 0x10 //ADC completeflag#define ADC_START 0x08 //ADC start control bit#define ADC_SPEEDLL 0x00 //540 clocks#define ADC_SPEEDL 0x20 //360 clocks#define ADC_SPEEDH 0x40 //180 clocks#define ADC_SPEEDHH 0x60 //90 clockssbit RS=P3;//数据命令选择端sbit RW=P3 ; //读写控制端sbit E=P3;//使能信号控制端//sbit key_0=P0; //设置按键sbit key_1=P0;//确定按键sbitkey_2=P0 ; //按键加sbit key_3=P0;//按键减sbit P04=P0;sb it P05=P0 ;sbitP06=P0;void key_temphigh();void key_templow();void key_scan();void delay_1602(unsigned int a);void init_1602(void);void WR_data_1602(unsigned char adata,unsigned char i);void process(unsigned int shuju);void Delay(unsigned char n){ int x; while (n--) { x = 500; while (x--); }}void init_ADC(void){P1ASF=0xFF;ADC_RES = 0;ADC_RESL = 0;ADC_CONTR = 0x88;Delay(2);}unsigned int GetResult(void){unsigned char m,n;unsigned int aaa; init_ADC();。
DHT11温湿度传感器51单片机在LCD1602显示程序
//51单片机控制温湿度传感器DHT11然后在LCD1602上显示当前的温湿度及单位其中湿度在第一行显示温度在第二行显示。
单片机为YL-9最小系统。
# include <reg51、h># include <intrins、h>typedef unsigned char BYTE;typedef unsigned int WORD;#define uint unsigned int#define uchar unsigned charsbit io=P1^0;//dht11data端接单片机的P1^0口//sbit rw=P2^1;//一下三行就是设置lcd1602的使能端//sbit rs=P2^0;sbit ep=P2^2;typedef bit BOOL;//此声明一个布尔型变量即真或假//uchar data_byte;uchar RH,RL,TH,TL;//***************延时函数*************************************void delay(uchar ms) //延时模块//{uchar i;while(ms--)for(i=0;i<100;i++);}void delay1()//一个for循环大概需要8个多机器周期一个机器周期为1us晶振为12MHz 也就就是说本函数延时8us多此延时函数必须德稍微精确一点{uchar i;for(i=0;i<1;i++);}//*************************************************************** //lcd模块//BOOL lcd_bz()//测试lcd忙碌状态返回值为布尔型数值真或假'1'、'0' {BOOL result;rs=0; // 读忙信号rw=1;ep=1;_nop_();_nop_();_nop_();_nop_();result = (BOOL)(P2&0x80);ep=0;result ;}void write_cmd(uchar cmd)//写指令//{while (lcd_bz());rs=0;rw=0;ep=0;_nop_();_nop_();P0=cmd ;_nop_();_nop_();_nop_();ep=1;_nop_();_nop_();_nop_();_nop_();ep=0;}void write_addr(uchar addr)//写地址//{write_cmd(addr|0x80);//LCD第一行的首地址为0x80第二行的首地址为0x80+0x40=0xc0 }void write_byte(uchar dat) //写字节//{while (lcd_bz());rs=1;rw=0;ep=0;_nop_();_nop_();P0=dat ;_nop_();_nop_();_nop_();_nop_();ep=1;_nop_();_nop_();_nop_();ep=0;}void lcd_init() //lcd初始化//{write_cmd(0x38);//设置LCD两行显示一个数据由5*7点阵表示,数据由8跟线传输delay(1);write_cmd(0x0c);//清除屏幕显示delay(1);write_cmd(0x06);//设定输入方式增量不移位delay(1);write_cmd(0x01);//开整体显示关光标不闪烁delay(1);}void display(uchar addr,uchar q)//在某一地址上显示内容adder表示的就是地址偏移量q 表示显示的字符或数字//{delay(10); write_addr(addr);write_byte(q);delay(1);//修改此时间可以改变LCD上数值跳变的数度}//**************************dht11测试某块*************************************// void start()//开始信号{io=1;delay1();io=0;delay(25);// 主机把总线拉低必须大于18ms保证DHT11能检测到起始信号io=1; //发送开始信号结束后拉高电平延时20-40usdelay1();//以下三个延时函数差不多为24us符合要求delay1();delay1();}uchar receive_byte()//接收一个字节//{uchar i,temp;for(i=0;i<8;i++)//接收8bit的数据{while(!io);//等待50us的低电平开始信号结束delay1();//开始信号结束之后延时26us-28us以下三个延时函数delay1();delay1();temp=0;//时间为26us-28us表示接收的为数据'0'if(io==1)temp=1; //如果26us-28us之后还为高电平则表示接收的数据为'1'while(io);//等待数据信号高电平'0'为26us-28us'1'为70usdata_byte<<=1;//接收的数据为高位在前右移data_byte|=temp;}return data_byte;}void receive()//接收数据//{uchar T_H,T_L,R_H,R_L,check,num_check,i;start();//开始信号//io=1; //主机设为输入判断从机DHT11响应信号if(!io)//判断从机就是否有低电平响应信号//{while(!io);//判断从机发出80us 的低电平响应信号就是否结束//while(io);//判断从机发出80us 的高电平就是否结束如结束则主机进入数据接收状态R_H=receive_byte();//湿度高位R_L=receive_byte();//湿度低位T_H=receive_byte();//温度高位T_L=receive_byte();//温度低位check=receive_byte();//校验位io=0; //当最后一bit数据接完毕后从机拉低电平50us//for(i=0;i<7;i++)//差不多50us的延时delay1();io=1;//总线由上拉电阻拉高进入空闲状态num_check=R_H+R_L+T_H+T_L;if(num_check==check)//判断读到的四个数据之与就是否与校验位相同{RH=R_H;RL=R_L;TH=T_H;TL=T_L;check=num_check;}}}//*****************************************************************************void main()//主函数模块//{lcd_init();//初始化LCDwhile(1){receive();//接收数据display(0x00,'R');//LCD的第一行显示display(0x01,':');display(0x02,RH/10+0x30); //0x30表示带字库的LCD1602中0x30的位置放有数字0 RH/10+0x30即表示湿度的十位数字在字库RH/10+0x30的位置处放着display(0x03,RH%10+0x30);display(0X04,'%');display(0x40,'T');//LCD的第二行显示display(0x41,':');display(0x42,TH/10+0x30);display(0x43,TH%10+0x30);display(0x44,0xdf);//以下两个就是温度单位的处理display(0x45,0x43);}}另附效果图:。
温湿度传感器SHT11数据手册(中文)版
3.2 温度
由能隙材料 PTAT (正比于绝对温度) 研发的温度 传感器具有极好的线性。可用如下公式将数字输
100nF 的电容,用以去耦滤波。 2.2 串行接口 (两线双向) SHTxx 的串行接口,在传感器信号的读取及电源损耗
信号提拉至高电平(参见图 2)。上拉电阻通常已包 含在微处理器的 I/O 电路中。详细的 IO 特性,参见表 5。
方面,都做了优化处理;但与 I2C 接口不兼容,详情
参见 FAQ .
SORH
c1
c2
c3
12 bit
-4
0.0405 -2.8 * 10-6
8 bit
-4
0.648 -7.2 *Байду номын сангаас10-4
表 6 湿度转换系数
简化的修正算法,可参阅应用说明“相对湿度 与温度的非线性补偿”。 对高于 99%RH 的那些测量值则表示空气已经 完全饱和,必须被处理成显示值均为 100%2RH。 湿度传感器对电压基本上没有依赖性。
DATA
Transmission Start
SCK 1 2 3 4 -8 9
图 4 通讯复位时序
2.2.6 CRC-8 校验 数字信号的整个传输过程由 8bit 校验来确保。任何错 误数据将被检测到并清除。 详情可参阅应用说明“CRC-8 校验”。
图 5 RH 测量时序举例: “0000’1001 ’ 0011’0001”= 2353 = 75.79 %RH (未包含温度补偿)
警告:为保证自身温升低于 0.1℃,SHTxx 的激活时 间不要超过 10%(例如,对应 12bit 精度测量,每秒最 多进行 2 次测量)。
2.2.5 通讯复位时序 如果与 SHTxx 通讯中断,下列信号时序可以复位串 口: 当 DATA 保持高电平时,触发 SCK 时钟 9 次或更多。 在下一次指令前,发送一个“传输启动”时序。这些 时序只复位串口,状态寄存器内容仍然保留。
SHT11温湿度传感器在单片机中的应用
郑州航空工业管理学院《单片机原理与应用》课程设计说明书09 级电气工程及其自动化专业 72 班级题目I2C总线数字温湿度传感器SHT11及其在单片机系统的应用姓名李兴田学号090607215指导教师王义琴职称讲师二О一二年五月28 日一、SHT11温湿度传感器的基本原理SHT11的湿度检测运用电容式结构,并采用具有不同保护的“微型结构”检测电极系统与聚合物覆盖层来组成传感器芯片的电容,除保持电容式湿敏器件的原有特性外,还可抵御来自外界的影响。
由于它将温度传感器与湿度传感器结合在一起而构成了一个单一的个体,因而测量精度较高且可精确得出露点,同时不会产生由于温度与湿度传感器之间随温度梯度变化引起的误差。
CMOSensTM技术不仅将温湿度传感器结合在一起,而且还将信号放大器、模/数转换器、校准数据存储器、标准I2C总线等电路全部集成在一个芯片内。
SHT11传感器的内部结构框图如图2所示。
SHT11的每一个传感器都是在极为精确的湿度室中校准的。
SHT11传感器的校准系数预先存在OTP内存中。
经校准的相对湿度和温度传感器与一个14位的A/D转换器相连,可将转换后的数字温湿度值送给二线I2C总线器件,从而将数字信号转换为符合I2C总线协议的串行数字信号。
由于将传感器与电路部分结合在一起,因此,该传感器具有比其它类型的湿度传感器优越得多的性能。
首先是传感器信号强度的增加增强了传感器的抗干扰性能,保证了传感器的长期稳定性,而A/D转换的同时完成,则降低了传感器对干扰噪声的敏感程度。
其次在传感器芯片内装载的校准数据保证了每一只湿度传感器都具有相同的功能,即具有100%的互换性。
最后,传感器可直接通过I2C总线与任何类型的微处理器、微控制器系统连接,从而减少了接口电路的硬件成本,简化了接口方式。
二、设计方案3.4 系统设计流程图设计SHT11温湿度传感器在单片机中的应用的流程图如下:三、硬件设计图5 单片机与SHT11接口电路及温湿度显示电路(1)湿度值输出SHT11可通过I2C总线直接输出数字量湿度值,其相对湿度数字输出特性曲线如图3所示。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#ifndef __SHT11_H__#define __SHT11_H__/*************************SHT11相关命令**************************/#define TEM_TEST 0x03//温度检测命令#define HUM_TEST 0x05//湿度检测命令#define REG_READ 0x07//读寄存器#define REG_WRITE 0x06//写寄存器#define FUNCTION_SET 0x01//设置SHT11的工作精度为8位/湿度12位温度/**************************SHT11端口定义***************************/sbit SHT11_DATA=P2^0;sbit SHT11_SCK=P2^2;uchar flag_tempeture=0; //显示温度位置的标志uchar flag_humidity=0; //显示湿度位置的标志uchar code str1[]={ 0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//温度图标uchar code str6_sht11[]="%RH ";uchar code str4_sht11[]="humi=";uchar code str2_sht11[]="temp=";uchar code str7_sht11[]=" ";//清除没不要的显示/***************************函数名称:Delay()函数功能:SHT11内部延时****************************/void Delay(){ ;;}/***************************函数名称:Delay_Ms()函数功能:SHT11检测等待延时函数说明:11ms/55ms/210ms 分别对应8位/12位/14位测量结果对应的形参为N 则延时Nms****************************/void Delay_Ms(uint ms){uint i,j;for(i=ms;i>0;i--)for(j=112;j>0;j--);/**************************函数功能:SHT11启动时序***************************/void SHT11_Start(){SHT11_SCK=1;SHT11_DATA=1;Delay();SHT11_DATA=0;Delay();SHT11_SCK=0;Delay();SHT11_SCK=1;Delay();SHT11_DATA=1;}/******************************函数名称:SHT11_Sendbyte(uchar dat) 函数功能: 向SHT11发送8bite数据******************************/ void SHT11_Sendbyte(uchar dat){uchar i;SHT11_SCK=0;Delay();for(i=0;i<8;i++){if(dat&0x80){SHT11_DA TA=1;Delay();}else{SHT11_DA TA=0;Delay();}dat=dat<<1;SHT11_SCK=1;Delay();SHT11_SCK=0;}/*********************************函数名称SHT11_Answer():函数功能:检测SHT11的响应信号(在第九个时钟周期) ***********************************/void SHT11_Answer(){SHT11_SCK=1;Delay();while(SHT11_DATA==1);SHT11_SCK=0;SHT11_DATA=1;}/************************************函数名称:SHT11_Test_Finish()函数功能:检测SHT11温湿度检测是否完毕*************************************/void SHT11_Test_Finish(){while(SHT11_DATA==1);}/************************************函数名称:SHT11_Receivebyte()函数功能:从SHT11接收8bite数据*************************************/uchar SHT11_Receivebyte(){ uchar i;uchar dat;SHT11_SCK=0;Delay();for(i=0;i<8;i++){SHT11_SCK=1;Delay();dat=dat<<1;if(SHT11_DA TA){dat=dat|0x01;Delay();}else{dat=dat&0xfe;Delay();}SHT11_SCK=0;Delay();}SHT11_DATA=1; //释放数据总线return(dat);}/***********************************函数名称:MCU_Answer()函数功能:单片机向SHT11发送应答信号*************************************/void MCU_Answer(){SHT11_SCK=0;Delay();SHT11_DATA=0;Delay();SHT11_SCK=1;Delay();SHT11_SCK=0;Delay();SHT11_DATA=1; //释放数据总线这条指令非常重要不加的话导致单片机不能读取低8位}/***********************************函数名称:SHT11_End()当接收两个8byte数据后部接收CRC校验码************************************/void SHT11_End(){SHT11_DATA=1;SHT11_SCK=1;Delay();SHT11_SCK=0;Delay();}/*************************************函数名称:void SHT11_Write_Register(uchar command ,uchar dat)函数说明:向SHT11的状态寄存器设置功能command为REG_WRITE 0x06写寄存器dat为设置SHT11的功能可以设置检测的数据位数***************************************/void SHT11_Write_Register(uchar command ,uchar dat){SHT11_Start();SHT11_Sendbyte(command);SHT11_Answer();SHT11_Sendbyte(dat);SHT11_Answer();}/***************************************函数名称:uchar SHT11_Read_Register(uchar command)函数说明:command为REG_READ 0x07//读寄存器返回值为状态寄存器的值位6显示当前检测完一次数据后电源供电情况当位6为0时表明VDD>2.47V 当位6为1时表明VDD<2.47V即电量不足位0表明当前的测量分辨率当位0为1时表明测量精度:8位/湿度12位温度当位0为0时表明测量精度:12位湿度14位温度默认为0*******************************************/uchar SHT11_Read_Register(uchar command){uchar dat;SHT11_Start();SHT11_Sendbyte(command);SHT11_Answer();dat=SHT11_Receivebyte();SHT11_End();return(dat);}/***************************************函数名称:SHT11_Measure(uchar command,uint time);函数功能:设置SHT11检测功能,并返回相应的检测结果函数说明:command形参用于设定温度检测还是湿度检测,time形参用于设定检测过程中的等待时间,以确定检测结果的位数11ms/55ms/210ms 分别对应8位/12位/14位****************************************/uint SHT11_Measure(uchar command,uchar time){uint dat=0;uchar data_high,data_low;SHT11_Start();SHT11_Sendbyte(command);SHT11_Answer();Delay_Ms(time);SHT11_Test_Finish();data_high=SHT11_Receivebyte();MCU_Answer();data_low=SHT11_Receivebyte();SHT11_End();dat=(dat|data_high);dat=(dat<<8)|data_low;return(dat);}/****************************************函数名称:Convert_Tempeture(uint dat);函数功能:将检测到的数据转化为相应的温度数据函数说明:温度转换公式--T=d1+d2*SOt公式中的参数d1=-40,d2=0.01适用于14位测量精度*****************************************/float SHT11_Convert_Tempeture14bit(uint dat){float tempeture1;tempeture1=-40+0.01*dat;if(tempeture1>100.0){flag_tempeture=1;}else if(tempeture1<0.0){flag_tempeture=1;}else{flag_tempeture=0;}return(tempeture1);}/*****************************************函数名称:SHT11_Convert_Humidity(uint dat,float temp)函数功能:将检测到的数据转化为相应的湿度数据函数说明:相对湿度转换公式-----RHline=C1+C2*SOrh+C3*SOrh*SOrh(检测数据的线性化SOrh为单片机接收到的数据)-----RHtrue=(tempeture-25)*(t1+t2*SOrh)+RHline公式中的参数:C1=-4,C2=0,0405,C3=-0.0000028t1=0.01,t2=0.00008适用于12位测量精度******************************************/float SHT11_Convert_Humidity12bit(uint dat,float temp) {float RHline,RHtrue;RHline=-4+0.0405*dat-0.0000028*dat*dat;RHtrue=(temp-25)*(0.01+0.00008*dat)+RHline;if(RHtrue<10.0){flag_humidity=1;}else{flag_humidity=0;}return(RHtrue);}/****************************************函数名称:Convert_Tempeture12bit(uint dat);函数功能:将检测到的数据转化为相应的温度数据函数说明:温度转换公式--T=d1+d2*SOt公式中的参数d1=-40,d2=0.04适用于12位测量精度float SHT11_Convert_Tempeture12bit(uint dat){float tempeture1;tempeture1=-40+0.04*dat;if(tempeture1>100.0){flag_tempeture=1;}else{flag_tempeture=0;}return(tempeture1);}*****************************************//*****************************************函数名称:SHT11_Convert_Humidity8bit(uint dat,float temp)函数功能:将检测到的数据转化为相应的湿度数据函数说明:相对湿度转换公式-----RHline=C1+C2*SOrh+C3*SOrh*SOrh(检测数据的线性化SOrh为单片机接收到的数据)-----RHtrue=(tempeture-25)*(t1+t2*SOrh)+RHline公式中的参数:C1=-4,C2=0,648,C3=-0.00072t1=0.01,t2=0.00128适用于12位测量精度float SHT11_Convert_Humidity8bit(uint dat,float temp){float RHline,RHtrue;RHline=-4+0.648*dat-0.00072*dat*dat;RHtrue=(temp-25)*(0.01+0.00128*dat)+RHline;if(RHtrue<10.0){flag_humidity=1;}else{flag_humidity=0;}return(RHtrue);}******************************************/#endif。