单片机
返回首页

基于51单片机的智能花盆设计

2024-03-18 来源:elecfans

项目名:

基于单片机的智能花盆设计


单片机:STC89C52

功能:

1、通过显示屏显示花盆中土壤的温度、湿度,花盆外光照强度;

2、通过按键切换显示屏的界面,设置土壤最小温度值、最小湿度值,花盆外光照强度值,输液倒计时,松土倒计时;

3、通过土壤湿度传感器检测土壤湿度,通过DS18B20检测土壤温度;

4、通过继电器控制加热片,水泵,输液,补光灯;

5、通过步进电机来实现松土;

wKgaomTH5tqAV4B0AAQ1lveAWqA823.png

部分程序:

#include 'main.h'

#include 'lcd1602.h'

#include 'key.h'

#include 'ds18b20.h'

#include 'adc.h'

#include 'motor.h'

#include 'timer.h'



/**********************************

变量定义

**********************************/

uchar key_num = 0; //按键扫描标志位

uchar flag_display = 0; //显示模式标志位

bit flag_display_cut = 0; //切换界面标志位

uint time_num = 0; //10ms计数变量

uint temp_value = 0; //温度值

uchar temp_min = 10; //最小温度值

uint humi_value = 0; //湿度值

uchar humi_min = 30; //最小湿度值

uint light_value = 0; //光照强度值

uchar light_min = 50; //最小光照强度值

uchar time_songtu = 0; //松土时间

uint time_minus_songtu = 0; //松土倒计时时间

uchar time_shuye = 0; //输液时间

uint time_minus_shuye = 0; //输液倒计时时间

extern bit flag_songtu_begin; //松土开始标志位

extern bit flag_songtu_finish; //松土完成标志位

extern bit flag_shuye_begin; //输液开始标志位

extern bit flag_shuye_finish; //输液完成标志位



/**********************************

函数声明

**********************************/

void Delay_function(uint x); //延时函数

void Key_function(void); //按键函数

void Monitor_function(void); //监测函数

void Display_function(void); //显示函数

void Manage_function(void); //处理函数



/****

******* 主函数

*****/

void main()

{

Lcd1602_Init(); //LCD1602初始化

Delay_function(50);

lcd1602_clean(); //清屏

Delay_function(50);

Ds18b20_Init(); //DS18B20初始化

Delay_function(50);

Timer0_Init(); //定时器0初使化

Delay_function(50);


while(1)

{

Key_function(); //按键函数

Monitor_function(); //监测函数

Display_function(); //显示函数

Manage_function(); //处理函数


Delay_function(10); //延时10ms

time_num++; //间隔10ms计时变量+1

if(time_num >= 5000) //计时累加到5000,重新从0开始累加

{

time_num = 0;

}

}

}


/****

******* 延时 x ms函数

*****/

void Delay_function(uint x)

{

uint m,n;

for(m=x;m>0;m--)

for(n=110;n>0;n--);

}


/****

*******按键函数

*****/

void Key_function(void)

{

key_num = Chiclet_Keyboard_Scan(0); //按键扫描

if(key_num != 0) //有按键按下

{

switch(key_num)

{

case 1: //按键1,切换界面

flag_display++;

if(flag_display >= 6) //一共6个界面

flag_display = 0;


lcd1602_clean(); //按一下,清屏一次

break;


case 2:

switch(flag_display)

{

case 0: //界面为0时,手动松土

Motor_Foreward();

break;


case 1: //界面为1时,修改温度最小值+1

if(temp_min < 99)

temp_min++;

break;

case 2: //界面为2时,修改湿度最小值+1

if(humi_min < 99)

humi_min++;

break;

case 3: //界面为3时,修改光照最小值+1

if(light_min < 99)

light_min++;

break;

case 4: //界面为4时,修改松土时间+1

time_songtu++;

time_minus_songtu = time_songtu*60;

break;

case 5: //界面为5时,修改输液时间+1

time_shuye++;

time_minus_shuye = time_shuye*60;

break;


default:

break;

}

break;

case 3: //按键3

switch(flag_display)

{

case 0: //界面为0时,手动输液

RELAY_SHUYE = 0; //闭合输液继电器,开始输液

Delay_function(3000); //输液三秒

RELAY_SHUYE = 1; //断开输液继电器,停止输液

break;


case 1: //界面为1时,修改温度最小值-1

if(temp_min > 0)

temp_min--;

break;

case 2: //界面为2时,修改湿度最小值-1

if(humi_min > 0)

humi_min--;

break;

case 3: //界面为3时,修改光照最小值-1

if(light_min > 0)

light_min--;

break;

case 4: //界面为4时,修改松土时间-1

if(time_songtu > 0)

{

time_songtu--;

time_minus_songtu = time_songtu*60;

}

break;

case 5: //界面为5时,修改输液时间-1

if(time_shuye > 0)

{

time_shuye--;

time_minus_shuye = time_shuye*60;

}

break;


default:

break;

}

break;

case 4: //按键4,切换界面

flag_display_cut = ~flag_display_cut;

lcd1602_clean(); //按一下,清屏一次

break;


default:

break;

}

}

}

wKgZomTH5tuACJthAAJgjJJ9BdU096.png


wKgZomTH5tyASY-JAAZ65dpYf3o323.png


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • PIC单片机控制的遥控防盗报警器电路

  • 红外线探测报警器

  • 短波AM发射器电路设计图

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 开关电源的基本组成及工作原理

  • 用NE555制作定时器

    相关电子头条文章