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

控制/MCU

1883人已加入

描述

项目名:

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

单片机:STC89C52

功能:

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

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

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

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

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

继电器控制

部分程序:

#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;

}

}

}

继电器控制

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分