|
功能描述:
(1)本系統(tǒng)采用單片機(jī)STC89C52+ADC0832+LCD1602液晶+土壤濕度傳感器+抽水電機(jī)+ 按鍵+蜂鳴器設(shè)計(jì)而成。
(2)能夠檢測(cè)土壤的濕度,實(shí)時(shí)顯示到LCD1602液晶屏上。其中,液晶第一行顯示實(shí)際的濕度。液晶第二行顯示濕度上限值和濕度下限值。
(3)根據(jù)不同的土壤,能夠合理的調(diào)整澆水要求。通過(guò)按鍵設(shè)置上下限值。濕度低于下限報(bào)警,開始澆水直到上限停止報(bào)警及澆水。隨后濕度下降到下限開始報(bào)警并啟動(dòng)澆水。
(4)按鍵分為,減鍵、加鍵、設(shè)置鍵。潛水泵通過(guò)繼電器控制通斷。
(5)可通過(guò)藍(lán)牙模塊對(duì)應(yīng)的手機(jī)端讀取實(shí)時(shí)濕度數(shù)據(jù),并控制單片機(jī)端繼電器和蜂鳴器功能的有無(wú)。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (20.53 KB, 下載次數(shù): 51)
下載附件
2021-6-3 15:33 上傳
51hei.png (22.11 KB, 下載次數(shù): 65)
下載附件
2021-6-3 15:33 上傳
單片機(jī)源程序如下:
- #include <reg52.H>
- #include "intrins.h"
- #include "uart.h"
- #include "stdio.h"
- #include <stdio.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define ulong unsigned long
- #define LCDIO P0 //液晶屏數(shù)據(jù)口
- //ADC0832的引腳
- sbit ADCLK =P3^6; //ADC0832 clock signal
- sbit ADDIO =P3^7; //ADC0832 k in
- sbit ADCS =P3^4; //ADC0832 chip seclect
- sbit rs=P2^5; //定義1602 RS
- sbit rw=P2^6; //定義1602 Rw
- sbit lcden=P2^7; //定義1602 EN
- sbit key1=P1^7; //設(shè)定
- sbit key2=P1^6; //加
- sbit key3=P1^5; //減
- sbit motor=P2^1; //繼電器接口
- sbit speak=P2^0; //蜂鳴器接口
- uchar key; //設(shè)定指針
- uint RH=500,RL=10;//水位上下限
- float temp_f;
- ulong temp;
- uchar v;
- uchar count,s1num;
- uchar code table[]= "shi du: ";
- uchar code table1[]="RH: % ";
- uchar getdata; //獲取ADC轉(zhuǎn)換回來(lái)的值
- unsigned char init_flag=1;
- /*********************************************/
- void delay(uint z) //延時(shí)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void long_alarm(void) //延時(shí)
- {
- speak=0;
- delay(800);
- speak=1;
- delay(800);
- }
- void alarm(void) //延時(shí)
- {
- speak=0;
- delay(50);
- speak=1;
- delay(50);
- }
- /**********************************************/
- void write_com(uchar com)
- {
- rs=0;
- // rd=0;
- lcden=0;
- P0=com;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
- /*********************************************/
- void write_date(uchar date)
- {
- rs=1;
- // rd=0;
- lcden=0;
- P0=date;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
- /***********************************************/
- void init()
- {
- uchar num;
- Uart_Init();
- lcden=0;
- rw=0;
- write_com(0x38);
- write_com(0x0c);
- write_com(0x06);
- write_com(0x01);
- write_com(0x80);
- for(num=0;num<15;num++)
- {
- write_date(table[num]);
- delay(5);
- }
- write_com(0x80+0x40);
- for(num=0;num<15;num++)
- {
- write_date(table1[num]);
- delay(5);
- }
- }
- //****************************************************************************/
- /************
- 讀ADC0832函數(shù)
- ************/
- //采集并返回
- /****************************************************************************
- 函數(shù)功能:AD轉(zhuǎn)換子程序
- 入口參數(shù):CH(如果讀取CH0,channel的值為0x01,如果讀取CH1則channel的值為0x03)
- 出口參數(shù):adval
- ****************************************************************************/
- uchar Adc0832() //AD轉(zhuǎn)換,返回結(jié)果
- {
- uchar i;
- uchar dat=0;
- ADCLK=0;
- ADDIO=1;
- ADCS=0; //拉低CS端
- ADCLK=1;
- ADCLK=0; //拉低CLK端,形成下降沿1
- ADDIO=1;//指定轉(zhuǎn)換通道是CH1還是CH2,指定值位與0x1,取最后一位的值
- ADCLK=1;
- ADCLK=0; //拉低CLK端,形成下降沿2
- ADDIO=0;//指定值右移一位,再取最后一位的值
- ADCLK=1;
- ADCLK=0; //拉低CLK端,形成下降沿3
- ADDIO=1;
- for(i=0;i<8;i++)
- {
- ADCLK=1;
- ADCLK=0; //形成一次時(shí)鐘脈沖
- if(ADDIO)
- dat|= 0x80>>i; //收數(shù)據(jù)
- }
- ADCS=1; //拉低CS端
- ADCLK=1;
- ADDIO=1; //拉高數(shù)據(jù)端,回到初始狀態(tài)
- return(dat); //return dat
- }
- /***************************************************************************/
- /********************************************************/
- void displayRH() //下限顯示
- {write_com(0xc0+3);
- write_date(RH/100%10+0x30);//上限百位
- write_date(RH/10%10+0x30);//上限十位
- //write_date('.');
- //write_date(RH%10+0x30);
- }
- void displayRL() //下限顯示
- {write_com(0xca);
- write_date('R');
- write_date('L');
- write_date(':');
- write_date(RL/100%10+0x30);//下限百位
- write_date(RL/10%10+0x30);//下限十位
- write_date('%');
- }
- /**************************************************/
- /********************************************************/
- void keyscan() //按鍵處理
- {
- bit kk1=0,kk2=0;
- if(key1==0)
- {
- delay(10);
- while(key1==0);
- alarm();
- key=1;
- switch(key)
- {
- // speak=1;kk2=motor;motor=1;
- case 1: //RL下線報(bào)警值設(shè)置
- {
- write_com(0x0f);write_com(0xce); //光標(biāo)閃爍
- while(key1!=0) //等待按鍵松開
- {
- if(key2==0) //key2按鍵下
- {
- delay(10); //按鍵延時(shí)消抖
- if(key2==0) //確定key2按下
- {
- while(key2==0); //等待松開
- alarm();
- if(RL>=998)
- {RL=999; //RL下限最大設(shè)置為99
- }
- else
- {RL+=10; //RL加1
- }
- }
- displayRL(); //調(diào)用RL下限顯示函數(shù)
- write_com(0xce);
- }
-
- if(key3==0) //key3按下
- {
- delay(10); //按鍵延時(shí)消抖
- if(key3==0) //確定key3按下
- {
- while(key3==0); //等待key3按鍵松開
- alarm();
- if(RL<=1) //RL最小設(shè)置為1
- {RL=0;
- }
- else
- {RL-=10; //RL下限減1
- }
- }
- displayRL(); //調(diào)用RL下限顯示函數(shù)
- write_com(0xce);
- }
- }
- while(key1==0);
- alarm();
- }
- case 2: //RL上線報(bào)警值設(shè)置
- {
- write_com(0x0f);write_com(0xc4); //RH設(shè)置數(shù)據(jù),光標(biāo)閃爍
- while(key1==1)
- {
- if(key2==0) //key2按下
- {
- delay(30); //按鍵延時(shí)消抖
- if(key2==0) //確定key2按下
- {
- while(key2==0); //等待松開
- alarm();
- if(RH>=998) //RH最大設(shè)置為99
- {RH=999;
- }
- else
- {RH+=10; //RH加1
- }
- }
- displayRH(); //RH上限顯示函數(shù)
- write_com(0xc4);
- }
-
-
-
- if(key3==0) //key3按下
- {
- delay(30); //按鍵延時(shí)消抖
- if(key3==0) //確定按下
- {
- while(key3==0);//等待松開
- alarm();
- if(RH<=1) //RH最小設(shè)置為1
- {RH=0;
- }
- else
- {RH-=10; //RH減1
- }
- }
- displayRH(); //調(diào)用RH顯示函數(shù)
- write_com(0xc4);
- }
- }
- while(key1==0);
- alarm();
- }
- case 0:
- {
- write_com(0x0c);
- break;
- }
- }
- }
- }
- /**************************************************/
- void Conut(void) //土壤檢測(cè)數(shù)據(jù)轉(zhuǎn)換
- {
- v=Adc0832();
- temp=v;
- // temp_f=temp*10/2.55;
- temp_f=(temp-173.4)*12.25;
- temp=temp_f;
- temp=1000-temp;
- write_com(0x80+10);
- write_date(temp/100%10+0x30);//千位
- write_date(temp/10%10+0x30);//百位
- write_date('.');
- write_date(temp%10+0x30);
- write_date('%');//顯示符號(hào)位
-
- }
- /********************************************************/
- void main(void)
- {
- char alarm_flag=0;
- char alarm_forbidden_flag=0;
- unsigned char shidu_string[20];
- init();
- displayRH(); //顯示上限
- displayRL(); //顯示下限
- delay(50); //啟動(dòng)等待,等LCD講入工作狀態(tài)
- delay(50); //延時(shí)片刻(可不要)
- delay(50); //延時(shí)
- delay(50);
- Conut(); //顯示函數(shù)
- delay(150);
-
- while(1)
- {
- // printf("%d",1);
- Conut(); //顯示當(dāng)前濕度
- keyscan();
-
- sprintf(shidu_string, "shi du: %2d.%d \r\n",(int)(temp/10),(int)(temp%10));
- Send_Word(shidu_string); //通過(guò)藍(lán)牙將數(shù)據(jù)上報(bào)出去,給你的手機(jī)藍(lán)牙助手。
- if(init_flag!=0)
- {
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
基于51單片機(jī)智能澆花系統(tǒng).7z
(231.39 KB, 下載次數(shù): 164)
2021-6-3 15:36 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|