Proteus仿真】【51单片机】智能垃圾桶设计

一、功能简介

本项目使用Proteus8仿真51单片机控制器,使用报警模块、LCD1602液晶模块、按键模块、人体红外传感器、HCSR04超声波、有害气体传感器、SG90舵机等。


主要功能:

系统运行后,LCD1602显示超声波检测距离和传感器采集有害气体浓度值极其阈值。

当感应到有人时,桶盖舵机开启,此时系统检测垃圾高度是否超限,如果超限,则开启压缩机打包,完成后蜂鸣器报警提示。当人离开,桶盖舵机关闭。如果有害气体浓度超限,蜂鸣器报警。

可通过按键K3进入阈值设置模式,K1和K2调节数据,K4确定。


二、软件设计

/*

作者:嗨小易(QQ:3443792007)


*/



//系统数据获取

void sys_data_get(void)

{

while(1)

{

  //获取距离

  sys_ctrl.dis=ultrasonicwave_measure();

  //获取有害气体浓度

  sys_ctrl.gas=pcf8591_read_adcvalue(0);

  sys_ctrl.gas=cal_map(sys_ctrl.gas,0,255,0,99);

  //检测有无人

  if(IRED==0)sys_ctrl.man=1;

  else sys_ctrl.man=0; 


  break;

}

}


//系统数据显示

void sys_data_show(void)

{

while(1)

{

  //距离显示

  lcd1602_show_nums(4,0,sys_ctrl.dis,3,0);

  //气体浓度显示

  lcd1602_show_nums(4,1,sys_ctrl.gas,2,0);

  //有无人状态显示

  if(sys_ctrl.man==1)lcd1602_show_string(8,1,"Y");

  else lcd1602_show_string(8,1,"N");


  //距离阈值显示

  lcd1602_show_nums(13,0,sys_ctrl.dish,3,0);

  //气体阈值显示

  lcd1602_show_nums(13,1,sys_ctrl.gash,2,0);


  //阈值闪烁指示

  switch(sys_ctrl.mode)

  {

  case 1://距离

    lcd1602_show_string(13,0,"  ");

    delay_ms(50);

    lcd1602_show_nums(13,0,sys_ctrl.dish,3,0);

    break;

  case 2://气体

    lcd1602_show_string(13,1,"  ");

    delay_ms(50);

    lcd1602_show_nums(13,1,sys_ctrl.gash,2,0);

    break;

  }


  break; 

}

}


//系统数据设置

void sys_data_set(void)

{

u8 key=0;

key=key_scan(0);


//设置

if(key==KEY3_PRESS)

{

  sys_ctrl.mode++;

  if(sys_ctrl.mode>2)sys_ctrl.mode=1;

}

//阈值设置模式

if(sys_ctrl.mode!=0)

{

  //加

  if(key==KEY1_PRESS)

  {

  switch(sys_ctrl.mode)

  {

    case 1://距离

    sys_ctrl.dish++;

    if(sys_ctrl.dish>500)sys_ctrl.dish=0;

    break;

    case 2://气体

    sys_ctrl.gash++;

    if(sys_ctrl.gash>99)sys_ctrl.gash=0;

    break;

  }

  }

  //减

  else if(key==KEY2_PRESS)

  {

  switch(sys_ctrl.mode)

  {

    case 1://距离

    sys_ctrl.dish--;

    if(sys_ctrl.dish<0)sys_ctrl.dish=500;

    break;

    case 2://气体

    sys_ctrl.gash--;

    if(sys_ctrl.gash<0)sys_ctrl.gash=99;

    break;

  }

  }

  //确定

  else if(key==KEY4_PRESS)

  {

  sys_ctrl.mode=0;

  }

}

}


//系统功能控制

void sys_fun_ctrl(void)

{

static u8 oneflag=0;


//如果红外检测到有人

if(sys_ctrl.man==1)

{

  //打开桶盖舵机

  steer_control(2);

  //如果垃圾高度到达阈值,开启打包

  if(sys_ctrl.dis>sys_ctrl.dish)

  {

  if(oneflag==0)//压缩机启动一次

  {

    oneflag=1;

    _dc_motor_zturn();

    delay_ms(1000);

    _dc_motor_stop();

    beep_alarm(100,2000);

  }

  }

  else oneflag=0;

 

}

//如果红外未检测到有人

else

{

  //关闭桶盖舵机

  steer_control(0); 

}


//如果有害气体浓度高于阈值,报警

if(sys_ctrl.gas>sys_ctrl.gash)beep_alarm(10,1000);

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容