前言:作者想要帮助一些童鞋和爱好者进行项目构建,但自知能力有限,不喜可论,创作不易,勿喷。
系统采用stc89c51芯片进行的单片机环境温湿度检测控制,能够实现温湿度检测与调节设定。上代码。
项目包含主要器件stc89c51 lcd1602 dht11
项目包含程序 仿真 原理图 PCB
main.c
#include <REG51.H>
#include <1602.c>
#include <uart.c>
#include <stdio.h>
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 <dht11.c>
#include <display.c>
#include <key.c>
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("\r\n temp :%d.%d C \r\n",TH,TL);
printf("\r\n temp high :%d C \r\n",TH_set);
// printf("\r\n temp low :%d C \r\n",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;
}
}
仿真
原理图
资源区会上传相关资源,积分下载
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/156063.html