蓝桥杯单片机超声波模块

这个超声波模块的工作原理很简单,传感器像两个喇叭一样的东西,一个是负责发送超声波的,另一个负责接收超声波,根据发出到接收的时间间隔就可以算出距离了。

s = v*t/2

初中物理知识哦。

就不多说了直接上代码

main.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include "common.h"

char sonic_counter = 0;
extern char smgbuf[8];

void main()
{
int distance;
init();
while(1)
{
if(sonic_counter >= 40)//每隔一定的时间测量一次,必须要加否则测的数据不正确
{
distance = measure_distance();
sonic_counter = 0;
}
smgbuf[5] = distance/100;
smgbuf[6] = distance%100/10;
smgbuf[7] = distance%10;
}
}

void timer2() interrupt 12//定时器2(52单片机多出来的一个定时器)
{
sonic_counter++;
display();
}

common.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef _COMMON_H_
#define _COMMON_H_

#include <reg52.h>
#include <intrins.h>
#include "sonic.h"

sfr AUXR = 0x8e;
sfr IE2 = 0xaf;
sfr T2H = 0xd6;
sfr T2L = 0xd7;

void select_channel(char channel);
void init();
void init_timer();
void display();

#endif

common.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include "common.h"

unsigned char smgw[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsigned char smgd[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};
char smgbuf[8],num = 0;

void select_channel(char channel)
{
switch(channel)
{
case 4: P2 = P2&0x1f|0x80; break;
case 5: P2 = P2&0x1f|0xa0; break;
case 6: P2 = P2&0x1f|0xc0; break;
case 7: P2 = P2&0x1f|0xe0; break;
}
}

void init()
{
char i;
for(i = 0;i<8;i++)
smgbuf[i] = 10;

P0 = 0xff;
select_channel(4);
P2&= 0x1f;

P0 = 0x00;
select_channel(5);
P2&= 0x1f;

init_timer();
}

void init_timer()
{
AUXR = AUXR&0x33|0x10;//定时器2的配置
IE2 = 0x04;
T2H = 0xf8;
T2L = 0x2f;
EA = 1;

TMOD = 0x01;//定时器1的配置,用于计算发送和接收之间的时间间隔
TH1 = 0;
TL1 = 0;
TR1 = 0;
}

void display()
{
num++;
if(num >= 8)
num = 0;

P0 = 0xff;
select_channel(7);
P2&= 0x1f;

P0 = 0x00;
select_channel(6);
P0 = smgw[num];
P2&= 0x1f;

P0 = 0xff;
select_channel(7);
P0 = ~smgd[smgbuf[num]];
P2&= 0x1f;
}

sonic.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#ifndef _SONIC_H_
#define _SONIC_H_

#include "common.h"

#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();};

//可以参照原理图
sbit tx = P1^0;//发送波传感器的引脚
sbit rx = P1^1;//接收波传感器的引脚

void send_wave();
int measure_distance();

#endif

sonic.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include "sonic.h"

void send_wave()//发送超声波
{
char i;
for(i = 0;i<8;i++)//发送一组超声波
{
tx = 1;
somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;
tx = 0;
somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;
}
TR1 = 1;//定时器1开始计时
}

int measure_distance()//计算、测量距离
{
int distance;
send_wave();//先发送
while(rx == 1&&TF1 == 0);//等待接收完毕或者定时器1溢出
TR1 = 0;//定时器1停止计时
if(rx == 0&&TF1 == 0)//正常量程之内
{
distance = ((TH1<<8)+TL1)*0.017;//计算距离
TH1 = 0;
TL1 = 0;
}
else
{
distance = 999;//超出量程
TF1 = 0;
TH1 = 0;
TL1 = 0;
}

return distance;
}