完整教程:【51单片机】【protues仿真】基于51单片机土壤湿度温度光照检测系统
目录
一、主导作用
1、LCD1602液晶显示温度,土壤湿度,光照值
2、按键设置温度,湿度,光照阈值
3、光照不足,补光灯启动
4、突然湿度不足,启动水泵,蜂鸣器警报
5、温度和光照都大于阈值,蜂鸣器警报
二、使用步骤
本项目是基于51单片机的土壤湿度、温度及光照检测系统是一种常见的农业环境监测方案,主要能力包括实时材料采集、阈值报警和自动控制。
三、硬件资源
1、51单片机核心模块
2、按键模块
3、土壤传感器、光照传感器模块
4、蜂鸣器模块
5、继电器模块
6、LCD1602显示模块
四、软件设计
#include <reg52.h>
#include <intrins.h>
通过#define uchar unsigned char // 以后unsigned char就能够用uchar代替
#define uint unsigned int // 以后unsigned int 就可以用uint 代替
sbit ADC_CS = P1^2; // ADC0832的CS引脚
sbit ADC_CLK = P1^1; // ADC0832的CLK引脚
sbit ADC_DAT = P1^0; // ADC0832的DI/DO引脚
sbit LcdRs_P = P1^3; // 1602液晶的RS管脚
sbit LcdRw_P = P1^4; // 1602液晶的RW管脚
sbit LcdEn_P = P1^5; // 1602液晶的EN管脚
sbit KeySet2_P = P3^5; // 设置
sbit KeyDown_P = P3^6; // 减按键
sbit KeyUp_P = P3^7; // 加按键
sbit shuibeng = P2^0; // 水泵
sbit led2=P2^1;
sbit fm=P2^2;
bit bjflag;
sbit DQ=P2^7; //定义DS18B20总线I/O
bit closeflag,openflag;
bit sdjs=0;
uchar gLight = 70; // 光照的阈值
uchar wDu=28;
uchar X_sd=60;
uint wd=13,t;
uchar xsflag;
uchar bjcount;
void DelayMs(uint time)
{
uint i,j;
for(i=0;i<time;i++)
for(j=0;j<112;j++);
}
void delay(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void LcdWriteCmd(uchar cmd)
{
LcdRs_P = 0;
LcdRw_P = 0;
LcdEn_P = 0;
P0=cmd;
DelayMs(2);
LcdEn_P = 1;
DelayMs(2);
LcdEn_P = 0;
}
void LcdWriteData(uchar dat)
{
LcdRs_P = 1;
LcdRw_P = 0;
LcdEn_P = 0;
P0=dat;
DelayMs(2);
LcdEn_P = 1;
DelayMs(2);
LcdEn_P = 0;
}
void LcdInit()
{
LcdWriteCmd(0x38);
LcdWriteCmd(0x0C);
LcdWriteCmd(0x06);
LcdWriteCmd(0x01);
}
void LcdGotoXY(uchar line,uchar column)
{
// 第一行
if(line==0)
LcdWriteCmd(0x80+column);
// 第二行
if(line==1)
LcdWriteCmd(0x80+0x40+column);
}
void LcdPrintStr(uchar *str)
{
while(*str!='\0')
LcdWriteData(*str++);
}
void LcdPrintNum(uchar num)
{
LcdWriteData(num/10+48);
LcdWriteData(num%10+48);
}
void LcdShowInit()
{
LcdGotoXY(0,0);
LcdPrintStr("20du sd: gz: ");
LcdGotoXY(1,0);
LcdPrintStr("X: T H L");
}
void main()
{
uchar light,sign1;
uchar sd;
LcdInit();
LcdShowInit();
TMOD=0x21;
EA=1;
ES = 1;
PCON = 0x80;
SCON = 0x50;
TH1 = 0xFa;
TL1 = 0xFa;
TR1=1;
while(1)
{
Get_temp(&sign1,&t); //检测温度材料
if(t>=0&&t<=1250) //温度合法范围,不在这个范围就是没有获取到合适的值
{
wd=t/10;
}
light=Get_ADC08322(); // 读取光照强度
sd=Get_ADC0832();
sd=sd/2.5;
light=light/2.5; // 缩小光照检测结果(在0-99)
if(light>99) // 如果大于99
light=99; // 则依然保持99
LcdGotoXY(0,0);
LcdPrintNum(wd);
LcdGotoXY(0,8); // 光标定位
LcdPrintNum(sd); // 显示湿度
LcdGotoXY(0,14); // 光标定位
LcdPrintNum(light); // 显示光照强度
LcdGotoXY(1,2);
LcdPrintNum(wDu);
LcdGotoXY(1,6); // 光标定位
LcdPrintNum(X_sd); // 展示湿度
LcdGotoXY(1,13); // 光标定位
LcdPrintNum(gLight); // 展示光照强度
KeyScanf2(); // 按键扫描(阈值的设置)
if(sd<X_sd || sdjs==1) //湿度小于阈值开启
Open();
else
Close();
if(light<gLight){
led2 = 0;
}else{
led2 = 1;
}
if(wd>wDu && light>gLight)
{
bjflag=1;
}else{
if(sd>X_sd)
bjflag=0;
}
if(bjflag==1){
bjcount++;
if(bjcount>5){
bjcount=0;
fm=0;DelayMs(100);DelayMs(100);fm=1;
}
}else{
fm=1;
}
DelayMs(100);
}
}
void UART_R ( ) interrupt 4 using 1
{
RI = 0;
UART_data = SBUF;
}
五、实验现象
演示视频:


浙公网安备 33010602011771号