HC-SR04超声波测距模块电路设计

发布者:科技创客最新更新时间:2015-09-10 来源: eefocus关键字:HC-SR04  超声波测距  51单片机 手机看文章 扫描二维码
随时随地手机看文章
超声波测距模块参数

【单片机学习】HC-SR04超声波测距模块电路设计

【单片机学习】HC-SR04超声波测距模块电路设计

【单片机学习】HC-SR04超声波测距模块电路设计

【单片机学习】HC-SR04超声波测距模块电路设计

超声波测距模块内部电路图

【单片机学习】HC-SR04超声波测距模块电路设计

超声波测距模块与51单片机连接电路图

【单片机学习】HC-SR04超声波测距模块电路设计
51单片机C语言参考程序

#include           //调用单片机头文件
#define uchar unsigned char  //无符号字符型宏定义 变量范围0~255
#define uint  unsigned int  //无符号整型 宏定义 变量范围0~65535
#include
#include "eeprom52.h"


sbit c_send   = P3^3;  //超声波发射
sbit c_recive = P3^2;  //超声波接收

//这三个引脚参考资料
sbit rs=P1^0;  //1602数据/命令选择引脚 H:数据       L:命令
sbit rw=P1^1;  //1602读写引脚          H:数据寄存器   L:指令寄存器
sbit e =P1^2;  //1602使能引脚          下降沿触发
uchar code table_num[]="0123456789abcdefg";

sbit beep = P1^4;   //蜂鸣器IO口定义
bit flag_300ms ;

long distance;         //距离
uint set_d;             //距离
bit flag_csb_juli;        //超声波超出量程
uint  flag_time0;     //用来保存定时器0的时候的

uchar menu_1;        //菜单设计的变量



void delay_1ms(uint q)
{
 uint i,j;
 for(i=0;i
  for(j=0;j<120;j++);
}


void write_eeprom() //保存数据
{
 SectorErase(0x2000);
 byte_write(0x2000, set_d % 256);
 byte_write(0x2001, set_d / 256);
 byte_write(0x2058, a_a); 
}


void read_eeprom()  //读出保存数据
{
 set_d  = byte_read(0x2001);
 set_d <<= 8;
 set_d  |= byte_read(0x2000);
 a_a      = byte_read(0x2058);
}

//
void init_eeprom()  ////开始初始化保存的数据
{
 read_eeprom();  //读出保存数据
 if(a_a != 2)  //新的单片机初始单片机内问EEPOM
 {
  set_d = 50;
  a_a = 2;
  write_eeprom(); //保存数据
 
}


void delay_uint(uint q)
{
 while(q--);
}

 


void write_com(uchar com)
{
 e=0;
 rs=0;
 rw=0;
 P0=com;
 delay_uint(25);
 e=1;
 delay_uint(100);
 e=0;
}


void write_data(uchar dat)
{
 e=0;
 rs=1;
 rw=0;
 P0=dat;
 delay_uint(25);
 e=1;
 delay_uint(100);
 e=0; 
}


void write_string(uchar hang,uchar add,uchar *p)
{
 if(hang==1)  
  write_com(0x80+add);
 else
  write_com(0x80+0x40+add);
  while(1)
  {
   if(*p == '')  break;
   write_data(*p);
   p++;
  
}

[page]

void write_sfm3(uchar hang,uchar add,uint date)
{
 if(hang==1)  
  write_com(0x80+add);
 else
  write_com(0x80+0x40+add);
 write_data(0x30+date/100);
 write_data('.');
 write_data(0x30+date/10);
 write_data(0x30+date); 
}



void init_1602()      //1602初始化
{
 write_com(0x38);
 write_com(0x0c);
 write_com(0x06);
 delay_uint(1000);
 write_string(1,0,"  juli:0.00m      ");
 write_string(2,0,"   set:0.00m      ");
}

 


uchar key_can;  //按键值

void key()  //独立按键程序
{
 static uchar key_new;
 key_can = 20;    //按键值还原
 P3 |= 0xf0;
 if((P3 & 0xf0) != 0xf0)  //按键按下
 {
  delay_1ms(1);       //按键消抖动
  if(((P3 & 0xf0) != 0xf0) && (key_new == 1))
       //确认是按键按下
   key_new = 0;
   switch(P3 & 0xf0)
   {
    case 0xd0:  key_can = 3;  break;  //得到按键值
    case 0xb0:  key_can = 2;  break;  //得到按键值
    case 0x70:  key_can = 1;  break;  //得到按键值
   }
//   write_sfm2(1,0,key_can);     //显示按键值
    
 }
 else
 {
  key_new = 1;  
 
}



void delay()
{
 _nop_();              //执行一条_nop_()指令就是1us
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_(); 
 _nop_();
 _nop_();
 _nop_(); 
 _nop_();
}



void send_wave()
{
 c_send = 1;             //10us的高电平触发
 delay();
 c_send = 0; 
 TH0 = 0;            //给定时器0清零
 TL0 = 0;
 TR0 = 0;      //关定时器0定时
 while(!c_recive);    //当c_recive为零时等待
 TR0=1;
 while(c_recive)        //当c_recive为1计数并等待
 {
  flag_time0 = TH0 * 256 + TL0;
  if((flag_time0 > 40000))      //当超声波超过测量范围时,显示3个888
  {
   TR0 = 0;
   flag_csb_juli = 2;
   distance = 888;
   break ;  
  }
  else
  {
   flag_csb_juli = 1; 
  }
 }
 if(flag_csb_juli == 1)
 
  TR0=0;        //关定时器0定时
  distance =flag_time0;    //读出定时器0的时间
  distance *= 0.017;               // 0.017 = 340M / 2 = 170M = 0.017M 算出来是米
  if((distance > 500))     //距离 = 速度 * 时间
  
   distance = 888;     //如果大于3.8m就超出超声波的量程
  }
 
}



void time_init()  
{
 EA  = 1;     //开总中断
 TMOD = 0X11;   //定时器0、定时器1工作方式1
 ET0 = 0;    //关定时器0中断
 TR0 = 1;    //允许定时器0定时
 ET1 = 1;    //开定时器1中断
 TR1 = 1;    //允许定时器1定时 
}


void key_with()
{
 if(key_can == 1)  //设置键
 {
  menu_1 ++;
  if(menu_1 >= 2)
  {
   menu_1 = 0;
   init_1602() ;     //1602初始化
   write_sfm3(2,7,set_d);  //显示设置的距离
  }
 }
 if(menu_1 == 1)   //设置距离报警
 {
  if(key_can == 2)
  {
   set_d ++ ;  //按键按下未松开自动加三次 
   if(set_d > 400)
    set_d = 400;
  }
  if(key_can == 3)
  {
   set_d -- ;  //按键按下未松开自动加三次 
   if(set_d <= 1)
    set_d = 1;
  }
  write_sfm3(2,7,set_d);  //显示设置的距离
  write_com(0x80+0x40+6);  //将光标显示地址
  write_com(0x0f);         //显示光标并且闪烁
  write_eeprom();  //保存数据
 


void clock_l()   //下限报警函数   距离超近  声音超快
{
 static uchar value,value1;
 if(distance <= set_d)
 {
  value ++;  //消除实际距离在设定距离左右变化时的干扰
  if(value >= 2)
  {
   value1 ++;
   if(value1 >= distance * 2)   //这里是控制报警声越来越快
   {
    value1 = 0;
    beep = ~beep;  //蜂鸣器报警
   }
  }
 }
 else
 {
  value = 0;
  beep = 1;
 

}


void main()
{
 init_1602();      //1602初始化
 beep = 0;   //开机蜂鸣器响一下
 delay_1ms(200);
 P0 = P1 = P2 = P3 = 0xff;  //单片机IO口初始化为1
 send_wave(); //测距离函数
 time_init();
 init_eeprom();  //读eepom数据
 write_sfm3(2,7,set_d);  //显示设置的距离
 send_wave(); //测距离函数
 send_wave(); //测距离函数
 while(1)
 {
  if(flag_300ms == 1)
  {
   flag_300ms = 0;
   if(beep == 1)
    send_wave(); //测距离函数
   if(menu_1 == 0)
    write_sfm3(1,7,distance);  //显示距离
  }
  key();      //按键函数
  if(key_can < 10)
  {
   key_with();    //按键处理函数
  }
 }
}
  


void time1_int() interrupt 3

 static uchar value;    //定时10ms中断一次
 TH1 = 0xf8;
 TL1 = 0x30;     //2ms
 value++;
 clock_l();   //下限报警函数   距离超近  声音超快
 if(value >= 150)
 {
  value = 0;
  flag_300ms = 1;
 }
}

关键字:HC-SR04  超声波测距  51单片机 引用地址:HC-SR04超声波测距模块电路设计

上一篇:51单片机最小系统电路设计
下一篇:步进电机变频技术的应用

推荐阅读最新更新时间:2024-03-16 14:31

AT89S51引脚图,AT89S51单片机引脚说明及管脚定义
AT89S51引脚图,AT89S51单片机引脚说明及管脚定义 AT89S51引脚图 AT89S51是一个低功耗,高性能CMOS 8位单片机,片内含4k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS -51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89S51可为许多嵌入式控制应用系统提供高性价比的解决方案。 AT89S51具有如下特点:40个引脚,4k Bytes Flash片内程序存储器,128 byte
[模拟电子]
AT89S51引脚图,AT89S<font color='red'>51单片机</font>引脚说明及管脚定义
51单片机实现智能泊车系统的设计方法
本文主要讲述用51单片机实现智能泊车系统,该智能泊车系统可以在实验室内实现小车的自动驶入指定停车位的功能。将小车停在停车场入口处,然后车主可以离开小车,此时小车就可以根据停车场内的车辆诱导信号(光源引导信号)将车引入停车场,从而实现自动泊车过程。 随着我国汽车数量逐年急剧增多,泊车位、停车场的数量却跟不上其增长的步伐,越来越多的人为如何泊车而发愁。日益拥挤的泊车环境要求人们对汽车的泊车技术更加地娴熟,这就更加重了人们工作之外的紧张情绪,降低了人们的生活质量。因此,如何解决泊车过程中的不便利,消除安全隐患,迅速、准确、安全地将汽车停靠到合适的位置,逐渐引起了人们的关注。 一、系统的工作原理及功能 智能泊车系统可分为控制部
[单片机]
<font color='red'>51单片机</font>实现智能泊车系统的设计方法
如何将UCOSII移植到51单片机
一、准备工作 1. 开发环境: Keil C集成开发环境 2. 源代码:UCOSII的源代码,网上可以自己下载 3. 文件分析: 1)UCOSII文件中与处理器无关的文件: OS_CORE.C OS_FLAG.C OS_MBOX.C OS_MEM.C OS_MUTEX.C OS_Q.C OS_SEM.C OS_TASK.C OS_TIME.C UCOS_II.C UCOS_II.H 以上这些文件在c51移植过程中只需给函数加上可重入性即可,即在每个函数后面添加关键字:reentrant 2)与应用相关的文件: INCLUDES.H——其中包含51单片机头文件和相关应用头文件 OS_CFG.H——这个文件对于要应用系统中的相关工
[单片机]
如何将UCOSII移植到<font color='red'>51单片机</font>上
51单片机的定时器中断(寄存器)
中断是为使单片机具有对外部或内部随机发生的事件进行处理而设置的。51单片机有5种中断源,即有5种对应的情况发生时会使单片机去处理中断程序(中断函数)。 此篇主要整理定时器中断笔记。采用定时器中断会涉及中断寄存器,定时器/计数器相关寄存器(TCON,TMOD),中断函数等知识点。 其中,中断寄存器,定时器/计数器相关寄存器本身或者相关位用来做初始化,中断函数的内容主要是体现发生中断后所需要的操作(在中断函数内写代码)。 1.中断允许寄存器IE 图1.中断寄存器IE 中断寄存器用来设定各个中断源的打开和关闭,IE在特殊功能寄存器中,字节地址为A8H,位地址(由低位到高位)分别是A8H~AFH,该寄存器运行位寻址,即可对该
[单片机]
<font color='red'>51单片机</font>的定时器中断(寄存器)
51单片机C51精确延时
如下程序能实现ms级的比较精确的延时: void Delayms(unsigned int n) { unsigned int i,j; for(j=n;j 0;j--) for(i=112;i 0;i--); } 用keil可以看出这个延时的时间,我们先延时1ms(Delayms(1))。 进入Delayms前,sec=0.00042209s 延时后,sec=0.00142253s 可以知道Delayms(1)实际延时0.00142253s 0.00042209s=0.00100044s 1ms 同样如果想延时15ms的话,用Delayms(15),实际延时0.01480903s 15ms
[单片机]
<font color='red'>51单片机</font>C51精确延时
51单片机串口实验时波特率怎么调才合适
一般而言,波特率的高低与串口传输距离和使用环境有关,距离越远,波特率一般越低,使用环境干扰越大,波特率越低,如果是在同一块板上的串口通讯,可以做到很高,比如115200bps,另外最好使用11.0592M之类的晶振,这样标准波特率可以做到没有误差。 通过我的使用经验,一般RS232传输距离在1米以内的话,115200bps的波特率是没有什么问题的。10米以内的话9600bps肯定可以稳定传输(关键是要保证电压,也就是解决压降的问题。)。超过10米的话最好用485了。
[单片机]
MCS-51单片机的中央处理器CPU介绍
MCS-51单片机的中央处理器CPU由运算器和控制逻辑构成,其中包括若干特殊功能寄存器(SFR)。 一、以ALU为中心的运算器 算术逻辑单元ALU能对数据进行加、减、乘、除等算术运算;“与”、“或”、“异或”等逻辑运算以及位操作运算。 PSW的格式如图1-3所示,其各位的含义是: 图1-3 PSW的格式 CY:进位标志。有进位/借位时CY=1,否则CY=0; AC:半进位标志。当D3位向D4位产生进位/借位时AC=1,常用于十进制调整运算中; F0:用户可设定的标志位,可置位/复位,也可供测试。 RS1、RS0:四个通用寄存器组的选择位,该两位的四种组合状态用来选择0~3寄存器组。见表1-2。 OV:
[单片机]
MCS-<font color='red'>51单片机</font>的中央处理器CPU介绍
基于ADS8343及51单片机的多路采集系统
    ADS8343是TI公司的16位4路伪差分模数转换芯片,具有分辨率高、转换速度快(最快10μs)、串行接口传输节省I/O口资源等优势,结合常用的51单片机可方便搭建多路采集系统。 1 ADS8343引脚     ADS8343是16位分辨率AD转换器,具有片内系统时钟,4路(单端)模拟输入通道,采样率最高可达100kbps,伪差分输入双极性输出。     ADS8343的引脚排列如图1所示。引脚功能简述如下:     +VCC:电源端,+2.7~+5V;     CH0~CH3:模拟信号输入端;     COM:模拟输入的公共参考端,一般连接到VREF;     :关闭端。当为低电平时,器件进入低耗电关闭模式;   
[单片机]
基于ADS8343及<font color='red'>51单片机</font>的多路采集系统
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved