历史上的今天

今天是:2024年09月04日(星期三)

正在发生

2020年09月04日 | SHT11数字温湿度传感器

发布者:EtherealGrace 来源: 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单片机的温度报警器

推荐阅读

人工智能作为新一轮产业变革的核心驱动力,正在深刻改变人类生产生活方式。如今,人工智能已成为引领科技发展的重要驱动力,全球各科技公司纷纷布局人工智能产业,抢占战略高地,中国更将其纳入国家发展战略,各地方政府也不甘落后,纷纷发布人工智能规划。而深圳作为改革开放的应许之地,创业创新风气浓厚,政策也高度倾斜于科技创新,有良好的技术市场化...
摘要:PWR系列可编程交流电源具备强大的波形生成功能,轻松地产生复杂的瞬态波形,模拟输出正常的交流电,也能模拟输出电力线路干扰或电网失真等异常交流电,并且支持电气参数量测。本文介绍如何选择合适可编程交流电源满足待测物测试需求。如今电子产品应用全球化,适应不同地区的各种类型电网,即不仅能在正常电网环境下正常运行,而且能在非正常的非理...
  目前,表面涂层是最先进的热伪装技术之一。涂层能够吸收穿戴者身体的热量,并且改变衣物散发出的热量。然而,涂层只能在预定温度下工作,如果环境温度发生改变,它就不再适用了。  《先进功能材料》杂志报道,美国加州大学圣地亚哥分校的研究人员Renkun Chen教授等开发了一种可穿戴技术,可以帮助用户避开夜视镜等热探测传感器的监视。虽然这款设备...
当打工人被繁杂的工作压垮,在日复一日的重复性工作后逐渐躺平;企业也在业务流程复杂性和员工生产力中困顿不堪,企业是时候思考如何实现业务流程端到端的自动化,以及组织和员工的协作关系。有远见的企业正在使用自动化与人工智能来增强核心优势,并与员工和客户建立智能高效的协作关系。 根据 IBM 商业价值研究院的一项研究显示,到 2022年,人工...

史海拾趣

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

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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