欢迎来到泰骏兴电子,大家有问题可以直接联系管理员QQ:233619809单片机 QQ群:59194556 各位游客也可以注册玩玩,享受更多权益。温馨提示:本网站仅提供平台学习以及渠道,一切后果自行承担,还望广大用户提高自我意识,请不要轻易相信他人,请不要轻易相信他人,请不要轻易相信他人。为了更好的管理论坛工作,所以现在使用邮箱注册,如果以前的邮箱不能修改的,请联系管理员代为修改

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 132|回复: 0

基于STC的智能浇花系统设计

[复制链接]
发表于 2023-1-9 19:36:17 | 显示全部楼层 |阅读模式
本帖最后由 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++;
        }
}




相关资料:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
高级模式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|泰骏兴电子科技有限公司 ( 粤ICP备2023060260号-1 ) 单片机爱好者

GMT+8, 2026-1-10 12:08

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表