一、基本原理

超声波发射模块向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时

二、计算公式

距离 = 声速 × 发出超声波到接收返回的时间/2
因为超声波在空气中的传播速度受温度影响。声波在空气中的传播速度与温度的关系是:
在20摄氏度时,声速V = 332 + 0.607t (m/s)
利用超声波进行距离测量,要求精度一般都不高,取20摄氏度时候的声速344M/S进行计算,再进行适当的补偿就可以。所以,其计算公式为:距离L = 344M/S * T / 2 = 172M/S * T 。

三、实现步骤

  1. 产生8个40KHz的超声波信号,通过TX引脚发射出去
  2. 启动定时器,计算计数脉冲。
  3. 等待超声波信号返回,如果接收到反射回来的信号,RX引脚变为低电平
  4. 停止定时器,读取脉冲个数,即获得时间T。
  5. 根据公式,L = V * T /2m进行距离的计算。

四、参考程序

注:超声波测距是一直以来都是国赛中重要的考点,几乎每届必考。虽然省赛还没有考过,但也不能排除以后不考

在蓝桥杯单片机的竞赛综合平台CT107D中,超声波模块的TX引脚接到单片机的P1.0端口,RX引脚接到单片机的P1.1端口。设计程序,进行超声波测距,最大测量范围约140cm。测量结果用cm作为显示单位,显示在数码管的最左边三位。如果测量距离超出范围,则以“F”作为标志,显示在数码管的最右边一位。

sonic.c

#include "sys.h"
#define sonic_nop {_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();};void Send_Sonic(void) //发送8个40khz脉冲信号
{unsigned char i = 8;while(i --){TX = 1;sonic_nop; sonic_nop; sonic_nop; sonic_nop; sonic_nop;sonic_nop; sonic_nop; sonic_nop; sonic_nop; sonic_nop;TX = 0;sonic_nop; sonic_nop; sonic_nop; sonic_nop; sonic_nop;sonic_nop; sonic_nop; sonic_nop; sonic_nop; sonic_nop;}
}unsigned int Mea_Distance()
{u16 distance = 0;u16 time = 0;Send_Sonic();  //发送超声波信号TR1 = 1;      //启动定时器1while((RX == 1)&&(TF1 == 0));//等待超声波信号返回,或者等到测量超出范围TR1 = 0;     //停止定时器1if(TF1 == 0) //正常测量范围{time = TH1;time = (time << 8)|TL1;distance = time*0.0175;}else     //超出测量范围{TF1 = 0;distance = 999;  }TH1 = 0;TL1 = 0;return distance;
}

main.c

#include "sys.h"
bit MEA_SONIC_FLAG;
void main()
{u16 distance = 0;ALL_Init();Timer0Init();Timer1Init();while(1){if(MEA_SONIC_FLAG) //每125ms测量一次{MEA_SONIC_FLAG = 0;distance = Mea_Distance();}Nixie_Drive(distance);}
}

sys.h

#ifndef __SYS_H__
#define __SYS_H__//头文件包含
#include <STC15F2K60S2.H>
#include <intrins.h>//管脚声明
sbit TX = P1^0;//超声波发送
sbit RX = P1^1;//超声波接收
//变量类型声明
typedef unsigned int uint;
typedef unsigned int u16;
typedef unsigned char uchar;
typedef unsigned char u8;//外部变量声明//函数声明
void ALL_Init();
void Operate_Delay(unsigned int ms);
void HC138_Set(u8 channel);
void Timer0Init();
void Timer1Init(void);
//nixie.c
void Nixie_Scan();
void Nixie_Show();
void Nixie_Drive(u16 dat);
//sonic.c
void Send_Sonic();
unsigned int Mea_Distance();
#endif

nixie.c

#include "sys.h"// 0    1    2    3    4    5    6    7
uchar code nixie[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,// 8 9    a    b    c    d     e    f    u0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xc1,0xff};    //共阳数码管码字uchar NixieBuff[] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};uchar smg1,smg2,smg3,smg4,smg5,smg6,smg7,smg8;
uchar code Symbol[] = {0xff,0xbf}; //全灭,-void Nixie_Scan()
{static u8 index;HC138_Set(7);P0 = 0XFF;HC138_Set(6);P0 = 0x01<<index;HC138_Set(7);P0 = NixieBuff[index];HC138_Set(0);index++;index &= 0x07;
}void Nixie_Show()
{NixieBuff[0] = nixie[smg1];NixieBuff[1] = nixie[smg2];NixieBuff[2] = nixie[smg3];NixieBuff[3] = Symbol[smg4];NixieBuff[4] = Symbol[smg5];NixieBuff[5] = Symbol[smg6];NixieBuff[6] = Symbol[smg7];NixieBuff[7] = nixie[smg8];
}void Nixie_Drive(u16 dat)
{if(dat == 999){smg1 = smg2 = smg3 = 17;smg4 = smg5 = smg6 = smg7 = 0;smg8 = 15;}else{smg1 = dat/100;smg2 = dat%100/10;smg3 = dat%10;smg4 = smg5 = smg6 = smg7 = 0;smg8 = 17;}
}

sys.c

#include "sys.h"
extern bit MEA_SONIC_FLAG;
/**
*@brief     外设初始化
*@param[in] none
*@return    none
**/
void ALL_Init()
{P2 = (P2&0x1f)|0xa0;  //打开Y5CP0 = 0x00;              //关闭蜂鸣器&继电器P2 = (P2&0x1f)|0xe0;    //打开Y7CP0 = 0xff;              //关闭数码管P2 = (P2&0x1f)|0x80;    //打开Y4CP0 = 0xff;              //关闭LEDP2 = P2&0x1f;           //关闭所用使能
}
/**
*@brief     延时函数
*@param[in] 延时多少ms(0~65535)
*@return    none
**/
void Operate_Delay(u16 ms)
{u16 i;for(ms;ms>0;ms--)for(i=921;i>0;i--);
}
/**
*@brief      74HC138译码器通道选择
*@param[in]  channel (通道)
*@return     none
**/
void HC138_Set(u8 channel)
{switch(channel){case 0: P2 =  P2 & 0x1f;     break;     //关闭所有通道case 4: P2 = (P2&0x1f)|0x80; break;     //选择Y4对应的模块 (LED),        运算结果为P2高三位 100case 5: P2 = (P2&0x1f)|0xa0; break;     //选择Y5对应的模块 (蜂鸣器),   运算结果为P2高三位 101case 6: P2 = (P2&0x1f)|0xc0; break;     //选择Y6对应的模块 (数码管位选), 运算结果为P2高三位 110case 7: P2 = (P2&0x1f)|0xe0; break;     //选择Y7对应的模块 (数码管段选), 运算结果为P2高三位 111}
}void Timer0Init(void)      //1毫秒@11.0592MHz
{AUXR |= 0x80;     //定时器时钟1T模式TMOD &= 0xF0;       //设置定时器模式TL0 = 0xCD;       //设置定时初值TH0 = 0xD4;        //设置定时初值TF0 = 0;       //清除TF0标志TR0 = 1;      //定时器0开始计时ET0 = 1;EA = 1;
}void Timer1Init(void)      //0微秒@11.0592MHz
{AUXR &= 0xBF;     //定时器时钟12T模式TMOD &= 0x0F;      //设置定时器模式TL1 = 0;      //设置定时初值TH1 = 0;       //设置定时初值TF1 = 0;       //清除TF1标志TR1 = 0;
}void Timer0() interrupt 1
{static unsigned char i;i++;if(i == 125){i = 0;MEA_SONIC_FLAG = 1;}Nixie_Show();Nixie_Scan();
}

蓝桥杯单片机设计与开发⑫ ---超声波模块相关推荐

  1. 蓝桥杯单片机设计与开发⑬ ---NE555模块

    一.555定时器&频率测量 1. 电路原理 NE555是一种时钟芯片,输出一定频率的脉冲信号.就其模块特性,简单点来说,该模块会根据Rb3电位器的阻值,在SIG脚输出相应的频率的脉冲信号. 第 ...

  2. 蓝桥杯单片机设计与开发_标准模板

    蓝桥杯单片机设计与开发_标准模板 一.前言 首先,这篇文章是笔者第一次在 CSDN 上写博文,较为生疏,读者若有任何意见,欢迎大家在评论区交流! 笔者目前为一名大二学生,参加了2021年蓝桥杯单片机设 ...

  3. 第十一届 蓝桥杯 单片机设计与开发项目 决赛

    第十一届 蓝桥杯 单片机设计与开发项目 决赛 题目 源码 赛题总结 1.界面切换 2.参数生效 3.LED显示 题目 源码 #include <STC15F2K60S2.H> #inclu ...

  4. 蓝桥杯——单片机设计与开发初学者必备资料

    蓝桥杯--单片机设计与开发初学者必备资料 国信长天 大赛官方指定电子类比赛硬件提供方,可能大家只知道他们提供硬件,殊不知还有一些免费的视频讲解(只是老师可能说话带一点方言,嘻嘻),感兴趣的可以去看看, ...

  5. 第十一届蓝桥杯 单片机设计与开发省赛试题

    第十一届蓝桥杯 单片机设计与开发 省赛 在昨天举办了第一波11届蓝桥杯比赛,第2波大概在10月份左右,看了看比赛题目,这次题目对于我来说,程序设计题简单,客观题全靠蒙! 本次比赛涉及: 1.数码管显示 ...

  6. 蓝桥杯单片机设计与开发历届客观题答案

    该页面由pdf转换而来,阅读效果不佳,你可以在这里下载pdf原件:https://download.csdn.net/download/dvs_dn/19373128 你也可以在百度文库免费下载该文档 ...

  7. 最新 2021年 第十二届 蓝桥杯 单片机设计与开发 省赛 客观试题 个人答案

    第十二届蓝桥杯单片机设计与开发项目省赛 第一部分客观试题(30分) 不定项选择(3分/题) (1)MCS-51单片机外部中断1的中断请求标志是( B ).     A.ET1        B.IE1 ...

  8. 蓝桥杯单片机设计与开发题目分析与源码(智能门锁)

    蓝桥杯单片机设计与开发(智障门锁) 内附完整工程 代码仅供参考,如有建议疑问欢迎留言讨论 程序设计部分 智能门锁-任务指导书 开发环境 Keil5 Stc-isp 国兴天长开发板 任务分析 任务逻辑梳 ...

  9. 蓝桥杯单片机设计与开发笔记(一)

    近期和我们实验室的小伙伴一起参加了第七届蓝桥杯单片机开发与设计组省赛,在这里将备赛期间的一些资料和经验总结一下,并分享给大家. 蓝桥杯单片机开发板是国信长天的CT107D单片机综合训练平台,个人感觉这 ...

最新文章

  1. keras 的 example 文件 babi_memnn.py 解析
  2. ACL 2016 | CopyNet 和 Pointer Softmax
  3. OGRE 1.7.2 [Cthugha] 编译配置全过程方法
  4. 阿里P8架构师谈:高并发网站的监控系统选型、比较、核心监控指标
  5. guid java_JAVA实现生成GUID的方法
  6. 生命计算机在线,抖音生命计算器
  7. ICMPV6协议及NDP协议
  8. 杰奇reader.php源码,最新杰奇CMS Jieqi V2.4 静思文学源码全解密开源版完整源码分享,附带关关采集杰奇V3.5版程序...
  9. 万圣节头像挂件微信小程序前端
  10. 图像分割-专有名词讲解
  11. 金山毒霸把我的oracle监听服务,金山毒霸误杀我的i_eyes.exe
  12. 美国国土安全部重点努力加强国家关键基础设施的网络安全
  13. 在使用selenium 做IE自动化操作时 请求状态码 400【帮忙解决或者找出问题所在悬赏200】
  14. 到底Redis是什么?
  15. Python一行代码能做什么,30个实用案例代码详解
  16. 马斯洛“需求层次理论” 在《植物大战僵尸》中的运用
  17. replace()方法
  18. win10 显卡更新后,屏幕亮度调节失效解决办法
  19. 基于单例模式的多键值序列号生成器实现(支持缓存)
  20. 一道二阶常系数非齐次微分方程的八种解法

热门文章

  1. 迅捷画图怎样画思维导图、流程图
  2. 《数据结构与抽象:Java语言描述(原书第4版)》一1.4 像使用自动贩卖机一样使用ADT...
  3. Keil C51程序设计
  4. 点击li标签增加样式,并删除其它li标签样式
  5. 云计算入门基础命令行
  6. 【IDEA导出jar包】错误: 找不到或无法加载主类 com.xxx.xxx
  7. 几何与向量方法推导两角和差公式
  8. ROS学习(3)——仿真平台搭建
  9. 修改phpmyadmin上传文件大小限制
  10. python统计元音字母个数_python正则表达式如何统计元音?