找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2287|回复: 0
收起左侧

单片机+DHT11+DS18B20智能报警源程序

[复制链接]
ID:933150 发表于 2021-7-20 23:17 | 显示全部楼层 |阅读模式
      下面是我做的温度报警,温度在30-35之间报警,温度显示在数码管上面,dht11模块的数值显示在1602液晶显示屏上面,能够获取实时的温度和适度.
      原理图如下:

原理图

原理图


      部分代码:

#include "reg52.h"
#include<intrins.h>
#include "XMF_DS18B20_51.h"

#define uchar unsigned char
#define uint unsigned int

sbit beep=P3^0;
sbit Data=P3^7;   
uchar rec_dat[16];   

sbit lcdrs=P3^5    ;
sbit lcdrw=P3^4;
sbit lcden=P3^3;



const char SMGNoDot_CC[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
const char SMGDot_CA[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};

unsigned int temp = 0;

unsigned char Send_dat[6] = {0xbf,0x00,0x00,0x00,0x00,0xfb};

void Delay(unsigned int t);
void DelaySMG(unsigned int t);
void DisplaySMG_Bit(unsigned char pos, unsigned char dat);
void ShowTemperature();
void ReadTemperature();
void bee(void);
void write_com(uchar com);
void write_dat(uchar dat);
void init_lcd();
void DHT11_delay_us(uchar n);
void DHT11_delay_ms(uint z);
void DHT11_start();
uchar DHT11_rec_byte();
void DHT11_receive();  

void main()
{        uchar rec_date[]={'C','R','S',':','1','9','1','1','1','3','0','6','1','3','2'};
  uchar i,a;   
   init_lcd();  
    while(1)
    {
        ReadTemperature();
        ShowTemperature();  
   
        bee();
        
        DHT11_delay_ms(100);   
    DHT11_receive();
    write_com(0x80);  
    for(i=0;i<16;i++)
        write_dat(rec_dat[ i]);   
        write_com(0x80+0x40);
        for(a=0;a<17;a++)
        write_dat(rec_date[a]);   
     }
        
    }


void Delay(unsigned int t)
{
    while(t--)
    {
        ShowTemperature();
        DelaySMG(100);
    }
}

void DelaySMG(unsigned int t)
{
    while(t--);
   
}



void ShowTemperature()
{            

P0=0x01;
P1=SMGNoDot_CC[temp/100];
DelaySMG(300);
P1=0xff;

P0=0x02;
P1=SMGDot_CA[temp%100/10];
DelaySMG(300);
P1=0xff;

P0=0x04;
P1=SMGNoDot_CC[temp%10];
DelaySMG(300);
P1=0xff;

P0=0x08;
P1=0xc6;
DelaySMG(200);
P1=0xff;   

}



void ReadTemperature()
{
    unsigned char LSB,MSB ;
   
    Init_DS18B20();                    
    Write_DS18B20(0xCC);        
    Write_DS18B20(0x44);   
    Delay(100);
    Init_DS18B20();
    Write_DS18B20(0xCC);        
    Write_DS18B20(0xBE);        
    LSB = Read_DS18B20();        
    MSB = Read_DS18B20();        
   
    temp = 0x0000;
    temp = MSB;
    temp <<= 8;
    temp = temp | LSB;
    temp >>= 4;
    temp = temp*10;
    temp = temp + (LSB&0x0f)*0.625;
   
    if((MSB>>4) == 0x0f)
    {
        temp |= 0x8000;
    }   

}

void bee()
{
if(2<(temp/100)>=3||(temp%100/10)>4)
{
  beep=1;
   
    Delay(100);
   
    beep=0;
    Delay(100);
}
else
{

beep=0;
}
}
   







void write_com(uchar com)
{
          lcdrw=0;
        lcdrs=0;                        
        P2=com;
         DelaySMG(5);
        lcden=1;                        
        DelaySMG(5);
        lcden=0;                     
}

void write_dat(uchar dat)
{       lcdrw=0;
        lcdrs=1;                        
        P2=dat;
         DelaySMG(5);
        lcden=1;
       DelaySMG(5);
        lcden=0;
}
void init_lcd()
{       lcdrw=0;
        lcden=0;
      
        write_com(0x38);         
        write_com(0x0c);        
        write_com(0x06);        
        write_com(0x01);

}
void DHT11_delay_us(uchar n)
{
    while(--n);
}

void DHT11_delay_ms(uint z)
{
   uint i,j;
   for(i=z;i>0;i--)
      for(j=110;j>0;j--);
}

void DHT11_start()
{
   Data=1;
   DHT11_delay_us(2);
   Data=0;
   DHT11_delay_ms(30);   
   Data=1;
   DHT11_delay_us(30);
}

uchar DHT11_rec_byte()      
{
   uchar i,dat=0;
  for(i=0;i<8;i++)   
   {         
      while(!Data);   
      DHT11_delay_us(8);     
      dat<<=1;           
      if(Data==1)   
         dat+=1;
      while(Data);   
    }  
    return dat;
}

void DHT11_receive()      
{
    uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
    DHT11_start();
    if(Data==0)
    {
        while(Data==0);   
        DHT11_delay_us(40);  
        R_H=DHT11_rec_byte();     
        R_L=DHT11_rec_byte();     
        T_H=DHT11_rec_byte();   
        T_L=DHT11_rec_byte();   
        revise=DHT11_rec_byte();

        DHT11_delay_us(25);   

        if((R_H+R_L+T_H+T_L)==revise)      
        {
            RH=R_H;
            RL=R_L;
            TH=T_H;
            TL=T_L;
        }
        rec_dat[0]='S';
        rec_dat[1]='D';
                rec_dat[2]=':';
        rec_dat[3]='0'+(RH/10);
        rec_dat[4]='0'+(RH%10);
        rec_dat[5]='R';
        rec_dat[6]='H';
                rec_dat[7]=' ';
                rec_dat[8]=' ';
                rec_dat[9]='W';
                rec_dat[10]='D';
                 rec_dat[11]=':';
        rec_dat[12]='0'+(TH/10);
        rec_dat[13]='0'+(TH%10);
        rec_dat[14]='C';
            }
        }

全部代码51hei附件下载:
Ds18b20报警+DTH11温湿度显示.7z (37.38 KB, 下载次数: 35)

评分

参与人数 1黑币 +40 收起 理由
admin + 40 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表