历史上的今天
返回首页

历史上的今天

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

正在发生

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

2020-09-04 来源:51hei


单片机源程序如下:

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

}

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

推荐阅读

史海拾趣

遨格芯微(AGM)公司的发展小趣事

除了在智能手机和IoT市场取得突破外,AGM还深耕工业和消费类市场。公司自主研发并量产的可编程逻辑SoC产品系列广泛应用于工业和消费类市场,满足了客户对高容积率、低成本、高品质的市场需求。通过不断的技术创新和产品优化,AGM在工业和消费类市场逐渐形成了自己的竞争优势,并赢得了越来越多客户的认可和信赖。

Gennum ( Semtech )公司的发展小趣事
确保所有元件都已正确安装,没有损坏或接错。
Ceramics公司的发展小趣事

“品质陶瓷”公司深知品质是企业生存和发展的根本。因此,该公司建立了严格的质量管理体系,从原材料采购到产品出厂的每一个环节都进行严格把控。品质陶瓷还引入了先进的生产设备和技术,不断提升产品的性能和质量稳定性。这一品质管理策略使得该公司的产品在市场上具有极高的竞争力,赢得了众多客户的信任和好评。

AB Connectors Ltd公司的发展小趣事

进入新世纪,电子行业的技术更新换代速度加快。AB Connectors Ltd意识到,只有不断创新才能在激烈的市场竞争中立足。于是,公司加大了研发投入,组建了一支高素质的研发团队,专注于连接器技术的创新。经过多年的努力,AB Connectors Ltd成功开发出了一系列具有自主知识产权的新型连接器产品,不仅提高了产品的性能和质量,还降低了生产成本。这些创新产品为公司赢得了众多客户的青睐,进一步巩固了市场地位。

EOS POWER INDIA Pvt公司的发展小趣事

EOS POWER INDIA Pvt公司成立于1991年,由美国加利福尼亚州几位电力电子领域的先驱创立。成立之初,EOS就致力于电力电子技术的研发与应用,特别是在电源解决方案方面。通过引进先进的技术和工艺,EOS在印度市场上逐步建立起自己的品牌形象,并开始为本地客户提供优质的电源产品和服务。

DB Unlimited公司的发展小趣事

DB Unlimited公司最初只是一个生产基础音频组件的小型企业。随着技术的不断发展和市场的变化,公司意识到单纯的组件生产已经无法满足客户的需求。于是,DB Unlimited开始转型,致力于提供完整的音频解决方案。通过不断研发和创新,公司成功开发出了一系列高性能的音频产品,并凭借其卓越的品质和性能,赢得了客户的广泛认可。

问答坊 | AI 解惑

DSP (数字信号处理) 技术: sysDSP

DSP应用方式持续扩展 随着视频和静态图像使用的增长以及软件无线电(SDR)等可重复配置系统的需求增长,数字信号处理(DSP)的应用持续扩展。许多应用将重要的DSP处理与成本因素结合在一起,产生了对高性能、低成本DSP解决方案的需求。 FPGA及通用D ...…

查看全部问答>

PCB板设计中的接地方法与技巧

PCB板设计中的接地方法与技巧 PCB设计中最重要的就是GND的接法?如何处理GND VSS等各种地 请看这里。。。。。。…

查看全部问答>

各位兄弟姐妹进来看看!

YTE xdata tempBuf2[512* 39 ]; #define        ramFatTab         (tempBuf2 + 512* 0) 我现在在一个C文件里定义上面这些,但是我现在要在一个工程的另外一个C文件里调用ramFatTab,但是如果 ...…

查看全部问答>

请问strrchr()函数如何使用

大家好,我能获取文件的整个路径\"\\\\My Document\\\\1.txt\",现在想获取文件名1.txt,请问该怎么用strrchr()函数来做?我是在win32 application中做的,请不要用mfc。谢谢了…

查看全部问答>

1、假设你需要一个类似于TCP的滑动窗口协议,该协议运行在一个100Mb/s网络上,网络的往返时间是100ms,最大段生命期为60s。请问协议头部的窗口和顺序号字段应该有多少位?为什么? 2、主机A要向主机B传送一个512KB的消息,途中要经过8个路由器。链 ...…

查看全部问答>

如何用cpld实现除法

如何用cpld实现除法…

查看全部问答>

RTC中的ALR寄存器复位时不保存,怎么回事

在RTC调试过程中,出现ALR寄存器数据复位不保存的情况,而CNT可以保存.按手册上讲,这两个寄存器都在后备域中,在未发生后备域复位的情况下,这些数据应该不保存才对啊,而现在ALR不保存,CNT却可以,这是为何??以下先贴初始化程序,后贴图,望有人能解 ...…

查看全部问答>

想了解下stm32f100c才11块,比M0还强啊

                                 f100的引脚和f103的一样是吗?code呢?…

查看全部问答>

求助:有没有SH3单片机的实例程序?

求助:有没有SH3单片机的实例程序?…

查看全部问答>

MSP430串口刚才使用出现的一个小问题

刚才运行程序发现下午明明配置好的串口不能使用,重新上电后有串口数据不稳定的情况,经过仔细排查得出结论:串口使用前,要确定所选的驱动时钟信号已经稳定,否则会产生无法预料的结果…

查看全部问答>