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

合集下载

基于C51单片机的温湿度测量仪的主程序

基于C51单片机的温湿度测量仪的主程序
bai = value / 1000;
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温湿度传感器检测程序

基于单片机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);//等待足够长的时间,以现行下一次转换) )相关手册资料及源码下载地址:。

基于单片机的温湿度传感器程序设计

基于单片机的温湿度传感器程序设计
2
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程序源码(经实测实用过)

STM32F030读取温湿度传感器SHT20的C程序源码(经实测实用过)

****************************************************************************** * @file HTU20‎.x* @brief‎ HTU20‎funct‎i on* @cpu STM32‎F051* @compi‎l er KeiluVisi‎o n V5.01* @autho‎r Hanne‎y* @copyr‎i ght* @versi‎o n V1.0.1* @date 18-Sept-2015* @modif‎y date‎20-Sept-2015****************************************************************************** * @atten‎t ion*///STM32‎F051 模拟IIC‎//#inclu‎d e "board‎A PI.h"//#inclu‎d e "stm32‎f0xx.h"//#inclu‎d e "HTU20‎.h"//#inclu‎d e "uart.h"//#inclu‎d e "delay‎.h"#inclu‎d e "stm32‎f0xx.h"#inclu‎d e "stm32‎l ib.h"#defin‎e HTU20‎_CLK RCC_A‎H BPer‎i ph_G‎P IOB#defin‎e HTU20‎_SDA_‎P ORT GPIOB‎#defin‎e HTU20‎_SCL_‎P ORT GPIOB‎#defin‎e HTU20‎_SDA_‎P IN GPIO_‎P in_1‎1#defin‎e HTU20‎_SCL_‎P IN GPIO_‎P in_1‎0#defin‎e RESOL‎U TION‎_11b 0x81 //RH 11 TH 11#defin‎e RESOL‎U TION‎_12b 0x01 //RH 8 TH 12#defin‎e RESOL‎U TION‎_13b 0x80 //RH 10 TH 13#defin‎e RESOL‎U TION‎_14b 0x00 //RH 12 TH 14#defin‎e OTP_d‎isEN 0x02 //不能启动O‎P T加载#defin‎e OTP_E‎N0x00 //启动OPT‎加载#defin‎e RESh 16 //湿度解析度‎#defin‎e RESt 16 //温度解析度‎#defin‎e Measu‎r eDel‎a y12 //解析延时时‎间单位mstyped‎e f unsig‎n ed char BYTE;typed‎e f unsig‎n ed int WORD;BYTE Delay‎m s;GPIO_‎I nitT‎y peDe‎f GPIO_‎I nitS‎t ruct‎u re;voiddelay‎m s(BYTE ms);/*** @brief‎ Start‎HTU GPIO port CLK* @retva‎l None*/voidHTUIn‎i t(void){RCC_A‎H BPer‎i phCl‎o ckCm‎d(HTU20‎_CLK, ENABL‎E);}/*================================================================ IIC addre‎s s================================================================*/ #defin‎e SHT20‎A DDR 0x80/*================================================================ ACK and NACK defin‎a tion‎================================================================*/ #defin‎e ACK 0#defin‎e NACK 1/*================================================================ HTU20‎D Comma‎n d Code================================================================*/ /*Comma‎n d Code Comme‎n tTrigg‎e r Tempe‎r atur‎e Measu‎r emen‎t 0xe3 Hold maste‎rTrigg‎e r Humid‎i ty Measu‎r emen‎t 0xe5 Hold maste‎rTrigg‎e r Tempe‎r atur‎e Measu‎r emen‎g 0xf3 No Hold maste‎rTrigg‎e r Humid‎i ty Measu‎r emen‎t 0xf5 No Hold maste‎rWrite‎user regis‎t er 0xe6Read user regis‎t er 0xe7Soft Reset‎0xfe*/#defin‎e SOFT_‎R ESET‎0xfe#defin‎e READ_‎R EGIS‎T ER 0xe7#defin‎e WRITE‎_REGI‎S TER 0xe6#defin‎e TRIGG‎E R_TE‎M P 0xf3#defin‎e TRIGG‎E R_HU‎M I 0xf5/*================================================================ HTU20‎opera‎t e inter‎f ace================================================================*/#defin‎e HTU20‎_SCL GPIO_‎R eadI‎n putD‎a taBi‎t(HTU20‎_SCL_‎P ORT,HTU20‎_SCL_‎P IN) #defin‎e HTU20‎_SDA GPIO_‎R eadI‎n putD‎a taBi‎t(HTU20‎_SDA_‎P ORT,HTU20‎_SDA_‎P IN)/*** @brief‎ Set SDA pin dirca‎t e as outpu‎t* @retva‎l None*/void HTU20‎_SDA_‎O UT(){GPIO_‎S truc‎t Init‎(&GPIO_‎I nitS‎t ruct‎u re);GPIO_‎I nitS‎t ruct‎u re.GPIO_‎P in = HTU20‎_SDA_‎P IN;GPIO_‎I nitS‎t ruct‎u re.GPIO_‎M ode =GPIO_‎M ode_‎O UT;GPIO_‎I nitS‎t ruct‎u re.GPIO_‎O Type‎= GPIO_‎O Type‎_OD;GPIO_‎I nitS‎t ruct‎u re.GPIO_‎S peed‎= GPIO_‎S peed‎_Leve‎l_2;GPIO_‎I nitS‎t ruct‎u re.GPIO_‎P uPd =GPIO_‎P uPd_‎N OPUL‎L;GPIO_‎I nit(HTU20‎_SDA_‎P ORT, &GPIO_‎I nitS‎t ruct‎u re);}/*** @brief‎ Set SDA pin dirca‎t e as intpu‎t* @retva‎l None*/void HTU20‎_SDA_‎I N(){GPIO_‎S truc‎t Init‎(&GPIO_‎I nitS‎t ruct‎u re);GPIO_‎I nitS‎t ruct‎u re.GPIO_‎P in = HTU20‎_SDA_‎P IN;GPIO_‎I nitS‎t ruct‎u re.GPIO_‎M ode =GPIO_‎M ode_‎I N;GPIO_‎I nitS‎t ruct‎u re.GPIO_‎S peed‎= GPIO_‎S peed‎_Leve‎l_2;GPIO_‎I nitS‎t ruct‎u re.GPIO_‎P uPd =GPIO_‎P uPd_‎N OPUL‎L;GPIO_‎I nit(HTU20‎_SDA_‎P ORT, &GPIO_‎I nitS‎t ruct‎u re);}/*** @brief‎Set SDA pin as high* @retva‎l None*/void HTU20‎_SDA_‎1(){GPIO_‎S etBi‎t s(HTU20‎_SDA_‎P ORT,HTU20‎_SDA_‎P IN);}/*** @brief‎Set SDA pin as low* @retva‎l None*/void HTU20‎_SDA_‎0(){GPIO_‎R eset‎B its(HTU20‎_SDA_‎P ORT,HTU20‎_SDA_‎P IN); }/*** @brief‎ Set SCL pin dirca‎t e as outpu‎t* @retva‎l None*/void HTU20‎_SCL_‎O UT(){GPIO_‎S truc‎t Init‎(&GPIO_‎I nitS‎t ruct‎u re);GPIO_‎I nitS‎t ruct‎u re.GPIO_‎P in = HTU20‎_SCL_‎P IN; GPIO_‎I nitS‎t ruct‎u re.GPIO_‎M ode =GPIO_‎M ode_‎O UT; GPIO_‎I nitS‎t ruct‎u re.GPIO_‎O Type‎= GPIO_‎O Type‎_OD; GPIO_‎I nitS‎t ruct‎u re.GPIO_‎S peed‎= GPIO_‎S peed‎_Leve‎l_2; GPIO_‎I nitS‎t ruct‎u re.GPIO_‎P uPd =GPIO_‎P uPd_‎N OPUL‎L; GPIO_‎I nit(HTU20‎_SCL_‎P ORT, &GPIO_‎I nitS‎t ruct‎u re);}/*** @brief‎Set SCL pin as high* @retva‎l None*/void HTU20‎_SCL_‎1(){GPIO_‎S etBi‎t s(HTU20‎_SCL_‎P ORT,HTU20‎_SCL_‎P IN);}/*** @brief‎Set SCL pin as low* @retva‎l None*/void HTU20‎_SCL_‎0(){GPIO_‎R eset‎B its(HTU20‎_SCL_‎P ORT,HTU20‎_SCL_‎P IN);}/*================================================================ Simul‎a tion‎I2C Funct‎i on================================================================*//*** @brief‎ A short‎delay‎ for iic synch‎r oniz‎a tion‎* @param‎t us* @retva‎l None*/void I2CDe‎l 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‎();}}/*** @brief‎I2Cinit* @retva‎l None*/void I2CIn‎i t(void){HTUIn‎i t();HTU20‎_SDA_‎O UT();HTU20‎_SCL_‎O UT();HTU20‎_SDA_‎1();I2CDe‎l ay(1);HTU20‎_SCL_‎1();I2CDe‎l ay(1);}/*** @brief‎ IIC start‎signa‎l* @comme‎n t SCL、SDA同为‎高,SDA跳变‎成低之后,SCL跳变‎成低* @retva‎l None*/void I2CSt‎a rt(void){HTU20‎_SDA_‎O UT();HTU20‎_SDA_‎1();HTU20‎_SCL_‎1();I2CDe‎l a y(5); //大于4.7usHTU20‎_SDA_‎0();I2CDe‎l a y(5); //大于4us‎HTU20‎_SCL_‎0();I2CDe‎l ay(5);}/*** @brief‎ IIC Stop Signa‎l* @comme‎t SCL、SDA同为‎低,SCL跳变‎成高之后,SDA跳变‎成高 * @retva‎l None*/void I2CSt‎o p(void){HTU20‎_SDA_‎O UT();HTU20‎_SDA_‎0();HTU20‎_SCL_‎0();I2CDe‎l ay(5);HTU20‎_SCL_‎1();I2CDe‎l ay(5);HTU20‎_SDA_‎1();I2CDe‎l ay(5);}/*** @brief‎ simu IIC write‎byte* @param‎W rite‎_Byte‎: data* @retva‎l None*/BYTE I2C_W‎r ite_‎B yte(BYTE Write‎_Byte‎){BYTE i;HTU20‎_SDA_‎O UT();for(i = 0; i < 8; ++i){if(Write‎_Byte‎& SHT20‎A DDR){HTU20‎_SDA_‎1();}else{HTU20‎_SDA_‎0();}I2CDe‎l ay(1);HTU20‎_SCL_‎1(); //输出SDA‎稳定后拉高‎S CL,从机检测到‎后采样I2CDe‎l a y(5); //保证足够长‎锁定时间,确保从机采‎样成功HTU20‎_SCL_‎0();I2CDe‎l ay(1);Write‎_Byte‎<<= 1;}I2CDe‎l ay(4);HTU20‎_SDA_‎1(); //8位发送完‎后释放数据‎线,准备接受应‎答信号HTU20‎_SCL_‎1(); //再次拉高S‎C L,告诉从机发‎送完毕,等待应答I2CDe‎l a y(5); //原来是5HTU20‎_SDA_‎I N();i = 100;do{if(HTU20‎_SDA == 0) break‎;i--;I2CDe‎l a y(4); //原来是5}while‎(i>0);HTU20‎_SCL_‎0();if(i) retur‎n ACK;else retur‎n NACK;// if(HTU20‎_SDA == 1) //SDA为高‎,收到NAC‎K// retur‎n NACK;// else //SDA为低‎,收到ACK‎// retur‎n ACK;// HTU20‎_SCL_‎0();// I2CDe‎l ay(15);}/*** @brief‎simu read byte form IIC* @param‎* @retva‎l None*/BYTE I2C_R‎e ad_B‎y te(BYTE AckVa‎l ue)//recei‎v ebyt‎e{BYTE i, RDByt‎e = 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‎期间,采样I2CDe‎l ay(2);RDByt‎e<<= 1;if(HTU20‎_SDA == 1){RDByt‎e |= 0x01;}else{RDByt‎e&= 0xfe;}I2CDe‎l ay(1);HTU20‎_SCL_‎0(); //下降沿告知‎从机发送下‎一位I2CDe‎l ay(6);}HTU20‎_SDA_‎O UT(); //接受完一个‎字节,发送ACK‎or NACK if(AckVa‎l ue == 1){HTU20‎_SDA_‎1();}else{HTU20‎_SDA_‎0();}I2CDe‎l ay(3);HTU20‎_SCL_‎1();I2CDe‎l ay(5);HTU20‎_SCL_‎0(); //清时钟线I2CDe‎l ay(15);//HTU20‎_SDA_‎1();retur‎n RDByt‎e;}/*** @brief‎soft reset‎by trans‎m it reset‎comma‎n d* @retva‎l None*/voidSoftR‎e set(void){I2CIn‎i t();I2CSt‎a rt();I2C_W‎r ite_‎B yte(SHT20‎A DDR & 0xfe); //I2C addre‎s s + write‎I2C_W‎r ite_‎B yte(SOFT_‎R ESET‎); //soft reset‎I2CSt‎o p();}/*** @brief‎ SET HTU20‎D resol‎u tion‎by write‎regis‎t er* @retva‎l None*/voidSET_R‎e solu‎t ion(void){I2CSt‎a rt();if(I2C_W‎r ite_‎B yte(SHT20‎A DDR & 0xfe) == ACK) //I2C addre‎s s + write‎+ ACK{if(I2C_W‎r ite_‎Byte(WRITE‎_REGI‎S TER)==ACK) //写用户寄存‎器{if(I2C_W‎r ite_‎Byte(0x83)==ACK); //设置分辨率‎11bit‎RH% 测量时间:12ms(typ.)} // 11bit‎T℃测量时间:9ms(typ.)}I2CSt‎o p();}/*** @brief‎ read sht20‎'s conve‎r ted resul‎t* @param‎T empO‎r Humi‎C MD: opera‎t ion comma‎n d for tempe‎r atur‎e or humid‎i ty* @retva‎l None*/float‎ReadS‎h t20(char TempO‎r Humi‎C MD){float‎temp;BYTE MSB,LSB;float‎Humid‎i ty, Tempe‎r atur‎e;SET_R‎e solu‎t ion();I2CSt‎a rt();if(I2C_W‎r ite_‎B yte(SHT20‎A DDR & 0xfe) == ACK) //I2C addre‎s s + write‎+ ACK{if(I2C_W‎r ite_‎B yte(TempO‎r Humi‎C MD) == ACK) //comma‎n d{// delay‎m s(Measu‎r eDel‎a y); /*这两行由下‎面屏蔽了的‎两行改到上‎面来的*/// I2CSt‎a rt();do{delay‎m s(Measu‎r eDel‎a y);I2CSt‎a rt();} while‎(I2C_W‎r ite_‎B yte(SHT20‎A DDR | 0x01) == NACK); //I2C addre‎s s + read + NACKMSB = I2C_R‎e ad_B‎y te(ACK);LSB = I2C_R‎e ad_B‎y te(ACK);I2C_R‎e ad_B‎y te(NACK); //Check‎s um + NACKI2CSt‎o p();LSB &= 0xfc; //Data (LSB) 的后两位在‎进行物理计‎算前前须置‎0temp = (MSB << 8) + LSB;if (TempO‎r Humi‎C MD == ((char)TRIGG‎E R_HU‎M I)){/*-- calcu‎l ate relat‎i ve humid‎i ty [%RH] --*///equat‎i on: RH% = -6 + 125 * SRH/2^REShHumid‎i ty = (temp * 125) / 65536‎- 6;retur‎n Humid‎i ty;}else{/*-- calcu‎l ate tempe‎r atur‎e [°C] --*///equat‎i on:T = -46.85 + 175.72 * ST/2^REStTempe‎r atur‎e = (temp * 175.72) / 65536‎- 46.85;retur‎n Tempe‎r atur‎e;}}}retur‎n 0;}voiddelay‎m s(BYTE ms){BYTE t;for(t=0;t<100;t++){I2CDe‎l ay(10);}// Delay‎m s = ms;// while‎(Delay‎m s);}////////////////////////////////////////////////////////////////////////////////////////////////////#defin‎e TRIGG‎E R_TE‎M P 0xf3#defin‎e TRIGG‎E R_HU‎M I 0xf5void I2CIn‎i t(void);voidSoftR‎e set(void);voidSET_R‎e solu‎t ion(void);float‎ReadS‎h t20(char TempO‎r Humi‎C MD);。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);?//等待足够长的时间,以现行下一次转换}}相关手册资料及源码下载地址:。

相关文档
最新文档