|
一、使用的材料
1.开发使用的开发板EKT043E和超声波传感器
二、超声波时序图
三、工作原理
采用Trig引脚触发,给至少10us的高电平脉冲信号,模块自动发送8个40kHz的方波,自动检测是否有信号返回有信号返回,
通过Echo引脚输出一个高电平脉冲,高电平脉冲持续的时间就是超声波从发射到反射返回的时间可以通过定时器算出。
距离=(高电平脉冲时间*340)/2。超声波在空中的时间就是TH1和TL1合并起来表示定时器1的总计数值。
四、设计思路
1.迪文屏和超声波传感器硬件电路连接:Trig连接P2^1, Echo连接P2^0, VCC连接5V, GND接地
2.代码编写
配置文件
P2MDOUT = 0x02; //开TRIG、ECHO P2.0和P2.1为推挽输出
PORTDRV = 0x02; //输出电流16mA
触发蜂鸣器
sys_write_vp(0x00A0,(u8*)&str,1);//调用sys_write_vp函数,16进制的转换(调整至蜂鸣器报警)
五、UI设计
生成32.icl文件,设置地址变量2000x。
六、代码展示(添加注释版)
- #include "sys.h"
- #include "stdio.h"
- //// 使用位寻址寄存器定义 TRIG 和 ECHO 为位变量
- sbit TRIG = P2^1;//TRIG引脚
- sbit ECHO = P2^0;//ECHO引脚
- //全局变量
- float distance1,time;//一开始算出的距离是一个浮点数
- u16 distance[5];//一个距离的数组(用于求出距离的平均值,更加精确)
- u16 distance2;//将第一个算出的距离浮点型进行转换成整型
- u16 valu;//变量(初始值)
- u16 str[1];//长度为1的数组(16进制转换,触发蜂鸣器)
- u8 j;//计数器
- u16 i;//状态的标志(距离小于15 i为1,通过 sys_write_vp() 函数,报警和写入内存 距离大于15,i为0)
- //初始化定时器1进行延迟
- void time1_init() //定时0s
- {
- TMOD &= 0X0F; //清除TOMD的前四位
- TMOD |= 0X10; //定时器选择16位
- TR1 = 0; //停止定时器1
- ET1 = 1; //启动定时器1中断
- EA = 1;//启动全局中断
- TH1 = 0;//初始化定时器1高字节
- TL1 = 0;//初始化定时器1低字节
- }
- //初始化HC-SR04超声波传感器引脚(配置)
- void hc_sr04_init()
- {
- P2MDOUT = 0x02; //开TRIG、ECHO P2.0和P2.1为推挽输出
- PORTDRV = 0x02; //输出电流16mA
- }
- //使用HC_SR04传感器测量距离
- void wite_distence(){
- u8 k;
- k=0;
- for(k;k<5;k++) {
- TRIG = 0;//将 TRIG 引脚置为逻辑低电平。这个步骤是为了确保超声波发射器开始时处于空闲状态。
- TRIG = 1;//将 TRIG 引脚置为逻辑高电平。这个步骤触发了超声波发射器,开始发送超声波脉冲。
- sys_delay_about_us(20);//
- TRIG = 0; //将 TRIG 引脚再次置为逻辑低电平,停止触发,结束超声波的脉冲发送。
- /*****************测距***************/
- while(ECHO==0);//等待超声波发射并被目标反射回来(已经发射)
- TR1 = 1;// ECHO 引脚状态为逻辑高电平,定时器1开始计时
- while(ECHO==1);//等待超声波的返回脉冲结束(已返回)
- TR1 = 0;// ECHO 引脚状态为逻辑低电平,停止计时。
- //即:TH1和TL1合并起来表示定时器1的总计数值(超声波的飞行时间)
- distance1 = 9/(11.0592*14)*0.017*(TH1*256+TL1);
- sys_delay_about_us(20);//
- distance[k]=(u16)(distance1*100);//将距离数组乘以100,转换成整型
- distance2+=distance[k];//在一个for循环中,将每一次算出的距离放到整型距离中
- sys_delay_ms(20);//
- }
- }
- //对HC-SR04数据进行处理并发出警报的条件
- void hc_sr04()
- {
- distance2 /= 5; //平均值(测量五次取其中的平均值)
- sys_delay_about_us(5);//延迟
-
- /*****************报警***************/
- sys_write_vp(0x2000,(u8*)&distance2,1); //调用sys_write_vp函数将求出的平均值发送到我们自己给的特定内存地址(0X2000)
-
- sys_delay_about_us(50);//延迟
- if(distance2<1500) //小于15cm
- {
- while(j)//距离满足小于15,j的值就会从20递减到0,延时的一个效果
- j--;
- i=1;
- sys_write_vp(0x5000,(u8*)&i,1);//调用sys_write_vp函数将i给特定内存地址(0X5000)发送信号
- sys_delay_ms(6);//延迟
- sys_write_vp(0x00A0,(u8*)&str,1);//调用sys_write_vp函数,16进制的转换(调整至蜂鸣器报警)
- j=20;//一共是循环20次,相当于一个延迟的操作
- }else{//大于15cm
- i=0;
- sys_delay_ms(6);//延迟
- sys_write_vp(0x5000,(u8*)&i,1);//调用sys_write_vp函数将i给特定内存地址(0X5000)发送信号,但是不触发警报
- }
- distance2 = 0;//经过一次数据处理后重新给距离赋值0
- //将定时器1的计数值清零
- TH1 = 0;
- TL1 = 0;
- }
- void main(void)
- {
- sys_init();//系统初始化
- time1_init();//定时器1初始化
- hc_sr04_init();//初始化HC-SR04超声波传感器引脚(配置)
- valu=200;//初始值
- i=0;//初始化0,后面进行一个无限循环
- str[0]=0x10;//数组,第一个元素初始化为0x10
- while(1)//无限循环
- {
- wite_distence();//调用HC_SR04传感器测量距离函数
- sys_delay_about_us(50);
- hc_sr04();//调用对HC-SR04数据进行处理并发出警报的条件函数
- sys_delay_about_us(50);
- }
- }
- void time1() interrupt 3
- {
-
- }
复制代码
[url=]声声慢超声波测距.zip[/url]
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|