摘要
本文设计了一种基于STC89C52RC的多功能垃圾箱控制系统。该系统主要由超声波测距电路、红外感应模块、电机驱动模块和蜂鸣器报警模块等功能模块组成,以超声波传感器、红外传感器和单片机为核心,通过传感器采集距离信息,LCD1602显示当前垃圾桶状态,如果红外感应传感器检测到人与垃圾箱的距离较小,则垃圾箱自动翻盖,如果超声波检测到垃圾箱已满,系统就会进行蜂鸣器提示。本系统具有结构简单、性能稳定、操作方便、低成本、智能化等优点,为进一步隔离人与垃圾,防止人感染细菌找到了一个可行的解决方法。矚慫润厲钐瘗睞枥庑赖。
关键词 : 单片机,超声波传感器,红外传感器,垃圾箱
1.1课题的目的和意义
生活垃圾造成污染一直是中国最严重的社会公害之一,鉴于改革开放以来,中国经济高速发展、城市人口数量显著增加,城市规模和范围不断增大,城市化进程不断加快,中国城市生活垃圾产量不断增大,尤其是近年来,随着经济的迅猛发展,公共场合的垃圾不能很好的收集,造成垃圾污染和影响市容的问题也越来越严重,所以,把垃圾良好的回收处理,防止环境污染,环境保护,已成为重要的举措智能垃圾桶应运而生。
随着科学技术的不断发展以及人们生活水平的不断提高,人们开始追求健康卫生、和谐的生活环境,其中环境存在的卫生问题越来越引起人们的高度重视。手动翻盖式的垃圾桶,这种垃圾桶需要经常用手来开垃圾桶,由于手近距离的接触垃圾桶口,很容易让手携带细菌,非常的不好。后来人们又想出利用脚代替手的脚踩翻盖式的垃圾桶,这种垃圾桶盛行一段时间后,又因为其体积非常的小,才那么两三下就装满了,再加人们丢垃圾时需要经常起身,非常不方便。人们迫切希望一种智能垃圾桶具有检测到近距离有人自动翻盖,扔完垃圾自动关闭盖子;还可以前后移动,方便不便行走的人群不用走路就能把垃圾扔掉。于是,基于单片机的智能垃圾桶比价有显示的意义,由此智能垃圾桶应运而生。它的出现标志着人们对环境的保护意识有提高了一个层次,同时也给现在的科技领域技术一个很好的展示平台。
课题背景
人们越来越注重家中各式各样的家居用器具有智能性,因而市场上出现了各式各样的垃圾桶,如按压式垃圾桶、智能语音识别垃圾、多个功能垃圾桶、自动分类垃圾桶等,为人们的生活带来极大的方便。而智能语音识别智能垃圾桶非常的方便,通过语音识别算法对控制语音命令进行识别,如前进、后退、开盖、关盖的指令,完成远距离非接触式智能开关闭垃圾桶的运动功能,目前很多发达国家都在致力于研究新型智能型垃圾桶,以便垃圾桶有更多的功能,如可以很好的调节垃圾桶的开盖角度、垃圾桶自动分类、控制垃圾桶遥控封袋等功能,可以更好的为人们服务。
1.3智能垃圾桶的发展概况
垃圾桶作为日常生活不可或缺的装置, 按摆放地点可分为公用垃圾桶和家用垃圾桶, 按制造材质可分为塑料垃圾桶和金属垃圾桶, 近年来还出现桶身为透明以便于辨识桶内是否遭放置爆裂物或有毒物质的垃圾桶, 也被叫做 “反恐垃圾桶”。 经过调研,目前生产的垃圾桶主要有下列有待改进的地方:
1、垃圾桶封闭性不佳或直接没有盖,既会向四周散发味道,又容易滋长蚊 虫,对环境和人的影响都不好。
2、不能处理垃圾已装满的情况,即缺少报警的功能,不及时清理垃圾就会 掉落在桶外,既不美观也不卫生。
目前在市场上各种类垃圾桶看起来令人目不暇接, 使用上却只不外乎是用脚踩或没有盖的开放式垃圾桶。在这个传感器技术快速更新的时代, 各式智能仪器 仪表、自动化装置迅速融入大众的生活当中。各种智能设备节省了大量人力, 财力,在可见的将来, 智能化和自动化技术必将得到更为广泛的应用, 所以智能垃圾桶垃圾也将会是是一个发展的趋势。除了传统的垃圾桶,现今市面上还有不同类型的智能垃圾桶。现在市面上已经出现了用红外线等感应装置的解决方案的智能垃圾桶,通过集成电路处理传感器的信号并发给步进电机控制垃圾箱的盖开合,以此达到智能的目标。除了红外检测垃圾桶外, 还有语音提示垃圾桶,垃圾桶自身配置一个用来播放语音喇叭,安装在桶底或合适的地方,并可以通过开关手动控制。垃圾桶作为人类社会不可缺少的一部分, 必定会伴随着时代发展和需求向着 小巧和智能的方向发展。虽然目前的垃圾桶在智能化方向已经初见端倪, 但距离 理想的形态还具有很长一段距离。
1.4本课题主要研究内容
本设计主要使用STC89C51单片机为基础设计并开发一个智能垃圾桶系统。该系统实现智能开盖,垃圾装满报警的功能。设计主要以单片机为控制中心,通过红外传感器检测探测范围内有人与否,如果有,经过单片机控制启动步进电机打开桶盖再经过延时设定时刻后自动关闭垃圾桶盖。步进电机通过线的正反缠绕实现桶盖的开启与关闭。通过超声波测距检测垃圾是否装满,如果装满单片机控制蜂鸣器进行提示人们处理垃圾
主要内容包括:
1.红外检测功能
2.步进电机驱动电路的设计
3.垃圾高度检测功能
4.LCD1602液晶显示
5.蜂鸣器报警
鶼劍鲰腎邏蘞。
2 系统整体实现
2.1系统整体实现
此多功能垃圾箱控制系统所要实现的功能包括:垃圾箱的自动翻盖、箱满自动报警、定时喷洒等。实现以上这些功能可以使用户方便投放垃圾,将两者初步隔离,且防止垃圾箱内细菌滋生。设计使用STC89C52RC单片机为核心元件。纣
2.2 单片机最小系统
2.2.1STC89C52RC单片机简介
如图2为STC89C51单片机的管脚图。
图2 STC89C52RC管脚图
本设计采用的是STC89C52RC单片机[10],其功能特性概述:4K字节Flash闪速存储器,128字节内部RAM,32个可编程I/O口线;,2个16位定时器/计数器,1个5向量两级中断结构,一个全双工串行通信口,片内振荡器以及时钟电路。中央处理器CPU会在空闲模式的状态下停止工作,但是在此种状态下又同时允许随机存储器RAM、串行通信口、定时/计数器和中断系统继续工作。在掉电模式下会保存随机存储器RAM里面的内容,但是振荡器停止工作,而且同时禁止其他的所有部件工作,直至下一个硬件复位。颖刍莖蛺饽亿顿裊赔泷。
STC89C52RC引脚功能简介:
P0口是三态双向口,通称数据总线口,因为只有该口能直接用于对外部存储器的读/写操作。P0口也用以输出外部存储器的低8位地图1址。因为是分时输出,所以应该在外部加锁存器将这个地址数据锁存,地址锁存,信号用ALE。 濫驂膽閉驟羥闈詔寢賻。
P1口是专门供用户使用的I/O口,是准双向口。
P2口是从系统扩展时作高8位地址线用。不扩展外部存储器时,P2口也可以作为用户I/O口线使用,P2口也是准双向口。 銚銻縵哜鳗鸿锓謎諏涼。
P3口是双功能口,该口的每一位均可独立地定义为第一I/O功能或第二I/O功能。作为第一功能使用时操作同P1口。挤貼綬电麥结鈺贖哓类。
P3口作为一些特殊功能口,如下表1所示。
表1 P3口替代功能
引脚 | 替代功能 | 说明 |
P3.0 | RXD | 串行数据输入 |
P3.1 | TXD | 串行数据输出 |
P3.2 | INT0 | 外部中断0输入 |
P3.3 | INT1 | 外部中断1输入 |
P3.4 | T0 | 定时器0外部计数输入 |
P3.5 | T1 | 定时器1外部计数输入 |
P3.6 | WR | 外部RAM写选通输出 |
P3.7 | RD | 外部RAM读选通输出 |
2.2.2 复位电路
为了不影响系统运行后的正常工作,在单片机开始启动时,都需要重新复位,使得CPU以及系统各部分处于初始状态,并且从初态开始工作。常见的复位方式有2种:手动复位和上电复位。由于本次设计的系统是位于垃圾箱内部,考虑到实际使用过程中,在垃圾箱外安装手动复位按钮容易被来往人流按到造成不便,所以使用了上电复位的方式。复位电路图如图3所示。赔荊紳谘侖驟辽輩袜錈。
图3复位电路图
如上图所示,上电复位的电路便是在单片机的复位输入引脚RST上接一个电容到电源Vcc端,而后下接一个电阻到地,这样组成的。上电复位电路的工作原理:复位电路通过电容加给RST端一个短暂信号,由于上电的瞬间电容充电电流最大,所以电容就相当于短路,即RST断获得一高电平信号。这个高电平信号是跟着Vcc对电容的充电过程而逐渐回落,所以RST端的高电平持续时间的长短取决于电容的充电时间。电容两端的电压一旦达到与电源Vcc相同的电压值时,给电容充电的电流就会减少至零,即停止给电容充电,电容就相当于开路,RST端就为低电平,程序就能够正常运行。塤礙籟馐决穩賽釙冊庫。
2.2.3 晶振电路
晶振电路是用来给系统提供基本的时钟信号。为了使得系统各部分能够保持同步,一般来说一个系统共用一个晶振。本次设计的系统采用的是仅用一个晶振来实现同步的。晶振电路如图4所示。裊樣祕廬廂颤谚鍘羋蔺。
图4晶振电路
如上图所示,本次设计的晶振电路由2个20uF的负载电容和1个为12MH晶振构成,两端分别连接单片机的XTAL1端口和XTAL2端口。仓嫗盤紲嘱珑詁鍬齊驁。
晶振是晶振电路组成的重要部分,其作用是为系统提供基准的频率。晶振的频率高低直接影响着单片机运行的速度,一般情况下,晶振频率越高,单片机的运行速度就可以越快。绽萬璉轆娛閬蛏鬮绾瀧。
图4中C2和C3成为负载电容,由于晶振产生的应该是完整的正弦波,如果2个负载电容不等,那么它们两端的电压会不同,使得产生的正弦波肯定是不完全对称的。因此要保证C2与C3的大小相同,特性相同,一般会采用20pF至30pF的电容,本设计所用的电容是20pF。选择晶振的范围通常在骁顾燁鶚巯瀆蕪領鲡赙。
1.2MHz-12MHz之内。在STC89C52RC单片机实际正常的运作情况下,运用电路分析、模电等理论计算出来12MHz的晶振最合适,所以本系统采用的是12MHZ的晶振。在最后硬件焊接的过程中,会安排元器件的分布,一般情况下,为了减少寄生电容、稳定振荡,会将晶振电路和单片机靠近安装。瑣钋濺暧惲锟缟馭篩凉。
2.3 红外感应模块
红外感应模块是通过红外传感器在有效范围内检测有无物体,然后将信息传给单片机。红外感应模块电路图如图5所示。鎦诗涇艳损楼紲鯗餳類
此传感器模块中使用了2个互相并联的RPR220传感器电路[11]。RPR220的4脚接入LM393的正输入端,LM393的负输入端接入一个滑动变阻器,这个滑动变阻器就决定了负输入端的电压。实际上,+5V电压、R4和U4组成了一个三极管的最小应用系统。当RPR220检测到光线射入时,U4电压约等于0,即LM393的正输入端的电压为0。所以LM393的负输入端电压大于正输入端,LM393的输出端会输出低电平,这样单片机就可以执行程序。反之,当没有检测到光线射入,LM393的正输入端电压大于负输入端时,输出端输出高电平,单片机不执行程序。栉缏歐锄棗鈕种鵑瑶锬。
RPR220是一种一体化反射红外探测器。因为RPR220的塑料透镜使得这类传感器具有了较高的灵敏度,而且它内置的可见光过滤器还能够减小离散光的对测量的影响,使得检测的误差大大减少,最后RPR220红外传感器的体积小且结构紧凑,适合放在垃圾箱外壳的夹层中。辔烨棟剛殓攬瑤丽阄应。
2.4 电机驱动模块
步进电机[12]是将电脉冲信号转变为角位移或者是线位移的开环控制元件。在步进电机正常运行的情况下,电机的转速只与脉冲信号的频率和脉冲数有关。将一个脉冲信号加给电机,电机就会因此转过一个步距角。由于步进电机转动的步距角和脉冲信号存在线性关系,并且具有瞬间启动和急速停止的优越特性,所以只需改变脉冲的顺序,就可以很方便的改变转动的方向在速度控制领域使用广泛。峴扬斕滾澗辐滠兴渙藺。
只有使用脉冲信号作为驱动信号,才能使步进电机正常运作。无脉冲信号的时候,步进电机就不会工作,一直处于静止状态;若是想使步进电机按一定的角度运转,就必须给步进电机加上一个适当的脉冲信号,电机运转的速度与脉冲的频率。电机驱动电路如图6所示。詩叁撻訥烬忧毀厉鋨骜。
本次设计采用的电机驱动是ULN2003[13]芯片,它由一个单片高电压、高电流的达林顿晶体管阵列集成电路。ULN2003 工作电压高,可以在高负载电流并行运行,还能够在关态时承受50V 的电压,另外其工作电流大,灌电流可达500mA。则鯤愜韋瘓賈晖园栋泷。
ULN2003芯片与单片机之间的接口电路比较简单,只需将ULN2003芯片的4、5、6、7引脚分别与单片机的P2.3、P2.2、P2.1、P2.0口连接,用于单片机与电机驱动之间的数据传输。10、11、12、13引脚分别与步进电机的1、2、3、4借口连接,用于控制步进电机的正反转。9引脚与步进电机的5引脚连接,一同接入电源输入端,8引脚接地线。胀鏝彈奥秘孫戶孪钇賻。
ULN2003的输入端驱动端口为P2.0(A),P2.1(B),P2.2(C),P2.3(D)。控制步进电机正转次序:AB组—BC组—CD组—DA组;反转次序:AB组—AD组—CD组—CB组,一个脉冲正转5.625度。当单片机P2.0口和P2.1口给芯片高电平,P2.2口和P2.3口给低电平时,AB组转动;当P2.1口和P2.3口给高电平,P2.0口和P2.3口给低电平,BC组转动,以此类推。高电平持续的时间越长,占空比越大,电机PMW的转速度就越快,高电平时间越短,占空比越小,电机的PMW的转速度越慢。鳃躋峽祷紉诵帮废掃減。
2.5 超声波测距模块
超声波测距[14,15]环境要求不高,由于穿透力强能够在雨雾天正常工作。所以本次设计的超声波电路中就使用了HC-SR04超声波测距模块。这个模块有4个引脚,1和4引脚分别接5V电源和接地,2脚是触发信号的输入端,3脚是回响信号的输出端2脚和3脚分别接在单片机的P3.4口和P3.5口。超声波测距模块的工作原理是:采用单片机的I/O口触发测距,即当单片机发送一个10us的高电平脉冲给超声波模块的输入端TRIG后,单片机内部定时器清零。当超声波传感器的输出端ECHO为高电平时,单片机内部定时器开始工作;当输出端ECHO变为低电平时,定时器停止工作,读取定时器T0的时间,通过公式算出距离。超声波测距模块电路图如图7所示。稟虛
2.6 蜂鸣器模块
报警电路采用蜂鸣器报警电路,蜂鸣器与家用电气上的喇叭在用法上也有相似的地方,通常工作电流比较大,电路上的TTL点评基本上驱动不了蜂鸣器,需要增加一个电流放大的电路才可以,即此一个管脚很难驱动蜂鸣器发出声音,所以增加了一个三极管来增加通过蜂鸣器的电流。
蜂鸣器的正极性的一端联接到5V电源上面,另一端接到三极管的集电极,三极管的基极由单片机的一个管脚通过一个与门来控制,当管脚为低时,与非门输出高电平,三极管导通,这样蜂鸣器的电流形成回路,发出声音。当管脚为高时,与非门输出低电平,三极管截至,蜂鸣器不发出声音。
蜂鸣器模块电路图如图8所示。沩氣嘮戇
2.7 电源模块
稳压电路的作用是保证电路正常工作。低于稳定电压电路不能正常工作,高于稳定电压可能损坏电路或者电路起保护。稳压电路如图9所示。钡嵐縣緱虜荣产涛團蔺。
电源模块主要用了稳压芯片L7805CV[17],1脚和3脚分别是输入端和输出端,2脚接地。外接电源接通后9V电压从1脚进入,经过稳压后从3脚输出5V电压。L7805CV还特别适合运用在过载的情况下,因为其拥有的内部电流限制和热关断特性。但是简单来说L7805CV是一种固定电压(5V)三端集成稳压器。无需外接元件;内部热过载保护;输出电流可以达到100mA;内部短路电流限制就是L7805CV的四大特点。懨俠劑鈍触乐鹇烬觶騮。
液晶显示器芯片介绍
考虑到要显示的是温度和湿度这两个数据,所以只需要能够显示一到两行的显示器即可。我选择了LCD1602液晶显示器[10]。它是一款工业字符型液晶,可以显示两行数据,每行可以显示十六个符号、字母或者数字,刚好可以满足设计的需要。它体积小巧,功耗较低,显示效果良好,是一款非常实用的液晶显示设备。
LCD 1602有16个引脚,它的引脚介绍如下:
表2-4 LCD1602引脚介绍
引脚号 | 引脚名称 | 引脚功能 |
1 | GND | 电源接地端 |
2 | VCC | 5V电源正极 |
3 | VL | 调节显示器对比度 |
4 | RS | 寄存器选择端 |
5 | RW | 读写信号线 |
6 | E | 使能端口 |
7~14 | D0~D7 | 双向数据端口 |
15 | BL+ | 背光正极 |
16 | BL- | 背光负极 |
LCD1602工作在3.5V~5V的工作电压下,它内部设计有复位电路,可以进行光标移动、清屏的操作。显示的亮度可以通过外部连接的电位计进行调节。内部带有存储器可以储存数据。它可以直接与单片机相连接,通过单片机程序来控制液晶的显示。
LCD 1602有16个引脚,其中RS、RW的值控制单片机对它的读写:
表2-5 LCD工作状态介绍
RS | RW | 操作命令 |
0 | 0 | 写入指令寄存器(清清屏等) |
0 | 1 | 读busy(DB7),以及读取位址计数器 (DB0—DB6) 的值 |
1 | 0 | 写入数据寄存器(显示各字符等) |
1 | 1 | 从数据寄存器读取数据 |
LCD1602液晶显示在执行程序指令之前要进行模块标志位的忙信号,只有当它的忙标志位为低电平时才表示可以执行指令。
3 系统软件实现
3.1 系统程序总体流程图
通电后,系统程序首先会将各个模块进行初始化。为了使得超声波模块能够正常地测距,完全避开声波由于外界各种反射回传的波形,设定了200ms的延时。延时结束后,同时超声波测量模块和红外感应模块也开始工作,如果超声波测量模块检测到垃圾箱的距离小于所设距离10cm,蜂鸣器会进行报警。当红外避障模块感应到有人需要投递垃圾,那么步进电机正转,垃圾如果满了的话蜂鸣器报警提醒
系统程序总体流程图如图10所示。謾饱兗争詣繚鮐癞别瀘。
3.2 超声波测距模块的程序设计
超声波测距模块除了能感应有无物体靠近,还能够在一定范围内还能测出靠近物体和自身的距离。当单片机发送一个10us的高电平脉冲给超声波模块的输入端TRIG后,单片机内部定时器清零。当超声波传感器的输出端ECHO为高电平时,单片机内部定时器开始工作;当输入端ECHO变为低电平时,定时器停止工作,读取定时器T0的时间,通过公式算出距离。超声波测距子程序流程图如图11所示。呙铉們欤谦鸪饺竞荡赚。
void send_wave()
{ c_send = 1; //10us的高电平触发
delay();
c_send = 0;
TH0 = 0; //给定时器0清零
TL0 = 0;
TR0 = 0; //关定时器0定时
flag_hc_value = 0;
while(!c_recive); //当c_recive为零时等待
TR0=1;
while(c_recive) //当c_recive为1计数并等待
{flag_time0 = TH0 * 256 + TL0;
if((flag_hc_value > 1) || (flag_time0 > 65000)) //当超声波超过测量范围时,显示3个888莹谐龌蕲賞组靄绉嚴减。
{TR0 = 0;
flag_csb_juli = 2;
distance = 888;
flag_hc_value = 0;
break ;}
else
{flag_csb_juli = 1;
}}
if(flag_csb_juli == 1)
{ TR0=0; //关定时器0定时
distance = TH0; //读出定时器0的时间
distance = distance * 256 + TL0;
distance +=( flag_hc_value * 65536);//算出超声波测距的时间 得到单位是ms麸肃鹏镟轿騍镣缚縟糶。
distance *= 0.017; // 0.017 = 340M / 2 = 170M = 0.017M 算出来是米納畴鳗吶鄖禎銣腻鰲锬。
if(distance > 350) //距离 = 速度 * 时间
{distance = 888; //如果大于3.8m就超出超声波的量程
}
}
}
3.3 控制电机正反转的程序设计
控制电动机正反转为本次设计自动翻盖的部分。系统开始工作后,判断电机是否需要正转,若需要就依次给AB、BC、CD、DA通电实现正转,正转结束后延时3m电机开始反转,即依次给AB、AD、CD、CB充电。电机驱动子流程图如图12所示。風撵鲔貓铁频钙蓟纠
void delay_uint(uint q)
{
while(q--);}
void bujindj() //步进电机函数
{if(flag_z_f != 0)
{if(flag_z_f == 1) //开
{bjdj_value ++;
if(bjdj_value >= 127)
{flag_z_f = 0;
P2 = P2 & 0xf0; //让4个IO口都不输出
}}
if(flag_z_f == 2) //关
{if(bjdj_value <= 1)
{flag_z_f = 0;
bjdj_value = 1;
P2 = P2 & 0xf0; //让4个IO口都不输出
}
bjdj_value --;
}
for(i=0;i<4;i++) //4相
{if(flag_z_f == 2) //关
P2=zheng[i]; //
else if(flag_z_f == 1)//开
P2=fan[i]; //
delay_uint(700); //改变这个参数可以调整电机转速
}}}
液晶显示程序设计
LCD 1602有16个引脚,其中RS、RW的值控制单片机对它的读写:
表2-5 LCD工作状态介绍
RS | RW | 操作命令 |
0 | 0 | 写入指令寄存器(清清屏等) |
0 | 1 | 读busy(DB7),以及读取位址计数器 (DB0—DB6) 的值 |
1 | 0 | 写入数据寄存器(显示各字符等) |
1 | 1 | 从数据寄存器读取数据 |
LCD1602液晶显示在执行程序指令之前要进行模块标志位的忙信号,只有当它的忙标志位为低电平时才表示可以执行指令。
LCD1602要显示字符时,就要获得该字符的现实的RAM地址。它内部的控制寄存器有11条控制指令,包括清屏,光标移位等指令。
其显示程序流程图如下:
结 论
经过努力查阅大量单片机、电机控制、太阳能利用、红外传感器、超声波、激光应用、无线通信等方面资料和参考文献。通过多次实验实践,将智能垃圾箱各个模块调试完善,分析传统垃圾箱和现有智能垃圾箱的发展,结合当今科技跨越式发展,微型计算机技术、各种传感技术在日常生活生产中的广泛应用,为了迎合社会全面智能化,信息化趋势,学习、研究出了可移动智能垃圾箱。灭嗳骇諗鋅猎輛觏馊藹。
通过将各种传感器、显示器和蜂鸣器等功能应用在垃圾箱上,并让垃圾箱拥有了可移动性,打破了人们对传统垃圾箱的理解,使人们在生活中随处可见的垃圾箱变得更加人性化。将太阳能电池板装在垃圾箱上并用太阳能跟随器,可以及时检测到太阳光照最强的方向,让太阳能利用率达到最高。创新的将吸尘器功能与垃圾箱相结合,节省了大量的人力、物力资源。另一方面,垃圾箱上的显示和蜂鸣器提示可以增添人们对垃圾箱和扔垃圾的兴趣,提高人民对环境保护意识,增强生态危机感,为人类高效、可持续稳定发展做出一定贡献。铹鸝饷飾镡閌赀诨癱骝。
参 考 文 献
[1] 侍倩,柳丽霞.生活垃圾卫生填埋场产气规律及污染[J]. 环境科学与技术,2005, 28(1):24-27.趕輾雏纨颗锊讨跃满賺。
[2] 杜子秀,叶文法,朱传芳.推广使用分类垃圾箱充分利用“城市矿藏”资源[J]. 环境保护科学,2002, 28(6):27-29.夹覡闾辁駁档驀迁锬減。
[3] 王邦超,姜勇,董铁有,苗娟.多功能环保垃圾桶设计简析[J]. 环境卫生工程,2008,16卷第5期:63.视絀镘鸸鲚鐘脑钧欖粝。
[4] 张益.我国生活垃圾处理技术的现状和展望.环境卫生工程,2000,8(2):81~84.
[5] 姚颖悟.我国城市里处理现状与分析[J]. 环境保护科学,2004,30卷:38
[6] 汤俊良.智能垃圾箱[J]. 科学启蒙, 2005 (6):14.
[7] 庄晓桓.模拟电子技术,北京:机械工业出版社,2002.
[8] 陈荣风.超声波消毒研究进展[J]. 上海预防医学杂志,1999,11(11):492-495.偽澀锟攢鴛擋緬铹鈞錠。
[9] 刘丽艳,张喜梅. 超声波杀菌技术在食品中的应用[J]. 食品科学,2006,27(12):778-780.緦徑铫膾龋轿级镗挢廟。
[10] 康华光. 电子技术基础[M]. 高等教育出版社,1987(6)
[11] 栾桂东,张金铎,王仁乾.压电换能器和换能器阵[M]. 修订版;北京大学出版社2005(9)
[12] 何厚波,熊杨,周敬超. 生活垃圾填埋场渗滤液的特点及处理技术[J]. 环境卫生工程,2002,10(4):159-163騅憑钶銘侥张礫阵轸蔼。
[13] 卢平,曾丽璇,张秋云,等. 高浓度氨氮垃圾渗滤液处理方法研究[J]. 中国给水排水,2003,19(5):44-45.疠骐錾农剎貯狱颢幗騮。
[14] 高廷耀, 顾国维. 水污染控制工程下册(第二版),高等教育出版社,1999.
[15] 谢崇禹. 活性炭徐吸附在环保中的应用[J]. 煤化工,2006,10(126):31-35
[16] 李惠民,邓兵杰,李晨曦.几种活性炭再生方法的特点[J ] .化工技术与开发,2006,11,(35) : 21-25镞锊过润启婭澗骆讕瀘。
[17] 谢洪.用单片机控制红外编码探测障碍物[J]. 《单片机与嵌入式系统应用》2007,(8):45-46.榿贰轲誊壟该槛鲻垲赛。
[18] 李光飞. 《传感器技术与应用》.北京航空航天大学出版社,2006.
[19] 张庆双. 《报警器警示器应用电路集萃》.机械工业出版社,2006(5).
[20] 王刚,林火养,石玲.温室大棚太阳能供电系统设计[J].农机化学研究,2006(8)109-111邁茑赚陉宾呗擷鹪讼凑。
[21] 吴建.DC-DC稳压电路的设计应用[J].电子元器件应用,2005(7)
[22] 丁玉兰.人机工程学[M].北京理工大学出版社,2005.
[23] 温诗铸.摩擦学原理[M].北京:清华大学出版社,1990,7-9,50-52.
[24] 沈权,吴鹿鸣,李娜,等.非稳态滑动轴承的研究.第四届全国摩擦学术会议论文集[C].北京:清华大学出版社,1987,35-38.嵝硖贪塒廩袞悯倉華糲。
[25] 陶建人.动接触减振法及其应用[D].大连:大连理工大学,1988.
[26] 刘长生.手提二冲程汽油机镀双金属气缸的研究[J].林业科学.2001,vol 37(4):89.该栎谖碼戆沖巋鳧薩锭。
[27] Singh,H.and Bhat,P. N. Genetic studies on serum
代码
#include <reg52.h> //调用单片机头文件
#include <intrins.h>
#include "lcd1602.h"
#include "StepMotor.h"
#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
#define uint unsigned int //无符号整型 宏定义 变量范围0~65535
//按键引脚定义
sbit KEY1 = P1^0;
sbit KEY2 = P1^1;
sbit LED1 = P1^2;//自动模式指示灯
sbit LED2 = P1^3;//垃圾满了指示灯
sbit HW = P1^5;//红外探头
sbit BEEP = P3^5;//蜂鸣器
sbit TRIG = P3^6; //超声波发射
sbit ECHO = P3^7; //超声波接收
float distance; //距离
bit mode = 0;//0位自动模式。1为手动模式
bit openFlag = 0;//电机开启标志
bit shuaxin = 0;//刷新标志
bit guanbi = 0;
uchar miao = 3;//等待时间3秒
uint djcount=0;
//容量条显示数组
uchar code lcdTable1[]={0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F};
uchar code lcdTable2[]={0x10,0x18,0x1F,0x1F,0x1F,0x1F,0x18,0x10};
uchar code lcdTable3[]={0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x1F};
/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
float Get_S(void)
{
long i = 0;
float S; //距离变量
TRIG=1; //触发信号是高电平脉冲,宽度大于10us
DelayUs2x(10);
TRIG=0;
while(!ECHO && i < 300000) i++; //等待高电平
TR0=1;
i = 0;
while(ECHO&& i < 300000) i++; //等待低电平
TR0=0;
S=TH0*256+TL0;//取出定时器值高8位和低8位合并
S=S/58; //为什么除以58等于厘米, Y米=(X秒*344)/2
// X秒=( 2*Y米)/344 -> X秒=0.0058*Y米 -> 厘米=微秒/58
TH0=0;
TL0=0; //清除定时器0寄存器中的值
return S;
}
/*********************定时器0、定时器1初始化******************/
void time_init()
{
TMOD |= 0X11; //定时器0、定时器1工作方式1
TH0=0;
TL0=0;
TH1=0x4c;
TL1=0x00;
ET0 = 1; //开定时器0中断
ET1 = 1;
TR1 = 1;//开启定时
EA = 1; //开总中断
}
void keyscan()
{
if(KEY1 == 0)//切换键按下
{
delay_ms(10);
if(KEY1 == 0)
{
while(!KEY1);
BEEP = 0;
delay_ms(100);
BEEP = 1;
mode = !mode;
if(mode==0){lcd_write_str(3, 1, " Auto ");LED1=0;}
else {lcd_write_str(3, 1, " Manual");LED1=1;}
}
}
if(mode == 1)
{
if(KEY2 == 0)//手动开关键按下
{
delay_ms(10);
if(KEY2 == 0)
{
while(!KEY2);
BEEP = 0;
delay_ms(100);
BEEP = 1;
openFlag = !openFlag;
}
}
}
}
void displayCapacity(uint temp)//显示容器的状态
{
if(temp < 8)//显示5格
{
Lcd_Custom_Char(0,7,0,lcdTable1);
Lcd_Custom_Char(0,8,1,lcdTable1);
Lcd_Custom_Char(0,9,2,lcdTable1);
Lcd_Custom_Char(0,10,3,lcdTable1);
Lcd_Custom_Char(0,11,4,lcdTable1);
LED2 = 0;
BEEP = 0;
}
else if(temp >= 8 && temp <16)//显示4格
{
Lcd_Custom_Char(0,7,0,lcdTable1);
Lcd_Custom_Char(0,8,1,lcdTable1);
Lcd_Custom_Char(0,9,2,lcdTable1);
Lcd_Custom_Char(0,10,3,lcdTable1);
Lcd_Custom_Char(0,11,4,lcdTable3);
LED2 = 0;
BEEP = 1;
}
else if(temp >= 16 && temp <24)//显示3格
{
Lcd_Custom_Char(0,7,0,lcdTable1);
Lcd_Custom_Char(0,8,1,lcdTable1);
Lcd_Custom_Char(0,9,2,lcdTable1);
Lcd_Custom_Char(0,10,3,lcdTable3);
Lcd_Custom_Char(0,11,4,lcdTable3);
LED2 = 1;
BEEP = 1;
}
else if(temp >= 24 && temp <32)//显示2格
{
Lcd_Custom_Char(0,7,0,lcdTable1);
Lcd_Custom_Char(0,8,1,lcdTable1);
Lcd_Custom_Char(0,9,2,lcdTable3);
Lcd_Custom_Char(0,10,3,lcdTable3);
Lcd_Custom_Char(0,11,4,lcdTable3);
LED2 = 1;
BEEP = 1;
}
else if(temp >= 32)//显示1格
{
Lcd_Custom_Char(0,7,0,lcdTable1);
Lcd_Custom_Char(0,8,1,lcdTable3);
Lcd_Custom_Char(0,9,2,lcdTable3);
Lcd_Custom_Char(0,10,3,lcdTable3);
Lcd_Custom_Char(0,11,4,lcdTable3);
LED2 = 1;
BEEP = 1;
}
}
void motoRotate(bit flag)//电机处理
{
if(flag == 1)//开启
{
if(djcount++ < 80)
{
MotorCW();
}
else
{
djcount = 80;
MotorStop();
}
}
else//关闭
{
if(djcount > 0)
{
djcount--;
MotorCCW();
}
else
{
MotorStop();
}
}
}
void main()
{
float temp; //距离变量
time_init();//定时器初始化
lcd_init();//1602初始化
LED1 = 0;//自动模式
lcd_write_str(0, 0, "STATE: ");
lcd_write_str(0, 1, "MS: Auto CLOSE");
Lcd_Custom_Char(0,12,5,lcdTable2); //显示特殊图形
while(1)
{
keyscan();//按键扫描
if(mode == 0)//在自动模式下
{
if(HW == 0)//检测到有人
{
openFlag = 1;//开启电机
miao = 3;//等待时间赋值3秒
}
else
{
if(openFlag==1 && djcount==80)//开启等待
{
guanbi = 1;
}
}
}
if(openFlag==1)lcd_write_str(11, 1, " OPEN");
else lcd_write_str(11, 1, "CLOSE");
motoRotate(openFlag);//电机处理
if(shuaxin == 1)//大约100ms读取一下数据
{
shuaxin = 0;
temp = Get_S();//获取距离
distance = temp > 400? 400 : temp;
displayCapacity(((uint)(distance)));//容量条根据距离显示
}
}
}
void zd0() interrupt 1 using 0 //T0中断用来计数器溢出,超过测距范围
{
ECHO = 0; //中断溢出标志
}
void zd1() interrupt 3
{
static uchar cnt=0,cnt1=0;
TH1=0x4c;
TL1=0x00;
if(cnt++ >= 1)//100ms
{
cnt = 0;
shuaxin = 1;
}
if(cnt1++ >= 20)//1s
{
cnt1 = 0;
if(guanbi == 1)
{
if(miao > 0)
{
miao --;
}
else
{
openFlag = 0;//3秒时间到了,关闭电机
guanbi = 0;
}
}
}
}