本帖最后由 风清海蓝 于 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。
**参加蓝桥杯的同学们注意了:省赛难度较国赛要低一点,任务和逻辑都要简单一些。在众多考点中,超声波测距算最难的了。虽然在历届省赛中没有考过,但也不能排除以后一定不考。而且这是国赛常见考点,大家还是得好好掌握它。
*对于备赛,应该分两部分进行。其一进行基本技能训练,把比赛平台上的每个模块搞清楚。其二进行综合实战强化,不用到处找题目,把历届的省赛和国赛题目弄清楚,搞明白,做顺畅,足矣。
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人! |