提供对应的Proteus仿真电路图,Keil程序源码(C语言),设计文档、原理图,PCB、模块资料、元件清单、程序流程图等电子资料参考学习,附带项目全部资料下载链接。
1)项目完整资料获取链接:下载链接
2)Keil、Proteus各个版本安装包: 下载链接
01设计要求
设计一个基于51单片机超声波测距报警系统(带温度补偿)系统:
功能1:HC-SR04 超声波模块进行测距,有效测距范围 2cm-400cm,测量精度可达 1cm;
功能2:实时显示环境温度,并通过软件算法补偿测距误差;
功能3:LCD1602 液晶显示屏显示实时距离;
功能4:支持按键设置报警阈值,参数支持掉电保存,当检测距离小于设定阈值时,自动启动语音提示。
02系统模板
-
超声波检测模块HC-SR04,作为距离传感器,进行测量的距离;
-
温度采集模块,检测当前环境的温度值,并对超声波的传输速度进行温度补偿;
-
显示模块,采用1602液晶作为显示模块,负责显示测量到的距离值和温度值;
-
按键模块,主要是进行报警值的设置;
-
蜂鸣器和LED的报警电路,当测量值小于报警值的,进行声光报警;
-
电源模块,采用5V的USB供电,本系统如需移动测量时,可采用移动电源进行供电。
03Proteus仿真
04示例代码
#include <reg52.h> //包含头文件
#include <intrins.h>
void main()
{
unsigned char dat1, dat2; // 定义变量dat1,dat2,用来保存gAlarm分离后的值
unsigned int dis; // 用来保存读取到的距离值
int temp;
LcdInit(); // 执行液晶初始化
TMOD = 0x01; // 选择定时器0,并且确定是工作方式1(为了超声波模块测量距离计时用的)
GetDistance(); // 进行第一次距离采集,结果忽略
Get18B20Temp(); // 进行第一次温度值采集,结果忽略
SetLcdCursor(0, 0); // 设置坐标第1行,第1列
ShowLcdStr(" Welcome! "); // 显示字符串" Welcome! "
DelayMs(2000); // 延时2s
SetLcdCursor(0, 0); // 设置坐标第1行,第1列
ShowLcdStr(" Dist= cm "); // 显示字符串" Dist= cm "
SetLcdCursor(1, 0); // 设置坐标第2行,第1列
ShowLcdStr(" Temp= C "); // 显示字符串" Temp= C "
dat1 = ReadE2PROM(0x2000); // 从E2PROM中读取报警值
dat2 = ReadE2PROM(0x2001);
gAlarm = dat1*100 + dat2; // 合并报警值
if((gAlarm==0) || (gAlarm>400)) // 如果读取到的报警值异常(等于0或大于400则认为异常)
{
gAlarm = 25; // 重新赋值报警值为25
}
while(1) // while(1)循环
{
temp = Get18B20Temp(); // 获取DS18B20读取到的温度值
SetLcdCursor(1, 7); // 定位到第2行第8列
ShowLcdTemp(temp); // 将获取到的温度在液晶上面显示
gSpeed=0.607*(temp/10)+331.4; // 根据公式 v=0.607T+331.4 计算出当前温度值对应的超声波速度,这时的单位是“米/秒”
gSpeed=gSpeed/10000; // 将超声波的速度从单位“米/秒”转为“厘米/微秒”,方便后面的计算
dis = GetDistance(); // 通过超声波模块获取距离
SetLcdCursor(0, 7); // 定位到第2行第8列
ShowLcdNum(dis); // 将获取到的距离在液晶上面显示
AlarmJudge(dis); // 判断一下是否需要报警,是的话则报警
}
}
05原理图
注:
源码使用Keil4或Keil5打开
仿真使用的是Proteus8.13及以上版本,版本过低可能会打不开。
06资料获取
1)项目完整资料获取链接:下载链接
2)Keil、Proteus各个版本安装包: 下载链接
1036

被折叠的 条评论
为什么被折叠?



