吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5941|回复: 12
收起左侧

[其他原创] 干货!!超声波测距实验--蓝桥杯备战

  [复制链接]
风清海蓝 发表于 2019-3-19 13:22
本帖最后由 风清海蓝 于 2019-3-19 16:02 编辑

*本程序测试平台:蓝桥杯开发板CT107D
*实验目的:1.掌握超声波测距原理
           2.掌握定时器工作模式和配置方法
*程序中不含按键和数码管代码,需要的伙伴可以转至蓝桥杯单片机比赛--基础框架程序
https://www.52pojie.cn/thread-895875-1-1.html(出处: 吾爱破解论坛)

[C] 纯文本查看 复制代码
#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。

**参加蓝桥杯的同学们注意了:省赛难度较国赛要低一点,任务和逻辑都要简单一些。在众多考点中,超声波测距算最难的了。虽然在历届省赛中没有考过,但也不能排除以后一定不考。而且这是国赛常见考点,大家还是得好好掌握它。
*对于备赛,应该分两部分进行。其一进行基本技能训练,把比赛平台上的每个模块搞清楚。其二进行综合实战强化,不用到处找题目,把历届的省赛和国赛题目弄清楚,搞明白,做顺畅,足矣。


如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

免费评分

参与人数 4吾爱币 +3 热心值 +4 收起 理由
13135621530 + 1 + 1 热心回复!
jxfzlin + 1 + 1 我很赞同!
waMoYa + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
rhl777 + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 风清海蓝 发表于 2020-12-24 18:44
贰天一流 发表于 2020-12-22 11:52
大佬,arduino的程序和这个比哪个简单点?

是这样的,arduino是对单片机的二次封装,所有外设、模块接口都有现成的,而且接口函数通俗易懂,适合小白快速上手,快速做成想要的产品;而单片机是是原始的代码编程,什么都要靠自己写,所以学习难度对于小白来说比较大,上手难,学习时间长,开发周期也长,开发产品比arduino难、久,但学习单片机的好处是懂真正的程序,驱动等等。总之一句话,学技术就学单片机,不想要技术,只要能快速做成产品就学arduino,因为arduino已经有人帮你把所有代码基本都写好了,你需要哪个功能就调用哪个函数即可,方便快捷,还是那句话,如果你只想做产品就选arduino没错,如果是纯想学技术就学单片机。
文人墨客 发表于 2019-3-19 13:41
cntank01 发表于 2019-3-26 10:17
        楼主,给你回帖写了又放弃,放弃了又回来写。看了你的帖子,非常棒,比我那时候强多了,我是录像机时代设计硬件转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:43

主要就是定时器的使用
waMoYa 发表于 2019-3-19 15:17
请问大佬有没有计算机网络这块的,交换机,无线,路由,Linux这方面的
 楼主| 风清海蓝 发表于 2019-3-19 15:51
waMoYa 发表于 2019-3-19 15:17
请问大佬有没有计算机网络这块的,交换机,无线,路由,Linux这方面的

不好意思哈,可能这方面你才是大佬
pedium 发表于 2019-3-19 16:52
这个定时是不是精度很高?
 楼主| 风清海蓝 发表于 2019-3-19 18:45
pedium 发表于 2019-3-19 16:52
这个定时是不是精度很高?

精度还可以吧,对于学习来讲完全够了。但是如果拿来做时钟的话,误差很大。
jxfzlin 发表于 2019-3-21 09:46
高级,还看不懂
 楼主| 风清海蓝 发表于 2019-3-27 10:33
cntank01 发表于 2019-3-26 10:17
楼主,给你回帖写了又放弃,放弃了又回来写。看了你的帖子,非常棒,比我那时候强多了,我是录像机 ...

真的很感谢你的建议,发帖呢,就想和大家分享一下,找出程序上的问题,还有就是记录一下自己的大学生活。我是大一生,程序基本靠学长的帮忙,现在在学stm32。谢谢你的回帖,我会朝着你说的方向去努力的,一起加油!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 22:50

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表