历史上的今天
返回首页

历史上的今天

今天是:2024年12月24日(星期二)

正在发生

2019年12月24日 | 单片机自动浇花器

2019-12-24 来源:51hei

自动浇花系统采用51单片机+LCD1602液晶+土壤传感器+继电器+ADC0832+水泵设计而成。

系统三个按键分别是:系统复位键、设置键、加键、减键。


1、土壤干湿度传感器实时给单片机传输信号。

2、按键设置土壤干湿度阈值,实现土壤水分的动态控制。

3、液晶实时显示土壤湿度情况,所设置的阈值,直观明了。

4、ADC0832将模拟信号转换成数字信号传给单片机。


按键调节上下限值,LCD1602实时显示土壤湿度值,并显示上下限值。土壤检测传感器检测湿度值低于下限时,蜂鸣器报警并驱动水泵浇水,湿度值高于上限时停止浇水。

单片机源程序如下:

#include  

#include "intrins.h"

#define uint unsigned int

#define uchar unsigned char

#define ulong unsigned long

#define     LCDIO      P0         //液晶屏数据口

//ADC0832的引脚

sbit ADCLK =P1^1;  //ADC0832 clock signal

sbit ADDIO =P1^3;  //ADC0832 k in

sbit ADCS =P1^4;  //ADC0832 chip seclect


sbit rs=P1^0;  //定义1602 RS

sbit lcden=P1^2; //定义1602 EN

sbit key1=P3^0;    //设定

sbit key2=P3^1;    //加

sbit key3=P3^2;    //减

sbit motor=P3^7;   //继电器接口

sbit speak=P1^5;        //蜂鸣器接口

uchar key;         //设定指针

uint RH=400,RL=200;//水位上下限

float temp_f;

ulong temp;

uchar v;

uchar count,s1num;

uchar code table[]= " moisture:          ";

uchar code table1[]="RH:  %              ";

uchar getdata; //获取ADC转换回来的值

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

void delay(uint z)                  //延时

{

        uint x,y;

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

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

}

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

void write_com(uchar com)

{

        rs=0;

//        rd=0;

        lcden=0;

        P0=com;

        delay(5);

        lcden=1;

        delay(5);

        lcden=0;        

}

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

void write_date(uchar date)

{

        rs=1;

//        rd=0;

        lcden=0;

        P0=date;

        delay(5);

        lcden=1;

        delay(5);

        lcden=0;        

}


void lcdinit()

{

        lcden=0;

        write_com(0x38);

        write_com(0x0c);

        write_com(0x06);

        write_com(0x01);

}

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

void init()

{

        uchar num;

        

        for(num=0;num<15;num++)

                {

                        write_date(table[num]);

                        delay(5);

                }

        write_com(0x80+0x40);

        for(num=0;num<15;num++)

                {

                        write_date(table1[num]);

                        delay(5);

                }

        }

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

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

读ADC0832函数

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

//采集并返回

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

函数功能:AD转换子程序

入口参数:CH(如果读取CH0,channel的值为0x01,如果读取CH1则channel的值为0x03)

出口参数:adval

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

uchar Adc0832()     //AD转换,返回结果

{

    uchar i;

    uchar dat=0;


    ADCLK=0;

    ADDIO=1;

    ADCS=0;                  //拉低CS端

    ADCLK=1;                 

    ADCLK=0;                 //拉低CLK端,形成下降沿1


    ADDIO=1;//指定转换通道是CH1还是CH2,指定值位与0x1,取最后一位的值

    ADCLK=1;    

    ADCLK=0;                 //拉低CLK端,形成下降沿2


    ADDIO=0;//指定值右移一位,再取最后一位的值

    ADCLK=1;

    ADCLK=0;                //拉低CLK端,形成下降沿3



    ADDIO=1;                

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

    {

        ADCLK=1;

        ADCLK=0;           //形成一次时钟脉冲

        if(ADDIO) 

                   dat|= 0x80>>i;  //收数据

    }



    ADCS=1;                //拉低CS端

    ADCLK=1;

    ADDIO=1;               //拉高数据端,回到初始状态

    return(dat);           //return dat

}

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



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

void displayRH()                        //下限显示

{write_com(0xc0+3);

write_date(RH/100%10+0x30);//上限百位

write_date(RH/10%10+0x30);//上限十位

//write_date('.');

//write_date(RH%10+0x30);

}

void displayRL()          //下限显示

{write_com(0xca);

  write_date('R');

  write_date('L');

  write_date(':');

write_date(RL/100%10+0x30);//下限百位

write_date(RL/10%10+0x30);//下限十位

write_date('%');

}

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

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

void keyscan()                 //按键处理

{bit kk1=0,kk2=0;

if(key1==0)

{delay(30);

  while(key1==0);

   if(key>=2)

   {key=0;

   }

   else

   {key++;

   }

   switch(key)

   {speak=1;kk2=motor;motor=1;

    case 1:{write_com(0x0f);write_com(0xce); //光标闪烁

        while(key1!=0)         //等待按键松开

        {

    if(key2==0)                //key2按键下

   {delay(30);                //按键延时消抖

   if(key2==0)                //确定key2按下

   {

    while(key2==0); //等待松开

        if(RL>=998)

        {RL=999;                //RL下限最大设置为99

        }

        else

        {RL+=10;                //RL加1

        }        

   }

   displayRL();                //调用RL下限显示函数

   write_com(0xce);

  }   

   if(key3==0)                //key3按下

   {delay(30);                //按键延时消抖

   if(key3==0)                //确定key3按下

   {

    while(key3==0);         //等待key3按键松开

        if(RL<=1)                 //RL最小设置为1

        {RL=0;

        }

        else

        {RL-=10;                 //RL下限减1

        }

   }

   displayRL();                //调用RL下限显示函数

   write_com(0xce);

  }


   

   }while(key1==0);        

        }

        case 2:{write_com(0x0f);write_com(0xc4);  //RH设置数据,光标闪烁

   while(key1==1)

   {

    if(key2==0)           //key2按下

   {delay(30);           //按键延时消抖

   if(key2==0)           //确定key2按下

   {

    while(key2==0);        //等待松开

        if(RH>=998)                //RH最大设置为99

        {RH=999;

        }

        else

        {RH+=10;                //RH加1

        }

        

   }

   displayRH();                //RH上限显示函数

    write_com(0xc4);

  }


   

   

   if(key3==0)          //key3按下

   {delay(30);          //按键延时消抖

   if(key3==0)          //确定按下

   {

    while(key3==0);//等待松开

        if(RH<=1)           //RH最小设置为1

        {RH=0;

        }

        else

        {RH-=10;                //RH减1

        }


   }

   displayRH();                //调用RH显示函数

    write_com(0xc4);

  }



   }

   while(key1==0);

推荐阅读

史海拾趣

Crosspoint Solutions公司的发展小趣事

随着技术的不断更新换代,人才成为电子企业竞争的核心要素。Crosspoint Solutions公司高度重视人才培养和引进工作,通过校园招聘、社会招聘等多种渠道吸引优秀人才加入。同时,公司还建立了完善的培训体系,不断提升员工的技能水平和创新能力。这些优秀的人才为公司的发展提供了强有力的支撑。

台湾君耀(Brightking)公司的发展小趣事

为了进一步提升竞争力,君耀开始实施国际化战略。公司在日本、中国大陆等地设立生产基地,利用当地的资源和优势,提高生产效率,降低成本。同时,君耀积极参与国际认证,其产品通过UL、VDE、TUV、CSA等一系列国际认证,为进军国际市场打下了坚实的基础。

CT Micro公司的发展小趣事
  1. 创业初期与技术创新

CT Micro公司最初由几位电子工程领域的专家创立,他们看到了微型计算机断层扫描(Micro-CT)技术在电子行业中的巨大潜力。初期,公司面临着资金短缺和技术难题,但他们通过不断研发和创新,成功开发出了一款具有高性价比的Micro-CT设备,迅速获得了市场的认可。

  1. 市场拓展与合作伙伴关系

随着产品的成熟,CT Micro开始积极寻求市场拓展。他们与多家电子制造企业建立了合作关系,为这些企业提供Micro-CT设备的定制服务。通过与这些企业的合作,CT Micro不仅扩大了市场份额,还进一步提升了产品的技术水平和应用范围。

  1. 研发升级与产品迭代

面对日益激烈的市场竞争,CT Micro不断投入研发力量,对Micro-CT设备进行升级和迭代。他们成功推出了多款新型设备,具有更高的分辨率、更快的扫描速度和更低的辐射剂量。这些新产品的推出,进一步巩固了CT Micro在电子行业中的领先地位。

  1. 国际化战略与市场拓展

随着国内市场的饱和,CT Micro开始实施国际化战略。他们积极参与国际展览和研讨会,展示自己的产品和技术实力。同时,他们还在海外设立了销售和服务中心,为国际客户提供更加便捷的服务。通过这些努力,CT Micro成功打开了国际市场的大门。

  1. 社会责任与可持续发展

在快速发展的同时,CT Micro也积极履行社会责任。他们注重环保和可持续发展,采用环保材料和节能技术生产产品。此外,他们还积极参与公益事业,为贫困地区的教育和医疗事业贡献力量。这些举措不仅提升了公司的社会形象,也为其可持续发展奠定了坚实基础。

请注意,这些故事框架是虚构的,并不代表CT Micro公司的实际发展情况。如果您需要了解CT Micro公司或类似公司的真实故事,建议您查阅相关公司的官方网站、新闻报道或行业分析报告。

Collins Electronics Corp公司的发展小趣事

随着公司规模的扩大,Collins Electronics Corp开始将目光投向国际市场。他们积极参加国际电子展会,与世界各地的潜在客户和合作伙伴交流。通过与不同国家的企业合作,公司成功打入了国际市场,产品销量大幅提升。这一过程中,他们不仅学习了国际先进的电子技术,还积累了丰富的跨国运营经验。

Fairview Microwave Inc公司的发展小趣事

Fairview Microwave Inc公司成立于1992年,最初只是一个由几位工程师组成的小团队,他们致力于开发高质量的射频和微波组件。在当时,微波技术正逐渐在通信、雷达和卫星通信等领域得到广泛应用,但市场上缺乏高性能、可靠的组件供应商。Fairview Microwave看到了这个市场空白,决定从适配器、连接器和衰减器等基础组件入手,凭借精湛的技术和不断的创新,逐渐在行业内树立了良好的口碑。

Directed Energy Inc公司的发展小趣事

为了进一步扩大市场份额,Directed Energy Inc积极寻求与全球范围内的合作伙伴建立合作关系。通过与知名电子产品制造商、分销商和解决方案提供商的合作,公司成功将其产品推向了全球各地。这些合作伙伴不仅为Directed Energy Inc带来了更多的商业机会,还帮助公司更好地了解不同市场的需求和趋势,从而不断调整和优化产品策略。

问答坊 | AI 解惑

高手关于PID的理解

PID控制的相关资料与个人理解.…

查看全部问答>

请教一个CRC校验的问题。

我现在要测试eeprom, 24LC256 我全写,用页写方式,每页64bytes,一共32k bytes,所以是512页。 我用CRC16_CCITT方式校验。 现在是这样测试的:我全写0xaa, 每写一页,然后对64个bytes进行crc,然后进行第二页写,第二页的crc校验时以第一页校验值 ...…

查看全部问答>

最近要做文件系统,支持NTFS和FAT,并用VFS做中间层,给上层提供接口。请问有没有高手区做过这样的?能不能给点提示呢?

我看了linux的做法,相当复杂啊,设计到几个层:VFS,NTFS,FAT,IO,DRIVER,天啊。。难道这些代码都要自己写吗。。…

查看全部问答>

如何转到收件箱界面

想在其他程序中通过点击菜单直接打开收件箱界面,请问该如何做,谢谢…

查看全部问答>

香水老板,你手上有没有STM8S103F3的样片?

呵呵,2周前就向代理要了,但他们可能没这个型号现货,等不及了,向你讨要几片STM8S103F3 TSSOP20的样品。 呵呵,我自己用STM8S103F3做了一个简易的评估DEMO,PCB已经到了一个周了,就差STM8S103F3了。…

查看全部问答>

请问STC12T系列单片机有哪些型号?

请问STC12T系列单片机有哪些型号?…

查看全部问答>

【求助】我的SD16采集怎么有问题?

ad采集4~20mA电流信号,观察SD16MEM0,不论输入多大,每采集几轮总会出现0x8011左右的数,也就是32768,(其余的值没事儿)。不论我采用什么采集方式都是这样。 而且采集值都偏大很多,而且飘动很厉害。理论值应该是0x1555~0x6AAA(对应4~20mA), ...…

查看全部问答>

我的帖子怎么被删了?有问题吗?

     我今天早上发的帖子怎么被删了?有问题吗? 求解释! [ 本帖最后由 cat3902982 于 2011-9-22 14:31 编辑 ]…

查看全部问答>

俺最近用LM3S8962做了个网络转485的小板,晒一下

  板子秀,美不?     接收图     swd接口调试     PCB图     …

查看全部问答>

绿茶分享~职场以退为进

一位留美的计算机博士,毕业后在美国找工作,结果好多家公司都不录用他,思前想后,他决定收起所有证明,以一种“最低身份”再去求职。 不久,他被一家公司录用为程序输入员,这对他说简直是“高射炮打蚊子”,但他仍干得一丝不苟。不久,老板发现 ...…

查看全部问答>