基于51单片机的蔬菜大棚温湿度智能控制系统

发布者:Harmonious88最新更新时间:2020-08-25 来源: 51hei关键字:51单片机  蔬菜大棚  温湿度智能控制系统 手机看文章 扫描二维码
随时随地手机看文章

基于51单片机的蔬菜大棚温湿度智能控制系统设计模块使用:使用dht11、74hc595数码管模块、继电器模块
任务

1)根据检测到的温湿度信息控制通风与加热;

2)采用MCU、温湿度传感器、继电器、按键、数码管等;

3)通过按键设定大棚温湿度报警值;

4)上传信息到PC机;

5)当温度或适度超限时用继电器控制小灯状态模拟相应动作的发生。

 

单片机源程序如下:

////////////////////////////////////////////////////10.3            17:58////////////////////////////////////////////////////////

#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

#include

#include

#define uchar unsigned char

#define uint unsigned int       

sbit RS = P1^0;   //定义端口

sbit RW = P1^1;

sbit EN = P2^5;

sbit DU = P2^0;

sbit WE = P2^1;

sbit Data = P3^6;//定义数据线



uchar rec_dat[19];   //用于显示的接收数据数组


#define RS_CLR RS=0

#define RS_SET RS=1


#define RW_CLR RW=0

#define RW_SET RW=1


#define EN_CLR EN=0

#define EN_SET EN=1


#define DataPort P0



void cmg88()//关数码管,点阵函数

{

DU=1;  

P0=0X00;

DU=0;

}

/*------------------------------------------------

uS延时函数,含有输入参数 unsigned char t,无返回值

unsigned char 是定义无符号字符变量,其值的范围是

0~255 这里使用晶振12M,精确延时请使用汇编,大致延时

长度如下 T=tx2+5 uS

------------------------------------------------*/

void DelayUs2x(unsigned char t)

{   

while(--t);

}

/*------------------------------------------------

mS延时函数,含有输入参数 unsigned char t,无返回值

unsigned char 是定义无符号字符变量,其值的范围是

0~255 这里使用晶振12M,精确延时请使用汇编

------------------------------------------------*/

void DelayMs(unsigned char t)

{

     

while(t--)

{

     //大致延时1mS

     DelayUs2x(245);

         DelayUs2x(245);

}

}


//              判忙函数

bit LCD_Check_Busy(void)

{

DataPort= 0xFF;

RS_CLR;

RW_SET;

EN_CLR;

_nop_();

EN_SET;

return (bit)(DataPort & 0x80);

}

//             写入命令函数

void LCD_Write_Com(unsigned char com)

{  

while(LCD_Check_Busy()); //忙则等待

RS_CLR;

RW_CLR;

EN_SET;

DataPort= com;

_nop_();

EN_CLR;

}

//             写入数据函数

void LCD_Write_Data(unsigned char Data)

{

while(LCD_Check_Busy()); //忙则等待

RS_SET;

RW_CLR;

EN_SET;

DataPort= Data;

_nop_();

EN_CLR;

}


//               清屏函数

void LCD_Clear(void)

{

LCD_Write_Com(0x01);

DelayMs(5);

}

//             写入字符串函数

void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)

{     

if (y == 0)

        {     

         LCD_Write_Com(0x80 + x);     //表示第一行

        }

else

        {      

        LCD_Write_Com(0xC0 + x);      //表示第二行

        }        

while (*s)

        {     

LCD_Write_Data( *s);     

s ++;     

        }

}

   //           写入字符函数

void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)

{     

if (y == 0)

        {     

        LCD_Write_Com(0x80 + x);     

        }   

else

        {     

        LCD_Write_Com(0xC0 + x);     

        }        

LCD_Write_Data( Data);  

}

//             初始化函数

void LCD_Init(void)

{

   LCD_Write_Com(0x38);    /*显示模式设置*/

   DelayMs(5);

   LCD_Write_Com(0x38);

   DelayMs(5);

   LCD_Write_Com(0x38);

   DelayMs(5);

   LCD_Write_Com(0x38);  

   LCD_Write_Com(0x08);    /*显示关闭*/

   LCD_Write_Com(0x01);    /*显示清屏*/

   LCD_Write_Com(0x06);    /*显示光标移动设置*/

   DelayMs(5);

   LCD_Write_Com(0x0C);    /*显示开及光标设置*/

   }

   


/*------------------------------------------------

              DHT11延时函数

------------------------------------------------*/

void DHT11_delay_us(uchar n)

{

    while(--n);

}


void DHT11_delay_ms(uint z)

{

   uint i,j;

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

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

}

/*------------------------------------------------

              DHT11开始信号

------------------------------------------------*/

void DHT11_start()

{

   Data=1;

   DHT11_delay_us(2);

   Data=0;

   DHT11_delay_ms(20);   //延时18ms以上

   Data=1;

   DHT11_delay_us(30);

}

//             接收八位二进制

uchar DHT11_rec_byte()      //接收一个字节

{

   uchar i,dat=0;

  for(i=0;i<8;i++)    //从高到低依次接收8位数据

   {         

      while(!Data);   ////等待50us低电平过去

      DHT11_delay_us(8);     //延时60us,如果还为高则数据为1,否则为0

      dat<<=1;           //移位使正确接收8位数据,数据为0时直接移位

      if(Data==1)    //数据为1时,使dat加1来接收数据1

         dat+=1;

      while(Data);  //等待数据线拉低   

    }  

    return dat;

}

//              接收40bit数据


void DHT11_receive()      //接收40位的数据

{

    uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;

    DHT11_start();


    if(Data==0)

    {

       

        while(Data==0);   //等待拉高     

               

        DHT11_delay_us(40);  //拉高后延时80us

        R_H=DHT11_rec_byte();    //接收湿度高八位  

        R_L=DHT11_rec_byte();    //接收湿度低八位  

        T_H=DHT11_rec_byte();    //接收温度高八位  

        T_L=DHT11_rec_byte();    //接收温度低八位

        revise=DHT11_rec_byte(); //接收校正位

                         

        DHT11_delay_us(25);    //结束


        if((R_H+R_L+T_H+T_L)==revise)      //校正

        {

            RH=R_H;

            RL=R_L;

            TH=T_H;

            TL=T_L;

        }

        /*数据处理,方便显示*/

        rec_dat[0]='0'+(RH/10);

        rec_dat[1]='0'+(RH%10);

                rec_dat[2] =' ';

                rec_dat[3] = 'R' ;

                rec_dat[4] = 'H';

        rec_dat[5]=' ';

        rec_dat[6]=' ';

        rec_dat[7]=' ';

        rec_dat[8]=' ';

        rec_dat[9]='0'+(TH/10);

        rec_dat[10]='0'+(TH%10);

                rec_dat[11] =' ';

                rec_dat[12] = 'C';

                rec_dat[13] = ' ' ;

        rec_dat[14]=' ';

                rec_dat[15] =(RH/10);

                rec_dat[16] =(RH%10);

                rec_dat[17] =(TH/10) ;

        rec_dat[18]=(TH%10);

    }

}

/////////////////数码管///////////////////////////////////////////////


  

unsigned char code fseg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

unsigned char code segbit[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};

unsigned char  disbuf[8]={0,0,0,0,0,0,0,0};

unsigned char code LED_0F[];                // LED字模表


sbit DIO = P1^0;                                //串行数据输入

sbit rclck  = P1^1;                                //时钟脉冲信号——上升沿有效

sbit SCLK = P1^2;                                //打入信号————上升沿有效


//-----------------------------------------------------------------------------

// 全局变量

uchar LED[8];        //用于LED的8位显示缓存

  



unsigned char code LED_0F[] =

{// 0         1          2           3        4         5          6           7        8         9          A           b        C    d          E    F    -

        0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8C,0xBF,0xC6,0xA1,0x86,0xFF,0xbf

};


void LED_OUT(uchar X)

{

        uchar i;

        for(i=8;i>=1;i--)

        {

                if (X&0x80) DIO=1; else DIO=0;

                X<<=1;

                SCLK = 0;

                SCLK = 1;

[1] [2] [3] [4] [5]
关键字:51单片机  蔬菜大棚  温湿度智能控制系统 引用地址:基于51单片机的蔬菜大棚温湿度智能控制系统

上一篇:单片机按键的三种方法
下一篇:基于51单片机的语音合成模块

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved