前言:作者想要帮助一些童鞋和爱好者进行项目构建,但自知能力有限,不喜可论,创作不易,勿喷。
系统采用stc89c51芯片进行的单片机环境温湿度检测控制,能够实现温湿度检测与调节设定。上代码。
项目包含主要器件stc89c51 lcd1602 dht11
项目包含程序 仿真 原理图 PCB
main.c
#include#include <1602.c> #include #include unsigned int cp1; unsigned int RH,RL,TH,TL,mode; int TH_set=30,TL_set=25; bit flash; sbit P31 = P3^1; sbit P32 = P3^2; sbit P30 = P3^0; sbit P22 = P2^2; #include #include #include void timer0_isr() interrupt 1 { TH0 = (65535 - 1000) / 255; TL0 = (65535 - 1000) % 255; cp1++; if(cp1 >= 6) { cp1 = 0; DHT11_receive() ; } } void timer0_init() { TMOD = 0x01; TH0 = (65535 - 1000) / 256; TL0 = (65535 - 1000) % 256; EA = 1; ET0 = 1; TR0 = 1; } void main() { F1602_init(); F1602_clear(); timer0_init(); DHT11_start(); uart_init() ; TI = 1; SendString("welcome to temp sys"); TI = 0; P22 = 0; // P31 = 0; // P32 = 0; while(1) { key0(); if(TH >= TH_set) P22 = 1; else P22 = 0; display0(); TI = 1; printf("rn temp :%d.%d C rn",TH,TL); printf("rn temp high :%d C rn",TH_set); // printf("rn temp low :%d C rn",TL_set); TI = 0; // if(RH <= RH_set1)P31 = 1; // else P31 = 0; // if(TH >= TH_set2)P32 = 1; // else P32 = 0; // if(RH >= RH_set2||TH <= TH_set1)P30 = 0; // else P30 = 1; } }
dht11.c
sbit Data = P3^6;
#define uchar unsigned char
#define uint unsigned int
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); //延时18ms以上
Data=1;
DHT11_delay_us(30);
}
uchar DHT11_rec_byte() //接收一个字节
{
uchar i,dat=0;
for(i=0;i<8;i++) //从高到低依次接收8位数据
{
while(!Data); 等待50us低电平过去
DHT11_delay_us(8); //延时60us,如果还为高则数据为1,否则为0
dat<<=1; //移位使正确接收8位数据,数据为0时直接移位
if(Data==1) //数据为1时,使dat加1来接收数据1
dat+=1;
while(Data); //等待数据线拉低
}
return dat;
}
void DHT11_receive() //接收40位的数据
{
uchar R_H,R_L,T_H,T_L,revise;
DHT11_start();
if(Data==0)
{
while(Data==0); //等待拉高
DHT11_delay_us(40); //拉高后延时80us
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;
}
}
}
display.c
char bz;
void display0()
{
if(mode == 0)
{
gotoxy(1,0);
display_string("TH:");
display_num(TH_set);
gotoxy(2,0);
display_string("temp:");
display_num(TH);
display_string(".");
display_num(TL);
}
if(mode == 1)
{
gotoxy(1,0);
display_string("temp high:");
gotoxy(2,0);
display_num(TH_set);
}
}
key.c
sbit k1 = P3^2;
sbit k2 = P3^3;
sbit k3= P3^4;
void key0()
{
if(k1 == 0)
{
while(k1 == 0);
F1602_clear();
mode++;
if(mode >= 2)mode = 0;
}
if(k2 == 0)
{
while(k2 == 0);
if(mode == 1)TH_set++;
if(TH_set >= 100)TH_set = 100;
}
if(k3 == 0)
{
while(k3 == 0);
if(mode == 1)TH_set--;
if(TH_set <= 0)TH_set = 0;
}
}
仿真
原理图
资源区会上传相关资源,积分下载



