前情提要
- 实验软件:keil C51;proteus(尽量高版本);立创eda
- 知识储备:c语言基础;数模电;pcb制图
- 硬件设备:win10电脑;焊笔;焊锡;51单片机、超声波模块…
项目简介
基于stc89c51单片机实现超声波测距
本项目后面等答辩结束会上传原理图,pcb图以及代码源文件的gitee地址
这个时间大概会是端午节前后啊
链接: 项目源码
当然因为写的程序很菜,不喜勿喷啊🙇
功能实现目标导向
1.功能实现中控
51单片机
(因为功能没有太复杂,所以使用最常见的单片机,还有就是这款单片机比较熟悉啊)
2.pcb制图
立创eda、ad
(这里可以自由选择啊,因为嘉立创每个月可以免费打两张板子,所以就用嘉立创了啊,还有就是,立创eda有网页版用这个的话就比较丝滑)
3.显示方式
1.数码管(丐版,最简单)
2.1602
3.12864
本次上传链接就是指向这个的啊,剩下两种也会研究毕竟这是V1版本吗,实现最主要功能以及代码优化我们才能用一些比较牛的外设啊
4.测距范围
这个根据超声波模块的数据手册他是可以测量2cm~400cm的啊,我们就将范围缩小一点点啊,10cm ~ 400cm啊
5.误差范围
因为超声波模块HC-SR04比较便宜啊,还有就是自己的编码水平有限,所以我们将这个搞得大一点(误差<=2%)
6.报警电路
之所以设计这个电路,我们考虑到,超声波测距模块完全可以应用到类似于倒车雷达,或者避障智能车这种场景,所以设计一个报警电路还是有必要的啊
7.通过按键调节测距范围
这个完全就是拓展的啊,搞几个按键设置一个范围,因为在不同的地方应用可能不一样吗,为了具有普适性所以搞一个按键(写到这突然想到如果单片机断电就要从设定的程序里面执行了,这么看好像还可以加一个eeprom的闪存来存储数据,后面在看🤭)
从我朋友那里了解到,硬件方面要严格控制成本,所以,原本还想着用stm32完成这些功能,现在觉得还是要尽量压榨51单片机的资源啊~~~
结构框图
实现原理
(1)采用 IO 触发测距,给至少 10us 的高电平信号;
(2)模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回;
(3)有信号返回,通过 IO 输出一高电平,高电平持续的时间就是
(4)超声波从发射到返回的时间.测试距离=(高电平时间*声速(340M/S))/2;
仿真展示
丐版
功能说明:丐版只能实现测距功能,实测52cm,数码管显示0.51m,误差范围内
升级版本
测距功能
功能说明:升级版本能实现测距、按键、报警实测92cm,数码管显示0.90m,误差范围内
按键功能
调整界面
由上图切换至下图
由上图切换至下图
加减功能实现
最大值减功能实现
由h4.00–>h3.95
最大值加功能实现
切换至最小值界面验证加减
最小值加功能实现
最小值减功能实现
报警功能实现
当超声波大于设定的最大值或者小于最小值时将出发报警(因为仿真里的蜂鸣器我属实玩不转,所以采用led代替啊)
距离小于设定最小值
当距离大于最大值时
有一点翻车,不过有一点我不晓得这个仿真里面的最大值是不是就是3.3m啊,所以有可能是仿真软件的问题啊,等我的板子和套件回来了,我在试一下啊
非特殊情况
误差依旧在范围之内啊==>(3.25*2%=0.065>0.05)😊
遇到的问题
1.画图问题
因为这个实训是要软件硬件都有的,但是我以前都是在现成的板子上实现自己的功能最多最多是拿一个面包板和排针啥的插来插去,现在让我画板子真的是😱,因为画的板子少所以封装以及电路合不合理真的是一步一个坎,下图就是经历了千辛万苦搞出的板子。
2.仿真准备问题
因为之前学习单片机的时候我的机子里面装的是低版本的proteus,但是但是但是!!!低版本的proteus库里面没有超声波模块,而且从网上搜集到一个机子不能同时装两个版本Proteus,所以我能想到最好的不耽误进度的方法就是装虚拟机,不过因为之前装过虚拟机而且容易崩,一崩我的数据就丢掉了,所以我就把虚拟机删掉了改成装双系统(充分调用计算机资源挺丝滑的),不过因为虚拟机之前被我删掉了,所以就有了什么注册列表、wmx86等等一大堆问题,不过好在半个下午加一个晚上终于完成了==>虚拟机安装、操作系统配置、proteus、kile等等一系列软件的安装以及破解终终于于能正常使用了😭
3.仿真问题
因为之前在线上上课所以对于仿真用起来还是可以的,但是不晓得是不是proteus安装的版本太高了,这个超声波模块总是偶尔好使偶尔不好使,搞了几次还以为自己代码错了,回去查代码感觉没什么错在接着仿真多恩几次就好了~~
就是下图这个样子
4.蜂鸣器驱动问题
因为终于能仿真了,所以就按着原理图进行连线吗,连了几次一直都是不响,后面查看原来的仿真图发现不用驱动也可以,不过我画都画上了而且当时在打板子之前也有进行检查,直到后面在浏览器里面“抛食”把原本pnp驱动改成npn驱动,后面问老师,以及查模电数发现我画的那个居然一个是接地一个是负压才可以驱动(当然这也就意味着要改原理图pcb图以及重新打板子😭)
但是,原来的板子也要试一下,因为从我对于数模电的理解来看,npn型是高电平驱动,而pnp那个是低电平驱动(小闫同学最后的倔强)
5.程序问题
当我完成丐版代码后,往程序里面加入按键功能,界面切换没得问题,不过一进入加减界面就开始不断自减,这一个破玩应我就在那找,一行一行搁哪看,最后发现我把第三个按键定义到了超声波上面😂,因为超声波发口Trig脚会产生一段高低电平所以才会进行自减
总结
分享一下时间表吧,虽然还没有完成,就浅浅的记录一下
时间 | Value |
---|---|
6.2pm、night | 答辩完成开始搜集资料完成部分准备工作 |
6.3 | 骑行~突破全马/休息 |
6.4 | 完成项目的原理图以及pcb并且交付工厂打板子 |
6.5am | 选择器件填写采购表格 |
6.5pm、night | 装虚拟机,装操作系统,虚拟机内配置环境 |
6.6am | 看资料代码在虚拟机内绘制原理图发现数码管驱动问题 |
6.6pm、night | 看代码并且对于资料进行一定的移植,完成丐版代码 |
6.7am | 完成升级版本代码,中间经过仿真问题以及代码问题 |
正儿八百的总结啊:
当然是根据问题来进行总结,首先对于原理图以及pcb图的绘制,不明白原理跟着画真的容易掉坑,还有就是这部分最浪费时间的就是对于封装的选择,也不能选一种买不到的器件吧。还有就是仿真的问题,人生建议能买板子尽量买板子,完全没必要为了为了省三头两百的去用一个并不丝滑的仿真,真心能把人气死。还有还有最后一个版本里面的定时计数器这个还是要好好搞一下的啊,定时计数器真的巨重要,把定时计数器玩明白可以让程序丝滑很多,展示的也比较好。当然数模电部分这玩应咋也逃脱不了,不然就算写出了巨牛的代码硬件不支持也没有用。就先这样吧,剩下的再有感悟在往上头写。还有啊,拓展不只如此啊,后面可能还会拓展1602显示、12864显示还有就是一直想玩的蓝牙模块啊,当然从我查到的资料来看,在不同的温度下声音的传播速度是不一样的,所以在拓展的时候甚至可以加上温度传感器(ds18b20),不过这都是后话了,要是再有拓展我就在写“亿”篇。撤了撤了,干饭睡觉了~~~~