历史上的今天
返回首页

历史上的今天

今天是:2025年07月27日(星期日)

正在发生

2021年07月27日 | 基于51最小系统的超声波测距

2021-07-27 来源:eefocus

原理:

超声波方面:

超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波可用于距离的测量。


超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。超声波在空气中的传播速度为340m/s,根据计时器记录的时间t,就可以计算出发射点距障碍物的距离(s),

即:S=Vt/2 。


51单片机方面:

震荡周期,时钟周期:晶振提供

机器周期:CPU完成一个独立操作,为十二个震动周期

即:外接12MHz晶振51单片机每进行一次操作需要1us


HC-SR04方面:

(1)采用IO口TRIG触发测距,给至少10us的高电平信号; (2)模块自动发送8个40khz的方波,自动检测是否有信号返回; (3)有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。


时序图:

在这里插入图片描述

代码实现部分:


#include  

#include

typedef unsigned int u16;   //对数据类型进行声明定义

typedef unsigned char u8;



sbit Trig = P2^1;

sbit Echo = P2^0;

sbit LED=P2^2;


u8 str[20]={0};

u8 zhi=10;

u8 code strerror[]={"error"};

u8 i;

u16 time;

u16 S=0;

bit flag=0;



/*******************************************************************************

函数功能 :串口通信配置

*******************************************************************************/

void USARTinit()                                          

{

SCON=0X50; //设置为工作方式1

TMOD=0X20|TMOD; //设置计数器工作方式2

PCON=0X80; //波特率加倍

TH1=0XF3; //计数器初始值设置,波特率是4800

TL1=0XF3;

ES=1; //打开串口中断

EA=1; //打开总中断

TR1=1; //打开计数器

}


/*******************************************************************************

函数功能 : 串口通信发送中断函数

输入           : 要发送的一字节数据

*******************************************************************************/

void send(u8 Data) 

{

SBUF=Data;     //数据放入到发送寄存器

while(!TI); //等待发送数据完成

TI=0;       //清除发送完成标志位

}


/*******************************************************************************

函数功能 : 定时器0初始化,用于计算时间

*******************************************************************************/

void T0inti()

{

TMOD=0x01|TMOD;    //设T0为方式1

TH0=0;

TL0=0;          

ET0=1;             //允许T0中断

EA=1;    //开启总中断

}


/*******************************************************************************

函数功能 : 外部中断初始化

*******************************************************************************/

void EXinit()

{

EX0=1;              //打开外部中断0

IT0=1;             //边沿触发方式

EX1=1;              //打开外部中断1

IT1=1;             //边沿触发

EA=1;        //打开总中断

}


/*******************************************************************************

函数功能 : 阈值初始化

*******************************************************************************/

void zhiinit() interrupt 0

{

zhi=10;

}


/*******************************************************************************

函数功能 : 阈值加10

*******************************************************************************/

void zhichuli() interrupt 2

{

zhi=zhi+10;

}


/*******************************************************************************

函数功能:  提示计数器溢出,超过测距范围

*******************************************************************************/

void error() interrupt 1  

  {

    flag=1; //中断溢出标志

S=0;

  }

/*******************************************************************************

函数功能 : 定时器0初始化,用于计算距离

*******************************************************************************/

void Conut() 

{

if(flag==0)

{

time=TH0*256+TL0;

TH0=0;

TL0=0;

(u16)S=(time*1.7)/100;     //算出来是CM

}

}

/*******************************************************************************

函数功能 : 对计算数据做处理,并发送,同时做量程判断

*******************************************************************************/

void chuli()

{

  ES=1;                                       //打开串口中断

TI=0;

if(S<=zhi)                              //距离小于阈值cm或者距离大于测量值LED点亮,LED低电平点亮 (初始为10)

{

  LED=0;

}

else 

{

LED=1;

}

if(S==0)

{

for(i=0;i<=5;i++)

{

send(strerror[i]);

}

flag=0;

TH0=0;

TL0=0;

}

if(S>0)

{

for(i=1;S>=1;i++)

{

str[i]=(unsigned char)(S%10)+'0';

(u16)S=S/10;

}

for(i=i-1;i>0;i--)

{

send(str[i]);

}

send('r');

send('n');

   ES=0;                                                                    //关闭串口中断

}

}


/*******************************************************************************

函数功能 : 启动HC-SR04

*******************************************************************************/

void  Start()                                                          //启动HC-SR04需要10us高电平,一个_nop_()是1us,保险起见设置20个

  {

  Trig=1;                      

  _nop_(); 

  _nop_(); 

  _nop_(); 

  _nop_(); 

  _nop_(); 

  _nop_(); 

  _nop_(); 

  _nop_(); 

  _nop_(); 

  _nop_(); 

  _nop_(); 

  _nop_(); 

  _nop_(); 

  _nop_(); 

  _nop_(); 

  _nop_(); 

  _nop_();

  _nop_(); 

  _nop_(); 

  _nop_(); 

  Trig=0;                       

  }

void main()

{

T0inti();

EXinit();

    USARTinit() ;

while(1)

{

Start() ;

while(!Echo); //当Echo为零时等待

     TR0=1;     //开启计数

     while(Echo); //当Echo为1计数并等待

     TR0=0; //关闭计数

Conut() ;

chuli();

}

}



收获:

对于单片机串口通信有了更深理解。

模块化编程有了一些尝试。

推荐阅读

史海拾趣

Advanced Semiconductor, Inc.公司的发展小趣事

随着全球对环保和可持续发展的重视,ASI也积极响应这一趋势,致力于研发更加环保、节能的半导体产品。公司不断投入资源研发低功耗、高性能的芯片技术,为推动绿色电子产业的发展贡献力量。同时,ASI也对未来充满信心,将继续加大在新技术、新应用领域的投入,为半导体行业的未来发展贡献更多的智慧和力量。

这五个故事展示了Advanced Semiconductor, Inc.在电子行业中的发展历程和取得的成就。从创立初期的艰难探索到如今的行业领先地位,ASI凭借其独特的技术、创新的精神和敏锐的市场洞察力,不断突破自我、超越自我,成为了半导体行业的一颗璀璨明星。

Elpakco Inc公司的发展小趣事

随着电子行业的不断发展,Elpakco Inc公司意识到,只有不断创新才能在激烈的市场竞争中立于不败之地。公司加大研发投入,积极引进先进技术和设备,不断推出具有创新性和竞争力的新产品。其中,公司研发的一款智能封装技术,不仅提高了生产效率,还降低了生产成本,引领了行业的技术潮流。

eLED.com Corp公司的发展小趣事

随着国内市场的逐渐饱和,eLED.com Corp开始将目光投向国际市场。公司积极参与各类国际展会,向全球客户展示其优质的产品和技术。同时,eLED.com Corp还与国际知名企业开展合作,共同研发新技术,推动LED行业的发展。通过与国际巨头的合作,eLED.com Corp不仅提升了自身的技术水平,还拓展了国际市场,实现了品牌的全球化布局。

Chenmoun Enterprise Ltd公司的发展小趣事

在电子行业竞争日益激烈的背景下,Chenmoun Enterprise Ltd始终坚持品质至上的原则。公司建立了严格的质量管理体系,从原材料采购到生产流程再到产品出厂,每一个环节都严格把关。这种对品质的执着追求赢得了客户的信任和口碑,使得Chenmoun的产品在市场上获得了广泛的认可。

东晨(DC)公司的发展小趣事

在电子行业的激烈竞争中,东晨(DC)公司凭借一项革命性的技术突破——高效能低功耗的芯片设计,迅速崛起。该公司投入大量研发资源,成功开发出了一款性能卓越、能耗极低的芯片,这一创新成果为智能手机、平板电脑等移动设备提供了更长的续航时间和更快的运行速度。凭借这一技术优势,东晨(DC)公司迅速获得了市场的认可,产品销量节节攀升。

A-BRIGHT公司的发展小趣事

A-BRIGHT公司注重与产业链上下游企业的合作与共赢。公司与多家原材料供应商建立了长期稳定的合作关系,确保了原材料的稳定供应和质量。同时,A-BRIGHT也与多家知名的电子产品制造商展开合作,共同开发新产品,实现了资源共享和互利共赢。

问答坊 | AI 解惑

PCB学习之一

常用电子元件封装电阻:RES1,RES2,RES3,RES4;封装属性为axial系列   无极性电容:cap;封装属性为RAD-0.1到rad-0.4   电解电容:electroi;封装属性为rb.2/.4到rb.5/1.0   电位器:pot1,pot2;封装属性为vr-1到vr-5   二极管:封装属 ...…

查看全部问答>

关于FPGA的AD转换有人做过么?

我用的是AD0804,按时序图写出的状态机程序,但是在数码管老是无法正常显示,数字不是老跳就是定在一个值不动,我让其每隔0.5秒就转换一次         always@(posedge clk)               ...…

查看全部问答>

S3C2440 bootloader加载nk.bin出错

我用的飞凌的Uboot下载NK.bin,提示出错,提示错误如下: real entry is 0x%00000000, physical address is 0x%00000000 指示检查了程序,是在读取NK.bin里面的记录时出的错。 NK.bin文件头,即7个字节的头文件读取正确,代码如下: if(strncmp ...…

查看全部问答>

sd卡的 RCA作用

小弟目前正在研究SD卡协议相关,对CMD3的Response中的RCA不是很理解,不知道具体作用是做什么的,与读写卡操作时的逻辑地址,物理地址有什么样的关系?…

查看全部问答>

招聘:硬件工程师(南京)

我们是一家总部在香港,主营半导体业务,方案设计、开发及推广的专业公司。 有成熟的音视频多媒体、高清显示等方面的产品方案和设计团队,现因业务发展,急需招聘硬件程序员。 我们为您提供良好的福利待遇和薪酬体制。 工作地点在南京广州路和珠 ...…

查看全部问答>

急~~~~请教一条关于WinCE的SQL语句~~~~急

我在SQL2005上执行下面这条语句没有问题,但是在CE上就错了,请问怎么解决? select * from ( Select SakuseiHiduke, case DakokuCode when \'01\' then max(SakuseiJikoku) else \'\' end as ShuKkinTime, case DakokuCode when \'02\' then m ...…

查看全部问答>

【挖电源】直流稳压开关电源

此款直流稳压开关电源是在深圳华强北买的   直流电压输出范围是0-30V   直流电流最大输出5A [ 本帖最后由 dongguanze 于 2011-7-31 23:49 编辑 ]…

查看全部问答>

8G SD卡和2G以下SD卡读写方式一样吗?

8GSD卡读写不出?我看到很多资料读写SD卡都是2G以下,他们有什么区别?…

查看全部问答>

毕业设计题!急!关于单片机设计求各路大神帮帮忙

关于单片机设计求各路大神帮帮忙!!!!!!急急急!导师要题目!关于51单片机不能是烂大街的 本人水平太渣 求助论坛各位大神!!!!!!!!!…

查看全部问答>

BBB内核源码下载

http://kuai.xunlei.com/d/SN-qDgJtAwCFjFRT5cf 给需要自己添加驱动的人。。。 里面有我已经编译好的内核,在deploy目录下 …

查看全部问答>