项目名:
基于单片机的智能花盆设计
单片机: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;
}
}
}