• C51--超声波测距


    超声波测距

    1、简介
    超声波模块是用来测距的一种产品,利用时间差和声音传播速度,计算出模块到前方障碍物的距离。
    型号:HC-SR04
    可测距离:2cm——400cm非接触距离感测
    测距精度:3mm
    接线参考:模块除了两个电源引脚外,还有TRIG,ECHO引脚,这两个分别接开发板的P1.5和P1.6端口

    VCC - 5v
    GND - 接地
    TRIG - P1.5口(发送波)
    ECHO -P1.6口(接收波)

    2、发送波返回波
    给TRIG一个10us的高电平就可以触发发波
    ECHO由低电平跳转到高电平表示开始发送波,
    ECHO由高电平跳转到低电平表示波返回

    3、计算时间
    (ECHO高电平持续的时间)
    波发出去,开始计算时间,启动定时器;
    波返回时,停止计时器,计算出中间经过的时间。

    4、计算距离
    距离=(时间)*波的速度(340m/s)/ 2

    5、代码实现
    十进制左移一位相当于乘以10。例:2左移一位为20
    二进制左移一位相当于乘以2. 例:1左移一位为10(十进制的2)
    左移8位,相当于乘以2的8次方 = 256

    /*
    1、给TRIG一个10us的高电平就可以触发发波 
    2、ECHO由**低电平跳转到高电平**表示开始发送波,开始启动定时器
    3、ECHO由**高电平跳转到低电平**表示波返回,停止定时器。
    4、计算中间经过的时间
    5、计算距离:距离=(时间)*波的速度(340m/s)/ 2
    */
    
    
    #include "reg52.h"
    
    //距离小于10cm,D5亮,D6灭,反之相反
    
    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 startHC()
    {
    	Trig = 0;
    	Trig = 1;
    	Delay10us();
    	Trig = 0;
    }
    
    void Time0Init()		
    {
    	TMOD &= 0xF0;		//设置定时器模式
    	TMOD |= 0x01;
    	TH0 = 0;
    	TL0 = 0;
    	//设置定时器0工作模式1,初值设定为0开始数数,不着急启动定时器
    }
    
    /*
    十进制左移一位相当于乘以10。例:2左移一位为20
    二进制左移一位相当于乘以2.  例:1左移一位为10(十进制的2)
    左移8位,相当于乘以2的8次方 = 256
    */
    
    void main()
    {
    	double time;//时间
    	double dis;//距离
    	
    	Time0Init();//定时器
    	
    	while(1){
    		startHC();					//给TRIG一个10us的高电平
    		while(Echo == 0);		//ECHO由**低电平跳转到高电平**表示开始发送波
    		TR0 = 1;						//波发送时启动定时器
    		while(Echo == 1);		//ECHO由**高电平跳转到低电平**表示波返回
    		TR0 = 0;						//波回来时关闭定时器
    		time = (TH0 * 256 + TL0)*1.085;		//计算中间经过的时间,以 um 为单位
    		dis = time * 0.017;
    		//距离=(时间)*波的速度(340m/s)/ 2 ; 340m/s = 34cm/ms = 0.034cm/us
    		if(dis < 10){
    			D5 = 0;
    			D6 = 1;
    		}else{
    				D5 = 1;
    				D6 = 0;
    			}
    		//定时器数据清零,方便下一次测距
    		TH0 = 0;
    		TL0 = 0;
    	}
    	
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
  • 相关阅读:
    MySQL Linux服务器快照克隆引起的binlog日志无法正常删除导致文件系统满
    Vue:element-ui中表格过长内容隐藏显示
    CoinGecko 播客:与 Cartesi 联合创始人 Erick 一起构建 Layer-2
    代码随想录算法训练营第五十九天| 503.下一个更大元素II,42. 接雨水
    JavaParse入门
    【Linux】环境变量
    华为云云耀云服务器L实例评测|轻松购买 快速使用 上云如此简单【详细版】
    【技术积累】Docker部署笔记
    Callble接口创建多线程【详细总结】
    虚拟机的ubuntu 22.04无法联网问题解决
  • 原文地址:https://blog.csdn.net/weixin_48208102/article/details/134050071