//硬件连接: P0.6口为通讯口连接DHT11
//软件说明:
//湿度大于湿度上限或者温度小于温度的下限,进行加热
//湿度小于湿度下限,进行喷水
//温度大于温度上限或者氧气含量不足,打开风扇
#include <reg51.h>
#include <nokia_5110.h>
#include <intrins.h>
/*****************宏定义******************/
#define uchar unsigned char /* defined for unsigned 8-bits integer variable 无符号8位整型变量 */
#define uint unsigned int /* defined for unsigned 16-bits integer variable 无符号16位整型变量 */
/*****************端口的定义******************/
sbit DHT11_DATA=P2^6;
sbit S1=P3^7;
sbit S2=P3^6;
sbit S3=P3^5;
sbit S4=P3^4;
sbit S5=P3^3;
sbit S6=P3^2;
sbit S7=P1^4;
sbit S8=P1^3;
sbit fengshan=P1^2;
sbit penshui=P1^1;
sbit jiare=P1^0;
sbit yangqi=P1^7;
sbit dianji=P1^6;
/*****************全局变量的定义******************/
uchar Overtime_counter; //判断等待是否超时的计数器。利用uchar型的数值范围进行自动延时控制(时长由初值决定),并判断是否超时
uchar bit_value; //从DATA总线上读到的位值
uchar T_data_H,T_data_L,RH_data_H,RH_data_L,checkdata;//校验过的温度高8位,温度低8位,湿度高8位,湿度低8位,校验和8位
uchar T_data_H_temp,T_data_L_temp,RH_data_H_temp,RH_data_L_temp,checkdata_temp;//未经校验的数据
uchar comdata; //从DHT11读取的一个字节的数据
uchar count; //串口发送的字节计数变量
uchar wendu_up = 30,wendu_low = 15;
uchar shidu_up = 25,shidu_low = 15;
uchar str_send[2];
unsigned char i=0,str[8]="25153015";
unsigned char code RUN[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; //步进电机相序表
void delay(unsigned int t);
uchar rec_flag = 0;
//步进电机驱动
void motor_ffw()
{
unsigned char i;
for (i=0; i<8; i++) //一个周期转3.75*8=30度
{
P0 = RUN[i]&0x1f; //取数据
delay(30); //调节转速
}
}
/******延时函数****************/
void delay(unsigned int t)
{
unsigned int k;
while(t--)
{
for(k=0; k<60; k++)//用for的空循环延长程序的执行时间
{ }
}
}
void Delay_10us(void)
{
uchar i;
i--;
i--;
i--;
i--;
i--;
i--;
}
void Delay_100us(uint i)
{
uchar j;
for(;i>0;i--)
{
for(j=0;j<10;j++)
Delay_10us();
}
}
void Delay_100ms(uint i)
{
uint j;
for(;i>0;i--)
{
for(j=0;j<10000;j++)
Delay_10us();
}
}
/*****************从DHT11读取一个字节函数******************/
void Read_Byte(void)
{
uchar i;
for(i=0;i<8;i++) //循环8次,读取8bit的数据
{
Overtime_counter=2;
while((!DHT11_DATA)&&Overtime_counter++);
Delay_10us(); //26-28us的低电平判断门限
Delay_10us();
bit_value=0; //跳过门限后判断总线是高还是低,高为1,低为0
if(DHT11_DATA)
bit_value=1;
Overtime_counter=2;
while((DHT11_DATA)&&Overtime_counter++);
if(Overtime_counter==1)
break; //超时则跳出for循环
comdata<<=1; //左移1位,LSB补0
comdata|=bit_value; //LSB赋值
}
}
/*****************DHT11读取五个字节函数******************/
void Read_DHT11(void)
{
uchar checksum;
DHT11_DATA=0; //主机拉低18ms
Delay_100us(180);
DHT11_DATA=1; //总线由上拉电阻拉高 主机延时20us-40us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
DHT11_DATA=1; //主机转为输入或者输出高电平,DATA线由上拉电阻拉高,准备判断DHT11的响应信号
if(!DHT11_DATA) //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
{
Overtime_counter=2; //判断DHT11发出的80us的低电平响应信号是否结束
while((!DHT11_DATA)&&Overtime_counter++);
Overtime_counter=2; //判断DHT11是否发出80us的高电平,如发出则进入数据接收状态
while((DHT11_DATA)&&Overtime_counter++);
Read_Byte(); //读取湿度值整数部分的高8bit
RH_data_H_temp=comdata;
Read_Byte(); //读取湿度值小数部分的低8bit
RH_data_L_temp=comdata;
Read_Byte(); //读取温度值整数部分的高8bit
T_data_H_temp=comdata;
Read_Byte(); //读取温度值小数部分的低8bit
T_data_L_temp=comdata;
Read_Byte(); //读取校验和的8bit
checkdata_temp=comdata;
DHT11_DATA=1;//读完数据将总线拉高
checksum=(T_data_H_temp + T_data_L_temp + RH_data_H_temp + RH_data_L_temp);//进行数据校验
if(checksum==checkdata_temp)
{
RH_data_H = RH_data_H_temp;
RH_data_L = RH_data_L_temp;
T_data_H = T_data_H_temp;
T_data_L = T_data_L_temp;
checkdata = checkdata_temp;
}
}
}
/*******************************************************************************
* 函 数 名 :UsartConfiguration()
* 函数功能 :设置串口
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void UsartConfiguration()
{
// SCON=0X50; //设置为工作方式1
// TMOD=0X20; //设置计数器工作方式2
// PCON=0X80; //波特率加倍
// TH1=0XF3; //计数器初始值设置,注意波特率是4800的
// TL1=0XF3;
// ES=1; //打开接收中断
// EA=1; //打开总中断
// TR1=1; //打开计数器
SCON = 0x50 ; //串口工作方式1,8位UART,波特率可变
TMOD |= 0x20 ; //定时器1,工作方式2,自动再装入8位定时器
PCON |= 0x80 ; //SMOD=1; 波特率加倍
TH1 = 0xfa ; //波特率:9600 晶振=11.0592MHz
IE |= 0x90 ; //使能串口中断
TR1 = 1 ; // 定时器1开始
}
//向串口发送一个字符
void send_char_com( unsigned char ch)
{
SBUF=ch;
while (TI==0 );
TI= 0 ;
}
//向串口发送一个字符串,strlen为该字符串长度
void send_string_com( unsigned char *str, unsigned int strlen)
{
unsigned int k= 0 ;
do
{
send_char_com(*(str + k));
k++;
}
while (k < strlen);
}
void main()
{
UsartConfiguration();
LCD_init();
LCD_clear();
//Delay_100us(500); //延时100US(12M晶振)
LCD_write_english_string(0,0,"shidu:");
LCD_write_english_string(0,2,"wendu:");
// LCD_write_english_string(0,4,"checkcode:");
while(1)
{
Read_DHT11();/////////调用温湿度读取子程序
str_send[0] = '1';
send_char_com(str_send[0]);
str_send[1] = RH_data_H; //shidu
send_char_com(str_send[1]);
str_send[2] = T_data_H; //wendu
send_char_com(str_send[2]);
str_send[3] = '2';
send_char_com(str_send[3]);
send_string_com(str_send,4);
// if(rec_flag == 1)
// {
if(i > 7)
{
i = 0;
shidu_up = (str[0]-'0')*10+(str[1]-'0');
shidu_low = (str[2]-'0')*10+(str[3]-'0');
wendu_up = (str[4]-'0')*10+(str[5]-'0');
wendu_low = (str[6]-'0')*10+(str[7]-'0');
// send_string_com(str,8);
// }
// rec_flag = 0;
}
while(dianji==0)
motor_ffw(); //调用旋转处理函数
LCD_set_XY(45,0);
LCD_write_char(RH_data_H/10+48); //////RH_data_H湿度显示 T_data_H 温度
LCD_write_char(RH_data_H%10+48);
if(RH_data_H>shidu_up||T_data_H<wendu_low)//加热
jiare = 0;
else
jiare = 1;
if(RH_data_H<shidu_low)//喷水
penshui = 0;
else penshui = 1;
if(T_data_H>wendu_up||yangqi == 0)//风扇
fengshan = 0;
else fengshan = 1;
LCD_set_XY(0,1);
LCD_write_char(shidu_up/10+48); //////湿度显示
LCD_write_char(shidu_up%10+48);
LCD_set_XY(45,1);
LCD_write_char(shidu_low/10+48); //////湿度显示
LCD_write_char(shidu_low%10+48);
LCD_set_XY(45,2);
LCD_write_char(T_data_H/10+48); /////////温度显示
LCD_write_char(T_data_H%10+48);
LCD_set_XY(0,3);
LCD_write_char(wendu_up/10+48); //////wen度显示
LCD_write_char(wendu_up%10+48);
LCD_set_XY(45,3);
LCD_write_char(wendu_low/10+48); //////wen度显示
LCD_write_char(wendu_low%10+48);
Delay_100us(200);
// Delay_100ms(5);
//sbit S1=P3^7;sbit S2=P3^6;sbit S3=P3^5;sbit S4=P3^4;sbit S5=P3^3;sbit S6=P3^2;sbit S7=P3^1;sbit S8=P1^3;
if(S1==0)
{
str[1]++;
if(str[1]==10)
{
str[1] = 0;
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
1、实时监测环境温度,湿度等含量。 2、实时液晶显示湿度,温度等参数。 3、按键设定温度湿度上下限。 4、增加警报功能,蜂鸣器警报。 5、可以设定温度的上下限,当低于设定温度时,系统自动启动加热设备。高于设定温度时,打开风扇降温。 6、可以设定湿度的上下限,当低于设定湿度时,系统自动启动加湿设备。高于设定湿度时,打开加热设备进行干燥。 7、可以通过对电机的控制进行蛋的反转。 8、单独设计硬件电路,并软件实现。
资源推荐
资源详情
资源评论
收起资源包目录
程序0410.rar (26个子文件)
程序0410
DTH11温湿度传感器_uvopt.bak 57KB
DTH11温湿度传感器.plg 192B
DTH11温湿度传感器.Uv2.bak 2KB
DTH11温湿度传感器.uvproj 13KB
882813691DHT11.zip 39KB
bmp_pixel.h 17KB
nokia_5110.OBJ 11KB
DTH11温湿度传感器.uvopt 57KB
DTH11温湿度传感器.opt.bak 2KB
nokia_5110.c 6KB
DTH11温湿度传感器.M51 28KB
write_chinese_string_pixel.h 206B
DTH11温湿度传感器.hex 11KB
DTH11温湿度传感器_uvproj.bak 13KB
DTH11温湿度传感器.lnp 57B
main.LST 19KB
DTH11温湿度传感器 25KB
nokia_5110.LST 11KB
english_6x8_pixel.h 13KB
main.OBJ 18KB
DTH11温湿度传感器_Opt.Bak 1KB
nokia_5110.h 1KB
DTH11温湿度传感器.uvgui_DMH.bak 67KB
DTH11温湿度传感器.uvgui.DMH 67KB
main.c 9KB
DTH11温湿度传感器_Uv2.Bak 0B
共 26 条
- 1
资源评论
- qq_523780052020-11-09方便加微信吗, 请教孵化机单机片一些问题。
迷离的眼神
- 粉丝: 45
- 资源: 48
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功