基于52单片机的简易感应开关垃圾桶
一、基于52单片机的简易开关垃圾桶,感应,震动,按键开盖
1.使用超声波模块,设置10cm感应范围,进入范围开盖
2.使用震动传感器,检测到震动开盖
3.使用蜂鸣器,开盖同时伴随滴滴声
4.实验视频-CSDN直播
#include "reg52.h"
#include "intrins.h"sbit D5 = P3^7;
sbit D6 = P3^6;
sbit SW1 = P2^1;
sbit Trig = P1^5;
sbit Echo = P1^6;
sbit sg90_con = P1^1;
sbit vibrate = P3^2;
sbit beep = P2^0;int jd; //舵机角度
int jd_bak;
int cnt = 0;
int mark_Vibrate = 0;void Delay100ms() //@11.0592MHz
{unsigned char i, j;i = 180;j = 73;do{while (--j);} while (--i);
}void Delay2000ms() //@11.0592MHz
{unsigned char i, j, k;_nop_();i = 15;j = 2;k = 235;do{do{while (--k);} while (--j);} while (--i);
}
void Delay10us() //@11.0592MHz
{unsigned char i;i = 2;while (--i);
}void Timer0Init() //定时器0 打开中断
{TMOD &= 0xF0; //设置定时器模式TMOD |= 0x01; //设置定时器模式TL0 = 0x33; //设置定时初始值TH0 = 0xFE; //设置定时初始值TF0 = 0; //清除TF0标志TR0 = 1; //定时器0开始计时ET0 = 1;//打开定时器0中断EA = 1;//打开总中断EA
}
void Time1Init() //定时器1
{ TMOD &= 0x0F; //设置定时器模式TMOD |= 0x10;TH1 = 0;TL1 = 0;//设置定时器0工作模式1,初始值设定0开始数数,不着急启动定时器
}void startHC() //启动超声波模块
{Trig = 0;Trig = 1;Delay10us();Trig = 0;
}
void initSG90_0() //初始化舵机
{jd = 1;cnt = 0;sg90_con = 1;
}
double get_distance() //获取距离,利用定时器获取时间再计算距离
{double time;TH1 = 0;TL1 = 0;startHC();while(Echo == 0);TR1 = 1;while(Echo == 1);TR1 = 0;time = (TH1 * 256 + TL1)*1.085;//us为单位return (time * 0.017);
}void openStatusLight() //开灯
{D5 = 0;D6 = 1;
}
void closeStatusLight() //关灯
{D5 = 1;D6 = 0;
}void openDustbin() //打开垃圾箱
{jd = 3;if(jd_bak != jd){cnt = 0;beep = 0;Delay100ms();Delay100ms();beep = 1;Delay2000ms();}jd_bak = jd;
}
void closeDustbin() //关闭垃圾箱
{jd = 1;jd_bak = jd;cnt = 0;Delay100ms();
}
void EX0_Init() //打开外部中断0,低电平触发
{EX0 = 1;IT0 = 0;
}
void main()
{double dis;Timer0Init();Time1Init();initSG90_0();EX0_Init();while(1){//超声波测距dis = get_distance();if(dis < 10 || SW1 == 0 || mark_Vibrate == 1){ //距离or按键or震动开盖openStatusLight();openDustbin();mark_Vibrate = 0;}else{closeStatusLight();closeDustbin();}}
}
void Int0_Routine() interrupt 0 //震动中断
{mark_Vibrate = 1;
}
void Timer0_Rountine() interrupt 1 //定时器0的中断
{cnt++;//统计爆表次数TL0 = 0x33; //设置定时初始值TH0 = 0xFE; //设置定时初始值if(cnt < jd){ sg90_con = 1;}else{sg90_con = 0;}if(cnt == 40){//爆表40次,经过了20mscnt = 0;//当40次经过了20ms,重新让cnt从0开始,计算下一次的sg90_con = 1;}}
感谢老陈!
基于52单片机的简易感应开关垃圾桶相关推荐
- 51单片机开发实例 基于52单片机的简易温度采集系统
一.系统设计 通过DS18B20温度采集模块进行环境温度数据的采集,并在数码管上对实时温度进行显示. 二.硬件设计 三.软件设计 四.实物展示 五.资料内容 六.资料链接 资料链接:https://p ...
- 基于51单片机的简易减法器设计制作
基于C51单片机的简易减法器设计制作 51单片机可实现很多功能,今天笔者介绍一种使用C51编写程序,通过4*4矩阵键盘和8位共阴数码管实现的简易减法器.矩阵键盘以及数码管的原理图如下: (1)4*4矩 ...
- 基于51单片机的简易游戏机
基于51单片机的简易游戏机 目录 基于51单片机的简易游戏机 一.绪论 二.设计方案 三.系统原理框图及模块的作用 四.硬件设计及说明 五.实际的程序流程图,写清楚程序模块的功能 六.系统使用说明 七 ...
- 【C51】基于51单片机的简易频率计(附代码、无需外设、小白简单易上手)
基于51单片机的简易频率计(无需外设.小白简单易上手) 代码较为简单,大概思路是通过定时器单位时间内外部中断上升沿触发的次数来计算实际频率. /基于51单片机的简易频率计#include<r ...
- 基于51单片机的简易mp3的制作
基于51单片机的简易mp3制作原理 1. 项目要求 基于AT89C51系列单片机的音乐播放器,采用AT89C51作为主控芯片,采用12864LCD作为液晶显示屏,通过按键实现播放器对应按键功能. 2 ...
- c语言51单片机计算器,新基于51单片机的简易计算器
<新基于51单片机的简易计算器>由会员分享,可在线阅读,更多相关<新基于51单片机的简易计算器(24页珍藏版)>请在人人文库网上搜索. 1.基于51单片机的简易计算器1.前言: ...
- 基于51单片机的简易抢答器设计
基于51单片机的简易抢答器 具体功能: 1.主持人按下抢答开始按键,抢答者才可以开始抢答,数码管抢答倒计时20S. 2.抢答者按下按键,数码管显示抢答者的编号. 3.可以通过按键修改倒计时时间. 部分 ...
- 基于51单片机的简易6位密码锁(数码管 led 矩阵)
本文章是基于51单片机的简易密码锁,无掉电保护,所以没有用到I^C总线协议,仅用到数码管显示,矩阵键盘扫描,led显示. 本例程主要实现功能为:定义一个六位数的初始密码,用矩阵输入,输入正确后led被 ...
- 基于51单片机的简易太阳能追踪系统
基于51单片机的简易太阳能追踪系统Proteus仿真如图所示. 系统主控核心为AT89C51单片机: 动作执行部分为两个0-360度舵机: 4个电位器模拟光敏电阻检测阵列: 模拟电压采集部分使用74H ...
最新文章
- linux+输出分页,是否可以在zsh中自动分页输出?
- log file sync(日志文件同步) 与 Log file parallel write 等待事件
- 血栓清道夫机器人_血栓“清道夫”找到了!洋葱排最后,排在第一很多人并不知道...
- 蓝桥杯第七届决赛JAVA真题----路径之谜
- Linux实战 | Centos6.8安装matlab的mount挂载问题的解决方法_3
- vs已停止工作的解决方案
- Spring Boot RestTemplate 忽略证书访问https
- 我就是这样学 Python 的
- Laravel自定义错误提示语语言包
- 中继器、集线器;网桥、交换机;路由器及网关之间的区别
- OpenGL2与ImGui整合入门教程
- cad导入新的线型、填充图案、字体压缩包
- 大数据在医疗行业中的5种应用
- python修改pdf文件名称_使用Python重命名pdf文件目录几乎可以工作
- 交换机和路由器技术-18-热备份路由选择协议HSRP
- 那些为用户保驾护航的产品
- MAC-将视频转成GIF
- 程序员的简历应该这么写!!
- 【LeetCode】三道简单的排序题 242、217、169
- 2022年的春节假期,消费者们都在如何“花钱”