基于51单片机的大棚环境土壤湿度光强监测系统proteus仿真原理图PCB
生活随笔
收集整理的這篇文章主要介紹了
基于51单片机的大棚环境土壤湿度光强监测系统proteus仿真原理图PCB
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
功能介紹:
0.本系統采用STC89C52作為單片機
1.系統實時監測當前溫濕度/土壤濕度/環境光強并顯示
2.溫濕度超過設定閾值范圍,蜂鳴器響,同時開啟對應控制繼電器
3.土壤濕度低于設定下限,開啟噴灑,直至達到上限,關閉噴灑
4.環境光強超過設定上限,啟動遮陽傘,環境光強低于設定下限,停用遮陽傘
5.按鍵可修改閾值范圍
6.采用DC002作為電源接口可直接輸入5V給整個系統供電
原理圖:
PCB :
主程序:
#include "main.h"#define MAXCNT (64*64-1) #define MINCNT (1)/*******************變量定義*********************/ enum _MODE_DF_ dispMode; uchar setIndex = 0; uint humidity; //濕度 uint temperature; //溫度 uint light; //光強 float SH_Value = 0;//土壤濕度uint hmMin= 50;//濕度下限 uint hmMax= 70;//濕度上限uint tempMin = 25;//溫度下限 uint tempMax = 40;//溫度上限uint lightMin = 30;//光照下限 uint lightMax = 60;//光照上限int SH_Value_Min = 30;//土壤濕度下限 int SH_Value_Max = 60;//土壤濕度上限uint motorCnt = 0; //記錄遮光棚位置 uchar motorFlag = 2; //標記當前控制狀態,=0遮陽棚已關閉,=1過程中,=2遮陽棚已打開 bit motorDir = 0; //方向bit dispFlag = 0;bit buzzerFlag1 = 0; //蜂鳴器標志1 bit buzzerFlag2 = 0; //蜂鳴器標志2char dis[16];/******************************************************** 函數名稱:void mian() 函數作用:主函數 參數說明: ********************************************************/ void main() {Timer0_Init(); //初始化定時器0LCD_Init(); //初始化液晶DelayMs(200); //延時有助于穩定LCD_DispStr(4, 0, "Welcome!");DelayS(1);LCD_Clear(); //清屏BYJ48 = ((BYJ48 & 0xF0) | REV[0]); //取數據ULN_DQ3 = BIT3; ULN_DQ2 = BIT2; ULN_DQ1 = BIT1; ULN_DQ0 = BIT0;while (1) //死循環{if (dispFlag == 1){dispFlag = 0;if (dispMode == NORMAL){DispNormal();}}if (humidity < hmMin) //濕度低于下限{buzzerFlag1 = 1;RELAY_JS = ON; //加濕開RELAY_CS = OFF; //除濕關}else if (humidity > hmMax) //濕度高于上限{buzzerFlag1 = 1;RELAY_JS = OFF; //加濕關RELAY_CS = ON; //除濕開}else{buzzerFlag1 = 0;RELAY_JS = OFF; //加濕關RELAY_CS = OFF; //除濕關}if (temperature < tempMin) //溫度低于下限{buzzerFlag2 = 1;RELAY_HEAT = ON; //升溫開RELAY_COOL = OFF; //降溫關}else if (temperature > tempMax) //溫度高于上限{buzzerFlag2 = 1;RELAY_HEAT = OFF; //升溫關RELAY_COOL = ON; //降溫開}else{buzzerFlag2 = 0;RELAY_HEAT = OFF; //升溫關RELAY_COOL = OFF; //降溫關}if (SH_Value < SH_Value_Min) //土壤濕度低于下限{RELAY_NY = ON; //噴灑}else if (SH_Value >= SH_Value_Max){RELAY_NY = OFF; //停止噴灑}if (motorFlag == 2) //遮陽傘已打開{if (light > lightMax) //光照太強{//關閉遮陽傘motorFlag = 1;motorDir = 1;motorCnt = 0;}}else if (motorFlag == 0) //遮陽傘已關閉{if (light < lightMin) //光照低于下限{//打開遮陽傘motorFlag = 1;motorDir = 0;motorCnt = MAXCNT;}}if (buzzerFlag1 || buzzerFlag2) //蜂鳴器報警{BUZZER = ON;}else{BUZZER = OFF;}KeyProcess();} }/*------------------------------------------------定時器初始化子程序 ------------------------------------------------*/ void Timer0_Init(void) {TMOD |= 0x01; //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響TH0 = (65536 - 9216) / 256; //重新賦值 10msTL0 = (65536 - 9216) % 256;EA = 1; //總中斷打開ET0 = 1; //定時器中斷打開TR0 = 1; //定時器開關打開 } /*------------------------------------------------定時器中斷子程序 ------------------------------------------------*/ void Timer0_Interrupt(void) interrupt 1 {static unsigned int time1ms = 0;TL0 = 0x66; //設置定時初始值TH0 = 0xFC; //設置定時初始值 1mstime1ms++;if (time1ms > 500){dispFlag = 1; //顯示標志time1ms = 0;}if (motorFlag == 1){if (motorDir == 1){motorCnt++;BYJ48 = ((BYJ48 & 0xF0) | REV[motorCnt % 8]); //取數據ULN_DQ3 = BIT3; ULN_DQ2 = BIT2; ULN_DQ1 = BIT1; ULN_DQ0 = BIT0;if (motorCnt >= MAXCNT){motorFlag = 0;}}else{motorCnt--;BYJ48 = ((BYJ48 & 0xF0) | REV[motorCnt % 8]); //取數據ULN_DQ3 = BIT3; ULN_DQ2 = BIT2; ULN_DQ1 = BIT1; ULN_DQ0 = BIT0;if (motorCnt <= 0){motorFlag = 2;}}} }void DispNormal(void) {ET0 = 0;DHT11_0_ReadData();ET0 = 1;temperature = U8T_data_H; //讀取溫度humidity = U8RH_data_H; //讀取濕度sprintf(dis, "Hm:%2d%% T:%3d", humidity, temperature);LCD_DispStr(0, 0, dis);LCD_DispOneChar(12, 0, 0xdf);LCD_DispOneChar(13, 0, 'C');LCD_DispOneChar(14, 0, ' ');LCD_DispOneChar(15, 0, ' ');SH_Value = 99 * (255-ReadADC(AIN0_GND)) / 210; //讀取土壤濕度if (SH_Value > 99){SH_Value = 99;}light = 100 - 100 * ReadADC(AIN1_GND) / 255; //讀取光強sprintf(dis, "L:%2d%% SH:%2d", light, (int)SH_Value);LCD_DispStr(0, 1, dis);if (motorFlag == 2) //遮陽傘已打開{LCD_DispStr(11, 1, " St:O");}else if (motorFlag == 1){LCD_DispStr(11, 1, " St:D");}else if (motorFlag == 0) //遮陽傘已關閉{LCD_DispStr(11, 1, " St:C");}}/************************* 設置濕度閾值 *************************/ void DispSetHm(unsigned char setIndex) {LCD_DispStr(0, 0, " Set Humidity ");sprintf(dis, " H:%2d%% L:%2d%% ", hmMax, hmMin);LCD_DispStr(0, 1, dis);switch (setIndex){case 1: LCD_SetCursor(6, 1, 1); break;case 2: LCD_SetCursor(12, 1, 1); break;default:;} }/************************* 設置溫度閾值 *************************/ void DispSetTemp(unsigned char setIndex) {LCD_DispStr(0, 0, "Set Temperature ");sprintf(dis, " H:%3d L:%3d ", tempMax, tempMin);LCD_DispStr(0, 1, dis);switch (setIndex){case 1: LCD_SetCursor(7, 1, 1); break;case 2: LCD_SetCursor(13, 1, 1); break;default:;} }/************************* 設置光照閾值 *************************/ void DispSetLight(unsigned char setIndex) {LCD_DispStr(0, 0, " Set LightLimit ");sprintf(dis, " H:%2d%% L:%2d%% ", lightMax, lightMin);LCD_DispStr(0, 1, dis);switch (setIndex){case 1: LCD_SetCursor(6, 1, 1); break;case 2: LCD_SetCursor(12, 1, 1); break;default:;} }/************************* 設置土壤濕度閾值 *************************/ void DispSetSH(unsigned char setIndex) {LCD_DispStr(0, 0, " Set SH Limit ");sprintf(dis, " H:%3d L:%3d ", SH_Value_Max, SH_Value_Min);LCD_DispStr(0, 1, dis);switch (setIndex){case 1: LCD_SetCursor(6, 1, 1); break;case 2: LCD_SetCursor(13, 1, 1); break;default:;} }仿真演示視頻:
https://www.bilibili.com/video/BV1h3411V7Jn/
實物演示視頻:
https://www.bilibili.com/video/BV1ee4y1n7ZD/
總結
以上是生活随笔為你收集整理的基于51单片机的大棚环境土壤湿度光强监测系统proteus仿真原理图PCB的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Volar - vue终极开发神器!
- 下一篇: Mac系统如何查看更新R版本