SHT11数字温湿度传感器

发布者:EtherealGrace最新更新时间:2020-09-04 来源: 51hei关键字:SHT11  数字温湿度传感器 手机看文章 扫描二维码
随时随地手机看文章


单片机源程序如下:

#include   

#include   

#include "LCD1602.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        0x1e


enum { TEMP, HUMI };


typedef union               //定义共用同类型  

{

        unsigned int i;

        float f;

} value;



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

位定义

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

sbit SCK = P1 ^ 0;

sbit DATA = P1 ^ 1;


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

变量定义

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

uchar wendu[6];

uchar shidu[6];



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

50us延时函数

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

void delay_50us(uint t)

{

        uint j;

        for (; t>0; t--)

        for (j = 19; j>0; j--);

}



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

液晶显示函数

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

void displaywendu(void)

{

        uchar i;

        write_com(0x80+0x40);

        write_data('T');

        write_data(':');

        for (i = 0; i<3; i++)

        {

                write_data(wendu[i]);

                delay_50us(1);

        }

        for (i = 0; i<1; i++)

        {

                write_data('.');

                delay_50us(1);

        }

        for (i = 4; i<5; i++)

        {

                write_data(wendu[i]);

                delay_50us(1);

        }

        write_data(0xDF);

        write_data('C');

}



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

液晶显示函数

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

void displayshidu(void)

{

        uchar i;

        write_com(0x80);

        write_data('H');

        write_data(':');

        for (i = 0; i<3; i++)

        {

                write_data(shidu[i]);

                delay_50us(1);

        }

        for (i = 0; i<1; i++)

        {

                write_data('.');

                delay_50us(1);

        }

        for (i = 4; i<5; i++)

        {

                write_data(shidu[i]);

                delay_50us(1);

        }

        write_data('%');

        write_data('R');

        write_data('H');

}


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

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_();        //延时3us   

                SCK = 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_();          //延时3us   

        SCK = 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 char mode)

{

        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 通讯错误  

}

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

[1] [2]
关键字:SHT11  数字温湿度传感器 引用地址:SHT11数字温湿度传感器

上一篇:STC8951单片机的外部中断资源
下一篇:基于51单片机的温度报警器

推荐阅读最新更新时间:2024-11-02 04:47

基于CXA1191和SHT11的无线温湿度监测系统
在工农业生产、气象、环保等部门,经常需要对环境温度与湿度进行测量与控制。准确的温湿度测量对生物制药、食品加工和造纸等行业更是至关重要的。随着测量技术自动化和智能化程度的提高,各种温湿度采集系统已得到了广泛应用。传统的温湿度测量采用有线传输方式,一般使用模拟化的温湿度传感器直接将非电量转换成电量,再送至PC机或单片机作后续处理。其缺点在于:一是布线工作量大,成本高,传输距离较远时还会引入较大的误差和干扰;二是模拟式湿度传感器一般都要设计信号调理电路并需要经过复杂的校准和标定过程,因此测量精度难以保证,且在线性度、重复性、互换性、一致性等方面往往不尽人意。尽管目前已有一些无线温湿度采集方案,但其传输部分多采用价格较高的专用无线模块实
[单片机]
基于CXA1191和<font color='red'>SHT11</font>的无线<font color='red'>温湿度</font>监测系统
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved