【Proteus仿真】【51单片机】自动浇花灌溉系统设计
生活随笔
收集整理的這篇文章主要介紹了
【Proteus仿真】【51单片机】自动浇花灌溉系统设计
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 一、功能簡介
- 二、軟件設計
- 三、實驗現象
- 聯系作者
一、功能簡介
本項目使用Proteus8仿真51單片機控制器,使用LCD1602液晶、按鍵、DS18B20、PCF8591 ADC、土壤濕度傳感器、水位傳感器、蜂鳴器模塊等。
系統運行后,LCD1602顯示傳感器檢測的溫度、濕度及水位值;
默認以自動模式運行,若按下K4鍵切換為手動模式,此時可以
通過K1和K2控制水泵和水箱開關。當再次按下K4鍵切換為自動
模式;自動模式下,實時檢測溫度、濕度及水位值,當溫度高于
或低于設定閾值,聲光報警。當濕度高于上限聲光報警,低于下限
且水箱水位高于30%,則開啟水泵澆水。否則水箱開始加水,當水箱
水位高于80%,停止加水。
可通過K3鍵進入閾值設置,K1和K2調節,設置好后可按下K4鍵返回主
界面。
主要功能如下:
1、溫度/濕度檢測
2、LCD1602顯示溫濕度/水位
3、溫濕度閾值設置
4、超限聲光報警
5、自動/手動澆花灌溉
二、軟件設計
/* 作者:嗨小易(QQ:3443792007) *///系統參數初始化 void sys_parm_init(void) {sys_ctrl.mode=0;sys_ctrl.temph=30;sys_ctrl.templ=25;sys_ctrl.humih=40;sys_ctrl.humil=20;sys_ctrl.auto_flag=0; }//系統開機界面顯示 void sys_open_show(void) {lcd1602_clear();lcd1602_show_string(0,0,"Tp: C");lcd1602_show_string(7,0," - ");lcd1602_show_string(13,0," %");lcd1602_show_string(0,1,"Sd: %");lcd1602_show_string(7,1," - %");lcd1602_show_string(14,1,"Au"); }//系統數據獲取 void sys_data_get(void) {static u8 i=0;while(1){//溫度獲取i++;if(i%10==0)sys_ctrl.temp=ds18b20_read_temperture();//濕度獲取sys_ctrl.humi=pcf8591_read_adcvalue(1);sys_ctrl.humi=cal_map(sys_ctrl.humi,0,255,0,99);//水位獲取sys_ctrl.level=pcf8591_read_adcvalue(0);sys_ctrl.level=cal_map(sys_ctrl.level,0,255,0,99); break;} }//系統數據顯示 void sys_data_show(void) {static u8 i=0;while(1){//溫度顯示lcd1602_show_nums(3,0,sys_ctrl.temp,2,0);//濕度顯示lcd1602_show_nums(3,1,sys_ctrl.humi,2,0);//水位顯示lcd1602_show_nums(13,0,sys_ctrl.level,2,0);//溫度閾值顯示lcd1602_show_nums(7,0,sys_ctrl.templ,2,0);lcd1602_show_nums(10,0,sys_ctrl.temph,2,0);//濕度閾值顯示lcd1602_show_nums(7,1,sys_ctrl.humil,2,0);lcd1602_show_nums(10,1,sys_ctrl.humih,2,0); //溫度下限閃爍顯示if(sys_ctrl.mode==1){i++;if(i%100!=0)lcd1602_show_string(7,0," "); }//溫度上限閃爍顯示else if(sys_ctrl.mode==2){i++;if(i%100!=0)lcd1602_show_string(10,0," "); }//濕度下限閃爍顯示else if(sys_ctrl.mode==3){i++;if(i%100!=0)lcd1602_show_string(7,1," "); }//濕度上限閃爍顯示else if(sys_ctrl.mode==4){i++;if(i%100!=0)lcd1602_show_string(10,1," "); }delay_ms(1);//手動狀態顯示if(sys_ctrl.auto_flag)lcd1602_show_string(14,1,"SD");else lcd1602_show_string(14,1,"Au");break; } }//系統數據設置 void sys_data_set(void) {u8 key=0;key=key_scan(0);//模式設置if(key==KEY3_PRESS){sys_ctrl.mode++;if(sys_ctrl.mode>=5)sys_ctrl.mode=0;}//在設置模式下,加else if(key==KEY1_PRESS){switch(sys_ctrl.mode){case 1://溫度下限 sys_ctrl.templ++;if(sys_ctrl.templ>99)sys_ctrl.templ=0;break;case 2://溫度上限 sys_ctrl.temph++;if(sys_ctrl.temph>99)sys_ctrl.temph=0;break;case 3://濕度下限 sys_ctrl.humil++;if(sys_ctrl.humil>99)sys_ctrl.humil=0;break;case 4://濕度上限 sys_ctrl.humih++;if(sys_ctrl.humih>99)sys_ctrl.humih=0;break;}//手動模式,開關水泵if(sys_ctrl.auto_flag==1)SB_PIN=!SB_PIN; }//在設置模式下,減else if(key==KEY2_PRESS){switch(sys_ctrl.mode){case 1://溫度下限 sys_ctrl.templ--;if(sys_ctrl.templ<0)sys_ctrl.templ=99;break;case 2://溫度上限 sys_ctrl.temph--;if(sys_ctrl.temph<0)sys_ctrl.temph=99;break;case 3://濕度下限 sys_ctrl.humil--;if(sys_ctrl.humil<0)sys_ctrl.humil=99;break;case 4://濕度上限 sys_ctrl.humih--;if(sys_ctrl.humih<0)sys_ctrl.humih=99;break;}//手動模式,開關水箱if(sys_ctrl.auto_flag==1)SX_PIN=!SX_PIN; }else if(key==KEY4_PRESS){if(sys_ctrl.mode!=0)//確定sys_ctrl.mode=0;else//自動/手動切換{sys_ctrl.auto_flag=!sys_ctrl.auto_flag;//自動模式下,關閉水箱水泵if(sys_ctrl.auto_flag==0){SX_PIN=1;SB_PIN=1; } } } }//系統功能控制 void sys_fun_ctrl(void) {//自動模式下控制if(sys_ctrl.auto_flag==0){//如果溫度高于上限或低于下限,聲光報警if(sys_ctrl.temp>sys_ctrl.temph || sys_ctrl.temp<sys_ctrl.templ){LED=0;beep_alarm(100,20);}//溫度正常,聲光報警取消elseLED=1; //如果濕度高于上限,聲光報警if(sys_ctrl.humi>sys_ctrl.humih){LED=0;beep_alarm(100,20); }//如果濕度低于下限,聲光報警else if(sys_ctrl.humi<sys_ctrl.humil){LED=0;beep_alarm(100,20);//當水箱有水,水泵打開澆水,關閉水箱加水if(sys_ctrl.level>LEVEL_MIN_VALUE){SB_PIN=0;SX_PIN=1; }//當水箱水不夠,水泵停止澆水,開啟水箱加水else{SB_PIN=1;SX_PIN=0; } }//如果濕度正常,聲光報警關閉,水泵停止澆水else {LED=1;SB_PIN=1; }//如果水箱水不夠,開始加水if(sys_ctrl.level<LEVEL_MIN_VALUE)SX_PIN=0;//如果水箱水足夠,停止加水else if(sys_ctrl.level>LEVEL_MAX_VALUE)SX_PIN=1; }}//應用控制系統 void appdemo_show(void) {u8 i=10;sys_parm_init();//系統參數初始化lcd1602_init();ds18b20_init();//讀取溫度數據,等待穩定while(i--){sys_ctrl.temp=ds18b20_read_temperture();//濕度獲取sys_ctrl.humi=pcf8591_read_adcvalue(1);sys_ctrl.humi=cal_map(sys_ctrl.humi,0,255,0,99);//水位獲取sys_ctrl.level=pcf8591_read_adcvalue(0);sys_ctrl.level=cal_map(sys_ctrl.level,0,255,0,99);delay_ms(100); }sys_open_show();//系統開機界面顯示while(1){ sys_data_get();//系統數據獲取sys_data_show();//系統數據顯示sys_data_set();//系統數據設置sys_fun_ctrl();//系統功能控制} }三、實驗現象
演示視頻:https://space.bilibili.com/444388619
聯系作者
專注于51單片機、STM32、國產32、DSP、Proteus、ardunio、ESP32、物聯網軟件開發,PCB設計,視頻分享,技術交流。
總結
以上是生活随笔為你收集整理的【Proteus仿真】【51单片机】自动浇花灌溉系统设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为交换机ip地址与MAC地址绑定(全局
- 下一篇: 快播合并工具