|
由于本論壇禁止伸手黨,所以向大家請教一下大致的實現方法與思路,理清頭緒后我自己來實現,謝謝大家
流程圖,是51單片機連mq2氣體傳感器,LED燈,光敏,風扇,1602a液晶,溫濕度傳感器進行工作
有鍵盤:溫度,濕度和切換+-模式,有上極限值
***************************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
- 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;//3¬ê±íË3ö
- //50usòÔoó¼ì2a
- 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;//3¬ê±íË3ö
- }
- }
- return date;
- }
- //éÏμçoó1ÃëμÄêy¾YÎ趨,2»òaéÏà-μç×è,2»è»IO¿úÎT·¨à-μí
- 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]êÇêa¶èμÄÕûêy,tab[1]êÇD¡êy,tab[2]êÇζèÕûêy,tab[3]êÇêa¶èD¡êy
- //tab[4]êÇD£Ñéoí,êÇÇóoíoóμÄ×îμíλ
- 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
復制代碼
視頻https://share.weiyun.com/1FUq9s1c
|
|