首页 > 其他分享 >52单片机超声波测距时无法刷新检测的问题

52单片机超声波测距时无法刷新检测的问题

时间:2024-07-01 09:59:15浏览次数:3  
标签:定时器 高电平 Trig 52 单片机 while sbit void 测距

本实验采用超声波模块HC-SR04模块进行测量距离,假设距离短则LED1亮,反之LED2亮

#include "reg52.h"

sbit led1 = P3^7;
sbit led2= P3^6;
sbit Trig = P1^5;
sbit Echo = P1^6;

void Delay10us()        //@11.0592MHz
{
    unsigned char i;

    i = 2;
    while (--i);
}

void Time0Init()    //ISP定时器计算器生成
{    
    TMOD &= 0xF0;        //设置定时器模式
    TMOD |= 0x01;
    TH0 = 0;
    TL0 = 0;
    //设置定时器0工作模式1,初始值设定0开始数数,先不启动定时器
}
 

void startHC()
{
    Trig = 0;
    Trig = 1;
    Delay10us();
    Trig = 0;
}
void main()
{
    double time;
    double dis;
    
    Time0Init();
    
    while(1){
        //1. Trig ,给Trig端口至少10us的高电平
        startHC();
        //2. echo由低电平跳转到高电平,表示开始发送波
        while(Echo == 0);
        //波发出去的那一下,开始启动定时器
        TR0 = 1;
        //3. 由高电平跳转回低电平,表示波回来了
        while(Echo == 1);
        //波回来的那一下,我们开始停止定时器
        TR0 = 0;


        //4. 计算出中间经过多少时间    /*
十进制2左移1位,变成20。相当于乘以10
二禁止1左移1位,变成10(2)。相当于乘以2,左移8位,乘以2的8次方=256;*/
        time = (TH0 * 256 + TL0)*1.085;//us为单位
        //5. 距离 = 速度 (340m/s)* 时间/2


        dis = time * 0.017;//转换成cm/us
        if(dis < 10){
                led1 = 0;
                led2 = 1;
        }else{
                led1 = 1;
                led2 = 0;
        }
        //定时器数据清零,以便下一次测距
        TH0 = 0;
        TL0 = 0;
    }
}

完成代码后,烧录程序,发现超声波模块并没有完成预期中的效果,而是只能检测一次,比方说刚开始的时候距离比较大,就一直执行else{
                led1 = 1;
                led2 = 0;
        }

的语句,距离拉到10cm以内,必须要按复位键才能重新检测。

<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="6OfRfMNA-1719799072367" src="https://live.csdn.net/v/embed/405101"></iframe>

没有加入延时的超声波

最后发现问题,我的超声波模块是不带外部晶振的,所以在每次检测前我加了200ms延时,用于稳定时钟

改正后代码:

#include "reg52.h"

#include "intrins.h"

sbit D5 = P3^7;
sbit D6 = P3^6;
sbit Trig = P1^5;
sbit Echo = P1^6;

void Delay10us()        //@11.0592MHz
{
    unsigned char i;

    i = 2;
    while (--i);
}
void Delay200ms()        //@11.0592MHz
{
    unsigned char i, j, k;

    _nop_();
    i = 2;
    j = 103;
    k = 147;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}


void Time0Init()
{    
    TMOD &= 0xF0;        //设置定时器模式
    TMOD |= 0x01;
    TH0 = 0;
    TL0 = 0;
    //设置定时器0工作模式1,初始值设定0开始数数,不着急启动定时器
}
/*
十进制2左移1位,变成20。相当于乘以10
二禁止1左移1位,变成10(2)。相当于乘以2,左移8位,乘以2的8次方=256;*/

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

最后终于得到动态超声波测距效果

<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="rL6LwUuk-1719799082623" src="https://live.csdn.net/v/embed/405102"></iframe>

延时后的超声波

标签:定时器,高电平,Trig,52,单片机,while,sbit,void,测距
From: https://blog.csdn.net/m0_63103301/article/details/140092385

相关文章

  • 51单片机项目:进阶版密码锁(附代码详解)
    一、基本功能简介1.四位密码锁        默认密码为1201(小彩蛋*1),后续可自由修改密码。2.输入密码        按下不同按键,输入相应的数字(最多输入四位,输入少于四位使用0补全)按键与数字对应表按键数字S11S22S33S44S55S66S77S88S99S100......
  • Proteus仿真实例_基于51单片机的二层电梯控制系统(仿真文件+程序)24-51f-03
    一.系统概述1.电梯有上行和下行功能,有一个电机通过正反转控制,分别用两个指示灯表示;2.有开门和关门功能,有一个电机通过正反转控制,分别用两个指示灯表示;3.电梯内部具有开门、关门按钮,带相应指示灯:4.超重和延时报警功能,超重信号保持功能。二.仿真概述 1.进入仿真,数码管......
  • 520.力扣每日一题6/23 Java
    博客主页:音符犹如代码系列专栏:算法练习关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞......
  • 《最新出炉》系列入门篇-Python+Playwright自动化测试-52- 字符串操作 - 下篇
    1.简介在日常的自动化测试工作中进行断言的时候,我们可能经常遇到的场景。从一个字符串中找出一组数字或者其中的某些关键字,而不是将这一串字符串作为结果进行断言。这个时候就需要我们对字符串进行操作,宏哥这里介绍两种方法:正则和字符串切片函数split()。2.测试场景宏哥在这里......
  • 152. 乘积最大子数组
    152.乘积最大子数组题目链接:152.乘积最大子数组代码如下:classSolution{public:intmaxProduct(vector<int>&nums){intres=nums[0];vector<int>f(nums.size()+1,0),g(nums.size()+1,0);f[0]=nums[0],g[0]=nums[0];......
  • 【单片机毕业设计选题24020】-全自动鱼缸的设计与应用
    系统功能:(1)检测并控制鱼缸水温,水温低于22℃后开启加热,高于28℃后关闭加热。(2)定时喂食,每天12点和0点喂食一次,步进电机开启后再关闭模拟喂食。(3)定时开启水循环,每隔一个小时开启水循环水泵一分钟。(4)OLED显示时间,水温,加热喂食和水循环的状态。(5)手机蓝牙显示系统状态及控制加热......
  • 酷得智能 电子方案开发 单片机方案定制
    手持小风扇电子方案开发,东莞酷得智能科技有限公司为您服务东莞市酷得智能科技有限公司在消费类电子市场深耕多年,依托于市场团队对市场的敏锐度、工程团队的技术积累、结合自身的创新以及和上游原厂深度合作,在2.4G通信、BLE、语音、马达驱动控制等领域,采用方案+代理的模式,形......
  • kedaOJ#P1529有趣的字母
    题目kedaOJ#P1529有趣的字母思路直接模拟,比较复杂的是找到最后一个字符代码#include<bits/stdc++.h>intmain(){std::vector<char>vowels={'a','e','i','o','u'};intn;std::cin>>n;intcount......
  • 【单片机毕业设计选题24021】-植物培养室温度自动调节系统
    系统功能:系统功能框图:主要功能模块原理图:电源时钟烧录接口:单片机和按键输入电路:温度采集及控制电路:资料获取地址系统主要功能模块代码初始化代码:/*USERCODEBEGIN1*//*USERCODEEND1*//*MCUConfiguration-------------------......
  • 基于STM32单片机的智能垃圾桶垃圾分类语音识别控制系统(实物+所有资料)
        随着社会科学技术的飞速发展,人们的生活质量和速度也在不断提高。大多数传统的家用垃圾桶已经过时且缺乏新颖性,并且缺乏人性化设计。使用起来既不方便也不卫生,并且所有的生活垃圾和废物垃圾都被均匀地装载,没有经过仔细的分类。随之而来的是,清洁工的任务量正以几何速......