本帖最后由 bcwx 于 2023-1-9 19:42 编辑
本设计由电源电路、晶振电路、复位电路、报警电路、土壤湿度传感器电路、显示电路、按键电路组成。以STC89C52单片机为核心,通过土壤湿度传感器测量出土壤湿度信号,单片机采集土壤湿度信号并进行分析和处理,输出控制信号,从而达到浇花目的,LCD1602来显示不同的工作模式,有以下功能: (1)对湿度进行测量; (2)能够自动控制浇水量功能; (3)能实现用按键来调节温度、湿度值的范围功能; (4)水泵中水不足进行报警。

一执行机构
包括:土壤湿度传感器,蜂鸣器电路 二驱动系统 电机驱动采用继电器进行控制,可以使弱电控制强电,控制不同功率的电机,蜂鸣器则为PNP三极管进行驱动,能够有效的对成本进行缩减 三控制系统 控制系统采用STC89C52作为主控,土壤湿度传感器进行检测土壤湿度,对继电器蜂鸣器进行相关的控制
PCB:

仿真:

代码:
[C] 纯文本查看 复制代码 #include "reg52.h"//标准头文件
#define uint unsigned int
#define uchar unsigned char
sbit cgq=P1^0;//传感器IO声明
sbit k1=P1^1;
sbit k2=P1^2;
sbit k3=P1^3;//三个按键声明
sbit jdq=P1^4;//继电器接口声明
sbit fmq=P2^2;//蜂鸣器接口声明
sbit rs=P2^1;//1602RS接口声明
sbit sn=P2^0;//1602en端接口声明
#define sjk P0//1602数据口声明
uint ji;//计时
uint flowers;//浇花时间
void delay_ms(unsigned int ms)//自动适应主时钟.单位是MS
{
unsigned int i;
do
{
i = 11059200/13000;
while(--i) ;
}
while(--ms);
}
/*
程序功能:1602写指令与写数据
变量:q(q=0;则是为写指令,q=1;则是为写数据)
变量;w(传达给1602的参数)
*/
void Write_instruction_data1602(unsigned char q,w)
{
rs=q;
delay_ms(1);//延时
sjk=w;//向总线写入数据或指令
sn=1;//使能
delay_ms(1);//延时
sn=0;
}
/*
程序功能:液晶1602的初始化
*/
void liquid1602crystal()
{
Write_instruction_data1602(0,0x0c);
Write_instruction_data1602(0,0x38);
Write_instruction_data1602(0,0x06);
Write_instruction_data1602(0,0x80+0x40) ;
}
/*
程序功能:向1602写入字符
变量:q(q=0;则是为第0行。q=1;则是为第一行)
变量:w(w的取值范围0<w<15,作用为显示的字符向后退格)
变量:*e(指针变量,取字符的地址)
*/
void display_characters1602(bit q,unsigned char w,unsigned char *e)
{
if(q==0)
{
Write_instruction_data1602(0,0x80+w);//写入指令加显示的位置
while(*e!='\0')
{
Write_instruction_data1602(1,*e);//写入数据加显示的字符
delay_ms(1);
e++;
}
}
else
{
Write_instruction_data1602(0,0x80+0x40+w);//写入指令加显示的位置
while(*e!='\0')
{
Write_instruction_data1602(1,*e);//写入数据加显示的字符
delay_ms(1);
e++;
}
}
}
void dsq_init()//定时器初始化
{
TMOD=0x01;//设置定时器模式
TH0=(65536-50000)/256;//给定时器高位赋初始值
TL0=(65536-50000)%256;//给定时器低位赋初始值
EA=1;//开启总中断
TR0=1;//开启定时器
ET0=1;//开启定时器中断
}
void set_up()
{
uchar xs[6];
liquid1602crystal();
display_characters1602(0,0,"interval_time ");
display_characters1602(1,7,"second");
while(1)
{
if(k1==0&&flowers<36000)//加间隔时间
{
flowers++;
}
if(k2==0&&flowers>0)//减间隔时间
{
flowers--;
}
if(k3==0)
{
while(k3==0);
break;
}
xs[0]='0'+flowers/10000;
xs[1]='0'+flowers%10000/1000;
xs[2]='0'+flowers%1000/100;
xs[3]='0'+flowers%100/10;
xs[4]='0'+flowers%10;
xs[5]='\0';
display_characters1602(1,0,&xs[0]);//对秒进行显示
}
}
void jiaohua()
{
while(1)
{
jdq=0;
fmq=0;
if(ji>=10)//设置10秒退出停止浇水
{
break;
}
}
ji=0;//清除计时时间
jdq=1;
fmq=1;
}
void fmq_jiao(uchar q,uint w)//蜂鸣器程序
{
uchar e;
for(e=0;e<q;e++)
{
fmq=0;
delay_ms(w);
fmq=1;
delay_ms(w);
}
}
void main()
{
bit ms;//切换模式
liquid1602crystal();
dsq_init();
display_characters1602(0,0,"Flower watering");
fmq_jiao(2,100);
flowers=100;//默认时间
while(1)
{
jdq=k1;//说明进行测试
fmq=k1;//说明进行测试
if(ms==0)//自动模式
{
if(cgq==1)//传感器检测
{
fmq_jiao(1,1000);
jdq=0;
}
else
{
fmq=1;
jdq=1;
}
}
else//计时模式
{
if(ji>=flowers)//到达时间
{
ji=0;
display_characters1602(0,0," start-up ");//启动
jiaohua();
display_characters1602(0,0,"Flower watering");//浇花
}
}
if(k2==0)//模式切换
{
ms=~ms;
while(k2==0);
}
if(k3==0)//进入设置界面
{
set_up();//设置界面
display_characters1602(0,0,"Flower watering");//显示设置界面
}
if(ms==0)//模式显示
{
display_characters1602(1,0,"Automatic mode");//自动模式
}
else
{
display_characters1602(1,0," Timing mode ");//手动模式
}
}
}
void dsq_zd()interrupt 1//定时器中断
{
static q;//静态变量
TH0=(65536-50000)/256;//给定时器高位赋初始值
TL0=(65536-50000)%256;//给定时器低位赋初始值
q++;
if(q==20)//大概1秒钟
{
q=0;
ji++;
}
}
相关资料:
|