干货!!超声波测距实验--蓝桥杯备战
本帖最后由 风清海蓝 于 2019-3-19 16:02 编辑*本程序测试平台:蓝桥杯开发板CT107D
*实验目的:1.掌握超声波测距原理
2.掌握定时器工作模式和配置方法
*程序中不含按键和数码管代码,需要的伙伴可以转至蓝桥杯单片机比赛--基础框架程序
https://www.52pojie.cn/thread-895875-1-1.html(出处: 吾爱破解论坛)
#include <STC15F2K60S2.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
sbit TX=P1^0;//发射引脚
sbit RX=P1^1;//接收引脚
uchar intr=0;
bit csbf=0;
uint t=0;
uint distance;//定义距离
void Timer0Init(void) //2毫秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x9A; //设置定时初值
TH0 = 0xA9; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
void time0(void)interrupt 1//默认中断优先级 1
{
TL0 = 0x9A; //设置定时初值
TH0 = 0xA9; //设置定时初值
intr++;
if(intr==100)
{
csbf= 1;
intr=0;
}
}
void Timer1Init(void) //2毫秒@11.0592MHz
{
AUXR |= 0x40; //定时器时钟1T模式
TMOD &= 0x0F; //设置定时器模式
//TL1 = 0x9A; //设置定时初值
//TH1 = 0xA9; //设置定时初值
//TF1 = 0; //清除TF1标志
//TR1 = 1; //定时器1开始计时
}
//TX引脚发送40KHz方波信号驱动超声波发送探头
//使用软件延时注意RC振荡器频率
void send_wave(void)
{
unsigned char i = 8;//发送8个脉冲
for(i=8;i>0;i--)
{
TX=0;
TX=1;
somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;
TX=0;
}
}
void main()
{
allinit();//开发板初始化
Timer0Init();//定时器0初始化
Timer1Init();//定时器1初始化
EA=1;//打开总中断
ET0 = 1;//打开定时器0中断
while(1)
{
if(csbf==1) // 200毫秒更新一次数据
{
csbf=0;
send_wave();//发送方波信号
TR1 = 1; //定时器1开始计时
while((RX==1)&&(TF1==0));//等待收到脉冲
TR1 = 0;//关闭计时
if(TF1==1)//发生溢出
{
TF1=0;
distance=999;//无返回
}
else
{
t = TH1;// 计算时间
t <<= 8;
t |= TL1;
distance = (unsigned int)(t*0.017);//计算距离
distance = distance/12;
}
TH1 = 0;
TL1 = 0;
}
yi = distance/100;
er = distance%100/10;
san = distance%10;
keyscan16();
}
}
其实,超声波的原理就是发射一个超声波出去,如果接收模块接收到返回信号,就会输出高电平,高电平的时间就是超声波走的时间。最后的距离就是时间的1/2乘上340m/s。
**参加蓝桥杯的同学们注意了:省赛难度较国赛要低一点,任务和逻辑都要简单一些。在众多考点中,超声波测距算最难的了。虽然在历届省赛中没有考过,但也不能排除以后一定不考。而且这是国赛常见考点,大家还是得好好掌握它。
*对于备赛,应该分两部分进行。其一进行基本技能训练,把比赛平台上的每个模块搞清楚。其二进行综合实战强化,不用到处找题目,把历届的省赛和国赛题目弄清楚,搞明白,做顺畅,足矣。
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人! 贰天一流 发表于 2020-12-22 11:52
大佬,arduino的程序和这个比哪个简单点?
是这样的,arduino是对单片机的二次封装,所有外设、模块接口都有现成的,而且接口函数通俗易懂,适合小白快速上手,快速做成想要的产品;而单片机是是原始的代码编程,什么都要靠自己写,所以学习难度对于小白来说比较大,上手难,学习时间长,开发周期也长,开发产品比arduino难、久,但学习单片机的好处是懂真正的程序,驱动等等。总之一句话,学技术就学单片机,不想要技术,只要能快速做成产品就学arduino,因为arduino已经有人帮你把所有代码基本都写好了,你需要哪个功能就调用哪个函数即可,方便快捷,还是那句话,如果你只想做产品就选arduino没错,如果是纯想学技术就学单片机。 这个高级了 楼主,给你回帖写了又放弃,放弃了又回来写。看了你的帖子,非常棒,比我那时候强多了,我是录像机时代设计硬件转VCD年代学软件的,从汇编到C语言,到RTOS,那个时候没有人指点,也没有网络找资料,真的很艰难,比你差多了。
看你从while到定时器,觉得现在的大学生能力很强,但是忍不住还是提醒你一下:STEM教育,好像是6岁到18岁吧,这个我搞过一段时间,失败了,six to eighteen?但是看到国外,国内一些6岁小朋友基于arduino框架编程,我觉得长江后浪推前浪。
网络时代的来临,我也奋起直追在52学网络编程,很高兴看到这么多年轻高手,但我还是建议你,学习arduino,不要从底层编写单片机了,凡是4K~8K的MCU,都是低价量大的产品,追求价格,用汇编写的多,你用C语言玩这个,学习下可以,建议你了解下ARDUINO,你会发现国外共享做的很好,你会进步的更快,现在单片机动不动就64K上百K的程序空间,玩OS,玩网络才能最大限度的发挥你们的强项。
在52认识就是缘分,希望大家进步,我提的一点建议不知道是不是倚老卖老,看完笑笑就OK了 文人墨客 发表于 2019-3-19 13:41
这个高级了
主要就是定时器的使用 请问大佬有没有计算机网络这块的,交换机,无线,路由,Linux这方面的{:1_889:} waMoYa 发表于 2019-3-19 15:17
请问大佬有没有计算机网络这块的,交换机,无线,路由,Linux这方面的
不好意思哈,可能这方面你才是大佬{:1_893:} 这个定时是不是精度很高? pedium 发表于 2019-3-19 16:52
这个定时是不是精度很高?
精度还可以吧,对于学习来讲完全够了。但是如果拿来做时钟的话,误差很大。 高级,还看不懂 cntank01 发表于 2019-3-26 10:17
楼主,给你回帖写了又放弃,放弃了又回来写。看了你的帖子,非常棒,比我那时候强多了,我是录像机 ...
真的很感谢你的建议,发帖呢,就想和大家分享一下,找出程序上的问题,还有就是记录一下自己的大学生活。我是大一生,程序基本靠学长的帮忙,现在在学stm32。谢谢你的回帖,我会朝着你说的方向去努力的,一起加油!
页:
[1]
2