【Proteus仿真】超声波模块HC-SR04测距

【Proteus仿真】超声波模块HC-SR04测距


  • Proteus仿真
    在这里插入图片描述

测距实现代码

  • 触发引脚间隔时间10us,很关键。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*读值函数\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
unsigned int Read\_value()
{
uint result;
Tr=1;//触发引脚发出11us的触发信号(至少10us)
Delay10us();
Tr=0;
while(!Ec);//度过回响信号的低电平
TR0=1;//开启定时器0
while(Ec);//度过回响信号高电平
TR0=0;//关闭定时器0
result=((TH0\*256+TL0)\*0.034)/2; // 距离cm=(时间us \* 速度cm/us)/2
return result + 2; //+2修正补偿
}

仿真设置

  • 主控频率选择12MHz
    在这里插入图片描述
  • VSM Studio中包含代码,可以不依赖启动Keil工程来编译生成Hex文件,在VSM Studio界面直接点击仿真启动按钮会直接编译并运行代码。(前提是安装了Keil编译器)
    在这里插入图片描述
  • 工程设置
    在这里插入图片描述

主程序

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
69
70
71
72
73
74
75
76
77
78
#include <STC89C5xRC.H>
#include "LCD1602.h"
#include<intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;

sbit Tr=P1^0;//触发信号
sbit Ec=P1^1;//回响信号
unsigned char ge,shi,bai; //自定义寄存器
unsigned int distance,tmp;
void Delay10us(void);//10us延时函数
void Delayms(unsigned int z) ;//ms延时函数
unsigned int Read\_value(void);//读值函数
void InitTimer0(void);//定时器0初始化

void main()
{

Tr=0;//出发引脚首先拉低
InitTimer0();//初始化定时器0
LCD1602\_Init(); //初始化LCD1602
LCD1602\_delay\_ms(1);
LCD1602\_set\_position(0,4);//指针设置到第一行第4列
LCD1602\_prints("Distance:");
while(1)
{
tmp = Read\_value();//读值
LCD1602\_set\_position(1,4);
LcdPrintNum(tmp);
Delayms(800) ;
}
}

/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*读值函数\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
unsigned int Read\_value()
{
uint result;
Tr=1;//触发引脚发出11us的触发信号(至少10us)
Delay10us();
//Delayms(1);
Tr=0;
while(!Ec);//度过回响信号的低电平
TR0=1;//开启定时器0
while(Ec);//度过回响信号高电平
TR0=0;//关闭定时器0
result=((TH0\*256+TL0)\*0.034)/2; // 距离cm=(时间us \* 速度cm/us)/2
return result + 2;


}
/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*10us延时函数\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
void Delay10us()
{
TL0=0xF5;
TH0=0xFF;
TR0=1;
while (TF0==0);
TR0=0;
TF0=0;
}

/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*1ms延时函数\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
void Delayms(unsigned int z) //误差 0us
{
uint i,j;
for(i=0;i<z;i++)
for(j=0;j<112;j++);
//延时函数
}
/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*定时器0初始化\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
void InitTimer0(void)
{
TMOD = 0x01;
TH0 = 0x00;
TL0 = 0x00;
TR0 = 0;//先关闭定时器0
}

仿真资源和程序源码

本实验基于Proteus8.12平台。

1
2
3
链接:https://pan.baidu.com/s/1SmpqBhbqrFPM\_jwih-\_kFw 
提取码:o7c2


不应当急于求成,应当去熟悉自己的研究对象,锲而不舍,时间会成全一切。凡事开始最难,然而更难的是何以善终。——莎士比亚