赞
踩
通过51单片机控制垃圾桶,实现三种不同的开盖方式
1、通过超声波检测距离,当人体靠近垃圾桶时自动开盖,并且随着开盖声音和开盖指示灯亮起,远离自动关盖,关盖指示灯亮起。
2、用震动传感器检测垃圾桶附近是否发生震动,发生震动时自动开盖。
3、通过单片机上按键对垃圾桶进行控制,当按键被按下实现开盖。
1.超声波模块:通过用51单片机的定时器1进行处理。
2.舵机模块:通过用51单片机的定时器0中断进行处理。
3.震动模块:通过用51单片机的外部中断0低电平触发控制。
1.超声波部分代码
- double get_distance()
- {
- double time;
- TH1 = 0; //重新给初值,方便下次超声波测距
- TL1 = 0;
- //1.给Trig引脚至少10us的高电平
- startHC();
- //2.当接受到高电平的那一下 开始计时
- while(Echo == 0);
- TR1= 1;
- //3.当高电平转低电平那一刻 结束计时
- while(Echo == 1);
- TR1= 0;
- //4.计算时间
- time = (TH1 * 256 + TL1)*1.085;//把定时器高低八位整合在一起计算时间
- return (time * 0.017); //5.函数返回距离
- }
2.舵机部分代码
- void initSg90_0() //舵机初始位置函数
- {
- jd=4;
- cnt=0;
- sg90_con=1;
- }
- void openDusbin() //开盖函数
- {
- char n;
- //舵机开盖
- jd=2;
- cnt=0;
- jd_bak=jd;
- BEEP=0;
- for(n=0;n<2;n++)
- Delay150ms();
- BEEP=1;
- Delay2000ms();
- }
-
- void closeDusbin() //关盖函数
- {
- //舵机关盖
- jd=4;
- if(jd_bak !=jd){ //消除垃圾桶一直抖动bug
- cnt=0;//角度变了cnt重新开始算
- Delay150ms();
- }
- jd_bak=jd;
- }
- void Time0Handler() interrupt 1
- {
- cnt++;
- TL0=0x33;
- TH0=0xFE;//重新赋初值
- if(cnt<jd){
- sg90_con=1;//模拟pwm脉冲
- }else{
- sg90_con=0;
- }
- if(cnt==40){//爆表40次,20ms
- cnt=0;
- sg90_con=1;
- }
- }
3.主函数代码
- void main()
- {
- double dis;
- Time1Init();//定时器1初始化
- Time0_init();//定时器0初始化
- EX0_init();//外部中断0初始化
- initSg90_0();//舵机的初始位置,关盖状态
- while(1){
- //超声波测距
- dis=get_distance();
- if(dis < 10||SW1==0||mark_vibrate==1){
- //D5亮
- openStatusLight();//开盖指示灯
- //舵机关盖
- openDusbin();//舵机开盖
- mark_vibrate=0;//震动传感器标志位
- }else{
- //D6亮
- closeStatusLight(); //关盖指示灯
- //舵机开盖
- closeDusbin();//舵机开盖
- }
- Delay150ms();
- }
- }
详细项目视频
见主页 基于51单片机的智能垃圾桶视频!!!!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。