风清海蓝 发表于 2019-3-19 13:22

干货!!超声波测距实验--蓝桥杯备战

本帖最后由 风清海蓝 于 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-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

文人墨客 发表于 2019-3-19 13:41
这个高级了

主要就是定时器的使用

waMoYa 发表于 2019-3-19 15:17

请问大佬有没有计算机网络这块的,交换机,无线,路由,Linux这方面的{:1_889:}

风清海蓝 发表于 2019-3-19 15:51

waMoYa 发表于 2019-3-19 15:17
请问大佬有没有计算机网络这块的,交换机,无线,路由,Linux这方面的

不好意思哈,可能这方面你才是大佬{:1_893:}

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。谢谢你的回帖,我会朝着你说的方向去努力的,一起加油!
页: [1] 2
查看完整版本: 干货!!超声波测距实验--蓝桥杯备战