基于52单片机的超声波测距模块(hc-sr04超声波测距模块+1602液晶显示器)
二年级课设做了超声波测障仪,用的是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液晶显示器)相关推荐
- 基于52单片机的简易感应开关垃圾桶
一.基于52单片机的简易开关垃圾桶,感应,震动,按键开盖 1.使用超声波模块,设置10cm感应范围,进入范围开盖 2.使用震动传感器,检测到震动开盖 3.使用蜂鸣器,开盖同时伴随滴滴声 4.实验视频- ...
- 基于52单片机的小型电扇控制系统
文章目录 前言 基本功能 器件 结构 系统结构图 Proteus 原理图 Altium Designer 原理图 程序流程图 主函数 中断 硬件资源分配 原理详述 直流电机控制 按键检测 数码管,LE ...
- 51单片机开发实例 基于52单片机的远程开锁系统
一.系统设计 按下开锁按键,HC-12发射端就会将开锁指令上传到HC-12接收端,接收端会将数据传输到单片机中,单片机会控制继电器开锁.同理按下关锁按键,通过两个远程通信模块和关锁按键就能实现远程关锁 ...
- 单片机c语言编程 时钟加日历转换,基于52单片机电子时钟日历系统的设计
该系统是以52单片机为基础,以时钟日历芯片DSl2887为核心构建的时钟系统.完成的功能如下:显示年.月.日.星期.小时.分钟.秒钟,具有1OO年的日历,具有掉电不丢失性,能够通过按键调整时间.DS1 ...
- 51单片机开发实例 基于52单片机的智能温湿控制
一.系统设计 智能温湿度控制系统内使用DHT11数字温湿度传感器实现温湿度的采集,采集的温湿度数据会在LCD1602显示屏上显示,通过按键可以设定温湿度的阈值,当实际的温湿度超过阈值,系统会通过继电器 ...
- 51单片机开发设计 基于52单片机的电子琴
一.系统设计 8个按键可以弹奏8个音符,蜂鸣器可以播放按键弹奏的音乐,数码管会显示相应的音符,通过无线模块可以将按下的音阶数据上传到上位机端并进行显示,可以按照乐谱进行音乐演奏,在与上位机进行通信时会 ...
- 51单片机开发实例 基于52单片机的简易温度采集系统
一.系统设计 通过DS18B20温度采集模块进行环境温度数据的采集,并在数码管上对实时温度进行显示. 二.硬件设计 三.软件设计 四.实物展示 五.资料内容 六.资料链接 资料链接:https://p ...
- 利用52单片机制作的超声波避障小车(包含所有源码)
做这个超声波避障小车的原因是因为单片机课程设计 一.硬件部分 1.电机驱动 电机驱动四个输入端IN1.IN2.IN3和IN4,四个输出端OUT1.OUT2.OUT3和OUT4,一个接地端GND,单片机 ...
- 单片机数字定时闹钟设计c语言,电子设计 基于51单片机的定时闹钟设计.doc
电子设计 基于51单片机的定时闹钟设计 课件之家精心整理资料--欢迎你的欣赏 课件之家精心整理资料--欢迎你的欣赏 摘 要 单片计体积小.能耗低.成本低.功能强,广泛应用于智能产品和工业自动化上.本次 ...
最新文章
- 中国科学家将绘制最精细人脑三维“地图”
- python中time的用法_python中的计时器timeit的使用方法
- windows环境下搭建rabbitMQ开发环境
- Harbor Docker 镜像仓库搭建
- U盘从4G变为了75M 恢复U盘容量的方法
- 在.net 2.0中使用了masterpager 重写WebForm_OnSubmit()
- 【C++深度剖析教程5】C++中类的静态成员函数
- 第5课 开心的金明《聪明人的游戏:信息学探秘.提高篇》(优化空间)
- MySQL企业级主从复制
- JavaScript 编程精解 中文第三版 十三、浏览器中的 JavaScript
- 中国象棋源码c语言,中国象棋C语言源代码.doc
- 分享168套HTML个人博客模板---总有一个是你想要的
- 微信小程序css方式animation动画弹幕实现
- 高德地图 地图点击获取经纬度,经纬度格式判断
- python seek(0)_seek() 方法
- css中如何使div元素居中垂直水平居中
- ISO 8583协议-银行交易的标准
- UE-c++规范命名
- 手机wifi显示未连接服务器,客户端显示wifi未连接到服务器
- 爱企查显示,Keep赴港上市,冲击“线上健身第一股”