【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);
}




三、实验现象

B站演示视频:https://space.bilibili.com/444388619
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

联系作者

视频地址:https://space.bilibili.com/444388619/video
专注于51单片机、STM32、国产32、DSP、Proteus、arduino、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

  • 14
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
标题:mcs 51单片机 proteus 仿真实用实例大全 例子集合,含汇编代码keil工程和proteus工程 mcs 51单片机 proteus 仿真 例子集合,代码为网上收集 PROTEUS 在 MCS-51 上应用实例 PROTEUS 在 MCS-51 应用例子 绝对经典,绝对通过,仿真正常,可用,亲测 单片机仿真例子源码 单片机汇编源码例子 source code for mcs 51 mcu mcs 51 汇编仿真例子集合 proteus 仿真大全, 100多个基于51单片机的汇编语言汇编c51 proteus 仿真例子 mcu simulate 1.流水灯 仿真 2.开关灯 仿真 3.51驱动74ls系列例子 4.单片机 74ls245 5.单片机驱动喇叭例子,单片机驱动喇叭或蜂鸣器音乐 单片机播放警告声 6.单片机驱动蜂鸣器例子 7.单片机驱动74hc系列例子 8.51单片机处理按键例子,,4x4按键,16按键处理,按键检测 代码 源码 9.单片机驱动电子仿真 和 例子 汇编 组合语言 源码 10.单片机 led 流水灯 例子,仿真,源码 11.51 单片机 驱动 8x8点阵 仿真 已经源码 12.单片机 74ls373 13.单片机 74ls273 14.单片机按键例子源码 15.单片机驱动 8255 例子源码 proteus仿真, 16.51单片机定时器例子, 17.51单片机 计数器例子 源码 实例,proteus 仿真 18.单片机驱动数码管,数码管显示数字,显示移动数字 19.动态数码管数字例子 源码 代码 仿真 20.电位器 ad转换例子 21.电位器调节模拟adc adc0808 单片机 事例 源码 以及proteus 例子仿真 22.单片机做的数字电压表仿真 23.单片机rs232串行通信 串口通信 例子 源码 代码 以及 仿真。 24.51单片机 c51 驱动 74ls165 并口转 串行 例子 事例 以及 proteus 仿真 25.单片机 驱动 74ls164 窜转并 串行 转 并行 例子 汇编源码 汇编代码 以及proteus 仿真 26.单片机 做的 数码管显示时钟,数字时钟 电子中,无ds1302. proteus 模拟 27.单片机 eeprom e2prom 例子 28.c51 单片机 i2c 例子 以及 汇编 组合语言 代码 源码 仿真 模拟 29.c51 单片机 DC马达 直流电机 驱动 例子 以及 代码 源码 仿真 模拟 30.c51 单片机 步进马达 步进电机 例子 以及 代码 源码 仿真 模拟 31.c51 单片机 电子锁 按键锁 例子 以及 代码 源码 仿真 模拟 32.c51 单片机 计算器 例子 以及 代码 源码 仿真 模拟 33.c51 单片机 门铃 例子 以及 代码 源码 proteus 仿真 模拟 34.c51 单片机 定时器 例子 以及 汇编 组合语言 代码 源码 proteus 仿真 模拟 35.c51 单片机 外部中断 例子 以及 汇编 组合语言 代码 源码 proteus 仿真 模拟 36.c51 单片机 pwm 脉宽控制 例子 以及 汇编 组合语言 代码 源码 proteus 仿真 模拟 等等...... 注意这个是压缩包,里有所有的工程文件,都是可用的,解压的时候最好要用 7zip 去解压。
proteus软件仿真 部分文件原创~~ 资料很全~~学习中各个过程的难题都有例子 文件头—————————————————————————————————————————必要 #include #define uint unsigned int #define uchar unsigned char 移位函数——————————————————————————————————————————走马灯 #include temp=_cror_(temp,1); 数码管数字代码———————————————————————————————————————从0到15 正 uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; 反 uchar code table[]={ 0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90}; 延时函数——————————————————————————————————————————z毫秒 #define uint unsigned int #define uchar unsigned char void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } 定时器0使用——————————————————————————————————————工作方式1 TMOD=0x11; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; void time0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; } 定时器1使用———————————————————————————————————————工作方式1 TMOD=0x11; TH1=(65536-50000)/256; TL1=(65536-50000)%256; EA=1; ET1=1; TR1=1; void time1() interrupt 3 { TH1=(65536-50000)/256; TL1=(65536-50000)%256; } 外部中断0使用————————————————————————————————————————检测下降沿 EA=1; EX0=1; IT0=1; TCON=0x01; 数码管显示数字函数——————————————————————————————————————只显示百十个,可以扩展 void display(uchar bai,uchar shi,uchar ge) { P0=0xff; wela=1; P0=0xfe; wela=0; dula=1; P0=table[bai]; dula=0; delay(1); P0=0xff; wela=1; P0=0xfd; wela=0; dula=1; P0=table[shi]; dula=0; delay(1); P0=0xff; wela=1; P0=0xfb; wela=0; dula=1; P0=table[ge]; dula=0; delay(1); } 控制液晶—————————————————————————————————限16*2小液晶 sbit rs=P3^5; sbit e= P3^4 ; sbit wela=P2^7; sbit dula=P2^6; uchar love1[]={"i say love."}; uchar love2[]={"i love you."}; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } int write_com(uchar com) { P0=com; rs=0; e=1; delay(5); e=0; } int write_date(uchar date) { P0=date; rs=1; e=1; delay(5); e=0; } init() { wela=0; dula=0; e=0; write_com(0x38); write_com(0x0e); write_com(0x06); write_com(0x01); write_com(0x80); } 串口通信——————————————————————————————————————————波特率 9600 TMOD=0x20; TH1=0xfd; //9600 TL1=0xfd; PCON=0x00; SCON=0x50;//方式1 EA=1; ES=1; TR1=1; ES=0; SBUF=**; while(!TI); TI=0; ES=1; void ser() interrupt 4 { **=SBUF; RI=0; } IIC总线的应用————————————————————————————————————————————————EEPROM上测试 sbit sck=P2^1; sbit sda=P2^0; sbit ACC7=ACC^7; sbit ACC0=ACC^0; void delay(int z) { uchar i,j; for(i=z;i>0;i--) for(j=110;j>0;j--); } void deluy() {;;} void start() { sda=1; deluy(); sck=1; deluy(); sda=0; deluy(); } void stop() { sda=0; deluy(); sck=1; deluy(); sda=1; deluy(); } respond() { uchar i; sck=1; while(sda!=0&&i<250)i++; sck=0; deluy(); } void write_byte(uchar date) { uchar i,temp; temp=date; for(i=0;i<8;i++) { temp=temp<<1; sck=0; deluy(); sda=CY; deluy(); sck=1; deluy(); } sck=0; deluy(); sda=1; deluy(); } uchar read_byte() { uchar i; sck=0; deluy(); sda=1; deluy(); for(i=0;i<8;i++) { ACC<<=1; sck=1; deluy(); ACC0=sda; sck=0; } return ACC; } write_date(uchar add,uchar date) { start(); write_byte(0xa0); respond(); write_byte(add); respond(); write_byte(date); respond(); stop(); } read_date(uchar add) { uchar k; start(); write_byte(0xa0); respond(); write_byte(add); respond(); start(); write_byte(0xa1); respond(); k=read_byte(); stop(); return k; } DS18b28的应用—————————————————————————————————————————————一些寄存器可以按需修改 bit DS18B20_init() { bit flag; DQ=1; for(time=0;time<2;time++); DQ=0; for(time=0;time<200;time++); DQ=1; for(time=0;time<10;time++); flag=DQ; for(time=0;time<200;time++); return (flag); } void writecom(uchar com) { uchar i; for(i=0;i<8;i++) { DQ=1; _nop_(); DQ=0; DQ=com&0x01; for(time=0;time<10;time++); DQ=1; for(time=0;time>=1; } for(time=0;time<4;time++); } uchar readdat() { uchar i,dat; dat=0; for(i=0;i>=1; _nop_(); DQ=1; for(time=0;time<2;time++); if(DQ==1) dat|=0x80; else dat|=0x00; for(time=0;time<8;time++); } return(dat); } void get_temp() { DS18B20_init(); writecom(0xCC); writecom(0x44); for(time=0;time<100;time++); DS18B20_init(); writecom(0xCC); writecom(0xBE); } void main() { uchar i,tl,th; uchar zhen,xiao; while(1) { get_temp(); tl=readdat(); th=readdat(); zhen=(th*256+tl)/16; xiao=(tl%16)*10/16; } } AD转换——————————————————————————————————————————————ADC0804,其他不适用,temp 0~255之间 关键是接口 sbit wr=P3^6; sbit rd=P3^7; sbit cs=P3^2; void init() { cs=0; } void start() { wr=1; wr=0; wr=1; } void huoqu () { uchar temp; temp=0; start(); rd=0; temp=P1; rd=1; retrn temp; } DA转换—————————————————————————————————————————————关键是接口 sbit wr=P3^6; sbit da=P3^2; init() { da=0; } start() { wr=1; wr=0; wr=1; } 键盘的使用—————————————————————————————————————————4X4 含消抖效果 uchar key; void scan(void) { uchar scode,rcode; P3=0xf0; if((P3&0xf0)!=0xf0) { delay(5); if((P3&0xf0)!=0xf0) { scode=0xfe; while((scode&0x10)!=0) { P3=scode; if((P3&0xf0)!=0xf0) { rcode=(P3&0xf0)|0x0f; key=(~scode)+(~rcode); switch(key) { case 0x11:key=0;break; case 0x21:key=1;break; case 0x41:key=2;break; case 0x81:key=3;break; case 0x12:key=4;break; case 0x22:key=5;break; case 0x42:key=6;break; case 0x82:key=7;break; case 0x14:key=8;break; case 0x24:key=9;break; case 0x44:key=10;break; case 0x84:key=11;break; case 0x18:key=12;break; case 0x28:key=13;break; case 0x48:key=14;break; case 0x88:key=15;break; default : key=16;break; } } else scode=(scode<<1)|0x01; } } } else key=16; }
51单片机基础应用设计C语言实例源码仿真300个合集: 100000秒以内的计时程序 10秒的秒表 12864LCD图形滚动演示 128X64LED 160128LCD图文演示 1602字符液晶滚动演示程序 1602液晶显示的DS1302实时时钟 16×16点阵(滚动显示) 16×16点阵2(滚动显示) 2io5键盘模拟音量数码管显示 2×20串行字符液晶演示 32x16汉字 44行列键盘 485全双工通信 4×4键盘矩阵控制条形LED显示 4个独立式按键控制LED开关 4个独立式按键控制LED移位 4只数码管滚动显示0~3 555可调PWM发生器 555的应用 6264扩展内存 6个16×16点阵 74HC154译码器应用 74HC595 74HC595串入并出芯片应用 74LS138译码器应用 74LS148扩展中断 8051双机通信简例 8255并行口扩展实例 89C51PWM 8x8LED汉字显示 8x8点阵做的贪吃蛇游戏 8×8LED点阵屏显示数字 8只数码管同时显示不同字符 8只数码管显示多个不同字符 8只数码管滚动显示8~F 8只数码管滚动显示单个数字 8只数码管滚动显示数字串 8只数码管闪烁显示 8通道自动温度检测系统仿真(含原程序) ADC0808 PWM实验 ADC0809模数转换与显示 ADC0832模数转换与显示 AT89C51对直流电动机的驱动 AVR_Uart BCD译码数码管显示数字 c51 可预设电压的数控电源(功能强大) clock Conter CPU控制的独立式键盘扫描实验 da、ad。液晶,传递函数模型综合应用的实例 DIY51式数控电源 DS1621温度传感器实验 ds18b20 DS18B20温度传感器实验 DS18B20温度检测及其液晶显示 HorseLight I2C IIC-24C04与数码管 IIC-24C04与蜂鸣器 INT0与INT1中断计数 INT0中断3位计数 INT0及INT1中断计数 INT0和INT1控制条形LED INT1中断5位计数 IO并行口直接驱动单个数码管 K1-K4 分组控制LED K1-K4 控制LED移位 K1-K4 控制数码管加减演示 K1-K4 控制数码管移位显示 K1-K4 键状态显示 key_lcd ks0108 液晶12864 LCD频率计仿真 LED代码查询V1[1].1 LED模拟交通灯 LED闪烁 M16_AN_Compare M16_EEPROM M16_Horse MAX7221控制数码管动态显示 my16key_c NT0中断控制LED NT0中断计数 NumberDisplay P3口流水灯 PCF8574 PCF8583+LCD1602 PCF8591模数与数模转换实验 proteus ADDC的练习程序 PWM PWMLED PWM控制LED的亮度仿真程序 PWM控制马达的方法 PWM波输出(可调) PWM电机正反转 pwm程序实例 PWM调温 RAM扩展练习 sscom32串口调试 TIMER0与TIMER1控制条形LED TIMER0控制LED二进制计数 TIMER0控制单只LED闪烁 TIMER0控制四只LED滚动闪烁 TIMER0控制流水灯 ULN2803 usart_t 《lcd1602仿真实例》 一个数控直流稳压电源 一个步进电机的仿真 一步一步教你51_PC串口通信 万能逻辑电路实验 三机通讯 串口仿真mcu_pc 串口方式1 串行数据转换为并行数据 交通灯 从左到右的流水灯 光藕隔离驱动电机 内部函数intrins.h应用举例 净水控制器仿真电路 刚做好的十个字的led屏模拟有程序 包含单片机寄存器的头文件 单只按键控制单只数码管滚动显示 单只数码管循环显示0-9 单只数码管循环显示0~F 单片机与PC机串口通讯仿真 单片机之间双向通信 单片机向PC发送数据 单片机向主机发送字符串 单片机接收PC发出的数据 单片机控制的电动自行车驱动系统 单片机数据发送程序 发一个用定时器做的PWM 基于1602+ds12b80+ds1302+音乐+电子书+流水灯的多功能电子表 基于ADC0832的数字电压表 基于AT24C02的多机通信 基于AT89C51+MAX7219的频率计 附带proteus仿真电路图 实际硬件电路测试通过 基于DS1302的日历时钟 基于yjwpm测试过的DS18B20仿真实例 多功能电子钟 多点温度测量 多路开关状态指示 大屏幕仿真 子电路做的一个H型电机驱动电路 字符串函数string.h应用举例 字符函数ctype.h应用举例 宏定义应用举例 定时器中断控制的独立式键盘扫描实验 定时器控制交通指示灯 定时器控制数码动态显示 定时器控制数码管动管显示 对I2C总线上挂接多个AT24C02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值