为什么要引入定时器呢?
因为定时到报表的时候,可以由硬件执行那部分程序,软件部分仍然单独运行。
一、智能垃圾桶需求分析:
当距离小于等于10时,垃圾桶开盖持续两秒钟,否则垃圾桶关闭盖子
当检测到震动时,垃圾桶开盖持续两秒钟,否则垃圾桶关闭盖子
当按下按键时,垃圾桶开盖


二、智能垃圾桶工作原理。

主要是通过超声波测距与舵机转动相结合来实现主功能。超声波采用定时器1进行定时,实现无难度;舵机转动我们要通过定时器0来实现中断,从而确定最小定时单位0.5ms,这里我们确定一个标志位,jd,从而来决定是否让舵机进行转动,例如,提前声明jd=3,当定时器开始计数时,跑到这里jd=3,定时器0不断进行中断操作,从而确定是否进行转动(这里定义PWM波时一定要一个周期循环定义)。当震动传感器震动时,cpu先对舵机进行的延时,从而不对震动传感器的响应进行操作,这里需要我们把这个震动传感器定义到中端口P3^2,打开外部中断EX,并且把ET0设置为低电平触发,当震动传感器震动时,cpu(即晶振,单片机的心脏)停止对舵机进行计时,优先处理震动。

#include "reg52.h"sbit LED1 = P3^7;//根据原理图(电路图),设备变量led1指向P3组IO口的第7口
sbit LED2 = P3^6;//根据原理图(电路图),设备变量led2指向P3组IO口的第6口
sbit Trig = P1^5;
sbit Echo = P1^6;
sbit SG90 = P1^4;
sbit Virbate = P3^2;//3.2口是外部中断口,当有电压来临时,中断其他服务程序,执行此程序。
sfr AUXR=0x8E;int cnt=0;
int jd;
int mark_vibrate=0;
double dis;
double time;
void Timer0Init(void)       //500微秒@11.0592MHz
{AUXR &= 0x7F;     //定时器时钟12T模式TMOD &= 0xF0;      //设置定时器模式TMOD |= 0x01;     //设置定时器模式TL0 = 0x33;       //设置定时初值TH0 = 0xFE;        //设置定时初值TF0 = 0;       //清除TF0标志TR0 = 1;      //定时器0开始计时EA = 1;//打开总中断ET0 = 1;//打开定 时器0的中断
}//计时器0管舵机,主要记录0.5ms时间void Timer1Init(void)      //71.111毫秒@11.0592MHz
{AUXR &= 0xBF;     //定时器时钟12T模式TMOD &= 0x0F;      //设置定时器模式TMOD |= 0x10;     //设置定时器模式TL1 = 0x00;       //设置定时初值TH1 = 0x00;        //设置定时初值
}//计时器1管超声波收发时间void Delay10us()     //@11.0592MHz
{unsigned char i;i = 2;while (--i);
}void Delay200ms()      //@11.0592MHz
{unsigned char i, j, k;i = 2;j = 103;k = 147;do{do{while (--k);} while (--j);} while (--i);
}void Delay600ms()      //@11.0592MHz
{unsigned char i, j, k;i = 5;j = 52;k = 195;do{do{while (--k);} while (--j);} while (--i);
}void Trigbegin()//超声波开始发送波
{Trig = 0;Trig = 1;Delay10us();Trig = 0;
}
void OpenLight()//开盖灯
{LED1 = 0;LED2 = 1;
}
void CloseLight()//关盖灯
{LED1 = 1;LED2 = 0;
}
void SG90Init()//舵机初始化
{cnt = 0;//开盖关盖从0计时jd = 1;//初始化舵机为关盖状态SG90=1;
}
void SG90_0()//舵机中断关盖
{jd = 1;cnt = 0;Delay200ms();
}
void SG90_90()//舵机中断开盖
{jd = 3;if(jd_back!=jd)//下次进来如果还和标志位相等,就不用延时,直接90°{cnt = 0;Delay600ms();//在这600ms里PWM波不断地让舵机重复90°,所以舵机臂不下降}jd_back=jd;//把标志位赋值给他,下次若手未动,则不延时,舵机直接90°不动。
}double getdis()
{Trigbegin();while(Echo == 0);TR1=1;//开始计时while(Echo == 1);TR1=0;//停止计时time=(TH1*256+TL1)*1.085/1000000;//以S为单位计时TH1=0x00;TL1=0x00;Delay200ms();return (time*17000);
}
void ExInit()外部中断P3^2初始化
{EX0 = 1;//打开外部中断IT0 =0;//低电平触发中断
}
void main()
{Timer0Init();//舵机开始计时,中断时跳到定时器0中断函数处Timer1Init();ExInit();SG90Init();while(1){dis=getdis();//从获取距离这一刻开始计时if(dis<=10||mark_vibrate == 1){OpenLight();SG90_90();mark_vibrate = 0;}else{CloseLight();SG90_0();}}
}
void Timer0() interrupt 1//定时器0中断,由硬件调用,软件部分继续执行
{cnt++;TL0 = 0x33;       TH0 = 0xFE;    if(cnt < jd){SG90 = 1;} else{SG90 = 0;}if(cnt == 40){cnt = 0;SG90=1;//又开始进入下一个周期,从头开始TL0 = 0x33;      TH0 = 0xFE;}
}
void Ex0_Handler() interrupt 0//外部中断
{                                   //中断cpu计数,小技巧mark_vibrate = 1;
}

基于51单片机来开发的智能感应开盖垃圾桶相关推荐

  1. 基于Wemos的智能感应开盖垃圾桶——日记

    参考:基于Wemos的智能感应开盖垃圾桶--日记 作者:9art0 发布时间:2020-09-24 00:40:59 网址:https://blog.csdn.net/GatoWong/article ...

  2. 基于Wemos的智能感应开盖垃圾桶

    基于Wemos的智能感应开盖垃圾桶 前言 硬件部分 软件部分 一.舵机控制 二.超声波控制 三.项目整体代码 思考 前言 记录嵌入式学习的第一个小项目吧,基于Wemos的智能感应开盖垃圾桶(上官可编程 ...

  3. 基于 wemos d1 智能感应开盖垃圾桶

    基于WEMOS d1的智能感应开盖垃圾桶 1.需要用的软件: arduino 垃圾桶视频: 智能感应开盖垃圾桶 2.硬件清单 1.Wemos d1 板子 2.超声波模块 3.SG90 舵机 4.垃圾桶 ...

  4. 基于Wemos D1的智能感应开盖垃圾桶

    硬件:这个项目我们主要用到的东西有环保型垃圾桶,Wemos D1模块,舵机,超声波模块,串口助手,若干条杜邦线等等. 环境:arduino 思路:首先这个项目又超声波,wemos d1模块,舵机SG9 ...

  5. 基于51单片机的RFID RC522智能钱包

    RFID RC522智能钱包 基于51单片机的RFID RC522智能钱包,这个程序主要演示的是RFID RC522智能钱包中的设置及扣款功能,相信会扣款那么充值也就改一个数字的事,具体的功能要自己根 ...

  6. 【51毕设案例】基于51单片机-定时喂食供氧智能鱼缸

    目录 功能介绍: 整体功能简述: 硬件框图: 软件流程图: 原理图: 仿真图: 元器件清单: 主要部分代码展示:void main() 工程管理展示: 下载内容展示: 更详细代码视频讲解及代码下载请看 ...

  7. 基于51单片机与ESP8266的智能台灯设计

    一.硬件设计 1. 硬件选型 主控芯片:选用STC89C52RC,单片机通过串口与EPS866模块通信. LDO: 选用AMS1117-3.3V,ESP8266模块需要使用3.3V电源,使用1117- ...

  8. 基于51单片机的公交车安全智能检测系统、基于51单片机的金属探测仪控制设计、基于单片机的智能电子密码锁系统设计、基于51单片机酒精浓度检测仪设计【资料转发分享】

    630基于51单片机的公交车安全智能检测系统-设计资料 本资料是基于单片机的公交车安全监测系统 具有如下功能: 1.监测环境的温度,超标报警.可以设置上下限 2.监测是否有火灾以及有毒气体,超标报警, ...

  9. 51单片机之感应开盖垃圾桶

    目录 定时器 晶振 时钟周期 机械周期 每经过一个机械周期经过多长时间 定时器和计数器的区别 定时器相关寄存器 定时10ms,相关寄存器的配置 单片机中断 什么是中断 中断源 中断优先级 中断函数 中 ...

最新文章

  1. Nature新研究:猪脑死亡4小时后,科学家成功恢复脑细胞功能
  2. CPQuery, 解决拼接SQL的新方法
  3. mysql6.0.7_MySQL Workbench v6.0.7 正式版
  4. update语句的返回值是什么
  5. 世界java大神有哪些_JAVA基础复习1:开始Java世界的第一个程序
  6. 01_ExtJS_HelloWorld
  7. markdown如何修改为 微软雅黑 字体
  8. 机器学习算法基础3-sklearn数据集与估计器
  9. Python 程序 可以一直输入 quit_Python二级考试临时抱佛脚专用笔记——(二)基本控制结构的程序设计amp;数据的输入和输出...
  10. PPT:华为数字化转型实践分享(附下载)
  11. 进程调度算法-先来先服务、最短作业优先调度算法和高响应比优先调度算法
  12. 火狐浏览器不弹出窗口_Firefox选项卡的Vista样式弹出窗口预览
  13. weka进行十折交叉验证
  14. 机械制图计算机类实验报告,机械cad实验报告总结
  15. Python—基础知识之总结(6)
  16. pdf转换成jpg python_Python 将pdf转成图片
  17. TTF、TOF、WOFF 和 WOFF2 的相关概念
  18. oracle现金流量表逻辑,财务学习:现金流量表内在逻辑研究
  19. csp 4-2 卖菜 (300 分)
  20. bw项目抱佛脚入门资料-2.按照指标创建BW数据存储对象

热门文章

  1. 在 Docker 中设置时区
  2. Hdu5128 - The E-pang Palac
  3. Linux下开MC服务器
  4. 使用Arthas热更新时,lombok注解导致mc命令编译失败
  5. 100元钱买100只鸡
  6. 12. SSL和TLS有关知识
  7. 正则表达式验证包含0的正正整数
  8. unity3d,跟着大佬做自己的第一个游戏(第一步,游戏模型制作)
  9. FPGA产生相位编码基带信号
  10. 对话MVP | 柳贵:在FISCO BCOS,我体会到了开源社区的精神