51单片机土壤湿度监测
时间: 2023-12-17 17:03:48 浏览: 138
51单片机土壤湿度监测系统可以通过土壤湿度传感器来实现。以下是实现该系统的步骤:
1. 硬件搭建:搭建51单片机最小系统,连接LCD1602液晶显示、土壤湿度传感器、蜂鸣器、按键、水泵控制系统、光照传感器和防水DS18B20温度传感器。
2. 编写程序:使用Keil C编写程序,通过ADC0804模数转换芯片将土壤湿度传感器采集到的模拟信号转换为数字信号,然后通过LCD1602液晶显示屏显示土壤湿度值和温度值,同时通过蜂鸣器报警和按键设置来控制水泵的开关。
3. 系统测试:将系统放置在土壤中进行测试,观察LCD1602液晶显示屏上的土壤湿度值和温度值,以及水泵的开关状态,检查系统是否正常工作。
示例代码如下:
```c
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DSPORT=P2^0; //DS18B20数据线连接的单片机IO口
sbit beep=P2^3; //蜂鸣器连接的单片机IO口
sbit key=P3^2; //按键连接的单片机IO口
sbit pump=P3^3; //水泵连接的单片机IO口
uchar code table[]="Soil Humidity:"; //LCD1602液晶显示屏上的提示信息
uchar code table1[]="Temperature:";
uchar disdata[16]; //存放LCD1602液晶显示屏上的数据
uchar temp; //存放DS18B20温度传感器采集到的温度值
uchar humi; //存放土壤湿度传感器采集到的湿度值
//延时函数
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//DS18B20初始化
uchar Init_DS18B20()
{
uchar i;
DSPORT=0; //将总线拉低
i++;
DSPORT=1; //将总线拉高
i++;
i++;
i++;
if(DSPORT==0) //判断DS18B20是否存在
{
i++;
return 0;
}
else
{
i++;
return 1;
}
}
//DS18B20写字节
void Write_DS18B20(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DSPORT=0; //将总线拉低
_nop_();
_nop_();
DSPORT=dat&0x01; //写入数据
_nop_();
_nop_();
DSPORT=1; //将总线拉高
dat>>=1;
}
}
//DS18B20读字节
uchar Read_DS18B20()
{
uchar i,dat;
for(i=0;i<8;i++)
{
DSPORT=0; //将总线拉低
_nop_();
_nop_();
dat>>=1;
if(DSPORT) dat|=0x80; //读取数据
_nop_();
_nop_();
DSPORT=1; //将总线拉高
}
return dat;
}
//DS18B20转换温度
void Convert_DS18B20()
{
Init_DS18B20();
Write_DS18B20(0xcc); //跳过ROM操作
Write_DS18B20(0x44); //启动温度转换
}
//DS18B20读取温度
void ReadTemp_DS18B20()
{
uchar a,b;
Init_DS18B20();
Write_DS18B20(0xcc); //跳过ROM操作
Write_DS18B20(0xbe); //读取温度寄存器
a=Read_DS18B20(); //读取温度低字节
b=Read_DS18B20(); //读取温度高字节
temp=b;
}
//ADC0804初始化
void Init_ADC0804()
{
P1=0x80; //设置P1.7为高电平,启动ADC0804
P0=0x00; //设置P0口为输出模式
}
//ADC0804读取数据
uchar Read_ADC0804(uchar ch)
{
uchar dat;
P0=ch; //选择通道
delay(1); //延时等待
dat=P0; //读取数据
return dat;
}
//土壤湿度传感器采集数据
void Get_Humidity()
{
uchar i;
uint sum=0;
for(i=0;i<10;i++)
{
sum+=Read_ADC0804(0); //读取通道0的数据
delay(1);
}
humi=sum/10; //计算平均值
}
//LCD1602液晶显示屏初始化
void Init_LCD1602()
{
delay(15);
WriteCommand(0x38);
WriteCommand(0x0c);
WriteCommand(0x06);
WriteCommand(0x01);
delay(15);
}
//LCD1602液晶显示屏写命令
void WriteCommand(uchar com)
{
RS=0; //选择命令寄存器
RW=0; //选择写入模式
P0=com; //写入命令
EN=1; //使能
delay(5);
EN=0; //失能
}
//LCD1602液晶显示屏写数据
void WriteData(uchar dat)
{
RS=1; //选择数据寄存器
RW=0; //选择写入模式
P0=dat; //写入数据
EN=1; //使能
delay(5);
EN=0; //失能
}
//LCD1602液晶显示屏显示数据
void Display()
{
uchar i;
WriteCommand(0x80); //设置显示位置为第一行第一列
for(i=0;i<14;i++)
{
WriteData(table[i]); //显示提示信息
}
WriteCommand(0x8f); //设置显示位置为第一行第十五列
WriteData(humi/100+0x30); //显示湿度百位数
WriteData(humi%100/10+0x30); //显示湿度十位数
WriteData(humi%10+0x30); //显示湿度个位数
WriteData('%'); //显示湿度单位
WriteCommand(0xc0); //设置显示位置为第二行第一列
for(i=0;i<12;i++)
{
WriteData(table1[i]); //显示提示信息
}
ReadTemp_DS18B20(); //读取温度值
WriteData(temp/10+0x30); //显示温度十位数
WriteData(temp%10+0x30); //显示温度个位数
WriteData('C'); //显示温度单位
}
//主函数
void main()
{
Init_ADC0804(); //初始化ADC0804
Init_LCD1602(); //初始化LCD1602液晶显示屏
while(1)
{
Get_Humidity(); //采集土壤湿度数据
Display(); //显示数据
if(humi<30) //判断土壤湿度是否过低
{
beep=0; //报警
pump=1; //开启水泵
}
else
{
beep=1; //停止报警
pump=0; //关闭水泵
}
if(key==0) //判断按键是否按下
{
delay(10); //消除抖动
if(key==0) //再次判断按键是否按下
{
while(!key); //等待按键释放
pump=!pump; //切换水泵状态
}
}
Convert_DS18B20(); //转换温度
}
}
```
阅读全文