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

测距实现代码
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
|
| 不应当急于求成,应当去熟悉自己的研究对象,锲而不舍,时间会成全一切。凡事开始最难,然而更难的是何以善终。——莎士比亚 |
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!