流程图,是51单片机连mq2气体传感器,LED灯,光敏,风扇,1602a液晶,温湿度传感器进行工作
有键盘:温度,湿度和切换+-模式,有上极限值 视频https://share.weiyun.com/1FUq9s1c
***************************main.c**********************
#include "stc12c5a60s2.h"
#include "intrins.h"
#include "stdio.h"
#include "math.h"
#include "string.h"
#include <stdlib.h>
#define uchar unsigned char
#define uint unsigned int
#define u8 unsigned char
#define u16 unsigned int
#define vu8 unsigned char
#define vu16 unsigned int
#define vu32 unsigned long int
vu8 sys[4];
vu8 dat11[5];
void delayms(int z)//延时函数
{
int x,y;
for(x=110*6;x>0;x--)
for(y=z;y>0;y--);
}
#define delay_ms delayms
#include "1602_12864.h"
#include "eeprom.h"
#include "adc.h"
#include "usart.h"
#include "ds18b20.h"
#include "dht11.h"
#include "display.h"
#include "int.h"
sbit k1=P2^5;
sbit k2=P2^6;
sbit k3=P2^7;
sbit fs=P1^5;
sbit led=P1^6;
sbit gm=P1^3;
vu8 CardID[4];
void main(void)//
{
vu16 i,status,k,mq2;
LCD_Init();//液晶初始化
Usart_Config(1);//串口1初始化
Timer0_Init();//定时器0初始化
SysRead((u8 *)&sys[0],4);//系统读取参数
InitADC();
while(1)
{
mq2=GetADCResult(7)/(1024.0/99.0);//mq-2气体传感器
DH11_GetTempDamp();//dht11温湿度传感器
if(gm==1)
led=0;//开灯
else
led=1;//关灯
display2(TempNow,DampNow,&sys[0],&sys[1]);
if((TempNow>sys[0])||(DampNow>sys[1])) //风扇
{
fs=0;//打开风扇
}
else
{
fs=1;//关闭
}
k++;
if(k>12) //通过SIM800a模块发送数据给手机app
{
k=0;
sendchar(1,'S');//固定字符S
sendchar(1,'0');
sendchar(1,'1');
sendchar(1,'0');
sendchar(1,TempNow/10+48);
sendchar(1,TempNow%10+48);
sendchar(1,',');
sendchar(1,DampNow/10+48);
sendchar(1,DampNow%10+48);
sendchar(1,',');
sendchar(1,mq2/10+48);
sendchar(1,mq2%10+48);
sendchar(1,',');
sendchar(1,(vu8)gm+48);
sendchar(1,'E');//固定字符E
}
delayms(100);
}
}
************************1602a液晶显示器****************************
display.h
#define disname1 "T1"
#define disname2 "T2"
#define disname3 "T3"
#define disname4 "T4"
#define disname1max 99
#define disname2max 99
#define disname3max 99
#define disname4max 99
sbit keys=P2^5;
sbit key1=P2^6;
sbit key2=P2^7;
sbit key3=P3^7;
sbit key4=P2^4;
vu8 AddFlag=0;
//display2(TempNow,DampNow,&sys[0],&sys[1]);
void display1(vu8 a1,vu8 *val1h)//只显示一组比较值
{
if(keys==0)
{
(*val1h)--;
if((*val1h)>disname1max)
(*val1h)=disname1max;
SysSave((u8 *)&sys[0],2);
}
if(key1==0)
{
(*val1h)++;
if((*val1h)>disname1max)
(*val1h)=0;
SysSave((u8 *)&sys[0],2);
}
LCD_DisStr(0,0,disname1);
LCDW_Dat(':');
LCDW_Dat(a1/10+48);
LCDW_Dat(a1%10+48);
LCD_DisStr(1,0,"H:");
LCDW_Dat(*(val1h)/10+48);
LCDW_Dat(*(val1h)%10+48);
}
void display2(vu8 a1,vu8 a2,vu8 *val1h,vu8 *val2h)
{
if(keys==0)
{
delayms(10);
if(keys==0)
AddFlag=1-AddFlag;
while(keys==0);
}
if(key1==0)
{
if(AddFlag==0)
{
(*val1h)++;
if((*val1h)>disname1max)
(*val1h)=0;
}
else
{
(*val1h)--;
if((*val1h)>disname1max)
(*val1h)=disname1max;
}
SysSave((u8 *)&sys[0],2);
}
if(key2==0)
{
if(AddFlag==0)
{
(*val2h)++;
if((*val2h)>disname2max)
(*val2h)=0;
}
else
{
(*val2h)--;
if((*val2h)>disname2max)
(*val2h)=disname2max;
}
SysSave((u8 *)&sys[0],2);
}
LCD_DisStr(0,0,disname1);
LCDW_Dat(':');
LCDW_Dat(a1/10+48);
LCDW_Dat(a1%10+48);
LCD_DisStr(0,12,"H:");
LCDW_Dat(*(val1h)/10+48);
LCDW_Dat(*(val1h)%10+48);
LCD_DisStr(1,0,disname2);
LCDW_Dat(':');
LCDW_Dat(a2/10+48);
LCDW_Dat(a2%10+48);
LCD_DisStr(1,12,"H:");
LCDW_Dat(*(val2h)/10+48);
LCDW_Dat(*(val2h)%10+48);
}
//显示4个参数,可调其值
void display4(vu8 *val1,vu8 *val2,vu8 *val3,vu8 *val4)
{
if(keys==0)
{
delayms(10);
if(keys==0)
AddFlag=1-AddFlag;
while(keys==0);
}
if(key1==0)
{
if(AddFlag==0)
{
(*val1)++;
if((*val1)>disname1max)
(*val1)=0;
}
else
{
(*val1)--;
if((*val1)>disname1max)
(*val1)=disname1max;
}
SysSave((u8 *)&sys[0],4);
}
if(key2==0)
{
if(AddFlag==0)
{
(*val2)++;
if((*val2)>disname2max)
(*val2)=0;
}
else
{
(*val2)--;
if((*val2)>disname2max)
(*val2)=disname2max;
}
SysSave((u8 *)&sys[0],4);
}
if(key3==0)
{
if(AddFlag==0)
{
(*val3)++;
if((*val3)>disname3max)
(*val3)=0;
}
else
{
(*val3)--;
if((*val3)>disname3max)
(*val3)=disname3max;
}
SysSave((u8 *)&sys[0],4);
}
if(key4==0)
{
if(AddFlag==0)
{
(*val4)++;
if((*val4)>disname4max)
(*val4)=0;
}
else
{
(*val4)--;
if((*val4)>disname4max)
(*val4)=disname4max;
}
SysSave((u8 *)&sys[0],4);
}
LCD_DisStr(0,0,disname1);
LCDW_Dat(':');
LCDW_Dat(*(val1)/10+48);
LCDW_Dat(*(val1)%10+48);
LCD_DisStr(0,16-strlen(disname2)-3,disname2);
LCDW_Dat(':');
LCDW_Dat(*(val2)/10+48);
LCDW_Dat(*(val2)%10+48);
LCD_DisStr(1,0,disname3);
LCDW_Dat(':');
LCDW_Dat(*(val3)/10+48);
LCDW_Dat(*(val3)%10+48);
LCD_DisStr(1,16-strlen(disname4)-3,disname4);
LCDW_Dat(':');
LCDW_Dat(*(val4)/10+48);
LCDW_Dat(*(val4)%10+48);
}
****************************dht11温湿度传感器***************************
dht11.h
#define STC_1T//ÊÇ·ñ1Tµ¥Æ¬»ú
//Èç¹û89c52,¶¨Ê±Æ÷10ms
sbit PIN_DHT11=P1^2;
vu8 TempNow=0x01,DampNow=0x01;
#ifdef STC_1T
void Delay_10us(void)
{
uchar i;
i--;
i--;
i--;
i--;
i--;
i--;
i--;
i--;
i--;
i--;
i--;
i--;
i--;
i--;
i--;
i--;
i--;
i--;
i--;
i--;
i--;
i--;
}
vu8 COM(void)
{
uchar i,date=0,timeout;
Delay_10us();
for(i=0;i<8;i++)
{
date<<=1;
timeout=2;
while((!PIN_DHT11)&&(timeout++))
Delay_10us();
if(timeout==1)
break;//³¬Ê±Í˳ö
//50usÒÔºó¼ì²â
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
if(PIN_DHT11)
{
date|=1;
timeout=2;
while((PIN_DHT11)&&(timeout++));
if(timeout==1)
break;//³¬Ê±Í˳ö
}
}
return date;
}
//Éϵçºó1ÃëµÄÊý¾ÝÎȶ¨,²»ÒªÉÏÀµç×è,²»È»IO¿ÚÎÞ·¨ÀµÍ
void DH11_GetTempDamp(void)
{
u16 i,y;
vu8 tab[5],timeout;
PIN_DHT11=0;
for(i=110*6;i>0;i--)
for(y=25;y>0;y--);
PIN_DHT11=1;
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
if(!PIN_DHT11)
{
timeout=2;
while((!PIN_DHT11)&&(timeout++))
Delay_10us();
timeout=2;
while((PIN_DHT11)&&(timeout++));
Delay_10us();
for(i=0;i<5;i++)
tab[i]=COM();
PIN_DHT11=1;
if(tab[4]==(tab[0]+tab[1]+tab[2]+tab[3]))
{
TempNow=tab[2];//tab[0]ÊÇʪ¶ÈµÄÕûÊý,tab[1]ÊÇСÊý,tab[2]ÊÇζÈÕûÊý,tab[3]ÊÇʪ¶ÈСÊý
//tab[4]ÊÇУÑéºÍ,ÊÇÇóºÍºóµÄ×îµÍλ
DampNow=tab[0];
}
}
}
#else
uchar TAB[4];
uchar U8FLAG,U8temp;
uchar U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
uchar U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
uchar U8comdata;
void Delay_10us(void)
{
uchar i;
i--;
i--;
i--;
i--;
i--;
i--;
}
void COM(void)
{
uchar i;
Delay_10us();
for(i=0;i<8;i++)
{
U8FLAG=2;
while((!PIN_DHT11)&&U8FLAG++);
Delay_10us();
Delay_10us();
Delay_10us();
U8temp=0;
if(PIN_DHT11)
U8temp=1;
Delay_10us();
U8FLAG=2;
while((PIN_DHT11)&&U8FLAG++);
if(U8FLAG==1)
break;
U8comdata<<=1;
U8comdata|=U8temp;
}
}
void DH11_GetTempDamp(void)
{
PIN_DHT11=0;
delayms(15);
PIN_DHT11=1;
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
PIN_DHT11=1;
if(!PIN_DHT11)
{
U8FLAG=2;
while((!PIN_DHT11)&&U8FLAG++);
U8FLAG=2;
while((PIN_DHT11)&&U8FLAG++);
COM();
U8RH_data_H_temp=U8comdata;
COM();
U8RH_data_L_temp=U8comdata;
COM();
U8T_data_H_temp=U8comdata;
COM();
U8T_data_L_temp=U8comdata;
COM();
U8checkdata_temp=U8comdata;
PIN_DHT11=1;
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
if(U8temp==U8checkdata_temp)
{
U8RH_data_H=U8RH_data_H_temp;
U8RH_data_L=U8RH_data_L_temp;
U8T_data_H=U8T_data_H_temp;
U8T_data_L=U8T_data_L_temp;
U8checkdata=U8checkdata_temp;
}
TAB[0]=U8T_data_H/10;
TAB[1]=U8T_data_H%10;
TAB[2]=U8RH_data_H/10;
TAB[3]=U8RH_data_H%10;
TempNow=U8T_data_H;
DampNow=U8RH_data_H;
}
}
#endif
你要先自己弄清楚流程,然后用Word里面画流程图的符号画出来。
您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632