基于51单片机的土壤湿度检测仪与自动浇水系统设计
一、系统概述以STC89C52RC单片机为核心结合土壤湿度传感器、水泵驱动电路、LCD显示模块和按键设置实现土壤湿度的实时检测与自动浇水功能。系统可根据预设湿度阈值自动控制水泵启停适用于菜园、花园等小型种植场景具备低功耗、低成本、易部署的特点。二、硬件设计2.1 核心组件选型模块型号/参数功能说明主控STC89C52RC8位单片机11.0592MHz数据处理、逻辑控制、外设驱动湿度传感器FC-28电阻式输出模拟电压检测土壤湿度干燥→阻值大湿润→阻值小ADC转换ADC08328位串行ADC将传感器模拟电压转换为数字信号0~255显示模块LCD160216×2字符型液晶显示当前湿度、设定阈值、水泵状态水泵5V微型直流水泵流量100L/h浇水执行机构通过继电器驱动驱动电路S8050三极管继电器5V/10A单片机IO口控制水泵通断隔离强电按键3个轻触按键设置/加/减设置湿度阈值下限/上限、手动控制水泵电源5V/2A DC电源或18650电池升压模块为系统供电传感器、单片机、水泵2.2 硬件连接图------------------- ------------------- ------------------- | 土壤湿度传感器 | | STC89C52RC | | LCD1602 | | (FC-28) | | | | | | VCC → 5V | | P1.0 → ADC0832 CS | | VCC → 5V | | GND → GND | | P1.1 → ADC0832 CLK | | GND → GND | | AO → ADC0832 CH0 |◄---------| P1.2 → ADC0832 DO | | RS → P2.0 | ------------------- | P2.0~P2.7 → LCD DB0~DB7 | | RW → P2.1 | | P3.0 → LCD RS | | E → P2.2 | ------------------- | P3.1 → LCD RW | | | | ADC0832 | | P3.2 → LCD E | ------------------- | CS → P1.0 | | P3.3 → 按键设置 | ------------------- | CLK → P1.1 |◄---------| P3.4 → 按键加 | | 继电器水泵 | | DO → P1.2 | | P3.5 → 按键减 | | IN → P3.6 | | VCC → 5V | | P3.6 → 继电器控制 | | VCC → 5V | | GND → GND | | P3.7 → 水泵状态LED | | GND → GND | ------------------- ------------------- ------------------- | P3.7 → LED水泵运行指示 | ---------------------------三、软件设计Keil C513.1 系统架构是否是否主程序初始化读取ADC值湿度传感器转换为湿度百分比LCD显示当前湿度/阈值按键扫描设置阈值湿度 下限?启动水泵浇水湿度 上限?停止水泵维持当前状态3.2 核心代码实现3.2.1 头文件与宏定义#includereg52.h#includeintrins.h// 引脚定义#defineADC_CSP1_0// ADC0832片选#defineADC_CLKP1_1// ADC0832时钟#defineADC_DOP1_2// ADC0832数据输出#defineLCD_RSP2_0// LCD1602 RS#defineLCD_RWP2_1// LCD1602 RW#defineLCD_EP2_2// LCD1602 E#defineLCD_DBP0// LCD1602数据总线#defineKEY_SETP3_3// 设置按键#defineKEY_UPP3_4// 加按键#defineKEY_DOWNP3_5// 减按键#definePUMPP3_6// 水泵控制高电平启动#defineLED_RUNP3_7// 水泵运行指示灯// 全局变量unsignedcharadc_val0;// ADC采样值0~255unsignedcharhumidity0;// 湿度百分比0~100%unsignedcharset_min30;// 湿度下限默认30%unsignedcharset_max60;// 湿度上限默认60%bit pump_flag0;// 水泵状态0停止1运行3.2.2 ADC0832驱动读取土壤湿度// ADC0832读取函数单通道CH0unsignedcharADC0832_Read(){unsignedchari,dat0;ADC_CS0;// 片选使能ADC_CLK0;// 时钟初始化// 发送通道选择信号CH0起始位1位通道号ADC_DO1;_nop_();ADC_CLK1;_nop_();ADC_CLK0;_nop_();// 起始位ADC_DO0;_nop_();ADC_CLK1;_nop_();ADC_CLK0;_nop_();// CH00// 读取8位数据MSB先出for(i0;i8;i){ADC_CLK1;_nop_();dat1;if(ADC_DO)dat|0x01;ADC_CLK0;_nop_();}ADC_CS1;// 片选禁用returndat;}3.2.3 湿度计算ADC值→百分比FC-28传感器特性干燥时输出≈5VADC255完全浸入水中输出≈0VADC0湿度与ADC值成反比。// 计算湿度百分比0~100%unsignedcharCalc_Humidity(unsignedcharadc){// 线性转换湿度% (255 - adc) / 255 * 100unsignedcharhum(unsignedchar)((255-adc)*100.0/255.0);return(hum100)?100:hum;// 限幅}3.2.4 LCD1602驱动显示湿度与状态// LCD延时函数约1ms11.0592MHzvoidLCD_Delay(unsignedintt){unsignedinti,j;for(it;i0;i--)for(j110;j0;j--);}// LCD写命令voidLCD_WriteCmd(unsignedcharcmd){LCD_RS0;LCD_RW0;LCD_DBcmd;LCD_Delay(1);LCD_E1;LCD_Delay(1);LCD_E0;}// LCD写数据voidLCD_WriteData(unsignedchardat){LCD_RS1;LCD_RW0;LCD_DBdat;LCD_Delay(1);LCD_E1;LCD_Delay(1);LCD_E0;}// LCD初始化voidLCD_Init(){LCD_WriteCmd(0x38);// 8位数据2行显示5×7点阵LCD_WriteCmd(0x0C);// 开显示关光标LCD_WriteCmd(0x06);// 光标右移不滚动LCD_WriteCmd(0x01);// 清屏}// 显示湿度与状态voidLCD_Display(){LCD_WriteCmd(0x80);// 第一行首地址LCD_WriteData(H);LCD_WriteData(u);LCD_WriteData(m);LCD_WriteData(:);LCD_WriteData(humidity/100);// 十位LCD_WriteData(humidity%100);// 个位LCD_WriteData(%);LCD_WriteData( );LCD_WriteCmd(0xC0);// 第二行首地址LCD_WriteData(L);LCD_WriteData(:);LCD_WriteData(set_min/100);LCD_WriteData(set_min%100);LCD_WriteData(%);LCD_WriteData( );LCD_WriteData(H);LCD_WriteData(:);LCD_WriteData(set_max/100);LCD_WriteData(set_max%100);LCD_WriteData(%);LCD_WriteData( );LCD_WriteData(pump_flag?P: );// 显示水泵状态P运行}3.2.5 按键扫描与阈值设置// 按键扫描返回键值0无1设置2加3减unsignedcharKey_Scan(){if(KEY_SET0){LCD_Delay(10);if(KEY_SET0){while(!KEY_SET);return1;}}if(KEY_UP0){LCD_Delay(10);if(KEY_UP0){while(!KEY_UP);return2;}}if(KEY_DOWN0){LCD_Delay(10);if(KEY_DOWN0){while(!KEY_DOWN);return3;}}return0;}// 阈值设置逻辑voidKey_Process(){unsignedcharkeyKey_Scan();if(key1){/* 设置模式切换略可扩展*/}if(key2){// 加按键if(set_min90)set_min5;if(set_max95)set_max5;}if(key3){// 减按键if(set_min10)set_min-5;if(set_max20)set_max-5;}}3.2.6 主程序自动浇水逻辑voidmain(){LCD_Init();// LCD初始化PUMP0;LED_RUN0;// 初始水泵停止while(1){adc_valADC0832_Read();// 读取ADC值humidityCalc_Humidity(adc_val);// 计算湿度百分比Key_Process();// 按键处理LCD_Display();// 显示数据// 自动浇水逻辑if(humidityset_min){// 湿度低于下限PUMP1;LED_RUN1;// 启动水泵pump_flag1;}elseif(humidityset_max){// 湿度高于上限PUMP0;LED_RUN0;// 停止水泵pump_flag0;}LCD_Delay(1000);// 1秒刷新一次}}参考代码 51单片机土壤的湿度检测仪程序 自动对菜园花园自动浇水www.youwenfan.com/contentcst/182739.html四、系统调试与优化4.1 传感器校准干燥校准将传感器置于干燥土壤记录ADC值如250对应湿度0%湿润校准将传感器浸入水中记录ADC值如50对应湿度100%线性修正根据实际校准值调整Calc_Humidity函数如humidity (255 - adc) * 100 / (255 - 50)。4.2 抗干扰措施硬件传感器信号线加滤波电容10μF电源端加100μF电解电容软件ADC采样取3次平均值adc_val (ADC0832_Read() ADC0832_Read() ADC0832_Read())/3。4.3 低功耗优化空闲时单片机进入掉电模式PCON | 0x01通过按键或传感器中断唤醒水泵采用间歇式浇水如启动30秒停止5分钟减少功耗。五、总结基于51单片机实现了土壤湿度检测与自动浇水核心包括ADC信号采集、湿度计算、阈值控制和LCD显示。通过简单的硬件连接和模块化代码可快速部署于菜园、花园等场景实现智能化灌溉。