温湿度传感器sht10程序

合集下载

sht10温湿度传感器说明.

sht10温湿度传感器说明.

Datasheet SHT1x (SHT10, SHT11, SHT15数字温湿度传感器• 完全标定• 数字信号输出• 低功耗• 卓越的长期稳定性• SMD 封装–适于回流焊接外形尺寸图 1 SHT1x 传感器尺寸(1mm=0.039inch,“ 11”表示该传感器型号为 SHT11。

外部接口:1:GND, 2: DATA, 3: SCK, 4: VDD传感器芯片此说明书适用于 SHT1x-V4。

SHT1x-V4 是第四代硅传感芯片,除了湿度、温度敏感元件以外,还包括一个放大器, A/D 转换器, OTP 内存和数字接口。

第四代传感器在其顶部印有产品批次号,以字母及数字表示,如“ A5Z ”,见图 1。

材质传感器的核心为 CMOS 芯片,外围材料顶层采用环氧 LCP ,底层为 FR4。

传感器符合 ROHS 和WEEE 标准,因此不含 Pb, Cd, Hg, Cr(6+, PBB, PBDE 。

实验包如要进行直接的传感器测量,传感器性能检验或者温湿度实验,客户可选用 EK-H2,其中包括传感器和与电脑配套的软、硬件。

如需进行更复杂的,要求更高的测量,可选用 EK-H3。

它可以同时进行 20个点的温湿度测量。

产品概述SHT1x (包括 SHT10, SHT11 和 SHT15 属于 Sensirion 温湿度传感器家族中的贴片封装系列。

传感器将传感元件和信号处理电路集成在一块微型电路板上,输出完全标定的数字信号。

传感器采用专利的 CMOSens® 技术,确保产品具有极高的可靠性与卓越的长期稳定性。

传感器包括一个电容性聚合体测湿敏感元件、一个用能隙材料制成的测温元件,并在同一芯片上,与 14 位的 A/D 转换器以及串行接口电路实现无缝连接。

因此,该产品具有品质卓越、响应迅速、抗干扰能力强、性价比高等优点。

每个传感器芯片都在极为精确的湿度腔室中进行标定,校准系数以程序形式储存在 OTP 内存中,用于内部的信号校准。

温湿度传感器SHT10驱动程序

温湿度传感器SHT10驱动程序

温湿度传感器SHT10驱动程序——基于MSP430这是暑假时用430的单片机写的温湿度传感器SHT10的程序,参考了官方的51例程,分享一下~~/****************************************Copyright(c)********************************************************************************************LiPeng********************* *************************************--------------FileInfo-------------------------------------------------------------------------------** File Name: Sht10_Driver.c** Created by: LiPeng** Created date: 2008-09-15** Version: 1.0** Descriptions: The original version****------------------------------------------------------------------------------------------------------** Modified by:** Modified date:** Version:** Descriptions:****------------------------------------------------------------------------------------------------------** System Function: Sht10 Driver------温湿度传感器SHT10驱动** 使用MSP430-F413连接方式:** VCC: P6.3** SCK: P6.4** SDA: P6.5*********************************************************************** ***********************************/#include <msp430x14x.h>/*宏定义,延时函数,参数为1时相应延时分别为1us和1ms*/#define CPU_F (double)1000000#define delay_us(x) __delay_cycles((long)(CPU_F * (double)x/1000000.0)) #define delay_ms(x) __delay_cycles((long)(CPU_F * (double)x/1000.0))/*常量定义*/#define uint unsigned int#define uchar unsigned char#define ulong unsigned long//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 bitselect 0x01 //选择温度与湿度的低位读#define noACK 0#define ACK 1#define HUMIDITY 2#define TEMPERATURE 1#define SCK BIT4#define SDA BIT5#define SVCC BIT3#define SCK_H P6OUT|=SCK#define SCK_L P6OUT&=~SCK#define SDA_H P6OUT|=SDA#define SDA_L P6OUT&=~SDA#define SVCC_H P6OUT|=SVCC#define SVCC_L P6OUT&=~SVCCtypedef union{unsigned int i;float f;}value;uint table_temp[3];uint table_humi[3];uint temten;uint humi_true;/******************************************************************** ****************************************Function Name: S_Init**Description: 初始化**Input Parameters: 无**Output Parameters: 无*************************************/void S_Init(){P6SEL&=~(SCK+SDA+SVCC); //选择P6.3 P6.4 为IO端口,输出 P6.5输入P6DIR|=(SCK+SVCC);P6DIR&=~SDA;BCSCTL1=(XT2OFF+RSEL2); //关闭XT2,1MHz DOCDCOCTL=DCO2; //设定DCO频率为1MHz}/******************************************************************** ****************************************Function Name: S_Transstart**Description: 发送开始时序**** generates a transmission start** _____ ________** DATA: |_______|** ___ ___** SCK : ___| |___| |______**Input Parameters: 无**Output Parameters: 无********************************************************************* *************************************/void S_Transstart(){P6DIR|=SDA;SDA_H;SCK_L;_NOP();SCK_H;_NOP();SDA_L;_NOP();SCK_L;_NOP();_NOP();_NOP();SCK_H;_NOP();SDA_H;_NOP();SCK_L;P6DIR&=~SDA;}****************************************Function Name: S_WriteByte**Description: 写时序**Input Parameters: 无**Output Parameters: 无********************************************************************* *************************************/char S_WriteByte(unsigned char value){unsigned char i,error=0;P6DIR|=SDA;for(i=0x80;i>0;i/=2) //shift bit for masking{if(i&value)SDA_H; //masking value with i , write to SENSI-BUSelseSDA_L;SCK_H; //clk for SENSI-BUS_NOP();_NOP();_NOP(); //pulswith approx. 5 usSCK_L;}SDA_H; //release DATA-lineP6DIR&=~SDA; //Change SDA to be inputSCK_H; //clk #9 for ackerror=P6IN; //check ack (DATA will be pulled down by SHT11)error&=SDA;P6DIR|=SDA;SCK_L;if(error)return 1; //error=1 in case of no acknowledgereturn 0;}/******************************************************************** ****************************************Function Name: S_ReadByte**Description: 读时序**Input Parameters: ack--->reads a byte form the Sensibus and gives an acknowledge in case of "ack=1"**Output Parameters: 无********************************************************************* *************************************/char S_ReadByte(unsigned char ack){unsigned char i,val=0;P6DIR|=SDA;SDA_H; //release DATA-lineP6DIR&=~SDA;for(i=0x80;i>0;i/=2) //shift bit for masking{SCK_H; //clk for SENSI-BUSif(P6IN&SDA)val=(val|i); //read bitSCK_L;}P6DIR|=SDA;if(ack) //in case of "ack==1" pull down DATA-LineSDA_L;elseSDA_H;SCK_H; //clk #9 for ack_NOP();_NOP();_NOP(); //pulswith approx. 5 usSCK_L;SDA_H; //release DATA-lineP6DIR&=~SDA;return val;}/******************************************************************** ****************************************Function Name: S_Connectionreset**Description: 通讯复位时序** communication reset: DATA-line=1 and at least 9 SCK cycles followed by transstart** _____________________________________________________ ________** DATA: |_______|** _ _ _ _ _ _ _ _ _ ___ ___** SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______| |___| |______ **Input Parameters: 无**Output Parameters: 无********************************************************************* *************************************/void S_Connectionreset(){unsigned char ClkCnt;P6DIR|=SDA;SDA_H;SCK_L; //Initial statefor(ClkCnt=0;ClkCnt<9;ClkCnt++) //9 SCK cycles{SCK_H;SCK_L;}S_Transstart(); //transmission start}/******************************************************************** ****************************************Function Name: S_Softreset**Description: 软件复位时序resets the sensor by a softreset**Input Parameters: 无**Output Parameters: 无********************************************************************* *************************************/char S_Softreset(){unsigned char error=0;S_Connectionreset(); //reset communicationerror+=S_WriteByte(RESET); //send RESET-command to sensorreturn error; //error=1 in case of no response form the sensor}/******************************************************************** ****************************************Function Name: S_WriteStatusReg**Description: 写状态寄存器**Input Parameters: *p_value**Output Parameters: 无********************************************************************* *************************************/char S_WriteStatusReg(unsigned char *p_value){unsigned char error=0;S_Transstart(); //transmission starterror+=S_WriteByte(STATUS_REG_W); //send command to sensorerror+=S_WriteByte(*p_value); //send value of status registerreturn error; //error>=1 in case of no response form the sensor}/******************************************************************** ****************************************Function Name: S_Mearsure**Description: 读时序 makes a measurement (humidity/temperature) withchecksum**Input Parameters: *p_value ,*p_checknum ,mode**Output Parameters: 无********************************************************************* *************************************/unsigned char S_Measure(unsigned char *p_value, unsigned char*p_checksum, unsigned char mode){unsigned error=0;unsigned int i;S_Transstart(); //transmission startswitch(mode){ //send command to sensorcase TEMPERATURE: error+=S_WriteByte(MEASURE_TEMP); break;case HUMIDITY: error+=S_WriteByte(MEASURE_HUMI); break;}P6DIR&=~SDA;for(i=0;i<65535;i++) //wait until sensor has finished the measurement if((P6IN&SDA)==0)break;if(P6IN&SDA)error+=1; //or timeout (~2 sec.) is reached*(p_value)=S_ReadByte(ACK); //read the first byte (MSB)*(p_value+1)=S_ReadByte(ACK); //read the second byte (LSB)*p_checksum=S_ReadByte(noACK); //read checksumreturn(error);}/******************************************************************** ****************************************Function Name: S_Calculate**Description: 计算**Input Parameters: humi [Ticks] (12 bit)** temp [Ticks] (14 bit)**Output Parameters: humi [%RH]** temp [癈]********************************************************************* *************************************/void S_Calculate(unsigned int *p_humidity ,unsigned int *p_temperature) {const float C1=-4.0; // for 8 Bitconst float C2=+0.648; // for 8 Bitconst float C3=-0.0000072; // for 8 Bitconst float D1=-39.6; // for 12 Bit @ 3Vconst float D2=+0.04; // for 12 Bit @ 3Vconst float T1=0.01; // for 8 bitconst float T2=0.00128; // for 8 bitfloat rh=*p_humidity; // rh: Humidity [Ticks] 12 Bitfloat t=*p_temperature; // t: Temperature [Ticks] 14 Bitfloat rh_lin; // rh_lin: Humidity linearfloat rh_true; // rh_true: Temperature compensated humidityfloat t_C; // t_C : Temperature [癈]t_C=t*D2+D1; //calc. temperature from ticks to [癈]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 ofif(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]}void main(){value humi_val,temp_val;unsigned char error,checksum;unsigned int i,temphigh,templow;unsigned int RegCMD=0x01;WDTCTL=WDTPW+WDTHOLD; //Stop watchdog timer to prevent time out resetS_Init();SVCC_H;S_Connectionreset();S_WriteStatusReg((unsigned char *)&RegCMD);while(1){error=0;error+=S_Measure((unsigned char*) &humi_val.i,&checksum,HUMIDITY);//measure humidityerror+=S_Measure((unsigned char*) &temp_val.i,&checksum,TEMPERATURE); //measure temperatureif(error!=0)S_Connectionreset(); //in case of an error: connection resetelse{templow=(humi_val.i&0xff00);humi_val.i=templow>>8;temphigh=((temp_val.i&0xf)<<8);templow=((temp_val.i&0xff00)>>8);temp_val.i=temphigh+templow;S_Calculate(&humi_val.i,&temp_val.i); //calculate humidity, temperature//temp_val_NOP();//printf("temp:%5.1fC humi:%5.1f%% dewpoint:%5.1fC\n",temp_val.f,humi_val.f,dew_point);}//----------wait approx. 0.8s to avoid heating upSHTxx------------------------------for (i=0;i<40000;i++); //(be sure that the compiler doesn't eliminate this line!)//-----------------------------------------------------------------------------------}}。

实验一 温湿度传感器

实验一 温湿度传感器

图 1-1-6 传感器件位置
(8) 测试完成后, 按下 Sensors 键蓝色按钮, 即关闭传感器板卡电源。 此时传感器断电, 在母板的显示屏上显示“请给传感器模块上电! ” ;再次按下蓝色按钮,即关闭单片机电源。 二. 完成程序并重新烧写程序,并观察显示效果
(1)利用 keil2 软件,打开目录“D:\传感器实验箱资料\传感器实验箱程序资料\C51\ 完成部分程序\完成部分程序”中的 SHT10.Uv2 文件。 (2) 双击打开左侧的“wenshi.c”文件,根据提示完成部分程序。
图 1-1-3 仿真器
3. 烧写程序并观察效果 (1) 切换频率, 把母版右侧上红色的 1、2 按钮都拨到 ON 的位置。 (2) 打开母版电源:即把黑色按钮向上拨动,如图 1-1-4 所示。
图 1-1-4 母板电源开关
(3) 当 (2)中的电源打开时, 观察母板上的显示屏幕中显示的内容。 其显示的内容为 “请 给传感器模块上电! ” 。 (4) 打开 D:\传感器实验箱资料\实验箱系统软件及驱动\STC 手动下载\STC-ISP.exe 烧 写软件,进行烧写,步骤如下。 1 选择 MCU TYPE:STC12LE5A60S2; ○ 2 打开文件: ○ 选择 D:\传感器实验箱资料\传感器实验箱程序资料\C51\SHT10_温湿度传
表 1-1-4 相对湿度的温度补偿转换系数 SORH 12 位 8位 t1 0.01 0.01 t2 0.00008 0.00128
2. 温度 温度计算公式如下所示。
T = d1 + d 2 *SO T
温度转换系数 d1 如下表所示。
表 1-1-5 温度转换系数 d1 VDD 5V 4V 3.5V 3V 2.5V d1(C) -40.1 -39.8 -39.7 -39.6 -39.4 d1(F) -40.2 -39.6 -39.5 -39.3 -38.9

SHT10空气温湿度MODbus协议(单指令)

SHT10空气温湿度MODbus协议(单指令)

SHT10温湿度传感器的通信协议命令包含:1.读取站号命令2.写站号命令3.读取数据4.手动矫正数据串口参数设置:读站号命令(固定命令)主站从站地址功能码H地址L地址 H数据L数据 CRC00 03 00 01 00 01 CRClo CRChi 从站从站地址功能码H地址L地址H数据CRC00 03 02 00 XX CRClo CRChi 注:返回帧与主站相同设备地址:(XX=01-FF)示例:命令00 03 00 01 00 01 D4 1B(固定命令)回复00 03 02 00 FF C5 C4 (设备默认站号FF)写站号命令主站从站地址功能码H地址L地址寄存器个数寄存器个数数据长度数据CRC00 10 00 01 00 01 02 00 XX CRClo CRChi 注:(XX=0X01-0XFF)从站从站地址功能码 H地址L地址寄存器个数CRC00 10 00 01 00 01 CRClo CRChi 示例:命令00 10 00 01 00 01 02 00 33 EA 04回复00 10 00 01 00 01 51 D8读数据主站从站地址功能码 H地址L地址寄存器个数寄存器个数CRCXX 03 00 00 00 02 CRClo CRChi注:(XX=0X01-0XFF)从站从站地址功能码数据长度数据数据CRCXX 03 04 19 AD 1B E4 CRClo CRCh 示例命令FF 03 00 00 00 02 D1 D5回复FF 03 04 19 AD 1B E4 79 FA注:温度:第4,5个字节19 AD温度=读数/100-40度湿度:第5,6个字节1B E4。

基于单片机SHT温湿度传感器检测程序

基于单片机SHT温湿度传感器检测程序

基于51单片机SHT11温湿度传感器检测程序(含电路图)下面是原理图:F面是SHT11与MCU连接的典型电路:下面是源代码:#include <reg52.h>#include <intrins.h>/********************************************************宏定义********************************************************/ #define uint unsigned int#define uchar unsigned char#define noACK 0#define ACK 1#define STATUS_REG_W 0x06#define STATUS_REG_R 0x07#define MEASURE_TEMP 0x03#define MEASURE_HUMI 0x05#define RESET 0x1eenum?{TEMP,HUMI};typedef?union?//定义共用同类型(unsigned?int?i;float?f;} value;/******************************************************** 位定义********************************************************/ sbit lcdrs=P2八0;sbit lcdrw=P2」;sbit lcden=P2八2;sbit SCK = P「0;sbit DATA = P11;/******************************************************** 变量定义********************************************************/ uchar table2[]=〃SHT11 温湿度检测〃; uchar table3[]=〃温度为:℃";uchar table4[]=〃湿度为:〃;uchar table5[]=〃.〃;uchar wendu[6];uchar shidu[6];/******************************************************** 1ms延时函数********************************************************/ void?delay(int?z)(int?x,y;for(x=z;x>0;x--)for(y=125;y>0;y--);)/******************************************************** 50us延时函数********************************************************/ void?delay_50us(uint t)(uint j;for(;t>0;t--)for(j=19;j>0;j--);)/******************************************************** 50ms延时函数********************************************************/ void?delay_50ms(uint t)(uint j;for(;t>0;t--)for(j=6245;j>0;j--);)/******************************************************** 12864液晶写指令********************************************************/ void?write_12864com(uchar com)(lcdrs=0;delay_50us(1);P0=com;lcden=1;delay_50us(10);lcden=0;delay_50us(2);)/******************************************************** 12864液晶写数据********************************************************/ void?write_dat(uchar dat)(lcdrs=1;lcdrw=0;delay_50us(1);P0=dat;lcden=1;delay_50us(10);lcden=0;delay_50us(2);)/******************************************************** 12864液晶初始化********************************************************/ void?init128641cd(void)(delay_50ms(2);write_12864com(0x30);delay_50us(4);write_12864com(0x30);delay_50us(4);write_12864com(0x0f);delay_50us(4);write_12864com(0x01);delay_50us(240);write_12864com(0x06);delay_50us(10);write_12864com(0x0c);delay_50us(10);)/******************************************************** 12864液晶显示函数********************************************************/ void?display1(void)(uchar i;write_12864com(0x80);for(i=0;i<18;i++)(write_dat(table2[i]);delay_50us(1);))/******************************************************** 12864液晶显示函数********************************************************/ void?display2(void)(uchar i;write_12864com(0x90);for(i=0;i<18;i++)(write_dat(table3[i]);delay_50us(1);))/******************************************************** 12864液晶显示函数********************************************************/ void?display3(void)(uchar i;write_12864com(0x88);for(i=0;i<8;i++)(write_dat(table4[i]);delay_50us(1);))/******************************************************** 12864液晶显示函数********************************************************/ void?displaywendu(void)(uchar i;write_12864com(0x94);for(i=0;i<3;i++)(write_dat(wendu[i]);delay_50us(1);)for(i=0;i<1;i++)(write_dat(table5[i]);delay_50us(1);)for(i=4;i<5;i++)(write_dat(wendu[i]);delay_50us(1);))/******************************************************** 12864液晶显示函数********************************************************/ void?displayshidu(void)(uchar i;write_12864com(0x8C);for(i=0;i<3;i++)(write_dat(shidu[i]);delay_50us(1);)for(i=0;i<1;i++)(write_dat(table5[i]);delay_50us(1);)for(i=4;i<5;i++)(write_dat(shidu[i]);delay_50us(1);))/******************************************************** SHT11写字节程序********************************************************/char?s_write_byte(unsigned?char?value)(unsigned?char?i,error=0;for?(i=0x80;i>0;i>>=1)?//高位为 1,循环右移(if?(i&value) DATA=1;?//和要发送的数相与,结果为发送的位 else?DATA=0; SCK=1;_nop_();_nop_();_nop_();?//延时 3usSCK=0;)DATA=1;?//释放数据线SCK=1;error=DATA;?//检查应答信号,确认通讯正常_nop_();_nop_();_nop_();SCK=0;DATA=1;return?error;?//error=1 通讯错误)/******************************************************** SHT11读字节程序********************************************************/char?s_read_byte(unsigned?char?ack)(unsigned?char?i,val=0;DATA=1;?//释放数据线for(i=0x80;i>0;i>>=1)?//高位为 1,循环右移(SCK=1;if(DATA) val=(val|i);?//读一位数据线的值SCK=0;)DATA=!ack;?SCK=1;_nop_();_nop_();_nop_();?//延时 3usSCK=0;_nop_();_nop_();_nop_();DATA=1;?//释放数据线return?val;)/********************************************************SHT11启动传输********************************************************/void?s_transstart(void)(DATA=1; SCK=0;?//准备_nop_();SCK=1;_nop_();DATA=0;_nop_();SCK=0;_nop_();_nop_();_nop_();SCK=1;_nop_();DATA=1;_nop_();SCK=0;)/********************************************************SHT11连接复位********************************************************/void?s_connectionreset(void)(unsigned?char?i;DATA=1; SCK=0;?//准备for(i=0;i<9;i++)?//DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位(SCK=1;SCK=0;)s_transstart();?//启动传输)/******************************************************** SHT11温湿度检测********************************************************/char?s_measure(unsigned?char?*p_value, unsigned?char?*p_checksum, unsigned?charmode)(unsigned error=0;unsigned?int?i;s_transstart();?//启动传输switch(mode)?〃选择发送命令 (case?TEMP : error+=s_write_byte(MEASURE_TEMP);?break;?〃测量温度case?HUMI : error+=s_write_byte(MEASURE_HUMI);?break;?〃测量湿度default?:?break;)for?(i=0;i<65535;i++)?if(DATA==0)?break;?〃等待测量结束if(DATA) error+=1;?//如果长时间数据线没有拉低,说明测量错误 *(p_value) =s_read_byte(ACK);?//读第一个字节,高字节(MSB)*(p_value+1)=s_read_byte(ACK);?//读第二个字节,低字节(LSB) *p_checksum =s_read_byte(noACK);?//read CRC 校验码 return?error;?// error=1 通讯错误)/********************************************************SHT11温湿度值标度变换及温度补偿********************************************************/void?calc_sth10(float?*p_humidity ,float?*p_temperature) (const?float?C1=-4.0;?// 12位湿度精度修正公式const?float?C2=+0.0405;?// 12 位湿度精度修正公式const?float?C3=-0.0000028;?// 12 位湿度精度修正公式 const?float?T1=+0.01;?// 14位温度精度5V条件修正公式 const?float?T2=+0.00008;?// 14位温度精度5V条件修正公式float?rh=*p_humidity;?// rh: 12 位湿度float?t=*p_temperature;?// t: 14 位温度 float?rh_lin;?// rh_lin: 湿度linear 值 float?rh_true;?// rh_true: 湿度 ture 值 float?t_C;?// 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;?//返回湿度结果)/********************************************************主函数********************************************************/ void?main(void)(unsigned?int?temp,humi;value humi_val,temp_val;?//定义两个共同体,一个用于湿度,一个用于温度unsigned?char?error;?//用于检验是否出现错误unsigned?char?checksum;?//CRCinit12864lcd();display1();display2();display3();s_connectionreset();?//启动连接复位while(1)(error=0;?//初始化error=0,即没有错误error+=s_measure((unsigned?char*)&temp_val.i,&checksum,TEMP);?//温度测量error+=s_measure((unsigned?char*)&humi_val.i,&checksum,HUMI);?//湿度测量if(error!=0) s_connectionreset();?////如果发生错误,系统复位else{ _humi_val.f=(float)humi_val.i;?//转换为浮点数temp_val.f=(float)temp_val.i;?//转换为浮点数calc_sth10(&humi_val.f,&temp_val.f);?//修正相对湿度及温度temp=temp_val.f*10;humi=humi_val.f*10;wendu[0]=temp/1000+'0';?//温度百位wendu[1]=temp%1000/100+'0';?//温度十位wendu[2]=temp%100/10+'0';//温度个位wendu[3]=0x2E;?//小数点wendu[4]=temp%10+'0';?//温度小数点后第一位displaywendu();shidu[0]=humi/1000+'0';?//湿度百位shidu[1]=humi%1000/100+'0';?//湿度十位shidu[2]=humi%100/10+'0';?//湿度个位shidu[3]=0x2E;?//小数点shidu[4]=humi%10+'0';?//湿度小数点后第一位displayshidu();)delay(800);//等待足够长的时间,以现行下一次转换) )相关手册资料及源码下载地址:。

SHT10(温湿度传感器)

SHT10(温湿度传感器)

应用领域
框图
_ 暖通空调 HVAC
_ 测试及检测设备
_ 汽车
_ 数据记录器
1
_ 消费品
_ 自动控制
_ 气象站
_ 家电
_ 湿度调节器
_ 医疗
_ 除湿器
湿度 传感

Amplification
14-bit
校验存储器
D A
数字 2-线 接口
& CRC 发生器
SCK DATA
订货信息
型号 测湿精度 测温精度
封装
200 ns
表 5 SHTxx I/O 信号特性
2.3.2 电量不足 “电量不足”功能可监测到 Vdd 电压低于 2.47V 的 状态。精度为±0.05V。
2.3.3 加热元件
传感芯片上集成了一个可通断的加热元件。接通 后,可将 SHTxx 的温度提高大约 5-15℃(9-27℉)。 功耗增加~8mA @ 5V。 应用于:
2.2.2 串行数据 (DATA) DATA三态门用于数据的读取。DATA在 SCK 时
钟下降沿之后改变状态,并仅在 SCK 时钟上升沿有 效。数据传输期间,在SCK 时钟高电平时,DATA必 须保持稳定。为避免信号冲突,微处理器应驱动 DATA 在低电平。需要一个外部的上拉电阻(例如: 10kΩ)将信号提拉至高电平(参见图 2)。上拉电阻 通常已包含在微处理器的 I/O 电路中。详细的 IO 特 性,参见表 5。
DATA
Transmission Start
SCK 1 2
图4
3 4 -8 9 通讯复位时序
2.2.6 CRC-8 校验
数字信号的整个传输过程由 8bit 校验来确保。任 何错误数据将被检测到并清除。 详情可参阅应用说明“CRC-8 校验”。

基于TE6410开发板的湿度传感器sht10驱动实例.

基于TE6410开发板的湿度传感器sht10驱动实例.

#include "stdafx.h"#include "bsp.h"//#include <s3c6410.h>#include <DrvLib.h>#include <winuser.h>#include "shidu.h"// humidity virtual addressstatic volatile S3C6410_GPIO_REG *v_pIOPregs;#define noACK 0 //继续传输数据,用于判断是否结束通讯#define ACK 1 //结束数据传输;//地址命令#define STATUS_REG_W 0x06 //000 00110 写寄存器#define STATUS_REG_R 0x07 //000 00111 读寄存器#define MEASURE_TEMP 0x03 //000 00011 温度测量#define MEASURE_HUMI 0x05 //000 00101 湿度测量#define RESET 0x1e //000 11110 软复位//typedef struct//{// int integer;// int decimal;//}HumHandle;//小数 decimal、整数 integer////// global variable//HumHandle g_Hum;float g_Hum;//----------------------------------------------------------------------------/ /// DLL entry////----------------------------------------------------------------------------/ /BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved){switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:OutputDebugString(L"\n Humidity - DLL_PROCESS_ATTACH\n");RETAILMSG(1,(TEXT("Humidity - DLL_PROCESS_ATTACH\n")));break;case DLL_PROCESS_DETACH:RETAILMSG(1,(TEXT("Humidity - DLL_PROCESS_DETACH\n")));break;case DLL_THREAD_ATTACH:break;case DLL_THREAD_DETACH:break;default:break;}return TRUE;}//----------------------------------------------------------------------------/ /// Delay//----------------------------------------------------------------------------/ /static void Delay(UINT32 count){volatile int i, j = 0;volatile static int loop = S3C6410_ACLK/1000000;for(;count > 0;count--)for(i=0;i < loop; i+=15) { j++; }}static void Delay_ms(UINT32 count){volatile int i, j = 0;volatile static int loop = S3C6410_ACLK/1000;for(;count > 0;count--)for(i=0;i < loop; i+=15) { j++; }}//----------------------------------------------------------------------------------// GPPCON9 =01 "DATA输出" ;=00 "DATA输入"//----------------------------------------------------------------------------------void Data_out(void){v_pIOPregs->GPPCON &= ~(0x3<<(9*2)); //GPP9 = 00v_pIOPregs->GPPCON |= (0x1<<(9*2)); //目的:GPP9 = 01}/*GPPCON & = (0x3<<(8*2)表示0011中的11左移8*2=16位,即将16到17位置1GPPCON & = ((0x3<<(8*2))|(0x3<<(9*2)))表示将16到19位分别置1GPPCON & = ~((0x3<<(8*2))|(0x3<<(9*2)))表示将GPPCON的16到19位分别置0*/void Data_in(void){v_pIOPregs->GPPCON &= ~(0xf<<(9*2));//GPP9 = 00}//----------------------------------------------------------------------------------// GPPCON8 =01 "SCK输出" ;=00 "SCK输入"//----------------------------------------------------------------------------------void Sck_out(void){v_pIOPregs->GPPCON &= ~(0x3<<(8*2)); //GPP8 = 00v_pIOPregs->GPPCON |= (0x1<<(8*2)); //目的:GPP8 = 01}void Sck_1(void){v_pIOPregs->GPPDAT |= (0x1<<8); //SCK=1; GPP8=1 }void Sck_0(void){v_pIOPregs->GPPDAT &= ~(0x1<<8); //SCK=0; GPP8=0 }void Data_1(void){v_pIOPregs->GPPDAT |= (0x1<<9); //DATA=1; GPP9=1 }void Data_0(void){v_pIOPregs->GPPDAT &= ~(0x1<<9); //DATA=1; GPP9=0 }//----------------------------------------------------------------------------------// 启动传输// _____ ________// DATA: |_______|// ___ ___// SCK : ___| |___| |______//----------------------------------------------------------------------------------void s_transstart(void){Data_out();Sck_out();Data_1(); //准备Sck_0(); //准备Delay(2);Sck_1(); //SCK=1;Delay(2);Data_0(); //DATA=0;Delay(2);Sck_0(); //SCK=0 ;Delay(5);Sck_1(); //SCK=1;Delay(2);Data_1(); //DATA=1;Delay(2);Sck_0(); //SCK=0 ;RETAILMSG(1, (TEXT("s_transport\r\n")));}//----------------------------------------------------------------------------------// 连接复位;// _____________________________________________________ ________ // DATA: |_______|// _ _ _ _ _ _ _ _ _ ___ ___// SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______| |___| |______ //----------------------------------------------------------------------------------void s_connectionreset(void){unsigned char i;Data_out();Sck_out();Data_1(); //准备Sck_0(); //准备Delay(1);for(i=0;i<9;i++) //DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位{Sck_1(); //SCK=1;Delay(1);Sck_0(); //SCK=0Delay(1);}s_transstart(); //启动传输RETAILMSG(1, (TEXT("s_connectionreset\r\n")));}//----------------------------------------------------------------------------------// 写字节函数//----------------------------------------------------------------------------------char sth_Wbyte(unsigned char cmd){unsigned char i,j,error=0;//在串口打印信息,显示正在写入数据为测量温度命令或湿度命令if (cmd==MEASURE_TEMP){RETAILMSG(1, (TEXT("write_byte temp\r\n")));}else if (cmd ==MEASURE_HUMI){RETAILMSG(1, (TEXT("write_byte humi\r\n")));}Sck_out();Data_out();for (i=0x80;i>0;i/=2) //高位为1,循环右移{if (i & cmd)Data_1(); // DATA=1 和要发送的数相与,结果为发送的位elseData_0(); //DATA=0;Delay(2);Sck_1(); //SCK=1;Delay(5);Sck_0(); //SCK=0 ;}Data_1(); // DATA=1 释放数据线//写入数据之后,测试ACK处,DATA有没有被拉低Sck_1(); //SCK=1; clk #9 for ackData_in(); //设置gpp9为输入口(input)Delay(2);j = (v_pIOPregs->GPPDAT)&(0x1<<9);if(j){error = 0;error += 1; // 如果长时间数据线没有拉低,说明测量错误RETAILMSG(1, (TEXT("wbyte_ack_ladi: error=%d\r\n"),error));}else{RETAILMSG(1, (TEXT("wbyte_ack_ladi: success\r\n")));}Sck_0(); //SCK=0 ;Data_out();Data_1();RETAILMSG(1, (TEXT("s_wbyte: error=%d\r\n"),error));return error; //error=1 通讯错误}//----------------------------------------------------------------------------------// 读字节函数//----------------------------------------------------------------------------------char sth_Rbyte(unsigned char ack){unsigned char i,j=0,val=0;Data_out();Data_1(); // DATA=1 数据线为高释放数据线Sck_out();Data_in(); //设置gpp9为输入口(input)for(i=0x80; i>0; i/=2) //右移位{Sck_1(); //SCK=1;Delay(2);j = (v_pIOPregs->GPPDAT)&(0x1<<9); //取DATA的值if (j)val = (val | i); /*读数据线的值,或“|”等价于加,即与1对应位加1,其余加0。

TM32F407 IO 口模拟 驱动SHT10 温湿度传感器 C程序

TM32F407   IO 口模拟  驱动SHT10 温湿度传感器 C程序

STM32F407 IO 口模拟驱动SHT10 温湿度传感器C程序#include "sys.h"#include "delay.h"#include "usart.h"#include "led.h"#include "beep.h"#include "key.h"#include "max5481.h"#include "stmflash.h"/////////////////////////////////////////////////////////////////////////////////////#define uchar u8#define uint u16/////////////////////////////////////////////////////////////////////////////////////long loop_coun = 0;int wiper_value = 0;int bug_tx_coun = 0;int bug_tx_once_flag = 1;volatile u32 bug_coun = 0;//虫子数量volatile char bug_coun_flag = 0;u8 BUG_F_Buffer[4]=//虫子个数存储数组{0x00,0x00,0x00,0x00,};#define BUG_F_LENTH sizeof(BUG_F_Buffer)//数组长度#define SIZE (BUG_F_LENTH / 4) + ((BUG_F_LENTH % 4)? 1 : 0)u8 bug_data_temp[BUG_F_LENTH]={0}; int led_run_coun = 0;char all_active_on_off_flag = 0;int pump_on_off_flag = 0;int mag_id_40_on_off_flag = 0;uint temp_data_a = 0;uint temp_data_b = 0;uint temp_data_c = 0;uint temp_data_d = 0;#define QITITANCE_ID 0X01//气体探测板的id号uchar get_co2_cmd_value_buffer[]=//得到CO2 含量{QITITANCE_ID,0x03,0x00,0x00,//第0个寄存器0x00,0x01,//要读取的数据长度0x84,0x0A,//CRC};uchar get_o2_cmd_value_buffer[]=//得到氧气含量{QITITANCE_ID,0x03,0x00,0x01,//第1个寄存器0x00,0x01,//要读取的数据长度0xD5,0xCA,//CRC};uchar get_ph3_cmd_value_buffer[]=//得到磷化氢含量{QITITANCE_ID,0x03,0x00,0x02,//第0个寄存器0x00,0x01,//要读取的数据长度0x25,0xCA,//CRC};uchar get_3_gas_cmd_value_buffer[8]=//得到三种气体含量{QITITANCE_ID,0x03,0x00,0x00,//第0个寄存器0x00,0x03,//要读取的数据长度0x05,0xCB,//CRC};uchar temp_cmd_value_buffer[]=//临时数组{QITITANCE_ID,0x03,0x02,0x00,0x00,};volatile int get_gas_coun = 0;struct SYS_3_GAS_VALUE{int sys_co2;int sys_o2;int sys_ph3;}sys_3_gas_value;int sys_co2 = 0;//325 代表为3.25% 的含量int sys_o2 = 0;//205 代表为20.5% 的含量int sys_ph3 = 0;//260 代表为260ppm 的含量uchar get_gas_crc_h_byte = 0;uchar get_gas_crc_l_byte = 0;uint get_gas_crc = 0;int rec_usart_1_data_judge_flag = 0;int zhu_base_time_coun = 0;//68 06 16//01 03 00 00 00 03 05 CB//01 03 06 00 02 00 CA 00 00 78 8Bint led_run_enable_active_flag = 0;int led_run_on_coun = 0;int rec_usart_2_data_judge_flag = 0;int led_run_uart_2_enable_on_flag = 0;int led_run_uart_2_coun = 0;uchar uart_2_crc_h_byte = 0;uchar uart_2_crc_l_byte = 0;u8 USART_TX_BUF[100]=//485的发送数组{};u8 USART_TX_BUF_2[72]=//网口的发送数组64+8=72个字节前8个字节为0 最后1个为crc值{};int dcf_is_on_coun = 0 ;// 命令中1的个数当大于5的时候,认为命令不合理,放弃执行int dcf_is_on_off_buffer[40]={0};int led_run_uart_2_tx_coun = 0;int uart_2_tx_enable_led_flash_flag = 0;int led_bug_coun = 0;#define UART2_TIME_OUT_MIN_VALUE 600 // 默认10分钟10*60int temp_dcf_id_v = 0;uint humidity_sys = 0;uint temp_sys = 0;float bug_parameter_humidity = 0.0;float bug_parameter_temperature = 0.0;uint test_a = 0;uint test_b = 0;//qqqqqqqqqqqqqqqqqqqqqqq/////////////////////////////////////////////////////////////////////////////////////void power_on_event(void)//eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee{int i;int led_flash_times = 2;//led 闪灯的次数for(i=0;i<led_flash_times;i++){led_run_1;beep_1;delay_ms(200);led_run_0;beep_0;delay_ms(200);}//max_5481_set_wiper_use_24_clock(2,0);//从NV存储器中调出wiper的值。

温湿度传感器SHT10驱动程序

温湿度传感器SHT10驱动程序

温湿度传感器SHT10驱动程序——基于MSP430这是暑假时用430的单片机写的温湿度传感器SHT10的程序,参考了官方的51例程,分享一下~~/****************************************Copyright(c)********************************************************************************************LiPeng********************* *************************************--------------FileInfo-------------------------------------------------------------------------------** File Name: Sht10_Driver.c** Created by: LiPeng** Created date: 2008-09-15** Version: 1.0** Descriptions: The original version****------------------------------------------------------------------------------------------------------** Modified by:** Modified date:** Version:** Descriptions:****------------------------------------------------------------------------------------------------------** System Function: Sht10 Driver------温湿度传感器SHT10驱动** 使用MSP430-F413连接方式:** VCC: P6.3** SCK: P6.4** SDA: P6.5*********************************************************************** ***********************************/#include <msp430x14x.h>/*宏定义,延时函数,参数为1时相应延时分别为1us和1ms*/#define CPU_F (double)1000000#define delay_us(x) __delay_cycles((long)(CPU_F * (double)x/1000000.0)) #define delay_ms(x) __delay_cycles((long)(CPU_F * (double)x/1000.0))/*常量定义*/#define uint unsigned int#define uchar unsigned char#define ulong unsigned long//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 bitselect 0x01 //选择温度与湿度的低位读#define noACK 0#define ACK 1#define HUMIDITY 2#define TEMPERATURE 1#define SCK BIT4#define SDA BIT5#define SVCC BIT3#define SCK_H P6OUT|=SCK#define SCK_L P6OUT&=~SCK#define SDA_H P6OUT|=SDA#define SDA_L P6OUT&=~SDA#define SVCC_H P6OUT|=SVCC#define SVCC_L P6OUT&=~SVCCtypedef union{unsigned int i;float f;}value;uint table_temp[3];uint table_humi[3];uint temten;uint humi_true;/******************************************************************** ****************************************Function Name: S_Init**Description: 初始化**Input Parameters: 无**Output Parameters: 无*************************************/void S_Init(){P6SEL&=~(SCK+SDA+SVCC); //选择P6.3 P6.4 为IO端口,输出 P6.5输入P6DIR|=(SCK+SVCC);P6DIR&=~SDA;BCSCTL1=(XT2OFF+RSEL2); //关闭XT2,1MHz DOCDCOCTL=DCO2; //设定DCO频率为1MHz}/******************************************************************** ****************************************Function Name: S_Transstart**Description: 发送开始时序**** generates a transmission start** _____ ________** DATA: |_______|** ___ ___** SCK : ___| |___| |______**Input Parameters: 无**Output Parameters: 无********************************************************************* *************************************/void S_Transstart(){P6DIR|=SDA;SDA_H;SCK_L;_NOP();SCK_H;_NOP();SDA_L;_NOP();SCK_L;_NOP();_NOP();_NOP();SCK_H;_NOP();SDA_H;_NOP();SCK_L;P6DIR&=~SDA;}****************************************Function Name: S_WriteByte**Description: 写时序**Input Parameters: 无**Output Parameters: 无********************************************************************* *************************************/char S_WriteByte(unsigned char value){unsigned char i,error=0;P6DIR|=SDA;for(i=0x80;i>0;i/=2) //shift bit for masking{if(i&value)SDA_H; //masking value with i , write to SENSI-BUSelseSDA_L;SCK_H; //clk for SENSI-BUS_NOP();_NOP();_NOP(); //pulswith approx. 5 usSCK_L;}SDA_H; //release DATA-lineP6DIR&=~SDA; //Change SDA to be inputSCK_H; //clk #9 for ackerror=P6IN; //check ack (DATA will be pulled down by SHT11)error&=SDA;P6DIR|=SDA;SCK_L;if(error)return 1; //error=1 in case of no acknowledgereturn 0;}/******************************************************************** ****************************************Function Name: S_ReadByte**Description: 读时序**Input Parameters: ack--->reads a byte form the Sensibus and gives an acknowledge in case of "ack=1"**Output Parameters: 无********************************************************************* *************************************/char S_ReadByte(unsigned char ack){unsigned char i,val=0;P6DIR|=SDA;SDA_H; //release DATA-lineP6DIR&=~SDA;for(i=0x80;i>0;i/=2) //shift bit for masking{SCK_H; //clk for SENSI-BUSif(P6IN&SDA)val=(val|i); //read bitSCK_L;}P6DIR|=SDA;if(ack) //in case of "ack==1" pull down DATA-LineSDA_L;elseSDA_H;SCK_H; //clk #9 for ack_NOP();_NOP();_NOP(); //pulswith approx. 5 usSCK_L;SDA_H; //release DATA-lineP6DIR&=~SDA;return val;}/******************************************************************** ****************************************Function Name: S_Connectionreset**Description: 通讯复位时序** communication reset: DATA-line=1 and at least 9 SCK cycles followed by transstart** _____________________________________________________ ________** DATA: |_______|** _ _ _ _ _ _ _ _ _ ___ ___** SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______| |___| |______ **Input Parameters: 无**Output Parameters: 无********************************************************************* *************************************/void S_Connectionreset(){unsigned char ClkCnt;P6DIR|=SDA;SDA_H;SCK_L; //Initial statefor(ClkCnt=0;ClkCnt<9;ClkCnt++) //9 SCK cycles{SCK_H;SCK_L;}S_Transstart(); //transmission start}/******************************************************************** ****************************************Function Name: S_Softreset**Description: 软件复位时序resets the sensor by a softreset**Input Parameters: 无**Output Parameters: 无********************************************************************* *************************************/char S_Softreset(){unsigned char error=0;S_Connectionreset(); //reset communicationerror+=S_WriteByte(RESET); //send RESET-command to sensorreturn error; //error=1 in case of no response form the sensor}/******************************************************************** ****************************************Function Name: S_WriteStatusReg**Description: 写状态寄存器**Input Parameters: *p_value**Output Parameters: 无********************************************************************* *************************************/char S_WriteStatusReg(unsigned char *p_value){unsigned char error=0;S_Transstart(); //transmission starterror+=S_WriteByte(STATUS_REG_W); //send command to sensorerror+=S_WriteByte(*p_value); //send value of status registerreturn error; //error>=1 in case of no response form the sensor}/******************************************************************** ****************************************Function Name: S_Mearsure**Description: 读时序 makes a measurement (humidity/temperature) withchecksum**Input Parameters: *p_value ,*p_checknum ,mode**Output Parameters: 无********************************************************************* *************************************/unsigned char S_Measure(unsigned char *p_value, unsigned char*p_checksum, unsigned char mode){unsigned error=0;unsigned int i;S_Transstart(); //transmission startswitch(mode){ //send command to sensorcase TEMPERATURE: error+=S_WriteByte(MEASURE_TEMP); break;case HUMIDITY: error+=S_WriteByte(MEASURE_HUMI); break;}P6DIR&=~SDA;for(i=0;i<65535;i++) //wait until sensor has finished the measurement if((P6IN&SDA)==0)break;if(P6IN&SDA)error+=1; //or timeout (~2 sec.) is reached*(p_value)=S_ReadByte(ACK); //read the first byte (MSB)*(p_value+1)=S_ReadByte(ACK); //read the second byte (LSB)*p_checksum=S_ReadByte(noACK); //read checksumreturn(error);}/******************************************************************** ****************************************Function Name: S_Calculate**Description: 计算**Input Parameters: humi [Ticks] (12 bit)** temp [Ticks] (14 bit)**Output Parameters: humi [%RH]** temp [癈]********************************************************************* *************************************/void S_Calculate(unsigned int *p_humidity ,unsigned int *p_temperature) {const float C1=-4.0; // for 8 Bitconst float C2=+0.648; // for 8 Bitconst float C3=-0.0000072; // for 8 Bitconst float D1=-39.6; // for 12 Bit @ 3Vconst float D2=+0.04; // for 12 Bit @ 3Vconst float T1=0.01; // for 8 bitconst float T2=0.00128; // for 8 bitfloat rh=*p_humidity; // rh: Humidity [Ticks] 12 Bitfloat t=*p_temperature; // t: Temperature [Ticks] 14 Bitfloat rh_lin; // rh_lin: Humidity linearfloat rh_true; // rh_true: Temperature compensated humidityfloat t_C; // t_C : Temperature [癈]t_C=t*D2+D1; //calc. temperature from ticks to [癈]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 ofif(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]}void main(){value humi_val,temp_val;unsigned char error,checksum;unsigned int i,temphigh,templow;unsigned int RegCMD=0x01;WDTCTL=WDTPW+WDTHOLD; //Stop watchdog timer to prevent time out resetS_Init();SVCC_H;S_Connectionreset();S_WriteStatusReg((unsigned char *)&RegCMD);while(1){error=0;error+=S_Measure((unsigned char*) &humi_val.i,&checksum,HUMIDITY);//measure humidityerror+=S_Measure((unsigned char*) &temp_val.i,&checksum,TEMPERATURE); //measure temperatureif(error!=0)S_Connectionreset(); //in case of an error: connection resetelse{templow=(humi_val.i&0xff00);humi_val.i=templow>>8;temphigh=((temp_val.i&0xf)<<8);templow=((temp_val.i&0xff00)>>8);temp_val.i=temphigh+templow;S_Calculate(&humi_val.i,&temp_val.i); //calculate humidity, temperature//temp_val_NOP();//printf("temp:%5.1fC humi:%5.1f%% dewpoint:%5.1fC\n",temp_val.f,humi_val.f,dew_point);}//----------wait approx. 0.8s to avoid heating upSHTxx------------------------------for (i=0;i<40000;i++); //(be sure that the compiler doesn't eliminate this line!)//-----------------------------------------------------------------------------------}}。

SHT10 SHT11中文资料

SHT10 SHT11中文资料
7.47 0.47 0.80
可以使用标准的回流焊炉对SHT1x 进行焊接。传感 器完全符合IPC/JEDEC J-STD-020D 焊接标准,在最高 260℃温度下,接触时间应小于40 秒。
TP tP
Temperature
TL TS (max)
tL
图 6: 传感器电极的后面, 俯视图. No copper in this field
max 单位 0.01 14 °C bit °C °C °C °C 123.8 254.9 30 °C °F s °C/yr
典型值 最大值 典型值 最大值 典型值 最大值
可完全互换 -40 -40 (63%) 5 < 0.04
± 10 ±8 RH (%RH)
T (°C)
± 2.0
SHT10 SHT11 SHT15
± 3.0 ± 2.5
max 0.05 12
单位 %RH bit %RH %RH %RH %RH
参数 分辨率 1 精度 2 SHT10 精度 2 SHT11 精度 2 SHT15 重复性 互换性 工作范围 响应时间6 漂移
条件
min 0.04 12
typ 0.01 14 0.5 参见图 3 0.4 参见图 3 0.3 参见图 3 0.1
1.8
用于密封/包装的材质
许多材质吸收湿气并将充当缓冲器的角色,这会加 大响应时间和迟滞。因此传感器周边的材质应谨慎 选用。推荐使用的材料有:金属材料, LCP, POM (Delrin),PTFE (Teflon), PE, PEEK,PP, PB, PPS, PSU, PVDF,PVF。 用于密封和粘合的材质(保守推荐):推荐使用充 满环氧树脂的方法进行电子元件的封装,或是硅树 脂。这些材料释放的气体也有可能污染SHT7x(见 1.3)。因此,应最后进行传感器的组装,并将其置 于通风良好处,或在50℃的环境中干燥24小时,以 使其在封装前将污染气体释放。

SHT10温湿度检测设计要点及故障分析

SHT10温湿度检测设计要点及故障分析

引言SHT1x 系列属于Sensorion 传感器家族中的贴片封装系列。

传感器将传感元件和信号处理电路集成在一块微型电路板上,输出完全标定的数据信号。

传感器采用专利的CMOSens 技术,确保产品具有极高的可靠性与卓越的长期稳定性。

传感器包括一个电容聚合体测湿敏感元件、一个能隙材料制成的测温元件,并在同一芯片上,与14位的A/D 转换及串行接口电路实现无缝连接。

因此,该产品具有品质卓越、响应迅速、抗干扰能力强、性价比高等优点,广泛应用于化工、机械、家电等温度及湿度的测量中[1]。

1 SHT10温湿度检测设计要点《开发使用SHTxx 温湿度传感器注意事项》之中提到了包装、运输、焊接、防静电的要求,以及编程使用中应该注意的问题[2],都是设计开发要注意的事项,下面结合空调机组SHT10温湿度检测板的开发过程,分别从安装、硬件、软件方面总结设计要点。

1.1 SHT10温湿度检测板安装设计要点SHT10温湿度检测板安装在空调机组上长期运行,如不进行防尘处理,灰尘积聚在SHT10传感器上,会影响检测精度;冷凝水积聚在检测板上,会造成主板氧化受潮,导致主板失效。

SHT10温湿度检测板安装时注意垂直安装,防止板上积水造成SHT10温湿度检测设计要点及故障分析缪玉珍(珠海格力电器股份有限公司制冷技术研究院 珠海 519070)氧化。

主板在生产时要刷防潮胶进行防护,防止主板在潮湿环境下氧化。

1.2 SHT10温湿度检测板硬件设计要点SHT10温湿度检测板硬件设计要注意在电源处加电容进行滤波去耦,在SHT10传感器的四周开槽隔热,同时也要注意上拉电阻的使用[1]。

规格书上要求数据线DATA 上接10~20K 的上拉电阻,用示波器观察SHT10工作正常,每次发送温度及湿度测试命令,都有数据回传。

在EMC 测试中,却出现不能读到温度及湿度测试数据,报“回风探头故障”,有时能自动恢复,有时不能自动恢复。

用示波器观察EMC 测试中的DATA 与SCK 波形,发现时钟SCK 信号的脉冲输出不全,导致SHT10的I 2C 通讯不正常。

AT89C52与SHT10和1602液晶测温湿度的程序

AT89C52与SHT10和1602液晶测温湿度的程序

/*************端口定义********************P1.0------SCK (SHT10)P1.1------DATA (SHT10)P0------DB0~DB7 (LCD1602)P2.0------RS (LCD1602)P2.1------RW (LCD1602)P2.2------E (LCD1602)*****************************************/#include <reg52.h>#include <intrins.h>#include <stdio.h>#include <string.h>#include <absacc.h>#include <math.h>#define uchar unsigned char#define uint unsigned int//按键设置sbit TEM_UP = P1^2;sbit TEM_DOWN = P1^3;sbit HUM_UP = P1^4;sbit HUM_DOWN = P1^5;sbit SHEZHI_ENTER = P1^6;sbit SHEZHI_EXIT = P1^7;float f_tem_up_value = 50.0;float f_tem_down_value = -30.0;float f_hum_up_value = 10.0;float f_hum_down_value = 100.0;//1602液晶端口定义******sbit LcdRs= P2^0;sbit LcdRw= P2^1;sbit LcdEn= P2^2;sbit ACC0 = ACC^0;sbit ACC7 = ACC^7;uchar str[7];//向LCD写入命令或数据************************************************************#define LCD_COMMAND 0 // Command#define LCD_DATA 1 // Data#define LCD_CLEAR_SCREEN 0x01 // 清屏#define LCD_HOMING 0x02 // 光标返回原点//设置显示模式************************************************************ #define LCD_SHOW 0x04 //显示开#define LCD_HIDE 0x00 //显示关#define LCD_CURSOR 0x02 //显示光标#define LCD_NO_CURSOR 0x00 //无光标#define LCD_FLASH 0x01 //光标闪动#define LCD_NO_FLASH 0x00 //光标不闪动//设置输入模式************************************************************ #define LCD_AC_UP 0x02#define LCD_AC_DOWN 0x00 // default#define LCD_MOVE 0x01 // 画面可平移#define LCD_NO_MOVE 0x00 //defaultunsigned char LCD_Wait(void);void LCD_Write(bit style, unsigned char input);/***********1602液晶显示部分子程序****************/void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void LCD_Write(bit style, unsigned char input){LcdRs=style;P0=input;delay(5);LcdEn=1;delay(5);LcdEn=0;}void LCD_SetDisplay(unsigned char DisplayMode){LCD_Write(LCD_COMMAND, 0x08|DisplayMode);}void LCD_SetInput(unsigned char InputMode){LCD_Write(LCD_COMMAND, 0x04|InputMode);}//初始化LCD************************************************************ void LCD_Initial(){LcdEn=0;LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵LCD_Write(LCD_COMMAND,0x38);LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动}//液晶字符输入的位置************************void GotoXY(unsigned char x, unsigned char y){if(y==0)LCD_Write(LCD_COMMAND,0x80|x);if(y==1)LCD_Write(LCD_COMMAND,0x80|(x-0x40));}//将字符输出到液晶显示void Print(unsigned char *str){while(*str!='\0'){LCD_Write(LCD_DATA,*str);str++;}}void zhuanhuan(float a)//浮点数转换成字符串函数{memset(str,0,sizeof(str));sprintf (str,"%f", a);}void welcome(){LCD_Initial();GotoXY(0,0);Print(" Welcome! ");GotoXY(0,1);Print(" Code of sht10 ");delay(200);}/*--------------------------------------;模块名称:delay_n10us();;功能:延时函数,延时约n个10us较精确的延时函数,"_nop_()"延时1us12M晶振;-------------------------------------*/void delay_n10us(uint n) //延时n个10us12M晶振{uint i;for(i=n;i>0;i--){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}}//*********************第一部分LCD1602设置END****************************************//*********************第二部分DHT90设置START****************************************sbit SCK = P1^0; //定义通讯时钟端口sbit DATA = P1^1; //定义通讯数据端口typedef union{ unsigned int i; //定义了两个共用体float f;} value;enum {TEMP,HUMI}; //TEMP=0,HUMI=1#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/****************定义函数****************/void s_transstart(void); //启动传输函数void s_connectionreset(void); //连接复位函数char s_write_byte(unsigned char value);//DHT90写函数char s_read_byte(unsigned char ack); //DHT90读函数char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode);//测量温湿度函数void calc_dht90(float *p_humidity ,float *p_temperature);//温湿度补偿/*--------------------------------------;模块名称:s_transstart();;功能:启动传输函数;-------------------------------------*/void s_transstart(void)// generates a transmission start// _____ ________// DATA: |_______|// ___ ___// SCK : ___| |___| |______{DA TA=1; SCK=0; //Initial state_nop_();SCK=1;_nop_();DA TA=0;_nop_();SCK=0;_nop_();_nop_();_nop_();SCK=1;_nop_();DA TA=1;_nop_();SCK=0;}/*--------------------------------------;模块名称:s_connectionreset();;功能:连接复位函数;-------------------------------------*/void s_connectionreset(void)// communication reset: DATA-line=1 and at least 9 SCK cycles followed by transstart// _____________________________________________________ ________ // DATA: |_______|// _ _ _ _ _ _ _ _ _ ___ ___// SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______| |___| |______{unsigned char i;DATA=1; SCK=0; //Initial statefor(i=0;i<9;i++) //9 SCK cycles{SCK=1;SCK=0;}s_transstart(); //transmission start}/*--------------------------------------;模块名称:s_write_byte();;功能:SHT10写函数;-------------------------------------*/char s_write_byte(unsigned char value)//----------------------------------------------------------------------------------// writes a byte on the Sensibus and checks the acknowledge{unsigned char i,error=0;for (i=0x80;i>0;i/=2) //shift bit for masking{if (i & value) DA TA=1; //masking value with i , write to SENSI-BUSelse DATA=0;SCK=1; //clk for SENSI-BUS_nop_();_nop_();_nop_(); //pulswith approx. 3 usSCK=0;}DATA=1; //release DATA-lineSCK=1; //clk #9 for ackerror=DATA; //check ack (DA TA will be pulled down by DHT90),DATA在第9个上升沿将被DHT90自动下拉为低电平。

基于温湿sht10度测量显示电路设计40;有仿真图41;

基于温湿sht10度测量显示电路设计40;有仿真图41;
ALE/PROG:当访问外部存储器时,地址锁存允许地输出电平用于锁存地址地地位字节.在FLASH编程期间,此引脚用于输入编程脉冲.在平时,ALE端以不变地频率周期输出正脉冲信号,此频率为振荡器频率地1/6.因此它可用作对外部输出地脉冲或用于定时目地.然而要注意地是:每当用作外部数据存储器时,将跳过一个ALE脉冲.如想禁止ALE地输出可在SFR8EH地址上置0.此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用.另外,该引脚被略微拉高.如果微处理器在外部执行状态ALE禁止,置位无效.
图3 SHT10与单片机地连接
4系统软件设计
本设计软件编程分为以下三个部分:
(1)温、湿度传感器SHT10测量程序;
(2)液晶显示程序;
(3)单片机与上位机数据通信程序.
4.1温湿度测量程序设计
SHT10传感器工作时首先对数据传输进行初始化来启动SHT10测量时序,即在第一个SCK时钟高电平时,DA TA翻转为低电平,并在第二个SCK时钟高电平时,DATA翻转为高电平.SHT10测量命令包含3个地址位和5个命令位.单片机发布一组8 bit测量命令后,DATA在第8个SCK时钟地下降沿被置为低电平.再发送第9个SCK时钟作为命令确认,DA2TA在其下降沿后,恢复为高电平.同时,单片机可暂时停止发送时钟序列以进入空闲模式,准备读取测量数据.SHT10在转换结束后,将DATA置为低电平,单片机继续发出时钟序列,来读取2个8 bit地测量数据和1个8 bit地CRC奇偶校验.所有数据从MSB开始,右值有效.其中,在每个字节传输结束后,均需要发出一个时钟高电子ACK,并将DATA置为低电平,以确认读取成功.在测量和传输结束后,SHT10自动转入休眠模式.
设计要求:在单片机最小系统地基础上扩展一片SHT10集成传感器,测量环境地温度湿度并通过6位LED数码管动态显示测量值.

温湿度传感器sht10程序

温湿度传感器sht10程序

温湿度传感器s h t10程序(总1页)本页仅作为文档封面,使用时可以删除This document is for reference only-rar21year.March#include <>#include <>#include <>sbit DATA=P1^1; 复位湿度的12测量以及温度的14位精度测量补偿及修正温湿度计数并得出绝对湿度{ float dew_point;unsigned char error,checksum;unsigned char HUMI,TEMP;HUMI=0X01;TEMP=0X02;// init_uart();s_connectionreset();while(1){ error=0;error+=s_measure((unsigned char*) &,&checksum,HUMI); //湿度测量 error+=s_measure((unsigned char*) &,&checksum,TEMP); //温度测量 if(error!=0) s_connectionreset(); //如果发生错误,系统复位 else{ =(float); //转换为浮点数=(float); //转换为浮点数calc_sth11(&,&; //修正相对湿度及温度dew_point=calc_dewpoint,; //计算绝对湿度值// printf("temp:% humi:%%% dew point:%\n",,,dew_point);}delay(800); //等待足够长的时间,以现行下一次转换}}。

AT89C52与SHT10和1602液晶测温湿度的程序

AT89C52与SHT10和1602液晶测温湿度的程序

/*************端口定义********************P1.0------SCK (SHT10)P1.1------DATA (SHT10)P0------DB0~DB7 (LCD1602)P2.0------RS (LCD1602)P2.1------RW (LCD1602)P2.2------E (LCD1602)*****************************************/#include <reg52.h>#include <intrins.h>#include <stdio.h>#include <string.h>#include <absacc.h>#include <math.h>#define uchar unsigned char#define uint unsigned int//按键设置sbit TEM_UP = P1^2;sbit TEM_DOWN = P1^3;sbit HUM_UP = P1^4;sbit HUM_DOWN = P1^5;sbit SHEZHI_ENTER = P1^6;sbit SHEZHI_EXIT = P1^7;float f_tem_up_value = 50.0;float f_tem_down_value = -30.0;float f_hum_up_value = 10.0;float f_hum_down_value = 100.0;//1602液晶端口定义******sbit LcdRs= P2^0;sbit LcdRw= P2^1;sbit LcdEn= P2^2;sbit ACC0 = ACC^0;sbit ACC7 = ACC^7;uchar str[7];//向LCD写入命令或数据************************************************************#define LCD_COMMAND 0 // Command#define LCD_DATA 1 // Data#define LCD_CLEAR_SCREEN 0x01 // 清屏#define LCD_HOMING 0x02 // 光标返回原点//设置显示模式************************************************************ #define LCD_SHOW 0x04 //显示开#define LCD_HIDE 0x00 //显示关#define LCD_CURSOR 0x02 //显示光标#define LCD_NO_CURSOR 0x00 //无光标#define LCD_FLASH 0x01 //光标闪动#define LCD_NO_FLASH 0x00 //光标不闪动//设置输入模式************************************************************ #define LCD_AC_UP 0x02#define LCD_AC_DOWN 0x00 // default#define LCD_MOVE 0x01 // 画面可平移#define LCD_NO_MOVE 0x00 //defaultunsigned char LCD_Wait(void);void LCD_Write(bit style, unsigned char input);/***********1602液晶显示部分子程序****************/void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void LCD_Write(bit style, unsigned char input){LcdRs=style;P0=input;delay(5);LcdEn=1;delay(5);LcdEn=0;}void LCD_SetDisplay(unsigned char DisplayMode){LCD_Write(LCD_COMMAND, 0x08|DisplayMode);}void LCD_SetInput(unsigned char InputMode){LCD_Write(LCD_COMMAND, 0x04|InputMode);}//初始化LCD************************************************************ void LCD_Initial(){LcdEn=0;LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵LCD_Write(LCD_COMMAND,0x38);LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动}//液晶字符输入的位置************************void GotoXY(unsigned char x, unsigned char y){if(y==0)LCD_Write(LCD_COMMAND,0x80|x);if(y==1)LCD_Write(LCD_COMMAND,0x80|(x-0x40));}//将字符输出到液晶显示void Print(unsigned char *str){while(*str!='\0'){LCD_Write(LCD_DATA,*str);str++;}}void zhuanhuan(float a)//浮点数转换成字符串函数{memset(str,0,sizeof(str));sprintf (str,"%f", a);}void welcome(){LCD_Initial();GotoXY(0,0);Print(" Welcome! ");GotoXY(0,1);Print(" Code of sht10 ");delay(200);}/*--------------------------------------;模块名称:delay_n10us();;功能:延时函数,延时约n个10us较精确的延时函数,"_nop_()"延时1us@12M晶振;-------------------------------------*/void delay_n10us(uint n) //延时n个10us@12M晶振{uint i;for(i=n;i>0;i--){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}}//*********************第一部分LCD1602设置END****************************************//*********************第二部分DHT90设置START****************************************sbit SCK = P1^0; //定义通讯时钟端口sbit DATA = P1^1; //定义通讯数据端口typedef union{ unsigned int i; //定义了两个共用体float f;} value;enum {TEMP,HUMI}; //TEMP=0,HUMI=1#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/****************定义函数****************/void s_transstart(void); //启动传输函数void s_connectionreset(void); //连接复位函数char s_write_byte(unsigned char value);//DHT90写函数char s_read_byte(unsigned char ack); //DHT90读函数char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode);//测量温湿度函数void calc_dht90(float *p_humidity ,float *p_temperature);//温湿度补偿/*--------------------------------------;模块名称:s_transstart();;功能:启动传输函数;-------------------------------------*/void s_transstart(void)// generates a transmission start// _____ ________// DATA: |_______|// ___ ___// SCK : ___| |___| |______{DA TA=1; SCK=0; //Initial state_nop_();SCK=1;_nop_();DA TA=0;_nop_();SCK=0;_nop_();_nop_();_nop_();SCK=1;_nop_();DA TA=1;_nop_();SCK=0;}/*--------------------------------------;模块名称:s_connectionreset();;功能:连接复位函数;-------------------------------------*/void s_connectionreset(void)// communication reset: DATA-line=1 and at least 9 SCK cycles followed by transstart// _____________________________________________________ ________ // DATA: |_______|// _ _ _ _ _ _ _ _ _ ___ ___// SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______| |___| |______{unsigned char i;DATA=1; SCK=0; //Initial statefor(i=0;i<9;i++) //9 SCK cycles{SCK=1;SCK=0;}s_transstart(); //transmission start}/*--------------------------------------;模块名称:s_write_byte();;功能:SHT10写函数;-------------------------------------*/char s_write_byte(unsigned char value)//----------------------------------------------------------------------------------// writes a byte on the Sensibus and checks the acknowledge{unsigned char i,error=0;for (i=0x80;i>0;i/=2) //shift bit for masking{if (i & value) DA TA=1; //masking value with i , write to SENSI-BUSelse DATA=0;SCK=1; //clk for SENSI-BUS_nop_();_nop_();_nop_(); //pulswith approx. 3 usSCK=0;}DATA=1; //release DATA-lineSCK=1; //clk #9 for ackerror=DATA; //check ack (DA TA will be pulled down by DHT90),DATA在第9个上升沿将被DHT90自动下拉为低电平。

sht10温湿度传感器说明

sht10温湿度传感器说明
3 在25℃和1m/s 气流的条件下,达到一阶响应63%所需要的时 间。
4 在挥发性有机混合物中数值可能会高一些。见说明书1.3。 5 此数值为 VDD=5.5V 在温度为 25°C 时, 12bit 测量,1 次/秒条件下
的平均值
6 响应时间取决于传感器底层的热容和热阻。
Relative Humidity (%)
2.6 MAX 0.8 ±0.1
2.2 MAX
图1 SHT1x 传感器尺寸(1mm=0.039inch),“11”表示该传感 器型号为SHT11。 外部接口:1:GND, 2: DATA, 3: SCK, 4: VDD
每个传感器芯片都在极为精确的湿度腔室中进行标 定,校准系数以程序形式储存在OTP 内存中,用 于内部的信号校准。两线制的串行接口与内部的电 压调整,使外围系统集成变得快速而简单。微小的 体积、极低的功耗,使SHT1x 成为各类应用的首 选。
1.9 布线规则和信号完整性 如果SCK和DATA信号线相互平行并且非常接近, 有可能导致信号串扰和通讯失败。解决方法是在两 个信号线之间放置VDD和/或GND,将信号线隔 开,和使用屏蔽电缆。此外,降低SCK频率也可能 提高信号传输的完整性。如使用导线,应在电源引 脚(VDD,GND)之间加一个100nF的去藕电容, 用于滤波。此电容应尽量靠近传感器。详情可参阅
1.8 用于密封/包装的材质 许多材质吸收湿气并将充当缓冲器的角色,这会加 大响应时间和迟滞。因此传感器周边的材质应谨慎 选用。推荐使用的材料有:金属材料, LCP, POM (Delrin),PTFE (Teflon), PE, PEEK,PP, PB, PPS, PSU, PVDF,PVF。
用于密封和粘合的材质(保守推荐):推荐使用充 满环氧树脂的方法进行电子元件的封装,或是硅树 脂。这些材料释放的气体也有可能污染SHT7x(见 1.3)。因此,应最后进行传感器的组装,并将其置 于通风良好处,或在50℃的环境中干燥24小时,以 使其在封装前将污染气体释放。

sht10工作原理

sht10工作原理

sht10工作原理温湿度传感器是一种广泛应用于工业自动化控制、环境监测、医疗器械、农业研究等领域的传感器。

通过测量环境中的温度和湿度,可以帮助我们了解环境条件,保障生产和生活的质量。

在这方面,SHT10温湿度传感器作为一种常用的传感器设备,其工作原理和应用十分重要。

SHT10温湿度传感器是瑞士Sensirion公司生产的一种数字式温湿度传感器,采用表面微机电系统(Surface Micro Electro-Mechanical System, S-MEMS)技术,具有高精度、长期稳定性、响应速度快等特点。

传感器内部集成了温度传感器和湿度传感器,通过数字接口可以方便地与微控制器等单片机设备进行通信。

SHT10传感器的工作原理主要包括湿度测量和温度测量两个部分。

在正常工作状态下,SHT10传感器会不断地采样环境中的温湿度数据,并将数据通过数字接口输出,供用户进行进一步的处理和分析。

SHT10温湿度传感器工作原理的详细解析如下:一、温度测量原理SHT10传感器内部集成了一颗高精度的热敏电阻,用来测量环境中的温度。

热敏电阻是一种阻值随温度变化的电阻元件,其阻值随温度的变化规律可以通过热敏电阻的特性曲线来描述。

SHT10传感器内部的热敏电阻是一种硅微机电元件,其阻值随温度的变化规律符合斯特恩-沃尔什定律,即在绝对温标下热敏电阻的阻值与温度成指数关系。

这种特性使得SHT10传感器可以通过测量热敏电阻的阻值变化来准确地计算环境中的温度。

SHT10传感器的温度测量原理主要可以分为以下几个步骤:1. 看电阻温度传感器的表面微机电系统技术:SHT10传感器内部的热敏电阻通过表面微机电系统技术制作成微小的敏感元件,能够高灵敏地反映环境温度的变化。

2. 采样环境温度:SHT10传感器通过热敏电阻感知环境中的温度,并将感知到的温度转换为相应的电信号。

3. 转换为数字信号:传感器内部的模数转换电路将温度转换的模拟信号转换为数字信号,以便于后续处理和通信。

温湿度传感器sht10程序

温湿度传感器sht10程序
*(p_value+1)=s_read_byte(ACK); //读第二个字节,低字节(LSB)
*p_checksum =s_read_byte(noACK); //read CRC校验码
return error;
}
//----------------------------------------------------------------------------------
for (i=0x80;i>0;i/=2) //高位为1,循环右移
{ if (i & value) DATA=1; //和要发送的数相与,结果为发送的位
else DATA=0;
SCK=1;
_nop_();_nop_();_nop_();
SCK=0;
}
DATA=1; //释放数据线
// DATA_IO=1;
char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)
//----------------------------------------------------------------------------------
SCK=1;
error=DATA; //检查应答信号,确认通讯正常
SCK=0;
return error; //error=1通讯错误
}
//----------------------------------------------------------------------------------
//void init_uart(void)
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#in elude <reg51.h>#in elude <math.h>#in elude vintrin s.h> sbit DATA=P1M; II定义通讯数据端口//#define DATA_IO TRISC7 II 用于设置10 状态sbit SCK=P1A0; II定义通讯时钟端口#defi ne no ACK 0 〃继续传输数据,用于判断是否结束通讯#defi ne ACK 1 〃结束数据传输;II地址命令#defi ne MEASURE_TEMP 0x03 II000 00011#defi ne MEASURE_HUMI 0x05 II000 00101IIvoid in it_uart(void); 〃初始化void s_conn eeti on reset(void);void s_tra nsstart(void);char s_measure (un sig ned char *p_value, un sig ned char *p_checksum, un sig ned char mode); char s_write_byte( un sig ned char value);char s_read_byte( un sig ned char ack);void calc_sth11(float *p_humidity ,float *p_temperature);float calc_dewpo in t(float h,float t);void delay (un sig ned int time);union{ un sig ned int i;float f;}humi_val,temp_val; II定义两个共同体,一个用于湿度,一个用于温度I*******************************************************************************延时1MS带参数(int)子程序*******************************************************************************Ivoid delay (un sig ned int time){un sig ned int a,b;for(a=0;a<time;a++){for(b=0;b<88;b++);}}II ------------------------------------------------------------------------------IIvoid ini t_uart(void)II --------------------------------------------------------------------------------//端口初始化//{〃TRISC7=0;〃TRISC6=0;//}// --------------------------------------------------------------------------------void s_conn ecti on reset(void)// --------------------------------------------------------------------------------//连接复位;// _______________________________________________// DATA://// SCK :」__| |__| |__|」| |」__|」__| | ___________{un sig ned char i;DATA=1; SCK=0; for(i=0;i<9;i++)通迅即复位{ SCK=1;SCK=0;}s_tra nsstart();// 启动传输 }// --------------------------------------------------------------------------------void s_tra nsstart(void)// --------------------------------------------------------------------------------//启动传输// ___________ _______________// DATA:| ______ | // ___ ___// SCK : ___||___| | _____ {DATA=1;SCK=0;_nop_();SCK=1;_nop_();DATA=0;_nop_();SCK=0;_nop_() ;_n op_();_ no p_();SCK=1;_nop_(); //准备 //DATA 保持高, SCK 时钟触发9次,发送启动传输,DATA=1;_nop_();SCK=O;// --------------------------------------------------------------------------------char s_measure (un sig ned char *p_value, un sig ned char *p_checksum, un sig ned char mode)// --------------------------------------------------------------------------------〃进行温度或者湿度转换,由参数mode决定转换内容;{un sig ned error=0;un sig ned char i;s_tra nsstart(); // 启动传输switch(mode){case 02 : error+=s_write_byte(MEASURE_TEMP); break;case 01 : error+=s_write_byte(MEASURE_HUMI); break;default : break;}for (i=0;i<110;i++){delay(2);if(DA TA==0) break; // 等待测量结束;}if(DA TA) error+=1; //如果长时间数据线没有拉低,说明测量错误*(p_value) =s_read_byte(ACK); // 读第一个字节,高字节(MSB)*(p_value+1)=s_read_byte(ACK); // 读第二个字节,低字节(LSB)*p_checksum =s_read_byte(noACK); //read CRC 校验码return error;}// -------------------------------------------------------------------------------- char s_write_byte( un sig ned char value)// -------------------------------------------------------------------------------- //写字节函数{un sig ned char i,error=0; for (i=0x80;i>0;i/=2){ if (i & value) DATA=1; elseDATA=0;SCK=1;_no p_();_ nop_();_nop_(); SCK=0; }DATA=1;〃高位为1,循环右移//和要发送的数相与,结果为发送的位//释放数据线// DATA_IO=1;SCK=1;error=DATA;SCK=0; returnerror;}〃检查应答信号,确认通讯正常〃error=1通讯错误// --------------------------------------------------------------------------------- char s_read_byte( un sig ned char ack)// --------------------------------------------------------------------------------- //读数据;{un sig ned char i,val=0;// DATA_IO=0;DATA=1;〃DATA_IO=1;for (i=0x80;i>0;i/=2){ SCK=1;if (DATA) val=(val | i);SCK=0;}// DATA_IO=0;DATA=!ack;SCK=1;_nop_() ;_n op_();_ no p_();SCK=0;DATA=1;return val;}//数据线为高//右移位//读数据线的值//如果是校验,读取完后结束通讯;//释放数据线// -------------------------------------------------------------------------------------- void calc_sth11(float *p_humidity ,float *p_temperature)// -------------------------------------------------------------------------------------- //补偿及输出温度和相对湿度{ const float C1= -4.0;const float C2=+0.0405;con st float C3=-0.0000028; con st floatT1=+0.01;const float T2=+0.00008; // for 12 Bit湿度修正公式// for 12 Bit湿度修正公式// for 12 Bit湿度修正公式// for 14 Bit @ 5V 温度修正公式// for 14 Bit @ 5V 温度修正公式float rh=*p_humidity; float t=*p_temperature; float rh_li n;float rh true;float t_C;t_C=t*0.01 - 40;// 补偿温度 rh_li n=C3*rh*rh + C2*rh + C1;II 相对湿度非线性补偿 rh_true=(t_C-25)*(T1+T2*rh)+rh_li n;〃相对湿度对于温度依赖性补偿 if(rh_true>100)rh_true=100;// 湿度最大修正 if(rh_true<0.1)rh_true=0.1;// 湿度最小修正 *p_temperature=t_C;*p_humidity=rh_true; } II -------------------------------------------------------------------float calc_dewpo in t(float h,float t)II -------------------------------------------------------------------II 计算绝对湿度值{ float logEx,dew_po int; logEx=0.66077+7.5*tI(237.3+t)+(log10(h)-2);dew_poi nt = (logEx - 0.66077)*237.3I(0.66077+7.5-logEx); retur n dew_po int; }II --------------------------------------------------------------------------------void mai n()II --------------------------------------------------------------------------------II 示例程序,完成如下功能II 1.复位II 2.湿度的12测量以及温度的14位精度测量II 3.补偿及修正温湿度II 4.计数并得出绝对湿度{ float dew_po int;un sig ned char error,checksum;unsigned char HUMI,TEMP;HUMI=0X01;TEMP=0X02;II i nit_uart();s_connection reset();while(1){ error=0;error+=s_measure ((un sig ned char*) & humi_val.i,&checksum,HUMI); error+=s_measure((unsigned char*)&temp_val.i,&checksum,TEMP); if(error!=0) s_connection reset(); II 女口果发生错误,else II 返回温度结果//返回湿度结果II 湿度测量 II 温度测量 系统复位{ humi_val.f=(float)humi_val.i; // 转换为浮点数temp_val.f=(float)temp_val.i; // 转换为浮点数calc_sth11(&humi_val.f, &temp_val.f); // 修正相对湿度及温度dew_poi nt=calc_dewpoi nt(humi_val.f,temp_val.f); // 计算绝对湿度值dew // prin tf("temp:%5.1fC humi:%5.1f%%poi nt:%5.1fC\n",temp_val.f,humi_val.f,dew_poi nt);}delay(800); II等待足够长的时间,以现行下一次转换}}。

相关文档
最新文档