×
单片机 > 单片机程序设计 > 详情

单片机温湿度光照二氧化碳 智能检测

发布时间:2020-08-26 发布时间:
|

仿真原理图如下


单片机源程序如下:

#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)=Sht


关键字:单片机  温湿度光照  二氧化碳  智能检测 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机制作超级流水灯