郭天祥51开发板——超声波测距+lcd1602

这篇博客介绍了如何使用单片机和HC-SR04超声波模块进行测距,并将结果显示在LCD1602显示屏上。通过脉冲回波法测量超声波往返时间,计算出距离。当测量值超出5~400cm范围时,LCD显示警告并伴有蜂鸣器报警。同时,测距数据还通过串口发送到电脑。
摘要由CSDN通过智能技术生成

使用超声波模块实现测距功能,测量结果显示在LCD1602上、并通过串口发送给电脑,测量距离大于或小于5~400cm,LCD1602显示“Waring!”同时蜂鸣器报警、串口发送“Waring”。

超声波测距原理

超声波测距的方法有很多种,最常用的是脉冲回波法。原理框图如图,
在这里插入图片描述
超声波传感器发射超声波,在空气中传播至被测目标,经反射后由超声波传感器接收反射脉冲,测量出超声波脉冲从发射到接收的时间,经过计算 S=1/2vt 可以得到距离。h较小时,S≈d ,所以通过测量超声波往返时间,就可以计算出距离长短。

HC-SR04模块

工作原理:采用IO触发测距,给trig至少10us的高电平信号;
模块自动发送8个40khz的方波,自动检测是否有信号返回;有信号返回,通过IO输出一高电平,高电平持续的时间就是超声波从发射到返回的时间。
时序图如下图所示:
在这里插入图片描述
具体实现,控制口发一个10us以上的高电平,就可以在接收口等待高电平输出。一有输出就可以开定时器计时,当接收口变为低电平时就可以读定时器的值,此时就为此次测距的时间,从而算出距离。如此不断地周期测量,就可以达到移动测量的值。

代码
#include<reg52.h>	
#include<intrins.h>
sbit trig=P1^1;		                //控制端口定义
sbit echo=P1^0;		                //接收端口定义
sbit RS=P3^5;	                    //lcd1602数据/命令端
sbit EN=P3^4; 	                    //使能端
sbit U1=P2^6;                       //数码管段选
sbit U2=P2^7;                       //数码管位选
sbit bi=P2^3;                       //buzz

unsigned char str[]={
   "Distance:"};      //lcd显示字符串
unsigned char juli[]={
   "0000cm"};        //lcd距离显示字符串
unsigned char change[]={
   "\r\n"};        //串口打印换行符
unsigned char jg[]={
   "Waring"};          //串口打印
unsigned int time;	                    //时间
unsigned long s;	                    //距离
bit flag=0;                             //标志位(定时器)
bit flag1=0;                            //标志位(串口打印)

void delayms(unsigned int xms);         //延时
void buzz();                            //蜂鸣器
void wcmd
  • 7
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
如果您使用的是郭天祥51开发板,并且想要让数码管循环三次,可以使用以下代码实现: ```c #include <reg51.h> #include <intrins.h> // 使用 _nop_ 函数需要引入此头文件 sbit D1 = P2^0; // 数码管第一位 sbit D2 = P2^1; // 数码管第二位 sbit D3 = P2^2; // 数码管第三位 sbit D4 = P2^3; // 数码管第四位 sbit A = P2^4; // 数码管 A 线 sbit B = P2^5; // 数码管 B 线 sbit C = P2^6; // 数码管 C 线 sbit D = P2^7; // 数码管 D 线 unsigned char digit[10] = { 0xC0, // 0 0xF9, // 1 0xA4, // 2 0xB0, // 3 0x99, // 4 0x92, // 5 0x82, // 6 0xF8, // 7 0x80, // 8 0x90 // 9 }; void display(unsigned char dat) { A = (dat & 0x01); // 取出二进制的最低位 B = (dat & 0x02) >> 1; // 取出二进制的第二位 C = (dat & 0x04) >> 2; // 取出二进制的第三位 D = (dat & 0x08) >> 3; // 取出二进制的最高位 } int main() { int i, j; while (1) { for (j = 0; j < 3; j++) { for (i = 0; i < 10; i++) { D1 = 1; // 打开第一位数码管 display(digit[i]); // 显示数字 i _nop_(); D1 = 0; // 关闭第一位数码管 D2 = 1; // 打开第二位数码管 display(digit[i]); // 显示数字 i _nop_(); D2 = 0; // 关闭第二位数码管 D3 = 1; // 打开第三位数码管 display(digit[i]); // 显示数字 i _nop_(); D3 = 0; // 关闭第三位数码管 D4 = 1; // 打开第四位数码管 display(digit[i]); // 显示数字 i _nop_(); D4 = 0; // 关闭第四位数码管 } } } return 0; } ``` 以上代码使用了 74LS47 芯片进行数码管的驱动。其中,`digit` 数组中存储了数字 0 到 9 对应的二进制编码。在循环中,依次显示 0 到 9,循环三次。为了防止数码管闪烁,使用了 `_nop_()` 函数进行短暂的延时。 希望这个回答能够帮助到您。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值