对LCD1602原理和操作掌握不好的可以看这篇: 快速掌握——LCD1602液晶显示(多组实验,附带源程序) 按键可以参考这篇: 按键(独立按键、矩阵键盘)——附带程序 定时器可以参考这两篇 1、基于51的数码管电子时钟(显示时、分、秒)——定时器 2、基于51单片机的数码管时钟设计——按键修改时间
一、系统介绍
本系统主要由STC89C52单片机最小系统、土壤湿度传感器、温湿度检测传感器DHT11、ADC0832 芯片、LCD1602显示电路、水泵控制电路、按键设置电路以及电源电路构成。
工作过程是: 温湿度传感器DHT11将采集到的温湿度信号直接由数据接口传到单片机,单片机处理后再LCD1602上显示出来;传感器采集到湿度信号经ADC0832 A/D转换后传给单片机,经单片机处理后,在LCD1602上显示出湿度的具体数值,同时单片机将接收到的湿度信号与湿度的上下限比较,判断是否浇水。通过按键可以设置湿度的上下限,并在LCD上显示。
硬件材料: 单片机最小电路是我自己焊接的,材料和电路百度上就有,不想麻烦的可以直接买最小电路板,其他都是模块,直接在某宝买就行
材料型号不了解的私信我
二、仿真展示
LCD显示内容介绍:
R:环境湿度
T:环境温度
H:土壤最高湿度值
L:土壤最低湿度值
S:土壤当前湿度值
>>>:手动浇水模式(不显示>>>为自动模式)
三、实物展示
四、仿真过程
在仿真的过程中用滑动变阻器代替湿度传感器。如下图,是启动仿真刚开始的情况。LCD1602上显示的湿度上限是60,湿度下限是30,当前湿度是62,超过湿度上限,所以LED灯没有被点亮,电动机也没有启动。
当调节滑动变阻器,使得阻值增大,即实际的湿度很小,如下图,此时在LCD1602上显示的湿度是26,低于湿度的下限,因此LED被点亮,电动机启动。 按键的调试。按键K1是菜单键,当按下第一次时,是对湿度的上限进行设置,K2是对湿度进行加,K3是对湿度进行减,如下图。
当K1被按下第二次时,是对湿度的下限进行设置,K2是对湿度进行加,K3是对湿度进行减,如下图。 当K1倍按下第三次时,是启动手动浇水模式,LCD的右下角会显示“>>>”,如下图,K2是启动,K3是停止。
五、代码
1、ADC0832
uchar adc0832() {
uchar i,temp,temp1,num;
CLK=0; DO=1;CS=0; CLK=1;
CLK=0; DO=1; CLK=1;
CLK=0; DO=0; CLK=1;
CLK=0; DO=1;
for(i=0;i<8;i++){
CLK=1;
CLK=0;
temp<<=1;
if(DO)
temp++;
}
for(i=0;i<8;i++){
temp1>>=1;
if(DO)
temp1+=0x80;
CLK=1;
CLK=0;
}
CLK=1;DO=1;
CS=1;
if(temp==temp1)
num=100-temp*99/255;
return num;
}
2、LCD1602
void Read_Busy(){
unsigned char sta;
P0 = 0xff;
lcd_rs= 0;
lcd_rw = 1;
do{
lcd_e= 1;
sta = P0;
lcd_e = 0;
}
while(sta & 0x80);
}
void Lcd1602_Write_Cmd(uchar cmd){
Read_Busy();
lcd_rs = 0;
lcd_rw = 0;
P0= cmd;
lcd_e = 1;
lcd_e = 0;
}
void Lcd1602_Write_Data(uchar dat){
Read_Busy();
lcd_rs = 1;
lcd_rw = 0;
P0 = dat;
lcd_e = 1;
lcd_e = 0;
}
void init_lcd(){
uchar code D[]="H: ";
uchar code T[]="L: ";
uchar code S[]="S: ";
uchar code R[]="R: %";
uchar code F[]="T: ";
.
.
.
.
.
}
3、按键
4、水泵
5、温湿度
6、定时器
void t0()interrupt 1{
uchar count;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count>0&&count<=60){
Wat=0;
}
if(count>60&&count<=120){
if(count==120)count=0;
Wat=1;
}
}
7、main.c
void main() {
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
k1n=0;
init_lcd();
while(1){
key0();
if(k1n==0){
adat=adc0832();
water();
disp0();
}
if(k1n!=0){
key1();
}
}
}
五、完整工程
基于51单片机智能浇花系统(可做毕设)(内含传感器资料和示例代码).zip
|