這是一個我做出來的51單片機的澆花系統,帶有DHT11溫濕度檢測模塊,以及土壤濕度檢測模塊,可以設置觸發澆花的臨界值,并且改進了澆水判斷程序,避免在臨界值抖動達不到澆水效果
這個1602顯示、帶DHT11的澆花系統的程序我們借鑒了51黑電子論壇上許多大佬的作品,在此對他們表示感謝٩(๑>◡<๑)۶,同時我們也對程序做了許多優化與更改,使得整個系統更具實用性,比如改進了澆水判斷程序,避免在臨界值抖動達不到澆水效果(〃'▽'〃)。但是時間緊,有一些地方并沒有完善,比如沒有加1602背光控制。還需要各位繼續完善(*/ω\*),然后,成品我們已經測試過可以正常使用,如果出現異常請檢查一下接線是否有誤~
還有還有,水泵如果和單片機使用同一個電源,要濾波否則會影響1602的正常顯示,最好使用獨立的電源。原理圖沒畫1602的對比度調節,大家可以自己加上!
制作出來的實物圖如下:
IMG_20181125_112839.jpg (3.28 MB, 下載次數: 59)
下載附件
正面
2018-11-25 11:37 上傳
IMG_20181125_112903.jpg (2.36 MB, 下載次數: 66)
下載附件
設置狀態
2018-11-25 11:37 上傳
IMG_20181125_112853.jpg (3.72 MB, 下載次數: 59)
下載附件
反面
2018-11-25 11:38 上傳
電路原理圖如下:
0.png (86 KB, 下載次數: 69)
下載附件
2018-11-25 16:28 上傳
單片機源程序如下:
- /**************************
- 制作:華南農業大學 LSR
- ***************************/
- //程序頭函數
- #include <reg52.h>
- #include <intrins.H>
- #include <math.H>
- //宏定義
- #define uint unsigned int
- #define uchar unsigned char
- #define Data_ADC0809 P1
-
- //管腳聲明
- sbit Feng = P3^0;
- sbit DQ=P3^1; //DTH11
- //ADC0809
- sbit ST=P3^3;
- sbit EOC=P3^4;
- sbit OE=P3^2;
- //按鍵
- sbit Key1=P3^5;
- sbit Key2=P3^6;
- sbit Key3=P3^7;
- sbit rs=P2^2;
- sbit lcden=P2^0;
- sbit rw=P2^1;
- uchar code table_num[]="0123456789abcdefg"; //定義數組
- uchar tem;
- uchar hum;
- //函數聲明
- extern uchar ADC0809();
- bit Init_DTH11() ;
- void delay_ms(uint z);
- void delay(uint t);
- void write_com(uchar com) ;
- void write_data(uchar dat) ;
- void write_sfm2(uchar hang,uchar add,uint date);
- void write_string(uchar hang,uchar add,uchar *p);
- void init() ;
- void Display(uchar X,uchar Data);
- void DTH11_DUSHU();
- void Display_DTH11();
-
- uchar DTH11_RD_CHAR();
- //濕度變量
- uchar temp=0;
- //蜂鳴器變量
- uchar FF=60;
- //顯示模式
- uchar Mode=0;
- int F=0;
- void main()
- {
- tem=0;hum=0;
- init();
- write_string(2,0,"T:00'C RH:00%");
- while(1)
- {
- //正常模式
- if(Mode==0)
- {
- //讀取AD值
- bit Init_DTH11() ;
- DTH11_DUSHU();
- Display_DTH11();
- delay(500);
- temp=ADC0809();
- delay(10);
- Display(0,temp);
- delay(100);
- //判斷是否報警
- if(temp>FF)
- {
- F=1;
- Feng=0;
- }
- else if(temp<=FF&&temp>=(FF-20)&&F==1) {Feng=0;} //這里是當濕度下降20時停止澆水的程序,若想改變澆水多少,改20即可。
-
- else
- {
- Feng=1;F=0;
- }
- }
- //調整模式
- else
- {
- Display(1,FF);
- }
- //功能鍵
- if(Key3==0)
- {
- Feng=1;
- delay(10);
- while(Key3==0)
- {
- if(Mode==0)
- Display(0,temp);
- else
- Display(1,FF);
- }
- if(Mode==0)
- Mode=1;
- else
- Mode=0;
- Feng=1;
- }
- //增加
- if(Key2==0&&Mode==1)
- {
- Feng=1;
- delay(10);
- while(Key2==0)
- {
- Display(1,FF);
- delay(100);
- }
- FF++;
- if(FF==256)
- FF=255;
- Feng=1;
- }
- //減少
- if(Key1==0&&Mode==1)
- {
- Feng=1;
- delay(10);
- while(Key1==0)
- {
- Display(1,FF);
- }
- FF--;
- if(FF==-1)
- FF=0;
- Feng=1;
- }
-
- }
- }
- void delay_ms(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=114;y>0;y--);
- }
- void write_com(uchar com) //寫命令函數
- {
- delay(5);
- lcden=0;
- rs=0;
- rw=0;
- delay(5);
- P0=com;
- delay(5);
- lcden=1;
- delay(25);
- lcden=0;
- }
- void write_data(uchar dat) //寫數據函數
- {
- delay(5);
- lcden=0;
- rs=1;
- rw=0;
- delay(5);
- P0=dat;
- delay(5);
- lcden=1;
- delay(25);
- lcden=0;
- }
- /********************************************************************
- * 名稱 : write_sfm2(uchar hang,uchar add,uchar date)
- * 功能 : 顯示3位十進制數,如果要讓第一行,第五個字符開始顯示"23" ,調用該函數如下
- write_sfm1(1,5,23)
- * 輸入 : 行,列,需要輸入1602的數據
- * 輸出 : 無 !!!還需測試的!!!!
- ***********************************************************************/
- void write_sfm2(uchar hang,uchar add,uint date)
- {
- if(hang==1)
- write_com(0x80+add);
- else
- write_com(0x80+0x40+add);
- delay(5);
- write_data(0x30+date/100%10);
- delay(5);
- write_data(0x30+date/10%10);
- delay(5);
- write_data(0x30+date%10);
- }
- /********************************************************************
- * 名稱 : write_string(uchar hang,uchar add,uchar *p)
- * 功能 : 改變液晶中某位的值,如果要讓第一行,第五個字符開始顯示"ab cd ef" ,調用該函數如下
- write_string(1,5,"ab cd ef;")
- * 輸入 : 行,列,需要輸入1602的數據
- * 輸出 : 無
- ***********************************************************************/
- void write_string(uchar hang,uchar add,uchar *p)
- {
- if(hang==1)
- write_com(0x80+add);
- else
- write_com(0x80+0x40+add);
- while(1)
- {
- if(*p == '\0') break;
- write_data(*p);
- p++;
- }
- }
- void init()
- {
- // uchar num;
- rw=0;
- lcden=0;
- write_com(0x38);
- write_com(0x0c);
- write_com(0x06);
- write_com(0x01);
- delay(1000);
- write_string(1,0,"shidu:") ;
- write_string(2,0,"T:00'C RH:00%");
-
- }
- //ADC0809讀取信息
- uchar ADC0809()
- {
- uchar temp_=0x00;
- //初始化高阻太
- OE=0;
- //轉化初始化
- ST=0;
- delay(5);
- //開始轉換
- ST=1;
- ST=0;
- //外部中斷等待AD轉換結束
- while(EOC==0)
- //讀取轉換的AD值
- OE=1;
- temp_=Data_ADC0809;
- OE=0;
- return temp_;
- }
- bit Init_DTH11()
- {
- bit flag;
- uchar num;
- DQ=0;
- delay_ms(19); // >18ms
- DQ=1;
- for(num=0;num<10;num++); // 20-40us 34.7us
- for(num=0;num<12;num++);
- flag=DQ;
- for(num=0;num<11;num++); //DTH響應80us
- for(num=0;num<24;num++); //DTH拉高80us
- return flag;
- }
- //****************************讀DTH11數據
- uchar DTH11_RD_CHAR()
- {
- uchar byte=0;
- uchar num;
- uchar num1;
- while(DQ==1);
- for(num1=0;num1<8;num1++)
- {
- while(DQ==0);
- byte<<=1; //高位在前
- for(num=0;DQ==1;num++);
- if(num<10)
- byte|=0x00;
- else
- byte|=0x01;
- }
- return byte;
- }
- //******************************讀取DTH11溫度和濕度
- void DTH11_DUSHU()
- {
- uchar num;
- if(Init_DTH11()==0)
- {
- hum=DTH11_RD_CHAR(); //比正常值高7度左右
- DTH11_RD_CHAR();
- tem=DTH11_RD_CHAR();
- DTH11_RD_CHAR();
- DTH11_RD_CHAR();
- for(num=0;num<17;num++); //最后BIT輸出后拉低總線50us
- DQ=1;
- }
- }
- //**************顯示函數
-
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
QQ截圖20181125114259.png (32.16 KB, 下載次數: 55)
下載附件
2018-11-25 11:43 上傳
所有資料51hei提供下載:
澆花系統.rar
(19.19 MB, 下載次數: 263)
2018-11-25 11:36 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|