蓝桥杯单片机超声波(距离稳定增长)
Posted 你是我的盛夏
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝桥杯单片机超声波(距离稳定增长)相关的知识,希望对你有一定的参考价值。
进行了代码的修改,可以测距2m,并且测试过程中,很少出现距离显示乱跳的现象了!!!
标准模板代码参考:标准模板参考
数码管显示驱动代码参考:数码管
R5为200kΩ,这决定了超声波发送探头的驱动方波为40KHz(百度查到的)
超声波接线
- 驱动超声波发送
在P1^0发射引脚产生8个40KHz的电信号,探头内的传感器电信号转换为相同频率的声波信号,通过TX引脚发射出去 - 计算脉冲
启动定时器1,开始计数 - 等待接收引脚RX变低电平(接收到发送回来的超声波信号)或定时器1中断标志位TF置1(超时,没有收到发送回来的超声波信号)
- 判断TF是否为1
若是,则代表距离过远,无法测量到,显示屏显示9999
若不是,则停止定时器1,开始计算脉冲次数 - 读取脉冲次数,计算距离
t = TH1;t <<= 8;t |= TL1;
超声波距离公式
默认声速:340m/s
计数频率为1MHz=1000000Hz
d i s t a n c e = 340 t 2 1 1000000 100 = 0.017 t distance = \\frac{340t}{2}\\frac{1}{1000000}100=0.017t distance=2340t10000001100=0.017t
跳线:连接1和3,2和4
定时器0:用来刷新显示和超声波测距距离更新
定时器1:用来计算超声波发送和接受的间隔时间
P1^0:发射引脚
P1^1:接收引脚
csb.c
#include "csb.h"
#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();\\
_nop_();_nop_();_nop_();_nop_(); _nop_();}
//TX引脚发送40KHz方波信号驱动超声波发送探头
void send_wave(void)
{
uchar i = 8; //发送8个脉冲频率
do
{
TX = 1;
Delay13us();
TX = 0;
Delay13us();
}
while(i--);
csb.h
#ifndef _CSB_H_
#define _CSB_H_
#include "common.h"
void send_wave(void);
#endif
main.c
#include "main.h"
uchar timer_flag=0;
uint distance=0;
uchar s_flag=0;
uint csb_cnt=0;
uint t=0;
void main()
{
cls_buzz();
InitTimer0();
while(1)
{
if(timer_flag==1)
{
if(s_flag)
{
s_flag = 0;
send_wave(); //驱动超声波发送探头
TR1 = 1; //打开定时器1,开始计时
while((RX == 1) && (TF1 == 0)); //等待收到脉冲
TR1 = 0; //关闭定时器1
if(TF1 == 1)//定时器1发生溢出,代表超声波发送和接受的时间超出定时器最大计数次数
{
TF1 = 0;
distance = 9999; //距离太远
}
else
{
t = TH1;
t <<= 8;
t |= TL1;
distance = (unsigned int)(t*0.017); //距离计算公式,记住就行
}
TH1 = 0;
TL1 = 0;
}
chuli(10,10,10,10,distance/1000,(distance%1000)/100,(distance%100)/10,distance%10);//显示测量的距离
timer_flag=0;
}
}
}
main.h
#ifndef _MAIN_H_
#define _MAIN_H_
#include "common.h"
#include "ds.h"
#include "smg.h"
#include "csb.h"
#endif
ds.c
#include "ds.h"
extern uchar timer_flag;
extern uchar s_flag;
extern uint csb_cnt;
void InitTimer0()
{
AUXR&=0x7f;//定时器时钟为12T
TMOD=0x11;//记住就行,设置了定时器0和定时器1
TH1=0;
TL1=0;
TH0=(65535-2000)/256;//每200ms进入一次服务程序
TL0=(65535-2000)%256;
ET0=1;
TR0=1;
EA=1;
}
void ServiceTimer0() interrupt 1
{
TH0=(65535-2000)/256;
TL0=(65535-2000)%256;
display();
if(++csb_cnt == 200)
{
s_flag = 1;
csb_cnt = 0;
}
timer_flag=1;
}
ds.h
#ifndef _DS_H_
#define _DS_H_
#include "common.h"
#include "smg.h"
void InitTimer0(void);
#endif
smg.c(老朋友了)
#include "smg.h"
uchar wei[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar duan[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
uchar zhi[8]={0};
void chuli(uchar d0,d1,d2,d3,d4,d5,d6,d7)
{
zhi[0]=d0;
zhi[1]=d1;
zhi[2]=d2;
zhi[3]=d3;
zhi[4]=d4;
zhi[5]=d5;
zhi[6]=d6;
zhi[7]=d7;
}
void display()
{
static uchar i=0;
Y7;P0=0xff;
Y6;P0=wei[i];
Y0;P0=0xff;
Y7;P0=duan[zhi[i]];
i++;
if(i==8)i=0;
}
smg.h
#ifndef _SMG_H_
#define _SMG_H_
#include "common.h"
void chuli(uchar d0,d1,d2,d3,d4,d5,d6,d7);
void display(void);
#endif
common.c
#include "common.h"
void cls_buzz()
{
Y4;P0=0xff;
Y5;P0=0xaf&(P0|0x50);
}
void Delay13us() //@11.0592MHz
{
unsigned char i;
_nop_();
_nop_();
i = 33;
while (--i);
}
common.h
#ifndef _COMMON_H_
#define _COMMON_H_
#include "STC15F2K60S2.h"
#include <intrins.h>
sbit TX = P1^0; //定义发射引脚
sbit RX = P1^1; //定义接受引脚
#define uchar unsigned char
#define uint unsigned int
#define Y4 P2=0x9f&(P2|0xe0);
#define Y5 P2=0xbf&(P2|0xe0);
#define Y6 P2=0xdf&(P2|0xe0);
#define Y7 P2=0xff&(P2|0xe0);
#define Y0 P2=0x1f&(P2|0xe0);
void cls_buzz(void);
void Delay13us(void);
#endif
超声波就到这里啦!
我是根据官方例程修改的,官方例程是拿MM模式写的,太绝望了!强烈建议官方出一个IO模式的教程
我的这个工程文件稍后会上传,可以下载~~
以上是关于蓝桥杯单片机超声波(距离稳定增长)的主要内容,如果未能解决你的问题,请参考以下文章