51单片机超声波测距和报警+Proteus仿真

news/2024/11/28 17:43:22/

系统描述

基于51单片机超声波测距和报警,采用HC-SR04测距,数码管显示测量距离。按键设置报警上下限,超限报警。

源码下载地址:51单片机超声波测距和报警+Proteus仿真

硬件设计

仿真图1:
在这里插入图片描述

仿真图2:
在这里插入图片描述

程序设计

部分程序

#include "task.h"extern unsigned int S;	//声明距离缓存变量,在文件"task.c"中定义
extern unsigned int dis_buf[4];	//声明显示缓存数组,在文件"task.c"中定义
extern unsigned int code duan_ma[16];
extern unsigned int S_H, S_L;	//S_H:报警上限值,默认400cm,S_L:报警下限值,默认10cm/* 主函数 */
void main(void)
{digDuan = 0x40;		//显示"----"digWei1 = 0;digWei2 = 0;digWei3 = 0;digWei4 = 0;delayms(1000);		//延时大约1s InitTimer0();		//定时器0初始化while(1){count();					//计算距离if(S>=S_H || S<=S_L)		//如果超出设定的范围,则显示"---"{dis_buf[3] = 0x00;dis_buf[2] = 0x40; 		//显示"---"dis_buf[1] = 0x40;dis_buf[0] = 0x40;	BEEP = 0;			//蜂鸣器鸣叫delayms(1000);}else{BEEP = 1;			//关闭蜂鸣器dis_distance();		//显示距离}if(key_scan() == 1)		//如果按下设置键,则进入设置报警功能{BEEP = 0;			//按键提示音delayms(50);BEEP = 1;delayms(100);key_fuction();		//进入设置报警功能}			}
}

key.h

#include "key.h"/* 按键延时函数,单位:ms */
static void key_delayms(unsigned int ms)
{unsigned char a,b,c;while(--ms){for(c=1;c>0;c--)for(b=142;b>0;b--)for(a=2;a>0;a--);}
}
/* 按键扫描 */
unsigned char key_scan(void)
{if(KEY1 == 0)			//如果按键1按下{key_delayms(10);	//延时10ms,去除按键抖动if(KEY1 == 0)		//再判断一次按键按下{return 1; 		//输出键值1}	}if(KEY2 == 0)		//如果按键2按下{key_delayms(10);	//延时10ms,去除按键抖动if(KEY2 == 0)		//再判断一次按键按下{return 2; 		//输出键值2}}if(KEY3 == 0)		//如果按键3按下{key_delayms(10);	//延时10ms,去除按键抖动if(KEY3 == 0)		//再判断一次按键按下{return 3; 		//输出键值3}}return 0;				//如果没有按键按下,则输出0
}

task.c

#include "task.h"//全局变量定义
//段码表,适用于共阴数码管
unsigned int code duan_ma[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,		//0~90x77,0x7c,0x39,0x5e,0x79,0x71};	//A~F
unsigned int dis_buf[4];			//显示缓存unsigned int S = 0;					//距离缓存变量
unsigned long time = 0;				//时间缓存变量 
unsigned int S_H = 400, S_L = 10;	//S_H:报警上限值,默认400cm,S_L:报警下限值,默认10cm/* 延时,单位:ms */
void delayms(unsigned int ms)
{unsigned char a,b,c;while(--ms){for(c=1;c>0;c--)for(b=142;b>0;b--)for(a=2;a>0;a--);	}
}

timer.c

#include "timer.h"extern unsigned int dis_buf[4];/* 定时器0初始化,定时1ms */
void InitTimer0(void)
{TMOD = 0x11;	//配置定时器0为工作方式1,定时器1位工作方式1TH0 = 0;TL0 = 0;TH1 = 0x0EC;	//定时5msTL1 = 0x78;EA = 1;			//打开总中断ET1 = 1;		//打开定时器0中断TR1 = 1;		//打开定时器1TR0 = 0;		//打开定时器0
}
/* 定时器0中断服务函数,5ms进一次本中断,用于数码管扫描 */
void Timer1Interrupt(void) interrupt 3
{TH1 = 0x0EC;		//定时5ms,重新赋值TL1 = 0x78;dig_scan(dis_buf);	//数码管显示温度
}

http://www.ppmy.cn/news/516563.html

相关文章

双目相机视差测距

文章目录 1.测距公式2.参数解析3.备注信息 1.测距公式 双目测距公式&#xff1a;disf*b/disp 2.参数解析 dis:距离信息&#xff0c;描述相机到目标点深度数据 f:相机焦距&#xff0c;焦距信息为像素距离 b:双目相机之间距离&#xff08;厘米&#xff09; disp:视差矩阵 3.备…

单目测距 视觉测距

文章目录 单目测距在kitti数据集中的测试结果C工程原理代码注释 其他视觉测距算法-基于相似三角形的单目测距算法原理代码 参考资料 单目测距 在kitti数据集中的测试结果 C工程 C工程代码下载地址。 原理 主要的思想就是借鉴3D Bounding Box Estimation Using Deep Learning…

FPGA开源项目:双目测距(一)之双目图像采集显示以及图片保存

1.简述 这个项目是大三下学期暑假(也就是2019年8份&#xff09;完成的&#xff0c;当时的视频效果已发布在bilibili上&#xff0c;这是我们的省级的科研立项&#xff0c;其实就我一个人负责完成。发布bilibili后很多人比较感兴趣&#xff0c;打算年初回学校完成毕设期间开源的…

双目相机测距代码演示

双目测距的操作流程有四步&#xff1a;相机标定——双目校正——双目匹配——计算深度&#xff0c;具体内容参考 &#xff1a; https://blog.csdn.net/qq_38236355/article/details/88933839 其中相机标定通常用matlab现成的工具箱进行标定&#xff0c;具体操作参考&#xff1…

FMCW雷达测距实验

目录 1. FMCW雷达基本原理1.1 基本结构与原理 2. L波段FMCW雷达的基本介绍2.1 参数配置2.2 数据采集板2.3 雷达测距实验2.4 干扰机实验 本文介绍如何设计FMCW雷达测距实验。 1. FMCW雷达基本原理 1.1 基本结构与原理 雷达系统所用信号的频率随时间变化呈线性升高&#xff0c;这…

激光测距仪系统设计 c语言程序),激光测距仪系统设计(机械图,电路图,c语言程序)...

激光测距仪系统设计(机械图,电路图,c语言程序)(毕业论文22000字,cad图纸,答辩ppt) 摘 要 本次激光测距仪系统设计采用的是相位式测距法,相位激光测距又称调幅连续波激光测距通常是基于对目标回波相位的探测,在诸如军事、航空、工业和体育等领域已经取得广泛的应用。相位激光测…

红外测距模块 51单片机_智能激光测距

编者按:本文转载于酷耍(http:/kooshua.com) 一、设计目的 超声波测距和激光测距是现在比较常见的两种测距方式。两种方式相对比而言,激光测距的优点是以极小的一束激光发射出去再返回,精度为毫米级,几乎不受干扰,弥补了超声波测距易受环境干扰、误差大的缺陷。因此,采用激…

利用android手机摄像头智能测量物体距离,高度

经过在下调研了利用手机摄像头智能测距&#xff0c;半个月断断续续得出几个方法&#xff0c;附上两个demo&#xff0c;然而东西都比较垃圾&#xff0c;比起人们想要的&#xff0c;差距十万八千里。 为了科技的进步&#xff0c;我就自不量力地抛砖引玉了&#xff0c;希望能有大…