下面是我做的溫度報警,溫度在30-35之間報警,溫度顯示在數碼管上面,dht11模塊的數值顯示在1602液晶顯示屏上面,能夠獲取實時的溫度和適度.
原理圖如下:
a.png (604.02 KB, 下載次數: 33)
下載附件
原理圖
2021-7-20 23:15 上傳
部分代碼:
#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, 下載次數: 38)
2021-7-21 05:18 上傳
點擊文件名下載附件
整個工程代碼 下載積分: 黑幣 -5
|