二年级课设做了超声波测障仪,用的是hc-sr04超声波测距模块+1602液晶显示器和52单片机。

由于自己之前的学习很是不牢固,在课设的时候没少走弯路,最后在第二个周的星期五做了出来,浪费了很多的时间,所以就想着把这个东西写出来,一则加强自己的理解,二则或许能帮助帮助别人。

HC-SR04超声波模块工作原理

 (1).采用IO口触发测距,给至少10us高电平脉冲;

(2).模块自动发送八个40khz方波,并自主检测是否有电波返回;

(3)当有信号返回时,通过IO口输出一个高电平,高电平的持续时间就是超声波从发送到返回的时间;

(4)测距公式:距离=(高电平时间*声速)/2;

(5)超声波模块时序图如图6所示:

图6:超声波模块时序图

(模块的原理很重要,只有把原理弄懂了才能很好地做出来你想要的东西)

程序的核心在于中断,即单片机内部的计数器中断。

具体的程序分为两个部分:1602显示部分和主程序(见下)

1602程序,基本上都是一些简单的时序问题。

首先对1602进行初始化,定义1602对应接口的接线方式。然后进行写命令,写数据操作,最后将得到的距离数(3位数,以cm为单位)按照个十百分为三个单独的数字输出到液晶显示器上,最后输出单位cm。

#include "lcd.h"

/*******************************************************************************
* 函 数 名         : Lcd1602_Delay1ms
* 函数功能    : 延时函数,延时1ms
* 输    入         : c
* 输    出         : 无
* 说    名         : 该函数是在12MHZ晶振下,12分频单片机的延时。
*******************************************************************************/

void Lcd1602_Delay1ms(uint c)   //误差 0ms
{
    uchar a,b;
for (; c>0; c--)
{
for (b=199;b>0;b--)
{
  for(a=1;a>0;a--);
}      
}
   
}

/*******************************************************************************
* 函 数 名         : LcdWriteCom
* 函数功能    : 向LCD写入一个字节的命令
* 输    入         : com
* 输    出         : 无
*******************************************************************************/
#ifndef LCD1602_4PINS //当没有定义这个LCD1602_4PINS时
void LcdWriteCom(uchar com)   //写入命令
{
LCD1602_E = 0;     //使能
LCD1602_RS = 0;    //选择发送命令
LCD1602_RW = 0;    //选择写入

LCD1602_DATAPINS = com;     //放入命令
Lcd1602_Delay1ms(1); //等待数据稳定

LCD1602_E = 1;           //写入时序
Lcd1602_Delay1ms(5);   //保持时间
LCD1602_E = 0;
}
#else 
void LcdWriteCom(uchar com)   //写入命令
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 0; //选择写入命令
LCD1602_RW = 0; //选择写入

LCD1602_DATAPINS = com; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
Lcd1602_Delay1ms(1);

LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;

LCD1602_DATAPINS = com << 4; //发送低四位
Lcd1602_Delay1ms(1);

LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 数 名         : LcdWriteData
* 函数功能    : 向LCD写入一个字节的数据
* 输    入         : dat
* 输    出         : 无
*******************************************************************************/    
#ifndef LCD1602_4PINS    
void LcdWriteData(uchar dat) //写入数据
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //选择输入数据
LCD1602_RW = 0; //选择写入

LCD1602_DATAPINS = dat; //写入数据
Lcd1602_Delay1ms(1);

LCD1602_E = 1;   //写入时序
Lcd1602_Delay1ms(5);   //保持时间
LCD1602_E = 0;
}
#else
void LcdWriteData(uchar dat) //写入数据
{
LCD1602_E = 0;   //使能清零
LCD1602_RS = 1;   //选择写入数据
LCD1602_RW = 0;   //选择写入

LCD1602_DATAPINS = dat; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
Lcd1602_Delay1ms(1);

LCD1602_E = 1;   //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;

LCD1602_DATAPINS = dat << 4; //写入低四位
Lcd1602_Delay1ms(1);

LCD1602_E = 1;   //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 数 名       : LcdInit()
* 函数功能 : 初始化LCD屏
* 输    入       : 无
* 输    出       : 无
*******************************************************************************/    
#ifndef LCD1602_4PINS
void LcdInit()   //LCD初始化子程序
{
  LcdWriteCom(0x38);  //开显示
LcdWriteCom(0x0c);  //开显示不显示光标
LcdWriteCom(0x06);  //写一个指针加1
LcdWriteCom(0x01);  //清屏
LcdWriteCom(0x80);  //设置数据指针起点
}
#else
void LcdInit()   //LCD初始化子程序
{
LcdWriteCom(0x32); //将8位总线转为4位总线
LcdWriteCom(0x28); //在四位线下的初始化
LcdWriteCom(0x0c);  //开显示不显示光标
LcdWriteCom(0x06);  //写一个指针加1
LcdWriteCom(0x01);  //清屏
LcdWriteCom(0x80);  //设置数据指针起点
}

#endif

主程序:主程序的核心在于中断

首先对于单片机的IO口进行初始化,1602液晶显示器的初始化,超声波模块的初始化。初始化的同时打开了定时器,同时内部中断打开并开始计数操作,待超声波的输入端接收到返回波之后关闭内部中断,停止计数,接下来通过记到的时间计算被测物的距离(s=time*340/2m)。

/**************************************************************************************
*               LCD1602液晶显示超声波测试的距离   *
实现现象:下载程序后插上LCD1602液晶在开发板上,即可显示
  
***************************************************************************************/

#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
#include "lcd.h"
#include "intrins.h"

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

sbit Trig = P2^1;
sbit Echo = P2^0;

sbit key =P1^1; 
sbit key1 = P3^2;
sbit led = P1^0;

u16 time = 0,S = 0;

/*******************************************************************************
* 函 数 名         : main
* 函数功能    : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

void Time_Init()
{
TMOD=0x01;    //设T0为方式1,GATE=1;
TH0=0;
TL0=0;  
EA=1;
TR0 = 0;        
}

void Conut(void)
{
  Trig=1;                      //启动一次模块
  _nop_(); 
  _nop_(); 
  _nop_(); 
  _nop_(); 
  _nop_(); 
  _nop_(); 
  _nop_(); 
  _nop_(); 
  _nop_(); 
  _nop_(); 
  _nop_(); 
  _nop_(); 
  _nop_(); 
  _nop_(); 
  _nop_(); 
  _nop_();
  Trig=0;
  while(!Echo);
      TR0=1;    
  while(Echo);
    TR0=0; 
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.7)/100;     //算出来是CM
}

void delayms(u16 xms)
{
u8 i,j;
for(i=0;i<110;i++)
   for(j=0;j<xms;j++);  
}

void main(void)
{
  Time_Init();
  LcdInit();
  while(1)
  {
     Conut();
LcdWriteData((S/100)+0x30);
LcdWriteData((S/10)%10+0x30);
      LcdWriteData((S%10)+0x30);
LcdWriteData('C');
LcdWriteData('M');
delayms(20);
LcdWriteCom(0x80);  //设置数据指针起点
}
}

void Time0() interrupt 1
 {
    Echo = 1;

}

硬件仿真图如下:



希望对你有些帮助。。。

基于52单片机的超声波测距模块(hc-sr04超声波测距模块+1602液晶显示器)相关推荐

  1. 基于52单片机的简易感应开关垃圾桶

    一.基于52单片机的简易开关垃圾桶,感应,震动,按键开盖 1.使用超声波模块,设置10cm感应范围,进入范围开盖 2.使用震动传感器,检测到震动开盖 3.使用蜂鸣器,开盖同时伴随滴滴声 4.实验视频- ...

  2. 基于52单片机的小型电扇控制系统

    文章目录 前言 基本功能 器件 结构 系统结构图 Proteus 原理图 Altium Designer 原理图 程序流程图 主函数 中断 硬件资源分配 原理详述 直流电机控制 按键检测 数码管,LE ...

  3. 51单片机开发实例 基于52单片机的远程开锁系统

    一.系统设计 按下开锁按键,HC-12发射端就会将开锁指令上传到HC-12接收端,接收端会将数据传输到单片机中,单片机会控制继电器开锁.同理按下关锁按键,通过两个远程通信模块和关锁按键就能实现远程关锁 ...

  4. 单片机c语言编程 时钟加日历转换,基于52单片机电子时钟日历系统的设计

    该系统是以52单片机为基础,以时钟日历芯片DSl2887为核心构建的时钟系统.完成的功能如下:显示年.月.日.星期.小时.分钟.秒钟,具有1OO年的日历,具有掉电不丢失性,能够通过按键调整时间.DS1 ...

  5. 51单片机开发实例 基于52单片机的智能温湿控制

    一.系统设计 智能温湿度控制系统内使用DHT11数字温湿度传感器实现温湿度的采集,采集的温湿度数据会在LCD1602显示屏上显示,通过按键可以设定温湿度的阈值,当实际的温湿度超过阈值,系统会通过继电器 ...

  6. 51单片机开发设计 基于52单片机的电子琴

    一.系统设计 8个按键可以弹奏8个音符,蜂鸣器可以播放按键弹奏的音乐,数码管会显示相应的音符,通过无线模块可以将按下的音阶数据上传到上位机端并进行显示,可以按照乐谱进行音乐演奏,在与上位机进行通信时会 ...

  7. 51单片机开发实例 基于52单片机的简易温度采集系统

    一.系统设计 通过DS18B20温度采集模块进行环境温度数据的采集,并在数码管上对实时温度进行显示. 二.硬件设计 三.软件设计 四.实物展示 五.资料内容 六.资料链接 资料链接:https://p ...

  8. 利用52单片机制作的超声波避障小车(包含所有源码)

    做这个超声波避障小车的原因是因为单片机课程设计 一.硬件部分 1.电机驱动 电机驱动四个输入端IN1.IN2.IN3和IN4,四个输出端OUT1.OUT2.OUT3和OUT4,一个接地端GND,单片机 ...

  9. 单片机数字定时闹钟设计c语言,电子设计 基于51单片机的定时闹钟设计.doc

    电子设计 基于51单片机的定时闹钟设计 课件之家精心整理资料--欢迎你的欣赏 课件之家精心整理资料--欢迎你的欣赏 摘 要 单片计体积小.能耗低.成本低.功能强,广泛应用于智能产品和工业自动化上.本次 ...

最新文章

  1. 中国科学家将绘制最精细人脑三维“地图”
  2. python中time的用法_python中的计时器timeit的使用方法
  3. windows环境下搭建rabbitMQ开发环境
  4. Harbor Docker 镜像仓库搭建
  5. U盘从4G变为了75M 恢复U盘容量的方法
  6. 在.net 2.0中使用了masterpager 重写WebForm_OnSubmit()
  7. 【C++深度剖析教程5】C++中类的静态成员函数
  8. 第5课 开心的金明《聪明人的游戏:信息学探秘.提高篇》(优化空间)
  9. MySQL企业级主从复制
  10. JavaScript 编程精解 中文第三版 十三、浏览器中的 JavaScript
  11. 中国象棋源码c语言,中国象棋C语言源代码.doc
  12. 分享168套HTML个人博客模板---总有一个是你想要的
  13. 微信小程序css方式animation动画弹幕实现
  14. 高德地图 地图点击获取经纬度,经纬度格式判断
  15. python seek(0)_seek() 方法
  16. css中如何使div元素居中垂直水平居中
  17. ISO 8583协议-银行交易的标准
  18. UE-c++规范命名
  19. 手机wifi显示未连接服务器,客户端显示wifi未连接到服务器
  20. 爱企查显示,Keep赴港上市,冲击“线上健身第一股”

热门文章

  1. vue props type设置多个类型,默认值
  2. STM32 IAP 串口在线升级源码详解
  3. C#EventHandler用法
  4. RPC基础之负载均衡算法一文全搞懂
  5. 蓝牙开发(一)----- 基于蓝牙Ble的Android应用开发
  6. 社交口才艺术:如何成为一个会说话的人
  7. java8 LocalTime的使用方法
  8. Unity制作RPG游戏——相机的设计与实现
  9. Java项目:微信小程序商城+后台管理系统
  10. 视频管理服务器维护内容,视频管理服务器