基于stm32单片机智能自动浇花灌溉系统Proteus仿真和源程序全套资料

 一:功能介绍

1、采用stm32单片机+LCD1602+DHT11温湿度传感器+继电器+按键+电机+蜂鸣器,制作一个基于stm32单片机智能自动浇花灌溉系统;

2、通过DHT11传感器采集当前的温湿度,显示到LCD1602上面;

3、通过按键设置湿度阈值,每按一下蜂鸣器会滴提醒一下,显示到LCD1602上面;

4、当检测到的湿度低于当前设置湿度阈值,继电器自动打开,浇水电机开启工作自动浇水;

二:仿真演示视频+程序简要讲解:(程序有中文注释,新手容易看懂)

132-基于stm32单片机智能自动浇花灌溉系统Proteus仿真+源程序

三:设计软件介绍

本设计使用C语言编程设计,程序代码采用keil5编写,程序有中文注释,新手容易看懂,仿真采用Proteus软件进行仿真演示视频使用的是Proteus8.9版本;资料包里有相关软件包,可自行下载安装。

四:程序打开方法

特别注意:下载资料包以后一定要先解压!(建议解压到桌面上,文件路径太深会导致程序打开异常),解压后再用keil5打开。

c2406f2a1ee77908ee04491cededbe25.png

dca1c418a5f07ab18fb6db443e266c26.png

程序部分展示,有中文注释,新手容易看懂
uint8_t lcd_dat1[20];//液晶第一行
uint8_t lcd_dat2[20];//液晶第二行
uint16_t temp_dat;//温度变量
uint16_t hum_dat;//湿度变量
uint16_t set_hum_dat=50;//设置湿度变量
uint8_t setnum;//设置变量


/**********函数申明****************************************/


void KEY_IO_Init(void);//按键初始化
void EXTIx_Init(void);//外部中断
void Relay_IO_Init(void); //控制继电器引脚io初始化
void EXTI0_IRQHandler(void);
void EXTI1_IRQHandler(void);
void EXTI2_IRQHandler(void);
/*****************************************
  main函数
*****************************************/
int main(void){
  
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断向量分组 2
  //按键和继电器引脚初始化
  KEY_IO_Init();
  Relay_IO_Init();
  EXTIx_Init();//外部中断初始化
  LCD_init();    //LCD1602初始化
  LCD_clr();//LCD清屏幕
  DHT11_Init();//温湿度传感器初始化
  
  
  while(1)
    {  
      //传感器数据采集
      if(DHT11_ReadData())//温湿度采集
      {
        temp_dat=DHT11_GetTem();
        temp_dat=temp_dat/256;
        delay_ms(10);
        hum_dat=DHT11_GetHum();
        hum_dat=hum_dat/256;
      }


          //液晶显示:T温度  H湿度,
      sprintf(lcd_dat1,"T:%d C   H:%d  \n",temp_dat,hum_dat);//转换温度,湿度
      LCD_prints(0,0,lcd_dat1);//液晶显示第一行
      if(setnum==0)
      {
        sprintf(lcd_dat2,"   SET:%d  \n",set_hum_dat);///转换设置设置湿度
        LCD_prints(0,1,lcd_dat2);//液晶显示第二行
      }
        if(setnum  == 1)
      {
        sprintf(lcd_dat2,"   SET:%d *\n",set_hum_dat);///转换设置湿度
        LCD_prints(0,1,lcd_dat2);//液晶显示第二行
      }


    if(hum_dat<set_hum_dat)//比较湿度 控制浇水电机
      Relay1=1;
    else
      Relay1=0;  
  }
  
}






void KEY_IO_Init(void)//按键初始化
{
   GPIO_InitTypeDef  GPIO_InitStructure;
   
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);   //使能PB端口时钟
  
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;         //按键输入端口配置
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;     
   GPIO_Init(GPIOB, &GPIO_InitStructure);  
}  
void EXTIx_Init(void)//外部中断
{
  NVIC_InitTypeDef NVIC_InitStructure;  //NVIC寄存器结构体变量
  EXTI_InitTypeDef EXTI_InitStructure;  //外部中断相关寄存器结构体变量
  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能IO复用功能时钟
  
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0); //
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1); //
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource2); //
  
  //配置外部中断4相关寄存器
  EXTI_InitStructure.EXTI_Line = EXTI_Line0|EXTI_Line1|EXTI_Line2;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  
  EXTI_Init(&EXTI_InitStructure);
  
  //中断通道使能
  NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//使能外部中断通道0
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //设置抢占优先级2
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;//设置响应优先级2
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  
  NVIC_Init(&NVIC_InitStructure);
  
    //中断通道使能
  NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;//使能外部中断通道1
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //设置抢占优先级2
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;//设置响应优先级2
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  
  NVIC_Init(&NVIC_InitStructure);
  
    //中断通道使能
  NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;//使能外部中断通道2
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //设置抢占优先级2
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;//设置响应优先级2
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  
  NVIC_Init(&NVIC_InitStructure);
  
  
}


void EXTI0_IRQHandler(void)//进入设置
{
  setnum++;
  buzzer=1;delay_ms(50);buzzer=0;delay_ms(50);
  if(setnum  > 1)//按下次数超过1次,退出设置
  {
    setnum=0;
  }  


  EXTI_ClearITPendingBit(EXTI_Line4);//清除中断挂起标志位
}
void EXTI1_IRQHandler(void)//设置加
{
buzzer=1;delay_ms(50);buzzer=0;delay_ms(50);
  if(setnum  == 1)
  {
    if(set_hum_dat<100)
    set_hum_dat++;
  }  
  EXTI_ClearITPendingBit(EXTI_Line4);//清除中断挂起标志位
}

:仿真文件(采用Proteus打开)

968bbd9401a314cd921feaabc8d1f2b0.png

9c857930a41fe8b90be015e5ea961f54.png

2b183b43ef661f62a9a3bdf05b6b822e.png

六:资料清单展示(文件中包含的相关资料)

41c52acc4883cef36d430286c56c91e1.png

资料下载链接(可点击)

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值