历史上的今天
返回首页

历史上的今天

今天是:2025年02月20日(星期四)

正在发生

2020年02月20日 | 单片机温湿度光照二氧化碳 智能检测

2020-02-20 来源:51hei

仿真原理图如下
0.png?imageView2/2/w/550

单片机源程序如下:

#include         

#include "lcd.h"

#include  

#define uchar unsigned char

#define uint unsigned int

#define ulong unsigned long

#define NACK        0

#define ACK                1

#define MEASURE_TEMP        0x03        //000 0001  1

#define MEASURE_HUMI        0x05        //000 0010  1

#define STATUS_REG_W        0x06        //000 0011  0

#define STATUS_REG_R        0x07        //000 0011  1

#define RESET                        0x1E        //000 1111  0

ulong volt;//测量的电压值

sbit Data=P2^3;   //定义数据线

sbit CLK=P3^3;//定义时钟信号口

sbit DIN=P3^1;//定义2543数据写入口

sbit DOUT=P3^0;//定义2543数据读取口

sbit CS=P3^2;//定义2543片选信号口

sbit Data_P    = P2^4;                        // SHT11传感器的数据管脚

sbit Sck_P     = P2^3;                        // SHT11传感器的时钟管脚

sbit BEEP =P2^5;

uchar tmpe,h;

uchar rec_dat[9];   //用于显示的接收数据数组

uchar temp_max = 30;

uchar humi_min = 60;

ulong C2_max = 3500000;

ulong LUX_max = 3500000;

ulong C2_now = 0;

ulong LUX_now = 0;

unsigned char temp;                                                        // 保存温度

unsigned char humi;                                                  // 保存湿度


enum { TEMP,HUMI };

typedef union                              //定义共用同类型

{

        unsigned int i;

        float f;

}value;



int display = 0;

void delay(uchar ms) 

{  // 延时子程序 

uchar i; 

while(ms--) 

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

}


char ShtWriteByte(unsigned char value)

{

        unsigned char i,error=0;

        for(i=128;i>0;i>>=1)  // 高位为1,循环右移

        {

                if (i&value)

                        Data_P=1;               // 和要发送的数相与,结果为发送的位

                else

                        Data_P=0;

                Sck_P=1;

                _nop_();                                                // 延时3us

                _nop_();

                _nop_();

                Sck_P=0;

        }

        Data_P=1;                                            // 释放数据线

        Sck_P=1;

        error=Data_P;                                  // 检查应答信号,确认通讯正常

        _nop_();

        _nop_();

        _nop_();

        Sck_P=0;

        Data_P=1;

        return error;                                 // error=1 通讯错误

}


char ShtReadByte(unsigned char ack)

{

        unsigned char i,val=0;

        Data_P=1;                                                 // 释放数据线

        for(i=0x80;i>0;i>>=1)        // 高位为1,循环右移

        {

                Sck_P=1;

                if(Data_P)

                        val=(val|i);            // 读一位数据线的值

                Sck_P=0;

        }

        Data_P=!ack;                            // 如果是校验,读取完后结束通讯

        Sck_P=1;

        _nop_();                                                        // 延时3us

        _nop_();

        _nop_();

        Sck_P=0;

        _nop_();

        _nop_();

        _nop_();

        Data_P=1;                                                 // 释放数据线

        return val;

}



void ShtTransStart(void)

{

        Data_P=1;

        Sck_P=0;

        _nop_();

        Sck_P=1;

        _nop_();

        Data_P=0;

        _nop_();

        Sck_P=0;

        _nop_();

        _nop_();

        _nop_();

        Sck_P=1;

        _nop_();

        Data_P=1;

        _nop_();

        Sck_P=0;

}


void ShtConnectReset(void)

{

        unsigned char i;

        Data_P=1;                                    //准备

        Sck_P=0;

        for(i=0;i<9;i++)          //DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位

        {

                Sck_P=1;

                Sck_P=0;

        }

        ShtTransStart();           //启动传输

}


char ShtMeasure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)

{

        unsigned error=0;

        unsigned int i;

        ShtTransStart();                  // 启动传输

        switch(mode)                       // 选择发送命令

        {

                case 1 :                                           // 测量温度

                        error+=ShtWriteByte(0x03);

                        break;

                case 2 :                                           // 测量湿度

                        error+=ShtWriteByte(0x05);

                        break;

                default:

                        break;

        }

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

                if(Data_P==0)

                        break;                                          // 等待测量结束

                if(Data_P)

                        error+=1;                           // 如果长时间数据线没有拉低,说明测量错误

        *(p_value) =ShtReadByte(1);                  // 读第一个字节,高字节 (MSB)

        *(p_value+1)=ShtReadByte(1);                 // 读第二个字节,低字节 (LSB)

        *p_checksum =ShtReadByte(0);          // read CRC校验码

        return error;                                                                          // error=1 通讯错误

}


void CalcSHT11(float *p_humidity ,float *p_temperature)

推荐阅读

史海拾趣

EZchip Technologies Ltd公司的发展小趣事

随着技术的不断成熟和市场的认可,EZchip开始寻求更广阔的市场空间。公司通过与全球知名通信设备制造商建立合作关系,将其产品应用于各类网络设备和解决方案中。同时,EZchip还积极参与国际标准制定和行业交流活动,不断提升品牌影响力。通过市场拓展和合作,EZchip的产品逐渐覆盖了全球多个国家和地区,成为了网络通信行业的重要参与者。

乔光电子(FTR)公司的发展小趣事

EZchip Technologies Ltd公司自创立之初,就以技术创新为核心驱动力。在21世纪初,网络通信行业飞速发展,对高性能的网络处理芯片需求激增。EZchip团队凭借其深厚的技术积累和对市场敏锐的洞察力,成功研发出了一款具有划时代意义的网络处理器芯片,该芯片以其高效的数据处理能力和低延迟特性迅速获得了市场的认可。随着技术的不断迭代和创新,EZchip逐渐在网络处理器领域建立了技术壁垒,成为了行业的佼佼者。

Gulf Semiconductor公司的发展小趣事

在激烈的市场竞争中,产品质量和客户服务是企业赢得客户信任的关键。EZchip一直秉承“质量第一、客户至上”的理念,注重产品的质量控制和客户服务体验。公司采用严格的生产流程和质量控制标准,确保每一件产品都符合高标准、高质量的要求。同时,EZchip还建立了完善的客户服务体系,为客户提供及时、专业的技术支持和售后服务。这些措施不仅提升了产品的竞争力,也赢得了客户的广泛赞誉和信任。

Cedrat Technologies公司的发展小趣事

Cedrat Technologies深知技术创新的重要性,因此一直致力于打造一支跨学科的研发团队。这支团队由材料科学、机械工程、电子工程等多个领域的专家组成,他们共同致力于智能材料机电产品的研发和应用。通过多年的努力,团队在微型纳米定位、阻尼、振动产生等领域取得了显著成果,为公司的快速发展提供了强大的技术支撑。

德丰(DEFOND)公司的发展小趣事

德丰金属材料有限公司(简称“德丰金属”)是一家专业从事铝合金建筑型材加工的企业。随着市场竞争的加剧和环保要求的提高,公司意识到必须加快转型升级的步伐。为此,德丰金属加大了研发投入和技术改造力度,成功开发出了一系列符合绿色环保标准的新型铝合金型材产品。同时,公司还积极拓展国际市场,与多家国外知名企业建立了长期稳定的合作关系。通过不断的努力和创新,德丰金属成功实现了从传统制造业向绿色环保型制造业的转型升级。

APTA Group Inc公司的发展小趣事

在电子行业的发展过程中,APTA Group Inc也遭遇了不少挑战。例如,原材料价格的波动、国际贸易环境的变化等都曾给公司带来不小的压力。然而,APTA并未被这些困难击垮,而是积极调整战略,优化生产流程,降低成本,提高产品质量。这种在挑战中展现出的韧性和应变能力,使得APTA能够在逆境中保持稳健的发展态势。

问答坊 | AI 解惑

闲聊哈希表(中)

上期链接: https://bbs.eeworld.com.cn/thread-97607-1-1.html 上期,我们说到了散列函数(Hash Function)。它又名哈希函数,是计算机科学中一个重要的课题。什么是散列函数呢?其实,这个概念并没有一个严格的定义。一般说来,散列函数满足以下 ...…

查看全部问答>

《C++编程习题与解答(全美经典学习指导系列)》

内容简介:   本书由浅入深地介绍了C++语言的各个方面,并在所涉及的各个知识点给出了详细的例子,使读者能够更容易了解C++语言的内容。无论读者是从未接触过 C++语言的新手,还是对C++语言有一定经验的开发人员,本书都能使你对这门编程语言有全 ...…

查看全部问答>

vxworks下,串口测试,只能写,不能读。。(附代码)

#include #include \"taskLib.h\" #include \"locale.h\" #include \"string.h\" #include \"stdlib.h\" #include \"Vxworks.h\" //#include \"configAll.h\" #include \"dosFsLib.h\" #include \"sioLib.h\" #include \"stdio.h\" /* ...…

查看全部问答>

s3c2410上arm-linux上的cs8900网卡驱动

我的s3c2410开发板的BANK3上接了一块cs8900, 我用的是IO模式, 中断接收方式, 相关寄存器的初始化如下:         put_reg(PP_RxCFG, get_reg(PP_RxCFG) | RxOKiE | BufferCRC );            ...…

查看全部问答>

测试功能性能的工具有哪些?

分不够加,有好的工具加分。…

查看全部问答>

请问下大家?怎么利用单片机产生 指数信号?

我想用单片机产生一个频率可程控按指数衰减的正弦信号, 我的思想是:用DDS产生可程控频率的正弦信号;  用单片机产生指数信号,在将两信号经过乘法器 进行调幅得到频率可程控按指数衰减的正弦信号  请问可行吗?   ...…

查看全部问答>

流明LM3S9B90 计划用于打印机项目

项目大楷要求:  1,可以使用TI的LM3S9B90  ARM  2,ARM通过外部总线连接一个ALTER公司FPGA  3,整个流程 PC通过100M网络传送打印数据到ARM,ARM通过外部总线传送到FPGA外扩的64M SDRAM中,后面的工作依靠FPGA从SDRAM中取出数 ...…

查看全部问答>

便携熨斗

除非入住高档酒店,否则一般旅馆提供的熨烫服务总让人头疼,这也是为什么不少商务旅客喜欢自带熨斗的原因。今天要给大家介绍的这款便携式熨斗正好满足经常出差的商务人士的需要。这款熨斗收纳起来只有小公文包大小,不占空间,并能用自带的电池支持 ...…

查看全部问答>

(已解决)C编写的延时60S的程序,但是软件仿真延时不到1S

谢谢大家的鼎力相助和给力支持~~!我已经找到错误所在,就是少了个中断函数,应该加个void timer0() interrupt1 的函数,然后把定时器设定放在里面。只是这样的话就没有用delay函数来的方便,而且定时器中断不能反复调用,个人觉得没有delay的调 ...…

查看全部问答>