C51---智能感应垃圾桶

news2024/11/16 17:28:55

1.器件:C51、蜂鸣器、SG90舵机、HC-SR04超声波测距

2.实现功能:超声波感应,舵机转动打开垃圾桶,蜂鸣器发出提示,LED灯亮

3.代码:

#include "reg52.h"
#include "intrins.h"

//距离小于10cm,D5亮,D6灭,反之相反现象
sbit D5        = P3^7;//根据原理图(电路图),设备变量led1指向P3组IO口的第七口
sbit D6        = P3^6;//根据原理图(电路图),设备变量led2指向P3组IO口的第六口
sbit Trig      = P1^5;
sbit Echo      = P1^6;
sbit sg90_con  = P1^1;    //定义sg90的管脚
sbit beep             = P2^0;    

int  jiaodu;                    //定义一个舵机转动的角度
int  cnt = 0;                    //cnt要定为全局变量

void Delay150ms()        //@11.0592MHz
{
    unsigned char i, j, k;

    _nop_();
    i = 2;
    j = 13;
    k = 237;
    do
    {
        do
        {
            while (--k);
        } 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);
}

//定时器 0 初始化
void Time0Init()
{
//1.配置定时器0工作模式位16位计时
    TMOD &= 0xF0;        //设置定时器模式
    TMOD |= 0x01;        //设置定时器模式
//2.给初值,定一个10ms出来
    TL0 = 0x33;        //设置定时初值
    TH0 = 0xFE;        //设置定时初值
//3.开始计时
    TR0 = 1;
    TF0 = 0;
//4.打开定时器中断
    ET0 = 1; 
//5.打开总中断EA
    EA = 1;
}

//定时器1初始化
void Time1Init()
{
    TMOD &= 0x0F;        //设置定时器模式
    TMOD |= 0x10;        //设置定时器模式
    TH0 = 0;
    TL0 = 0;
    //设置定时器0工作模式,初始值设定0开始数数,不着急启动定时器 
}


void startHC()
{
    Trig = 0;
    Trig = 1;
    Delay10us();
    Trig = 0;
    
}
 
double get_distance()
{
    double time;
    //定时器数据要清零,以便下一次测距
        TH1 = 0;
        TL1 = 0;
    //1.Trig,给Trig端口至少10us的高电平
    startHC();
    //2.由低电平跳转到高电平,表示开始发送波; 波发出去那一下,开始启动定时器
    while(Echo == 0);
    TR1 = 1;                     
    //3.由高电平跳转回低电平,表示波回来了波回来那一下我们开始停止定时器
    while(Echo == 1);
    TR1 = 0;     
    //4.计算出中间经过多少时间
    time = (TH1 * 256 + TL1)*1.085;//us为单位
    //5.距离 = 速度(340m/s)*时间/2        dis = 340m/s == 3400cm/s == 34cm/ms == 0.034cm/us
    return (time * 0.017);

}
//封装开灯状态
void openStatusLight()
{
            D5 = 0;    
          D6 = 1;
}
//封装关灯状态
void closeStatusLight()
{
            D5 = 1;
          D6 = 0;
}

void initSG90_jiaodu()
{
    jiaodu = 4;//初始化角度0度,0.5ms,高电平
    cnt   = 0;
    sg90_con = 1;//一开始从高电平开始
}

void openDusbin()
{
            char n;
            //舵机开盖
                jiaodu = 3;    //90度,1.5ms高电平
                   cnt = 0;
                  beep = 0;
        for(n=0;n<2;n++)
            Delay150ms();
                    beep = 1; 
          Delay2000ms();
}

void closeDusbin()
{
                //舵机关盖
                jiaodu = 1;    //0度,1.5ms高电平
                     cnt = 0;
            Delay150ms();
}

void main()
{
    
    double  dis;    
    Time0Init();    
    Time1Init();
    
    //舵机回到初始位置
    initSG90_jiaodu();
    
    while(1){
        //超声波测距
     dis = get_distance();
     if(dis <10){
                //开盖,D5亮 
                openStatusLight();//调用开灯状态
                openDusbin();            //舵机开盖
        }else {
                //关盖,D5灭
                closeStatusLight();//调用关灯状态
                closeDusbin();         //舵机关盖
        } 
    }
}

//封装一个中断函数
void Time0Handler() interrupt 1 
{
        cnt++;//统计爆表次数,cnt等于1的时候,爆表了一次
        //重新给初值
        TL0 = 0x33;        
        TH0 = 0xFE;    
        sg90_con = 1;
    
    //控制PWM波
        if(cnt < jiaodu){  //cnt 决定舵机转动的角度
                    sg90_con = 1;
        }else{
                    sg90_con = 0;
            }
    
        if(cnt == 40){//cnt爆表了40次,经过了20ms
            cnt = 0;//当经过了1s,重新让cnt从0开始,计算下一次的1s.
                    sg90_con = 1;
    }
}

4.效果图

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/399254.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于进程与进程调度

目录什么是进程进程管理进程的结构体(PCB)里的属性并行与并发什么是进程 一个运行起来的程序就是进程. 比如文件名是以 exe 结尾的就是一可执行文件(程序) 双击QQ.exe文件, 这个程序就跑起来了, 它在系统中形成了一个进程, 那我们怎么看到进程呢? 可以打开任务管理器, 点开进…

Spark MLlib 模型训练

Spark MLlib 模型训练决策树随机森林GBDTSpark MLlib 开发框架下 : 监督学习 : 回归 (Regression) , 分类 (Classification) , 协同过滤 (Collaborative Filtering)非监督学习 : 聚类 (Clustering) 、频繁项集 (Frequency Patterns) 例子分类 : 算法分类 : 算法分类算法子分类…

探究SMC局部代码加密技术以及在CTF中的运用

前言 近些日子在很多线上比赛中都遇到了smc文件加密技术,比较出名的有Hgame杭电的比赛,于是我准备实现一下这项技术&#xff0c;但是在网上看了很多文章&#xff0c;发现没有讲的特别详细的&#xff0c;或者是无法根据他们的方法进行实现这项技术&#xff0c;因此本篇文章就是…

Springboot怎么快速集成Redis?

前言其实在Springboot中集成redis是一个非常简单的事情&#xff0c;但是为什么要单独输出一篇文章来记录这个过程呢&#xff1f;第一个原因是&#xff0c;我记性不是太好&#xff0c;这次把这个过程记录下&#xff0c;在新的项目搭建的时候或者需要在本地集成redis做一些其他相…

51红外循迹智能车——红外循迹模块设计

目录 赛道环境 红外传感器的特征 TCRT5000传感器 LM339单限电压比较器 LM339简介 ​编辑 单限电压比较器仿真 红外循迹模块的设计 红外循迹模块原理图 红外循迹模块原理图讲解 赛道环境 上图为赛道示意图&#xff0c;两端为黑色&#xff0c;中间为白色 红外传感器的…

小孩用什么样的台灯比较好?2023眼科医生青睐的儿童台灯推荐

小孩子属于眼睛比较脆弱的人群&#xff0c;所以选购护眼台灯时&#xff0c;选光线温和的比较好&#xff0c;而且调光、显色效果、色温、防蓝光等方面也要出色&#xff0c;否则容易导致孩子近视。 1、调光。台灯首先是照度高&#xff0c;国AA级&#xff0b;大功率发光&#xff0…

Yolov5目标检测算法解析:模型结构

Yolov5系列是Yolo家族新一代的模型&#xff0c;相比于之前的版本Yolov3和Yolov4&#xff0c;相同的是&#xff0c;它依然采用锚框&#xff08;anchor&#xff09;对目标的尺寸进行回归的思想&#xff0c;保持大中小多种尺度特征输出&#xff0c;所不同的是&#xff0c;Yolov5系…

SQL 进阶刷题笔记

SQL 进阶刷题笔记 一、MySQL 进阶 这里主要是 MySQL 刷题相关笔记&#xff0c;方便后面温习和查阅&#xff0c;希望可以帮到大家&#xff01;&#xff01;&#xff01; 题1 请计算每张SQL类别试卷发布后&#xff0c;当天5级以上的用户作答的人数uv和平均分avg_score&#xff0…

TCP和UDP对比

TCP和UDP对比 UDP(用户数据报协议) 无连接(指的是逻辑连接关系,不是物理上的连接) 支持单播、多播以及广播,也就是UDP支持一对一、一对多、一对全 面向应用报文的,对应用层交付的报文直接打包 无连接不可靠的传输服务(适用于IP电话、视频会议等实时应用),不使用流量控制和…

易优cms range 范围判断标签

range 范围判断标签 【基础用法】 标签&#xff1a;range 描述&#xff1a;范围判断标签包括in notin between notbetween四个标签&#xff0c;都用于判断变量是否中某个范围。 用法&#xff1a; {eyou:range name$eyou.field.typeid value1,2,3,4 typein} 输出内容 {/e…

HTTPS加密解析

日升时奋斗&#xff0c;日落时自省 目录 1、加密解释 2、对称加密 3、非对称加密 4、证书 HTTPS&#xff08;HyperText Transfer Protocol over Secure Socket Layer&#xff09;也是一个应用层协议&#xff0c;是在HTTP协议的基础上引入了一个加密层 HTTP协议内容都是按…

卷积神经网络(CNN)基础知识

文章目录CNN的组成层卷积层卷积运算卷积的变种分组卷积转置卷积空洞卷积可变形卷积卷积层的输出尺寸和参数量CNN的组成层 在卷积神经⽹络中&#xff0c;⼀般包含5种类型的⽹络层次结构&#xff1a;输入层、卷积层、激活层、池化层和输出层。 输入层&#xff08;input layer&a…

Android Audio HAL 服务

在 Android 系统中&#xff0c;Audio HAL 服务用于管理对音频硬件的访问&#xff0c;AudioFlinger 通过 Audio HAL 服务访问音频硬件。这里以 Android Automotive (AAOS) 版模拟器为例&#xff0c;来看 Audio HAL 服务的设计、实现和访问&#xff0c;代码分析基于 android-12.1…

【JavaSE】数组的定义和使用(下)

数组的定义和使用&#xff08;下&#xff09;4. 数组练习4.1 模拟实现toString4.2 数组拷贝4.3 比较两个数组是否相同4.4 填充数组4.3 求数组中元素的平均值4.4 查找数组中指定元素&#xff08;顺序查找&#xff09;4.5 查找数组中指定元素&#xff08;二分查找&#xff09;4.6…

力扣-树节点

大家好&#xff0c;我是空空star&#xff0c;本篇带大家了解一道中等的力扣sql练习题。 文章目录前言一、题目&#xff1a;608. 树节点二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行结果5.其他总结前言 …

基于nvidia xavier智能车辆自动驾驶域控制器设计与实现-百度Apollo架构(二)

智能车辆操作系统 智能车辆操作系统是智能车辆系统的重要组成部分。现代汽车软件组件通常首 先由不同的供应商开发&#xff0c;然后在有限的资源下由制造商进行集成[42]。智能车辆操作 系统需要采用模块化和分层化设计思想来兼容传感器、分布式通信和自动驾驶通用 框架等模块&a…

适当的合同管理有什么积极影响?若管理不善有什么后果?

合同管理将决定合同是主要的风险因素还是业务增长的工具。事实是&#xff0c;如何处理合同会影响企业的底线。据研究显示&#xff0c;糟糕的合同管理使企业每年损失超过9%的收入。实施合同管理最佳实践将帮助企业提高合同签约效率。 什么是合同管理&#xff1f; 合同管理是对合…

玩转CodeQLpy之用友GRP-U8漏洞挖掘

0x01 前言CodeQLpy是作者使用python3实现的基于CodeQL的java代码审计工具&#xff0c;github地址https://github.com/webraybtl/CodeQLpy。通过CodeQLpy可以辅助代码审计人员快速定位代码中的问题&#xff0c;目前支持对SprintBoot的jar包&#xff0c;SpringMVC的war包&#xf…

初探git——版本控制工具git实用教程

文章目录前言基本配置基本操作1.初始化2.查看修改状态(status)3.添加工作区到暂存区4.提交暂存区到本地仓库5.查看提交日志6.版本回退7.添加文件至忽略列表分支1.基本命令2.分支冲突git远程仓库1.创建远程仓库2.配置公钥3.操作远程仓库idea配置git前言 Git是目前世界上最先进的…

九龙证券|业绩增长态势向好 沪市数字产业公司活力迸发

3月8日晚间&#xff0c;中国联通发表年报并举行成绩说明会&#xff0c;年报显现&#xff0c;公司2022年完成经营收入&#xff08;兼并报表&#xff09;3549.44亿元&#xff0c;同比增加8.30%&#xff1b;归属于母公司股东净利润72.99亿元&#xff0c;同比增加15.80%&#xff0c…