家电维修网

 找回密码
 注册
家电维修网 网站首页 维修文章 查看内容

基于单片机的自动浇花系统的设计与制作

2019-4-5 10:15| 发布者: 南召修电视| 查看: 1016| 评论: 0

摘要: 生活中,人工浇灌花木要耗费大量时间,而且土壤湿度不好控制,有时候由于主人长时间外出,家里的花木会因无人浇水而枯死。为了解决上述问题,本文利用单片机,设计了自动和手动浇花系统(如图1所示)。图1 自动浇花 ...
参考程序


}

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

函数功能:测量、状态显示

入口参数:无

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

void ShowLcd1602()

{    

       LcdShowStr(0,0,"PV:");

       ShowNum(0,3,TestVal);//显示实测值

       LcdShowStr(0,6,"%RH");

       LcdShowStr(0,10,"State:");

      

       LcdShowStr(1,0,"SV:");

       ShowNum(1,3,SetVal);//显示设定值

       LcdShowStr(1,6,"%RH");

       if(staSystem==E_AUTO)LcdShowStr(1,10," Auto ");

       elseif(staSystem==E_MANUAL)   LcdShowStr(1,10,"Manual");

}                         

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

函数功能:读取当前的ADC 转换值

入口参数:chnAD通道号0-3

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

unsigned char GetADCValue(unsigned charchn)

{

       ucharval;

       I2CStart();

       if(!I2CWrite(0x48<<1)) // 寻址PCF8591 PCF8591,如未应答,则停止操作并返回,00

       {

       I2CStop();

       return0;

       }

       I2CWrite(0x40|chn);// 写入控制字节,选择转换通道

       I2CStart();

       I2CWrite((0x48<<1)|0x01);// 寻址PCF8591 PCF8591,指定后续为读操作

       I2CReadACK();// 先空读一个字节,提供采样转换时间

       val= I2CReadNAK(); // 读取刚刚转换完的值

       I2CStop();

       returnval;

}

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

函数功能:按升序排列数组元素

入口参数:数组及数组长度

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

void SortArray(unsigned char a[],unsignedchar a_len)

{

       unsignedchar i,temp;

       for(i=1;i<a_len;i++)

       {

              if(a[i-1]>a[i])

       {

           temp=a[i-1];

           a[i-1]=a[i];

           a[i]=temp;

           i=0;

              }

       }

}

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

函数功能:中值滤波,线性转换后,获得土

壤湿度0-100%

入口参数:无

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

void Humidity()

{

unsigned char i, tmp;

unsigned char adBuf[N];

for(i=0;i<N;i++)adBuf[i]=GetADCValue(1);//读取湿度

SortArray(adBuf,sizeof(adBuf));

tmp=adBuf[N/2];

tmp=GetADCValue(3);

TestVal=100-100.*tmp/255;

}

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

函数功能:配置定时器0,定时时间

壤湿度0-100

入口参数:ms,定时时间(毫秒)

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

void ConfigTimer0(unsigned int ms)

{

unsigned long tmp;

tmp = 11059200 /12; // 定时器计数频率

tmp = (tmp * ms) /1000; // 计算所需的计数值

tmp = 65536 - tmp; // 计算定时器重载值

tmp = tmp + 12; // 修正中断响应延时造成的误差

T0RH = (unsigned char)(tmp >> 8); // 定时器重载值拆分为高低字节

T0RL = (unsigned char)tmp;

TMOD &= 0xF0; // 清零T0 的控制位

TMOD |= 0x01; // 配置T0 为模式11

TH0 = T0RH; // 加载T0 重载值

TL0 = T0RL;

ET0 = 1; // 使能T0 中断

TR0 = 1; // 启动T0

}

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

函数功能:延时函数

入口参数:t,延时约t毫秒

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

//---------延时----------------

void delayms(uint t)

{

       uchari;

       while(t--)

       for(i=0;i<123;i++);

}

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

函数功能:T0 中断服务函数

入口参数:无

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

void InterruptTimer0() interrupt 1

{

static unsigned char tmrms=0;

static unsigned char tmr=0; 

 

TH0 = T0RH; // 定时器重新加载重载值

TL0 = T0RL;

 

tmrms++;

tmr=(tmr+1)%100; 

if(staSystem==E_ALARM) //故障液晶报警显示      

{

       if(tmr<50)LcdShowStr(1,11, "ALARM ");    

       elseLcdShowStr(1,11, "      ");

 

       if(tmrms>=50) // 定时0.5s

       {

       tmrms=0; 

       ALARM_LED=!ALARM_LED;

       if(cnt>0){cnt--;BUZZER=!BUZZER;}

       else{BUZZER=OFF;}

       }

}                              

       else

       {

       ALARM_LED=OFF;    

       BUZZER=OFF; 

       }

}

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

Lcd1602.h

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

#ifndef _LCD1602_H

#define _LCD1602_H

 

#ifndef _LCD1602_C

 


最新评论

  • 消毒柜惊魂夜:一个被忽视的家居安全隐患
  • 写一篇关于饮水机故障维修的文章
  • 家电坏了哪里找人维修
  • 卫星机顶盒有信号收不到台什么原因
  • 用户问的是微信收款提示音延迟的原因
  • 燃气热水器一直闪不加热,这是什么造成的?
  • 万家乐热水器不出热水是什么原因?万家乐电
  • 电热水器有哪些常见故障?电热水器故障维修
  • 热水器怎么安装?热水器详细安装教程分享
  • 电热水器通电不加热是什么原因?电热水器故

QQ|门户地图|网站地图|家电维修|手机版|家电维修技术论坛 ( 蜀ICP备14030498号-16 川公网安备51102502000162号 )

GMT+8, 2025-5-1 03:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

返回顶部