基于单片机SHT 温湿度传感器检测程序
基于C51单片机的温湿度测量仪的主程序
P0 = 0XBF; P1_1=1; P1_1=0;
P0 = array[bai]; P1_0=1; P1_0=0;
Delay_1ms(2);
P0 =0XDF; P1_1=1;P1_1=0;
P0 = 0X77; P1_0=1; P1_0=0;
Delay_1ms(2);
P0 = 0XFE; P1_1=1; P1_1=0;
P0 = 0X76; P1_0=1; P1_0=0;
if(flag==61) //由于程序太长,时间补偿
{
flag = 0;
mark++;
/* 读温湿度,可检测函数调用是否失败, 函数返回OK(1)表示成功,返回ERROR(0)表示失败 OK 和ERROR 是在DHT11.H 中定义的宏 */
#include <REGX51.H>
#define uint unsigned int
#define uchar unsigned char
sbit Key_ce=P1^3;
sbit Seg_ce=P1^0;
sbit Dig_ce=P1^1;
static unsigned char flag; //中断计数标志
}
//中断函数
void ቤተ መጻሕፍቲ ባይዱimer(void) interrupt 1
{
TH0 = (unsigned char)((65535 - 50000)/256);
TL0 = (unsigned char)((65535 - 50000)%256);
P0 = 0XFB; P1_1=1; P1_1=0;
基于单片机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);//等待足够长的时间,以现行下一次转换) )相关手册资料及源码下载地址:。
基于单片机的温湿度传感器程序设计
1.性能参数
DHT11相关参数如表13-3所示。湿度测量范围中的RH表示相对湿度。
表13-3 DHT11参数表
外文名
DHT11
测量精度 湿度±5%RH(误差为5%),温度±2℃
供电电压
3.3~5.5V DC
分辨率
湿度1%RH,温度1℃输出Βιβλιοθήκη 单总线数字信号互换性
可完全互换
测量范围 湿度20~90%RH,温度0~50℃ 长期稳定性
9
【例13-2】 【参考代码】
//***********************************************************************//
//
DHT11使用范例
//
功能:串口发送温湿度数据
//***********************************************************************//
#include <reg51.h>
#include <intrins.h>
typedef unsigned char U8;
//无符号8位整型变量
typedef signed char S8;
//有符号8位整型变量
typedef unsigned int U16;
//无符号16位整型变量
typedef signed int S16;
<±1%RH/年
DHT11为4针单排引脚封装,引脚说明如表13-4所示。
引脚Pin 1 2 3 4
表13-4 DHT11引脚说明
名称
说明
VDD
电源3.3~5.5V DC
基于单片机的温湿度监测系统毕业设计
基于单片机的温湿度监测系统毕业设计一、引言在现代生活和工业生产中,对环境温湿度的准确监测和控制具有重要意义。
温湿度的变化可能会影响产品质量、设备运行以及人们的生活舒适度。
因此,设计一个可靠、精确且易于使用的温湿度监测系统是十分必要的。
本毕业设计旨在基于单片机技术开发一款实用的温湿度监测系统。
二、系统总体设计(一)系统功能需求该监测系统应能够实时采集环境的温度和湿度数据,并将其显示在屏幕上。
同时,系统应具备数据存储功能,以便后续分析和查询。
此外,还应设置报警阈值,当温湿度超出设定范围时能发出警报。
(二)系统组成本系统主要由传感器模块、单片机控制模块、显示模块、存储模块和报警模块组成。
传感器模块负责采集环境温湿度数据,选用了精度高、稳定性好的DHT11 温湿度传感器。
单片机控制模块作为系统的核心,采用了 STC89C52 单片机,负责处理传感器采集到的数据、控制其他模块的工作以及进行逻辑判断。
显示模块采用了液晶显示屏(LCD1602),能够清晰地显示当前的温湿度值。
存储模块使用了 EEPROM 芯片,用于保存历史数据。
报警模块则通过蜂鸣器和指示灯实现,当温湿度异常时发出声光报警。
三、硬件设计(一)传感器接口电路DHT11 传感器与单片机通过单总线进行通信,连接时需要注意数据线的上拉电阻。
(二)单片机最小系统STC89C52 单片机的最小系统包括时钟电路和复位电路。
时钟电路采用晶振和电容组成,为单片机提供稳定的时钟信号。
复位电路用于系统初始化和异常情况下的复位操作。
(三)显示电路LCD1602 通过并行接口与单片机连接,需要配置相应的控制引脚和数据引脚。
(四)存储电路EEPROM 芯片通过 I2C 总线与单片机通信,实现数据的存储和读取。
(五)报警电路蜂鸣器通过三极管驱动,指示灯通过限流电阻连接到单片机的引脚,由单片机控制其工作状态。
四、软件设计(一)主程序流程系统上电后,首先进行初始化操作,包括单片机内部寄存器的设置、传感器的初始化、显示模块的初始化等。
基于单片机的温湿度传感器程序代码(编译成功)
温度
#include <reg52.h>
#include "1602.h"
#include "dht.h"
#include "2402.h"
//定义三个LED灯
sbit L2=P1^3;
sbit L3=P1^4;
sbit L4=P1^5;
}
//存入设定值、
void Save_Setting()
{
pSave = (char *)&TL;//地址低位对应低8位,高位对应高8位
wrteeprom(0, *pSave);//存温度上限值TH低8位
DELAY(500);
pSave ++;
wrteeprom(1, *pSave);//存温度上限值TH高8位
while(1)
{
//温度转换标志检查
if (FlagStartRH == 1)
{
TR0 = 0;
testnum = RH();
FlagStartRH = 0;
TR0 = 1;
//读出温度,只取整数部分
humidity = U8RH_data_H;
temperature = U8T_data_H;
//显示温度
volatile bit FlagKeyPress = 0; //有键按下
//定义温度传感器用外部变量
extern U8 U8FLAG,k;
extern U8 U8count,U8temp;
extern U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
课程设计基于单片机的温湿度传感器
由于温度与湿度不管是从物理量本身还是在实际人们的生活中都有着密切的关系,所以温湿度一体的传感器就会相应产生。
DHT11与单片机之间能采用简单的单总线进行通信,仅仅需要一个I/O口。
操作简单,使用基亚5110二手屏幕显示DHT11传感器读出来的温度和湿度值。
关键字:AT89S52;5110液晶;DHT11传感器;单总线AbstractBecause of the temperature and the humidity from both the physical quantity itself or in the actual life of people are closely related, so the temperature and humidity sensor integrated will arise accordingly. Between DHT11 and SCM can adopt the simple single bus, only need a I\/O port. Simple operation, using the base of 5110 secondhand screen display DHT11 sensor Read out the temperature and humidity.Keywords: AT89S52; DHT11 5110 LCD; sensor; single bus引言 ------------------------------------------11.1 DHT11描述---------------------------------------------------21.2 管脚排列----------------------------------------------21.3 应用电路连接说明--------------------------------------21.4 DHT11数据结构-----------------------------------------31.5 DHT11的传输时序---------------------------------------31.5.1 DHT11开始发送数据流程--------------------------31.5.2 主机复位信号和DHT11响应信号 --------------------31.5.3 数字‘0’信号表示方法-----------------------------31.5.4 数字‘1’信号表示方法-----------------------------42、诺基亚5110液晶简介(PCD8544驱动)--------------------42.1 引脚---------------------------------------------------4 2.2 功能描述:---------------------------------------------52.2.1 地址计数器 (AC)--------------------------------52.2.2 初始化-------------------------------------------52.2.3复位的作用----------------------------------------62.2.4显示控制------------------------------------------62.2.5 串行接口时序--------------------------------------62.2.6 指令集 ------------------------------------------63、总结-------------------------------------------------74、谢辞-------------------------------------------------85、参考文献---------------------------------------------96、附录-------------------------------------------------105.1 实验总框架图---------------------------------------------10 5.2 硬件部分-------------------------------------------------105.2.1硬件原理图-------------------------------------------10 5.2.2 硬件PCB图-------------------------------------------11 5.2.3 所需元器件-------------------------------------------115.3 实验效果-------------------------------------------------11 5.4 实验软件程序---------------------------------------------12引言可靠性与卓越的长期稳定性。
基于单片机的温湿度检测系统的设计
基于单片机的温湿度检测系统的设计一、引言温湿度是常见的环境参数,对于很多应用而言,如农业、生物、仓储等,温湿度的监测非常重要。
因此,设计并实现一个基于单片机的温湿度检测系统是非常有实际意义的。
本文将介绍该温湿度检测系统的设计方案,并详细阐述其硬件和软件实现。
二、系统设计方案1.硬件设计(1)传感器选择温湿度传感器的选择非常关键,常用的温湿度传感器包括DHT11、DHT22、SHT11等。
根据不同应用场景的精度和成本要求,选择相应的传感器。
(2)单片机选择单片机是整个系统的核心,需要选择性能稳定、易于编程的单片机。
常用的单片机有51系列、AVR系列等,也可以选择ARM系列的单片机。
(3)电路设计温湿度传感器与单片机的连接电路包括供电电路和数据通信电路。
供电电路通常采用稳压电源,并根据传感器的工作电压进行相应的电压转换。
数据通信电路使用串行通信方式。
2.软件设计(1)数据采集单片机通过串行通信方式从温湿度传感器读取温湿度数据。
根据传感器的通信协议,编写相应的代码实现数据采集功能。
(2)数据处理将采集到的温湿度数据进行处理,可以进行数据滤波、校准等操作,以提高数据的准确性和可靠性。
(3)结果显示设计一个LCD显示屏接口,将处理后的温湿度数据通过串行通信方式发送到LCD显示屏上显示出来。
三、系统实现及测试1.硬件实现按照上述设计方案,进行硬件电路的实现。
连接传感器和单片机,搭建稳定的供电电路,并确保电路连接无误。
2.软件实现根据设计方案,使用相应的开发工具编写单片机的代码。
包括数据采集、数据处理和结果显示等功能的实现。
3.系统测试将温湿度检测系统放置在不同的环境条件下,观察测试结果是否与真实值相符。
同时,进行长时间的测试,以验证系统的稳定性和可靠性。
四、系统优化优化系统的稳定性和功耗,可以采用以下方法:1.优化供电电路,减小电路噪声和干扰,提高电路的稳定性。
2.优化代码,减小程序的存储空间和运行时间,降低功耗。
STM32F030读取温湿度传感器SHT20的C程序源码(经实测实用过)
****************************************************************************** * @file HTU20.x* @brief HTU20functi on* @cpu STM32F051* @compil er KeiluVisio n V5.01* @author Hanney* @copyri ght* @versio n V1.0.1* @date 18-Sept-2015* @modify date20-Sept-2015****************************************************************************** * @attent ion*///STM32F051 模拟IIC//#includ e "boardA PI.h"//#includ e "stm32f0xx.h"//#includ e "HTU20.h"//#includ e "uart.h"//#includ e "delay.h"#includ e "stm32f0xx.h"#includ e "stm32l ib.h"#define HTU20_CLK RCC_AH BPeri ph_GP IOB#define HTU20_SDA_P ORT GPIOB#define HTU20_SCL_P ORT GPIOB#define HTU20_SDA_P IN GPIO_P in_11#define HTU20_SCL_P IN GPIO_P in_10#define RESOLU TION_11b 0x81 //RH 11 TH 11#define RESOLU TION_12b 0x01 //RH 8 TH 12#define RESOLU TION_13b 0x80 //RH 10 TH 13#define RESOLU TION_14b 0x00 //RH 12 TH 14#define OTP_disEN 0x02 //不能启动OP T加载#define OTP_EN0x00 //启动OPT加载#define RESh 16 //湿度解析度#define RESt 16 //温度解析度#define Measur eDela y12 //解析延时时间单位mstypede f unsign ed char BYTE;typede f unsign ed int WORD;BYTE Delaym s;GPIO_I nitTy peDef GPIO_I nitSt ructu re;voiddelaym s(BYTE ms);/*** @brief StartHTU GPIO port CLK* @retval None*/voidHTUIni t(void){RCC_AH BPeri phClo ckCmd(HTU20_CLK, ENABLE);}/*================================================================ IIC addres s================================================================*/ #define SHT20A DDR 0x80/*================================================================ ACK and NACK defina tion================================================================*/ #define ACK 0#define NACK 1/*================================================================ HTU20D Comman d Code================================================================*/ /*Comman d Code Commen tTrigge r Temper ature Measur ement 0xe3 Hold masterTrigge r Humidi ty Measur ement 0xe5 Hold masterTrigge r Temper ature Measur emeng 0xf3 No Hold masterTrigge r Humidi ty Measur ement 0xf5 No Hold masterWriteuser regist er 0xe6Read user regist er 0xe7Soft Reset0xfe*/#define SOFT_R ESET0xfe#define READ_R EGIST ER 0xe7#define WRITE_REGIS TER 0xe6#define TRIGGE R_TEM P 0xf3#define TRIGGE R_HUM I 0xf5/*================================================================ HTU20operat e interf ace================================================================*/#define HTU20_SCL GPIO_R eadIn putDa taBit(HTU20_SCL_P ORT,HTU20_SCL_P IN) #define HTU20_SDA GPIO_R eadIn putDa taBit(HTU20_SDA_P ORT,HTU20_SDA_P IN)/*** @brief Set SDA pin dircat e as output* @retval None*/void HTU20_SDA_O UT(){GPIO_S truct Init(&GPIO_I nitSt ructu re);GPIO_I nitSt ructu re.GPIO_P in = HTU20_SDA_P IN;GPIO_I nitSt ructu re.GPIO_M ode =GPIO_M ode_O UT;GPIO_I nitSt ructu re.GPIO_O Type= GPIO_O Type_OD;GPIO_I nitSt ructu re.GPIO_S peed= GPIO_S peed_Level_2;GPIO_I nitSt ructu re.GPIO_P uPd =GPIO_P uPd_N OPULL;GPIO_I nit(HTU20_SDA_P ORT, &GPIO_I nitSt ructu re);}/*** @brief Set SDA pin dircat e as intput* @retval None*/void HTU20_SDA_I N(){GPIO_S truct Init(&GPIO_I nitSt ructu re);GPIO_I nitSt ructu re.GPIO_P in = HTU20_SDA_P IN;GPIO_I nitSt ructu re.GPIO_M ode =GPIO_M ode_I N;GPIO_I nitSt ructu re.GPIO_S peed= GPIO_S peed_Level_2;GPIO_I nitSt ructu re.GPIO_P uPd =GPIO_P uPd_N OPULL;GPIO_I nit(HTU20_SDA_P ORT, &GPIO_I nitSt ructu re);}/*** @briefSet SDA pin as high* @retval None*/void HTU20_SDA_1(){GPIO_S etBit s(HTU20_SDA_P ORT,HTU20_SDA_P IN);}/*** @briefSet SDA pin as low* @retval None*/void HTU20_SDA_0(){GPIO_R esetB its(HTU20_SDA_P ORT,HTU20_SDA_P IN); }/*** @brief Set SCL pin dircat e as output* @retval None*/void HTU20_SCL_O UT(){GPIO_S truct Init(&GPIO_I nitSt ructu re);GPIO_I nitSt ructu re.GPIO_P in = HTU20_SCL_P IN; GPIO_I nitSt ructu re.GPIO_M ode =GPIO_M ode_O UT; GPIO_I nitSt ructu re.GPIO_O Type= GPIO_O Type_OD; GPIO_I nitSt ructu re.GPIO_S peed= GPIO_S peed_Level_2; GPIO_I nitSt ructu re.GPIO_P uPd =GPIO_P uPd_N OPULL; GPIO_I nit(HTU20_SCL_P ORT, &GPIO_I nitSt ructu re);}/*** @briefSet SCL pin as high* @retval None*/void HTU20_SCL_1(){GPIO_S etBit s(HTU20_SCL_P ORT,HTU20_SCL_P IN);}/*** @briefSet SCL pin as low* @retval None*/void HTU20_SCL_0(){GPIO_R esetB its(HTU20_SCL_P ORT,HTU20_SCL_P IN);}/*================================================================ Simula tionI2C Functi on================================================================*//*** @brief A shortdelay for iic synchr oniza tion* @paramt us* @retval None*/void I2CDel ay (BYTE t){while(t--){__nop(); __nop(); __nop(); __nop(); __nop();__nop(); __nop(); __nop(); __nop(); __nop();__nop(); __nop(); __nop(); __nop(); __nop();__nop(); __nop(); __nop(); __nop(); __nop();__nop(); __nop(); __nop(); __nop(); __nop();__nop(); __nop(); __nop(); __nop(); __nop();__nop(); __nop(); __nop(); __nop(); __nop();}}/*** @briefI2Cinit* @retval None*/void I2CIni t(void){HTUIni t();HTU20_SDA_O UT();HTU20_SCL_O UT();HTU20_SDA_1();I2CDel ay(1);HTU20_SCL_1();I2CDel ay(1);}/*** @brief IIC startsignal* @commen t SCL、SDA同为高,SDA跳变成低之后,SCL跳变成低* @retval None*/void I2CSta rt(void){HTU20_SDA_O UT();HTU20_SDA_1();HTU20_SCL_1();I2CDel a y(5); //大于4.7usHTU20_SDA_0();I2CDel a y(5); //大于4usHTU20_SCL_0();I2CDel ay(5);}/*** @brief IIC Stop Signal* @commet SCL、SDA同为低,SCL跳变成高之后,SDA跳变成高 * @retval None*/void I2CSto p(void){HTU20_SDA_O UT();HTU20_SDA_0();HTU20_SCL_0();I2CDel ay(5);HTU20_SCL_1();I2CDel ay(5);HTU20_SDA_1();I2CDel ay(5);}/*** @brief simu IIC writebyte* @paramW rite_Byte: data* @retval None*/BYTE I2C_Wr ite_B yte(BYTE Write_Byte){BYTE i;HTU20_SDA_O UT();for(i = 0; i < 8; ++i){if(Write_Byte& SHT20A DDR){HTU20_SDA_1();}else{HTU20_SDA_0();}I2CDel ay(1);HTU20_SCL_1(); //输出SDA稳定后拉高S CL,从机检测到后采样I2CDel a y(5); //保证足够长锁定时间,确保从机采样成功HTU20_SCL_0();I2CDel ay(1);Write_Byte<<= 1;}I2CDel ay(4);HTU20_SDA_1(); //8位发送完后释放数据线,准备接受应答信号HTU20_SCL_1(); //再次拉高SC L,告诉从机发送完毕,等待应答I2CDel a y(5); //原来是5HTU20_SDA_I N();i = 100;do{if(HTU20_SDA == 0) break;i--;I2CDel a y(4); //原来是5}while(i>0);HTU20_SCL_0();if(i) return ACK;else return NACK;// if(HTU20_SDA == 1) //SDA为高,收到NACK// return NACK;// else //SDA为低,收到ACK// return ACK;// HTU20_SCL_0();// I2CDel ay(15);}/*** @briefsimu read byte form IIC* @param* @retval None*/BYTE I2C_Re ad_By te(BYTE AckVal ue)//receiv ebyte{BYTE i, RDByte = 0;HTU20_SCL_0(); /*后改的程序*/HTU20_SDA_O UT();// HTU20_SCL_0();HTU20_SDA_1(); //释放总线,并置数据线为输入HTU20_SDA_I N();for (i = 0; i < 8; ++i){HTU20_SCL_1(); //拉高SCL期间,采样I2CDel ay(2);RDByte<<= 1;if(HTU20_SDA == 1){RDByte |= 0x01;}else{RDByte&= 0xfe;}I2CDel ay(1);HTU20_SCL_0(); //下降沿告知从机发送下一位I2CDel ay(6);}HTU20_SDA_O UT(); //接受完一个字节,发送ACKor NACK if(AckVal ue == 1){HTU20_SDA_1();}else{HTU20_SDA_0();}I2CDel ay(3);HTU20_SCL_1();I2CDel ay(5);HTU20_SCL_0(); //清时钟线I2CDel ay(15);//HTU20_SDA_1();return RDByte;}/*** @briefsoft resetby transm it resetcomman d* @retval None*/voidSoftRe set(void){I2CIni t();I2CSta rt();I2C_Wr ite_B yte(SHT20A DDR & 0xfe); //I2C addres s + writeI2C_Wr ite_B yte(SOFT_R ESET); //soft resetI2CSto p();}/*** @brief SET HTU20D resolu tionby writeregist er* @retval None*/voidSET_Re solut ion(void){I2CSta rt();if(I2C_Wr ite_B yte(SHT20A DDR & 0xfe) == ACK) //I2C addres s + write+ ACK{if(I2C_Wr ite_Byte(WRITE_REGIS TER)==ACK) //写用户寄存器{if(I2C_Wr ite_Byte(0x83)==ACK); //设置分辨率11bitRH% 测量时间:12ms(typ.)} // 11bitT℃测量时间:9ms(typ.)}I2CSto p();}/*** @brief read sht20's conver ted result* @paramT empOr HumiC MD: operat ion comman d for temper ature or humidi ty* @retval None*/floatReadSh t20(char TempOr HumiC MD){floattemp;BYTE MSB,LSB;floatHumidi ty, Temper ature;SET_Re solut ion();I2CSta rt();if(I2C_Wr ite_B yte(SHT20A DDR & 0xfe) == ACK) //I2C addres s + write+ ACK{if(I2C_Wr ite_B yte(TempOr HumiC MD) == ACK) //comman d{// delaym s(Measur eDela y); /*这两行由下面屏蔽了的两行改到上面来的*/// I2CSta rt();do{delaym s(Measur eDela y);I2CSta rt();} while(I2C_Wr ite_B yte(SHT20A DDR | 0x01) == NACK); //I2C addres s + read + NACKMSB = I2C_Re ad_By te(ACK);LSB = I2C_Re ad_By te(ACK);I2C_Re ad_By te(NACK); //Checks um + NACKI2CSto p();LSB &= 0xfc; //Data (LSB) 的后两位在进行物理计算前前须置0temp = (MSB << 8) + LSB;if (TempOr HumiC MD == ((char)TRIGGE R_HUM I)){/*-- calcul ate relati ve humidi ty [%RH] --*///equati on: RH% = -6 + 125 * SRH/2^REShHumidi ty = (temp * 125) / 65536- 6;return Humidi ty;}else{/*-- calcul ate temper ature [°C] --*///equati on:T = -46.85 + 175.72 * ST/2^REStTemper ature = (temp * 175.72) / 65536- 46.85;return Temper ature;}}}return 0;}voiddelaym s(BYTE ms){BYTE t;for(t=0;t<100;t++){I2CDel ay(10);}// Delaym s = ms;// while(Delaym s);}////////////////////////////////////////////////////////////////////////////////////////////////////#define TRIGGE R_TEM P 0xf3#define TRIGGE R_HUM I 0xf5void I2CIni t(void);voidSoftRe set(void);voidSET_Re solut ion(void);floatReadSh t20(char TempOr HumiC MD);。
基于单片机的温湿度监测系统毕业设计
基于单片机的温湿度监测系统毕业设计一、引言在现代社会中,温湿度的监测在许多领域都具有重要意义,例如农业生产、仓储管理、工业制造以及室内环境控制等。
为了实现对温湿度的准确、实时监测,基于单片机的温湿度监测系统应运而生。
本毕业设计旨在设计并实现一种基于单片机的温湿度监测系统,以满足实际应用中的需求。
二、系统总体设计方案(一)系统功能需求分析本系统需要实现对环境温湿度的实时采集、数据处理、显示以及超限报警等功能。
能够在不同的环境中稳定工作,并具有较高的测量精度和可靠性。
(二)系统总体结构设计系统主要由单片机控制模块、温湿度传感器模块、显示模块、报警模块以及电源模块等组成。
单片机作为核心控制器,负责协调各个模块的工作,温湿度传感器用于采集环境温湿度数据,显示模块用于实时显示测量结果,报警模块在温湿度超限时发出警报,电源模块为整个系统提供稳定的电源。
三、硬件设计(一)单片机控制模块选择合适的单片机型号,如 STC89C52 单片机,其具有丰富的资源和良好的性价比。
单片机通过 I/O 口与其他模块进行通信和控制。
(二)温湿度传感器模块选用 DHT11 数字温湿度传感器,该传感器具有体积小、功耗低、测量精度高、响应速度快等优点。
通过单总线方式与单片机进行数据传输。
(三)显示模块采用液晶显示屏(LCD1602)作为显示设备,能够清晰地显示温湿度测量值。
通过并行接口与单片机连接。
(四)报警模块使用蜂鸣器和发光二极管作为报警装置,当温湿度超过设定的阈值时,蜂鸣器发声,发光二极管闪烁。
(五)电源模块设计稳定的电源电路,为整个系统提供 5V 直流电源。
可以采用电池供电或者通过电源适配器接入市电。
四、软件设计(一)系统主程序设计主程序主要负责系统的初始化、各模块的协调控制以及数据处理和显示。
首先对单片机进行初始化,包括设置 I/O 口状态、定时器和中断等。
然后循环读取温湿度传感器的数据,并进行处理和显示,判断是否超过阈值,若超过则启动报警。
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所示。
基于51单片机的温湿度检测系统设计与实现
3、无线通信模块
本系统的无线通信模块采用nRF24L01无线通信芯片。nRF24L01是一款具有 2.4GHz全球开放频率的无线通信芯片,具有低功耗、高速率、高稳定性等特点。 它将主控制器处理后的数据通过无线方式发送给接收器。
4、电源模块
本系统的电源模块采用9V电池供电。我们将9V电池通过稳压器转换为5V电源, 为整个系统提供稳定的电力支持。
三、测试与结果分析
为了验证本系统的可靠性和准确性,我们进行了一系列的测试。测试结果表 明,本系统能够准确快速地采集环境中的温湿度数据,并且能够稳定地将数据上 传至计算机或其他数据采集设备。同时,本系统的按键电路和液晶显示电路也表 现良好,用户可以通过按键调整系统的参数设置,并直观地查看温湿度数据。
2、液晶显示屏
为了方便用户直观地查看温湿度数据,本系统选用了一块16×2字符型液晶 显示屏。液晶屏的驱动电路简单易懂,且具有较低的功耗。
3、按键电路
为了便于用户对温湿度检测系统的参数进行设置,本系统加入了一个按键电 路。用户可以通过按键对系统的采样间隔、数据上传频率等参数进行设置。
4、串口通信电路
图1主程序流程图
2.温湿度采集模块
温湿度采集模块主要负责通过DHT11传感器采集环境中的温湿度数据。该模 块首先对DHT11传感器进行初始化,然后通过单总线接口接收传感器输出的温湿 度数据,最后对数据进行处理并存储。
3、液晶显示模块
液晶显示模块主要负责将温湿度数据显示在液晶屏上。该模块首先对液晶屏 进行初始化,然后根据主程序传递过来的温湿度数据,控制液晶屏的字符输出。
三、软件设计
本系统的软件设计主要分为以下几个步骤:
1、系统初始化:在系统上电后,首先进行各模块的初始化操作,包括DHT11 传感器、AT89C51单片机、nRF24L01无线通信芯片等。
基于单片机的温湿度检测系统的设计
基于单片机的温湿度检测系统的设计设计一个基于单片机的温湿度检测系统需要考虑多个方面,包括硬件设计和软件设计。
硬件设计方面,系统需要包括传感器、单片机、显示屏、通信模块等部分。
传感器方面可以选择常见的温湿度传感器,如DHT11或DHT22、单片机方面可以选择常见的Arduino、STM32或PIC单片机等。
显示屏可以选择OLED屏幕或液晶屏幕,用于显示实时的温湿度数据。
通信模块可以选择无线通信模块,如WiFi或蓝牙模块,用于将温湿度数据发送到远程设备。
在软件设计方面,需要编写单片机的程序,实现数据的采集、处理和显示。
首先,需要编写传感器读取的代码,通过读取传感器的引脚来获取温湿度数据。
然后,可以使用合适的算法来处理数据。
例如,可以添加滤波算法,以提高数据的稳定性。
接下来,需要设计显示的界面,并将处理后的数据显示在屏幕上。
最后,可以添加通信模块的代码,将温湿度数据发送到远程设备。
具体步骤如下:1.硬件准备:-选择合适的温湿度传感器(如DHT11或DHT22),并将其与单片机连接。
-选择合适的显示屏,并将其与单片机连接。
-如果需要将数据发送到远程设备,选择合适的通信模块,并将其与单片机连接。
2.软件编程:-编写单片机的程序,通过读取传感器的引脚获取温湿度数据。
-实现数据处理算法,例如滤波算法。
-设计显示的界面,并将处理后的数据显示在屏幕上。
-如果需要将数据发送到远程设备,编写通信模块的代码,并将温湿度数据发送出去。
3.调试和测试:-确保硬件连接正确,并进行必要的调试。
-测试程序是否正常工作,能够准确地读取温湿度数据并显示在屏幕上。
-如果需要发送数据到远程设备,测试通信模块的功能是否正常。
4.优化和改进:-可以根据实际需求对系统进行优化和改进,例如添加数据存储功能,实现数据的历史记录和分析。
-可以添加报警功能,当温湿度超过设定阈值时发出警报。
通过以上步骤,可以设计一个基于单片机的温湿度检测系统,实现温湿度数据的采集、处理和显示,并实现数据的远程传输和其他功能的扩展。
基于AT89C52单片机和SHT10温湿度传感器的温、湿度监测系统的设计讲解
贵州大学本科毕业论文(设计)目录目录 (I)摘要 .............................................................................................................................. 错误!未定义书签。
关键词 . (III)Abstract (IV)Key word (IV)第一章概述 (1)1.1 课题的研究背景 (1)1.2 课题的研究目的和意义 (1)1.3 国内外发展现状和发展趋势 (2)1.4 本文结构 (3)第二章系统的总体设计 (4)2.1 系统的设计思路 (4)2.2 系统的设计要求 (4)2.2.1 基本功能 (4)2.2.2 主要技术参数 (4)2.3 方案的比较和论证 (5)第三章系统的硬件设计 (7)3.1 系统主控电路 (7)3.1.1 AT89C52单片机 (8)3.1.2 主要功能特性 (8)3.1.3 主要引脚 (9)3.2 数据采集模块 (9)3.2.1 数字温湿度传感器SHT10 (10)3.2.2 SHT10的工作原理 (10)3.2.3 传输开始时序 (11)3.2.4 连接复位时序 (12)3.2.5 温湿度测量时序 (12)3.3 显示模块设计 (13)3.3.1 LCD1602简介 (14)3.3.2 LCD1602主要技术参数 (15)3.3.3 LCD1602引脚功能 (15)3.3.4 LCD1602指令集 (16)3.4 报警电路 (18)3.5 系统的原理图 (19)第四章系统的软件设计 (20)4.1 主程序设计 (20)4.1.1 系统主程序流程图 (20)4.1.2 系统主程序 (21)4.2 温湿度测量程序流程图 (22)4.3 报警器流程图 (23)第五章系统仿真与测试 (24)5.1仿真软件proteus简介 (24)5.2 源程序的编译、调试 (25)5.3 在proteus里画系统原理图 (26)5.4 在proteus里仿真 (26)第六章总结 (28)参考文献 (30)附录 (32)附录A实物图 (32)附录B系统部分程序 (35)摘要温、湿度是仓库管理中常见的被控参数,顺着电子科学技术的发展,温度和湿度己不再是相互独立的量,而应在系统集成中综合考虑。
双SHT1x温湿度传感器的单片机系统程序开发经验谈
顺利解决 。
器 以及 其 他 外 围控 制 电路 组 成 。双 S HT1 温 湿 度 传 感 器 X 用 于 测 量 两个 独 立 空 间 的 湿 度 值 , 以此 测 量值 作 为 依 据 并
让 单 片 机 进 行 相 应 的控 制 。程 序 是 在 Kel 1环 境 下 开 i C5
发的 。
1 单 Sr1 湿度传 感器 的单片机 系统程序 卜rx温
单S HTl x温 湿 度 传 感 器 与单 片 机 连 接 , HT1 S x温 湿 度 传 感 器 的 S K 接 口与 单 片 机 P1 口相 连 , C 0 DATA 接 V I
与 单 片 机 Pl l口 相 连 。
经 济 的小 内存 单 片 机 以 降低 成 本 。这 时就 要 考 虑 程 序 的 大
小 , 量减 少 程 序 的代 码 量 , 尽 以节 约宝 贵 的程 序 内存 空 间 。 本 系统 中在 采 用 c 语 言 进 行 程 序 编 程 时 , 于 数 据 由 测 量 过 程 中单 片 机 和 传 感 器 之 间 的命 令 以 及 数 据 传 输 相 对 而 言 比较 复 杂 , 应 的程 序 代 码 量 就 会 较 大 。对 于 双 传 相 感 器 甚 至 多 传 感 器 系 统 , 可 能 让 每 个 传 感 器 都 有 对 应 的 不 测 量 程 序 , 是将 一 段 程 序 做 成 通 用 程 序 , 各 个 传 感 器 而 在
他 总 线 的竞 争 中体 现 出 了强 大 的生 命 力 , 望本 文 所 介 绍 希 的经验对正在应用或计划应用 S I . P 一4 2总线 的 同行 有 所
ppr entcm C( ae @m se.o .R投稿专用)
0 F ~ S 4 一O2 f0I PI .1,20 03 — 1 0.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于51单片机SHT11温湿度传感器检测程序(含电路图)?下面是原理图:下面是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^1;sbit lcden=P2^2;sbit SCK = P1^0;sbit DATA = P1^1;/******************************************************** 变量定义********************************************************/ 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?init12864lcd(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);?//等待足够长的时间,以现行下一次转换}}相关手册资料及源码下载地址:。