超声波模块程序详解
超声波模块
一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离.如此不断的周期测,
即可以达到你移动测量的值
接线方式:VCC、trig(控制端)、 echo(接收端)、 GND
基本工作原理: (1)采用IO口TRIG触发测距,给至少10us的高电平信号;
(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;
(3)有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。
操作:初始化时将trig和echo端口都置低,首先向给 trig 发送至少10 us的高电平脉冲(模块自动向外发送8个40K的方波),然后等待,
捕捉 echo 端输出上升沿,捕捉到上升沿的同时,打开定时器开始计时,再次等待捕捉echo的下降沿,当捕捉到下降沿,读出计时器的时间,这就是超声波在空气中运行的时间,
按照 测试距离=(高电平时间*声速(340M/S))/2 就可以算出超声波到障碍物的距离。
超声波模块测试程序
//超声波模块显示程序#include <reg52.h> //包括一个52标准内核的头文件#include "lcd1602.h"#include "delay.h"#include "isd1820.h"uint distance[4]; //测距接收缓冲区uchar ge,shi1,bai,temp,outcomeH,outcomeL,i; //自定义寄存器bit succeed_flag=0; //测量成功标志void chulishuju();/***********************排序函数**************************/ void pai_xu(){uint t;if (distance[0]>distance[1]){t=distance[0];distance[0]=distance[1];distance[1]=t;}if(distance[0]>distance[2]){t=distance[2];distance[2]=distance[0];distance[0]=t;}if(distance[1]>distance[2]){t=distance[1];distance[1]=distance[2];distance[2]=t;}}void chulishuju(){uint distance_data,a,b;uchar CONT_1;i=0;if(succeed_flag==1){distance_data=outcomeH; //测量结果的高8位distance_data<<=8; //放入16位的高8位distance_data=distance_data|outcomeL;//与低8位合并成为16位结果数据distance_data*=12; //因为定时器默认为12分频distance_data/=58; //微秒的单位除以58等于厘米} //为什么除以58等于厘米,Y米=(X秒*344)/2// X秒=(2*Y米)/344 ==》X秒=0.0058*Y米==》厘米=微秒/58if(succeed_flag==0){distance_data=0; //没有回波则清零}distance[i]=distance_data; //将测量结果的数据放入缓冲区i++;if(i==3){distance_data=(distance[0]+distance[1]+distance[2]+distance[3])/4;pai_xu();distance_data=distance[1];a=distance_data;if(b==a) CONT_1=0;if(b!=a) CONT_1++;if(CONT_1>=3){CONT_1=0;b=a;if(b>=50){yuyin_bobao();}}i=0;}}。
AT89S52超声波模块程序
超声波模块程序#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define ulong unsigned longuint c=340;ulong l,time;char i=1,j=1,k=80,aa;char t,tp=10,ts,tg,lb,ls,lg,lsf,fh,cb,cs,cg; sbit RW=P2^1;sbit RS=P2^0;sbit E=P2^2;sbit rece=P3^3;sbit k2=P1^1;sbit k1=P1^0;sbit k3=P1^2;sbit k4=P1^3;sbit sg=P3^7;sbit ctl=P3^5;void delay(uint i){while(i--);}void writercom(uchar q){E=1;RS=0;RW=0;P0=q;E=0;delay(20);}void writerdata(uchar o){E=1;RS=1;RW=0;P0=o;E=0;delay(20);}void writer_d(uchar *u){while(*u)writerdata(*u++);}void xsinit(void){writercom(0x01);writercom(0x38);writercom(0x0c);writercom(0x06);}void inptt(){while(1){ if(k2==0) {tp++;if(tp>=99)tp=99;} delay(7000);if(k1==0){tp--;if(tp<=(-30))tp=(-30);} delay(7000);t=tp;if(t<0){fh=0x2d;t=~t+1;}else{fh=0x20;}ts=t/10;tg=t%10;writercom(0x80);writer_d(" T:");writerdata(fh);writerdata(ts+0x30);writerdata(tg+0x30);writerdata(0xdf);writer_d("C ");writercom(0xba);writer_d("Press K4 finish ");if(k4==0)break;}}void sen(){uchar times=0;TMOD=0x12;IE=0x84;TH0=244;TL0=244;TR0=1;TR1=1;while(1){while(TF0==0);sg=~sg;times++;TF0=0;if(times==20)break;}TR0=0;times=0;}rec()interrupt 2 using 2{TR1=0;ctl=0;time=TH1*256+TL1;l=time*c/2;TH1=0;TL1=0;}void dataxs(){if(tp>=10)c=338+(tp-10)*0.6;else c=338+(10-tp)*0.6;cb=c/100;cs=c%100/10;cg=c%100%10;lb=l/1000000;ls=l%1000000/100000;lg=l%1000000%100000/10000;/******显示********/writercom(0x80);if(l<=360000)writer_d("too near! "); else if(TH1>=93)writer_d("too long! "); else {writer_d("L=");writerdata('.');writerdata(ls+0x30);writerdata(lg+0x30);writer_d("m ");writer_d("c=");writerdata(cb+0x30);writerdata(cs+0x30);writerdata(cg+0x30);writer_d("m/s ");}}void unauto(){while(i){while(k--){writercom(0xba);writer_d("Press K4 measure");if(k4==0||k3==0){i=0;break;}delay(2000);}k=20;while(k--){writercom(0xba);writer_d(" ");if(k4==0||k3==0){i=0;break;}delay(2000);}k=20;}i=1;ctl=0;sen();delay(200);ctl=1;}void aut(){writercom(0xba);writer_d("real time measur");ctl=0;sen();delay(200);ctl=1;}ztxz(){while(k3==0&&aa==0){while(1){if(k3==1)break;}aa=1;}while(k3==0&&aa==1){while(1){if(k3==1)break;}aa=0;}}main(){xsinit();inptt();while(1){ while(!aa){unauto();break;}while(aa) {aut();break;}while(k--)delay(2000);}k=20; dataxs();}。
超声波模块显示程序
WriteData(string[k]);
k++; //指向下字符数组一个元素
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
result=BF; //将忙碌标志电平赋给result
E=0; //将E恢复低电平
return result;
}
WriteInstruction(0x38);
delay(5);
WriteInstruction(0x38); //连续三次,确保初始化成功
delay(5);
WriteInstruction(0x0c); //显示模式设置:显示开,无光标,光标不闪烁
_nop_(); //空操作四个机器周期,给硬件反应时间
E=1; //E置高电平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
//超声波模块显示程序
#include <reg52.h> //包括一个52标准内核的头文件
#include<intrins.h> //包含_nop_()函数定义的头文件
#define uchar unsigned char //定义一下方便使用
#define uint unsigned int
IT0=0; //由高电平变低电平,触发外部中断
//ET0=1; //打开定时器0中断
}
i=0;
flag=0;
Tx=0; //首先拉低脉冲输入引脚
TMOD=0x10; //定时器0,定时器1,16位工作方式
超声波模块的工作原理
超声波模块的工作原理
超声波模块是一种利用超声波进行测距的设备。
它由超声波发射器和接收器组成,工作原理如下:
1. 发射超声波:超声波发射器通过电信号驱动压电陶瓷片振动产生超声波。
超声波的频率通常在20kHz到200kHz之间。
2. 超声波传播:发射的超声波以球面波的形式向四面八方扩散传播。
超声波在空气中传播速度约为340m/s。
3. 接收超声波:超声波接收器也是一个压电陶瓷片,当超声波碰到物体并被反射回来时,接收器会将接收到的超声波转化为电信号。
4. 信号处理:接收到的电信号会经过放大、滤波、模数转换等处理,以便后续的距离计算和数据分析。
5. 距离计算:根据发射超声波到接收超声波的时间间隔,可以计算出超声波从发射到接收的时间差。
再根据超声波在空气中的传播速度,可以将时间差转换为距离。
6. 输出结果:最终,超声波模块会输出测量得到的距离信息,一般以数字信号或模拟电压输出。
超声波模块的工作原理可应用于测距、障碍物检测、物体定位等场景,在工业、机器人、智能家居等领域有广泛的应用。
单收单发超声波模块使用指南自动跟随机器人
单收单发超声波模块使用手册V1.01.参数简介最远接收距离:>5米最短接收距离:<4厘米最大接收角度:>90度数据波动范围:<3毫米模块工作电压:5V模块工作方式:串口模块发送频率:50HZ模块通信波特率:1152002.使用过程发送超声波模块:发送超声波模块只需要上电即可。
发送超声波模块上电后,发送超声波模块上的LED会快闪,此时证明,发送超声波模块已经在正常工作了。
(注:发送超声波模块上面留有了RX TX,这是用来刷超声波固件。
)接收超声波模块:当发送超声波模块通上电之后。
需要将发送超声波模块和接收超声波模块对准,此时接收超声波模块需上的LED 会快闪。
此时证明接收超声波模块已经接收到发送超声波模块发射的超声波。
此时接收超声波模块上接收到的数据即是发送和接收超声波的距离数据。
值得注意的是,2个超声波发射头需要对准,才会通信成功,发送超声波模块只需上电即可工作(发送上的LED闪烁),此时只是证明了发送超声波模块已经成功发射出超声波,但并不能证明接收超声波模块会接收到数据,只有接收到发送超声波模块的声波后,接收超声波模块上的LED闪烁后,才能证明这两者已经通信成功。
接收超声波模块才会有距离数据输出。
3.数据格式当接收超声波已经接收到发送超声波的数据后,接收超声波模块上的LED灯会快速闪烁,会通过串口以50Hz的频率发送出距离数据。
数据格式是:0XA5+两个字节数据(16进制),距离的单位是mm,例如:返回数据是:A500C8,意思就是:200mm。
数据的含义是什么呢?0XA5是帧头,另外2个是数据存储字节。
如何解算:很简单,把2个字节数据移位然后逻辑运算即可。
如下:distance_left=dat_left[1]<<8|dat_left[2];。
hcsr04超声波模块工作频率
hcsr04超声波模块工作频率
摘要:
1.HCSR04超声波模块简介
2.HCSR04超声波模块的工作原理
3.HCSR04超声波模块的引脚功能
4.HCSR04超声波模块的使用注意事项
正文:
HCSR04超声波模块是一款常用的测距模块,具有高精度、盲区超近、稳定测距等特点。
它的工作电压为DC 5V,工作电流为15ma,工作频率为
40kHz。
最远射程可达4m,最近射程为2cm,测量角度为15度。
HCSR04超声波模块的工作原理如下:首先,给超声波模块接入电源和地,然后给脉冲触发引脚(trig)输入一个长为20us的高电平方波。
输入方波后,模块会自动发射8个40khz的声波,与此同时回波引脚echo端的电平会由0变为1。
当超声波返回被模块接收到时,回波引脚端的电平会由1变为0,此时应停止定时器计数。
定时器记录的时间就是超声波从发射到返回的时间,根据这个时间可以计算出距离。
HCSR04超声波模块的引脚功能如下:VCC接5V电源,GND接地线,TRIG接脉冲触发信号,ECHO接回响信号。
在使用HCSR04超声波模块时,有一些注意事项:
1.确保模块工作电压稳定,避免电压波动影响测量精度。
2.避免模块长时间连续工作,以免过热损坏。
3.确保触发引脚和回响引脚的连接稳定,避免信号干扰。
4.在测量过程中,保持探头清洁,避免灰尘或污垢影响测量结果。
5.探头应垂直于被测物体,避免因角度不准确导致测量误差。
HC-SR04超声波测距模块及程序(坤)
char Del20us=0;//延时变量,在超声波脉冲引脚中产生 20us 的方波 char RxBack=1;//超声波返回标志位
TMOD=0x01;//定时器工作方式 1:16 位,初值不能重装
Tx=0;//将超声波脉冲引脚电位拉低 Th0=0;//初始化变量值 Tl0=0;//初始化变量值 TimeUp=0;//初始化
程序:
#include<reg52.h>
#define uint unsigned int #define uchar unsigned char
sbit Tx=P3^2;//产生脉冲引脚,延时 20us sbit Rx=P3^3;//回波引脚,进入外部中断 1。这些引脚可随意改ቤተ መጻሕፍቲ ባይዱ。
bit TimeUp=0;//定时器溢出标志位 long Th0,Tl0; unsigned long time0=0; uint Measureresult=0;
函数中调用了单片机的定时器所以单片机的一个定时器资源已经被占用但是没有使用外部中断而是软件查询引脚电平的方式判断回波信号目的是方便于再接入几个超声波模块因为单片机的外部中断资源有限
超声波模块 HC-SR04 简介以及编程
说明:我编写了一个超声波测距模块(HC-SR04)的程序,主 要把测距的程序写成函数形式,函数的返回值为所测的距离(为十进 制数),单位为毫米(mm)。便于大家嵌入自己开发的主程序中,方 便随时调用。函数中调用了单片机的定时器,所以单片机的一个定时 器资源已经被占用,但是没有使用外部中断,而是软件查询引脚电平 的方式判断回波信号,目的是方便于再接入几个超声波模块,因为单 片机的外部中断资源有限。
效果:可在 3CM-90CM 范围内测量,但是远距离误差较大 (1cm-2cm),但近距离误差较小。可以根据不同的模块作简单的修 正。
超声波模块
超声波传感器模块1)硬件工作原理超声波测距传感器是模拟传感器。
超声波测距传感器利用声音在空气中的传输距离和传输时间成正比的原理,通过检测不同远近的反射面对超声波反射回去的时间不同来检测障碍物的距离。
超声波传感器有一个发射头和一个接收头,安装在同一面上。
在有效的检测距离内,发射头发射特定频率的超声波,遇到检测面反射部分超声波,接收头接收返回的超声波,由芯片记录超声波的往返时间,并计算出距离值,本模块把距离值通过DA芯片转化成模拟值。
“控制器模块”通过扩展接口的模数转换,再通过软件处理,就可以读取离障碍物的距离并在数码管上显示数值。
当超声波测距模块检测到障碍物,同时超声波模块上LED1亮,则数码管显示检测到的距离;当超声波测距模块没有检测到障碍物,同时超声波模块上LED1灭,则数码管显示888。
2)软件工作原理“控制器模块”硬件电路通过扩展接口将完成两个任务:1.读取当前接口的AD 转化结果。
2.把当前的模拟值转化成距离值并把距离值送“显示模块”进行显示。
超声波模块上的DA芯片使用MCP4822,由公式Vout=2.048*2*Dn/4096 (1)Dn是数字输入量Dn=距离<<3(为了提高精度)扩展接口取得的AD值AD_value=(Vin/Vcc)*1024 (2)Vin =(AD_value/1024)* Vcc (3)因为(1)中的Vout与(2)中的Vin相等,则2.048*2*Dn/4096=(AD_value/1024)* Vcc,Dn= AD_value*4096* Vcc/2.048*1024*2;即Dn=0.97* Vcc* AD_value;所需求的距离S=Dn>>3;Vcc=5V;流程图:流程图说明:上电先初始化各端口状态:声光输出口都处于关闭状态,即P0.0、P0.1、P0.2端口输出一个高电平。
声明变量及初始化AD 函数。
完成初始化工作后,程序就读取ADC 转化结果,由公式S= (AD_value*4.84)>>3可以计算小车离障碍物的距离,并把当前的距离值送“显示模块”进行显示。
超声波模块单片机程序
1.超声波测距//晶振=8M//MCU=STC10F04XE//P0.0-P0.6共阳数码管引脚//Trig = P1^0//Echo = P3^2#include <reg52.h> //包括一个52标准内核的头文件#define uchar unsigned char //定义一下方便使用#define uint unsigned int#define ulong unsigned long//***********************************************sfr CLK_DIV = 0x97; //为STC单片机定义,系统时钟分频//为STC单片机的IO口设置地址定义sfr P0M1 = 0X93;sfr P0M0 = 0X94;sfr P1M1 = 0X91;sfr P1M0 = 0X92;sfr P2M1 = 0X95;sfr P2M0 = 0X96;//***********************************************sbit Trig = P1^0; //产生脉冲引脚sbit Echo = P3^2; //回波引脚sbit test = P1^1; //测试用引脚uchar code SEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管0-9 uint distance[4]; //测距接收缓冲区uchar ge,shi,bai,temp,flag,outcomeH,outcomeL,i; //自定义寄存器bit succeed_flag; //测量成功标志//********函数声明void conversion(uint temp_data);void delay_20us();//void pai_xu();void main(void) // 主程序{ uint distance_data,a,b;uchar CONT_1;CLK_DIV=0X03; //系统时钟为1/8晶振(pdf-45页)P0M1 = 0; //将io口设置为推挽输出P1M1 = 0;P2M1 = 0;P0M0 = 0XFF;P1M0 = 0XFF;P2M0 = 0XFF;i=0;flag=0;test =0;Trig=0; //首先拉低脉冲输入引脚TMOD=0x11; //定时器0,定时器1,16位工作方式TR0=1; //启动定时器0IT0=0; //由高电平变低电平,触发外部中断ET0=1; //打开定时器0中断//ET1=1; //打开定时器1中断EX0=0; //关闭外部中断EA=1; //打开总中断0while(1) //程序循环{EA=0;Trig=1;delay_20us();Trig=0; //产生一个20us的脉冲,在Trig引脚while(Echo==0); //等待Echo回波引脚变高电平succeed_flag=0; //清测量成功标志EX0=1; //打开外部中断TH1=0; //定时器1清零TL1=0; //定时器1清零TF1=0; //TR1=1; //启动定时器1EA=1;while(TH1 < 30);//等待测量的结果,周期65.535毫秒(可用中断实现)TR1=0; //关闭定时器1EX0=0; //关闭外部中断if(succeed_flag==1){distance_data=outcomeH; //测量结果的高8位distance_data<<=8; //放入16位的高8位distance_data=distance_data|outcomeL;//与低8位合并成为16位结果数据distance_data*=12; //因为定时器默认为12分频distance_data/=58; //微秒的单位除以58等于厘米} //为什么除以58等于厘米,Y米=(X秒*344)/2// X秒=(2*Y米)/344 ==》X秒=0.0058*Y米==》厘米=微秒/58if(succeed_flag==0){distance_data=0; //没有回波则清零test = !test; //测试灯变化}/// distance[i]=distance_data; //将测量结果的数据放入缓冲区/// i++;/// if(i==3)/// {/// distance_data=(distance[0]+distance[1]+distance[2]+distance[3])/4;/// pai_xu();/// distance_data=distance[1];a=distance_data;if(b==a) CONT_1=0;if(b!=a) CONT_1++;if(CONT_1>=3){ CONT_1=0;b=a;conversion(b);}/// i=0;/// }}}//***************************************************************//外部中断0,用做判断回波电平INTO_() interrupt 0 // 外部中断是0号{outcomeH =TH1; //取出定时器的值outcomeL =TL1; //取出定时器的值succeed_flag=1; //至成功测量的标志EX0=0; //关闭外部中断}//****************************************************************//定时器0中断,用做显示timer0() interrupt 1 // 定时器0中断是1号{TH0=0xfd; //写入定时器0初始值TL0=0x77;switch(flag){case 0x00:P0=ge; P2=0xfd;flag++;break;case 0x01:P0=shi;P2=0xfe;flag++;break;case 0x02:P0=bai;P2=0xfb;flag=0;break;}}//***************************************************************** /*//定时器1中断,用做超声波测距计时timer1() interrupt 3 // 定时器0中断是1号{TH1=0;TL1=0;}*///****************************************************************** //显示数据转换程序void conversion(uint temp_data){uchar ge_data,shi_data,bai_data ;bai_data=temp_data/100 ;temp_data=temp_data%100; //取余运算shi_data=temp_data/10 ;temp_data=temp_data%10; //取余运算ge_data=temp_data;bai_data=SEG7[bai_data];shi_data=SEG7[shi_data];ge_data =SEG7[ge_data];EA=0;bai = bai_data;shi = shi_data;ge = ge_data ;EA=1;}//****************************************************************** void delay_20us(){ uchar bt ;for(bt=0;bt<100;bt++);}/*void pai_xu(){ uint t;if (distance[0]>distance[1]){t=distance[0];distance[0]=distance[1];distance[1]=t;} /*交换值if(distance[0]>distance[2]){t=distance[2];distance[2]=distance[0];distance[0]=t;} /*交换值if(distance[1]>distance[2]){t=distance[1];distance[1]=distance[2];distance[2]=t;} /*交换值}*/2.超声波测距LCD1602显示/*SMC1602A(16*2)模拟口线接线方式连接线图:---------------------------------------------------|LCM-----51 | LCM-----51 | LCM------51 |--------------------------------------------------||DB0-----P1.0 | DB4-----P1.4 | RW-------P3.4 ||DB1-----P1.1 | DB5-----P1.5 | RS-------P3.3 ||DB2-----P1.2 | DB6-----P1.6 | E--------P3.5 ||DB3-----P1.3 | DB7-----P1.7 | VLCD接1K电阻到GND|---------------------------------------------------接线:模块TRIG接P3.7 ECH0 接P3.6本程序源码只供学习参考,不得应用于商业用途,如有需要请联系作者。
HC-SR04超声波测距模块程序
HC-SR04超声波测距模块程序/************************************************************** *********************************************///HC-SR04 超声波测距模块//晶振:12MHZ//接线://串口波特率2400//编写:by kai*************************************************************** ********************************************/#include#include#include#define uchar unsigned char#define uint unsigned intsbit RX = P3^3; // ECHOsbit TX = P1^4; // TRLGsbit BEEP = P1^6; // BEEPsbit K1 = P4^5; // 报警距离 +sbit K2 = P4^3; // 报警距离 -unsigned int time=0;unsigned int timer=0;float S=999;bit flag =0;unsigned int B1 = 150; //设置报警距离 2-400//延时void Delay10ms() //@12.000MHz {unsigned char i, j;_nop_();_nop_();i = 117;j = 183;do{while (--j);} while (--i);}void Delay800ms() //@12.000MHz {unsigned char i, j, k;i = 37;j = 123;k = 92;do{do{while (--k);} while (--j);} while (--i);}/********************************************************/void Conut(void){time=TH0*256+TL0;TH0=0;TL0=0;S=(time*1.87)/100; //算出来是CMif(flag==1) //超出测量{flag=0;printf("-----\n");}printf("S=%f\n",S);}/********************************************************/void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围{flag=1; //中断溢出标志}/********************************************************/void StartModule() //T1中断用来扫描数码管和计800MS启动模块{TX=1; //800MS 启动一次模块Delay800ms();;TX=0;}void ceju(void){EA = 0; //关闭中断,防止影响测量数据StartModule();while(!RX); //当RX为零时等待TR0=1; //开启计数while(RX); //当RX为1计数并等待TR0=0; //关闭计数EA = 1;Conut(); //计算}void Timer0Init(void) //微秒@12.000MHz{AUXR &= 0x7F; //定时器时钟12T模式TMOD &= 0xF0; //设置定时器模式TMOD |= 0x01; //设置定时器模式TL0 = 0x00; //设置定时初值TH0 = 0x00; //设置定时初值TF0 = 0; //清除TF0标志ET0 = 1; //开启定时器1中断EA = 1; //开启定时器1中断}voidUartInit(void)//***************** {PCON &= 0x7F; //波特率不倍速SCON = 0x50; //8位数据,可变波特率AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12TAUXR &= 0xFE; //串口1选择定时器1为波特率发生器TMOD &= 0x0F; //清除定时器1模式位TMOD |= 0x20; //设定定时器1为8位自动重装方式TL1 = 0xF3; //设定定时初值TH1 = 0xF3; //设定定时器重装值ET1 = 0; //禁止定时器1中断TR1 = 1; //启动定时器1TI=1;}void baojing(){EA = 0;while(K1==0||K2==0){if(K1 == 0) // 报警距离 +{BEEP = 1;Delay10ms(); //消抖BEEP = 0;B1 = B1+5;}if(K2 == 0) // 报警距离 -{BEEP = 1;Delay10ms();BEEP = 0;B1 = B1-5;}}if(S{BEEP = 1;Delay800ms();Delay800ms();BEEP = 0;Delay800ms();BEEP = 1;Delay800ms();Delay800ms();BEEP = 0;Delay800ms();BEEP = 1;Delay800ms();Delay800ms();BEEP = 0;}EA = 1;}/********************************************************/ void main(void){Timer0Init();UartInit();K1 = 1;K2 = 1;P1M1 = 0X00;P1M0 = 0X40;BEEP = 1;Delay800ms(); BEEP = 0; while(1){ceju();Delay800ms(); baojing();}}。
51单片机驱动超声波测距模块C51程序
51单片机驱动超声波测距模块C51程序51单片机驱动超声波测距模块C51程序#include;#define uchar unsigned char#define uint unsigned int#define ulong unsigned long//******************* 函数声明**************************void init_T otal(); //总初始化void init_T0(); //初始化定时器T0void init_T1(); //初始化定时器T1void init_inter0();//初始化外部中断1void send_T();void delay(uint z);//延时一段时间void delay_300us();//延时300usvoid delay_100us();//延时100us//*********************************************** *********sbit lcdrs=P1^7;sbit lcdrw=P3^1;sbit lcden=P1^5;//1602液晶控制端sbit send=P1^0;//sbit BEEP=P2^5;sbit wei=P2^6;sbit duan=P2^7;volatile uchar Count_TH ,Count_TL;//分别读计数器T1的高位TH1,低位TL1uchar t0,flag;uint time;uchar code table1[]=" distance "; uchar code table2[]=" ";//初始化显示void write_com(uchar com)//1602写指令函数{lcdrs=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;void write_data(uchar datb)//1602写数据函数{ lcdrs=1;P0=datb;delay(1);lcden=1;delay(1);lcden=0;}void distance(uchar addr,uint datb){uchar bai,shi,ge ;bai=datb/100;shi=datb%100/10;ge=datb%10;write_com(0x80+0x40+addr);write_data(0x30+bai);write_data(0x30+shi);write_data(0x30+ge);}/************************************************ *************************************** 名称:void init_T otal()* 功能:总初始化* 入口参数:NULL* 全局变量:NULL* 返回值:NULL**************************************************************************************/void init_T otal(){init_T0(); //初始化定时器T0为工作方式2 init_T1(); //初始化定时器T1为工作方式1 init_inter0();//初始化外部中断1EA=1; //开总中断}/*************************************************************************************** 名称:void init_T0()* 功能:初始化定时器T0为工作方式2* 入口参数:NULL* 全局变量:NULL* 返回值:NULL**************************************************************************************/void init_T0(){TMOD=0X12;TH0=0XE7;TL0=0XE7;EA=0;ET0=1;TR0=1;}/************************************************ *************************************** 名称:void init_T1()* 功能:初始化定时器T1为工作方式1* 入口参数:NULL* 全局变量:NULL* 返回值:NULL************************************************* *************************************/void init_T1(){TMOD=0X12;TH1=0;TL1=0;EA=0;ET1=1;TR1=1;}/************************************************ *************************************** 名称:void init_inter1()* 功能:初始化外部中断1为低电平触发方式* 入口参数:NULL* 全局变量:NULL* 返回值:NULL************************************************* *************************************/void init_inter0(){IT0=0; //低电平触发EA=0;EX0=0; //关外部中断1}/************************************************ *************************************** 名称:void inter_T0() interrupt 1* 功能:定时器T0中断函数产生40KHZ的方波* 入口参数:NULL* 全局变量:NULL* 返回值:NULL************************************************* *************************************/void inter_T0() interrupt 1{send=~send;}/************************************************ *************************************** 名称:void inter_T1() interrupt 3* 功能:定时器T1中断函数* 入口参数:NULL* 全局变量:NULL* 返回值:NULL************************************************* *************************************/void inter_T1() interrupt 3{TR1=0;EX0=0; //关外部中断0TH1=0;TL1=0;flag=2;}/************************************************ *************************************** 名称:void inter1() interrupt 2* 功能:外部中断1函数* 入口参数:NULL* 全局变量:Count_TH,Count_TL* 返回值:NULL************************************************* *************************************/void inter0() interrupt 0{TR1=0;EX0=0;flag=1;}/************************************************ *************************************** 名称:void send_T()* 功能:发送10个超声波脉冲* 入口参数:NULL* 全局变量:Count* 返回值:NULL************************************************* *************************************/void send_T(){delay_100us();//发送100us的方波TR0=0;//关定时器T0}/************************************************ *************************************** 名称:void delay(uint z)* 功能:延时一段时间* 入口参数:z* 全局变量:NULL* 返回值:NULL************************************************* *************************************/void delay(uint z){uint x,y;for(x=z;x>;0;x--)for(y=1000;y>;0;y--);}/************************************************ *************************************** 名称:void delay_300us()* 功能:延时300us* 入口参数:NULL* 全局变量:NULL* 返回值:NULL************************************************* *************************************/void delay_300us(){uint x;for(x=75;x>;0;x--);}/************************************************ *************************************** 名称:void delay_100us()* 功能:延时100us* 入口参数:NULL* 全局变量:NULL* 返回值:NULL************************************************* *************************************/void delay_100us(){uint x;for(x=24;x>;0;x--);}//*********************************************** ****************************************void main(){uint t,s;init_T otal();//总初始化while(1){TR1=1;//启动定时器1TR0=1;//启动定时器0send_T(); //发送100us超声波脉冲delay_300us();//延时300us跳过盲区EX1=1; //开外部中断1while(!flag); //等待回波或定时器T1溢出if(flag==1) //回波{Count_TH=TH1;//读计数器T1的高位TH1 Count_TL=TL1;//读计数器T1的低位TL1 t=Count_TH*256+Count_TL;s=(33140*t)/400000;distance(4,s);//液晶1602显示距离 }/* else //定时器T1溢出{Count_TH=0XFE;Count_TL=0X7F;// P2=Count_TH;P2=Count_TL;}*/delay(150);flag=0;//标志位清0TH1=0; //T1清0重新计时TL1=0;}}。
超声波测距模块的工作流程
超声波测距模块的工作流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!超声波测距模块的工作流程一般包括以下几个步骤:1. 发射超声波:超声波测距模块通过发射电路产生一定频率的超声波信号,并通过换能器将其转换为机械波向目标物体发射。
超声波模块程序详解
int Trigpin = 7; //定义模块触发引脚int Echopin = 5; //定义模块接收引脚float Distance; //定义距离变量void setup(){pinMode(Echopin,INPUT) ;pinMode(Trigpin,OUTPUT);Serial.begin(9600);//启动串口功能}void loop(){Distance = Measurement();//调用测量函数,将采得的值给变量DistanceSerial.print(Distance);//在端口输出距离Serial.println("cm");//输出单位,并换行delay(2000);}float Measurement(){float distance;//定义一个局部变量digitalWrite(Trigpin,LOW); //初始化触发引脚delayMicroseconds(2);digitalWrite(Trigpin,HIGH);//给触发引脚一个信号,使模块发出声波delayMicroseconds(10);digitalWrite(Trigpin,LOW);//结束声波信号distance = (pulseIn(Echopin,HIGH)*17)/1000;//计算距离return distance;//将算得的距离返回给变量distance}伺服舵机+超声波模块#include<Servo.h>int Trigpin = 7; //定义模块触发引脚int Echopin = 5; //定义模块接收引脚float Distance; //定义距离变量Servo myservo3;void setup(){myservo3.attach(3);pinMode(Echopin,INPUT) ;pinMode(Trigpin,OUTPUT);Serial.begin(9600);//启动串口功能}void loop(){myservo3.write(0);delay(2000);Distance = Measurement();//调用测量函数,将采得的值给变量DistanceSerial.print(Distance);//在端口输出距离Serial.println("cm");//输出单位,并换行myservo3.write(90);delay(2000);Distance = Measurement();//调用测量函数,将采得的值给变量DistanceSerial.print(Distance);//在端口输出距离Serial.println("cm");//输出单位,并换行myservo3.write(178);delay(2000);Distance = Measurement();//调用测量函数,将采得的值给变量DistanceSerial.print(Distance);//在端口输出距离Serial.println("cm");//输出单位,并换行}float Measurement(){float distance;//定义一个局部变量digitalWrite(Trigpin,LOW); //初始化触发引脚delayMicroseconds(2);digitalWrite(Trigpin,HIGH);//给触发引脚一个信号,使模块发出声波delayMicroseconds(10);digitalWrite(Trigpin,LOW);//结束声波信号distance = (pulseIn(Echopin,HIGH)*17)/1000;//计算距离return distance;//将算得的距离返回给变量distance}。
HCSR04超声波模块程序(MSP430)
TA1cap_time=655356-TA1cap_value[0]+TA1cap_value[1];
}
else
{
TA1cap_time=TA1cap_value[1]-TA1cap_value[0];
}
TA1CCTL1 &=~CCIFG;
}
(2)头文件
/*
* HC_SR04.h
*
* Created on: 2015年4月4日
* Author: LGY
*/
#ifndef HC_SR04_H_
#define HC_SR04_H_
//#define DIVS2 0x0010 //SNCLK 2分频
//变量
extern uchar HC_count;//发10usTTL电平次数
#define uint unsigned int
#define uchar unsigned char
//UCSCTL5 |=0x0010;// //SMCLK 2分频,2Mhz
TA1CTL |=TASSEL_2;///* Timer A时钟源选择: SMCLK */
TA1CTL |=0x0080;// Timer A 4分频
TA1CTL |=0x0020;// Timer A反复计数模式
//TA1CCR0 =400;//约10ms //计数终值
while(TA1cap_next<2);//等待捕获完成,若发送1次无效则跳出
TA1CCTL1 &=~CCIE; //CCR中断关闭
distance=(float)TA1cap_time/58;//求出距离,单位厘米
超声波测距模块SR04测试程序51单片机(串口助手,串口通信)
超声波测距模块SR04测试程序51单⽚机(串⼝助⼿,串⼝通信)#include#includetypedef unsigned char uint8;typedef unsigned int uint16;sbit Trig=P3^3;//触发引脚定义sbit Echo=P3^2;//测量引脚定义uint16 distance;//定义全局变量/******************************************延时让Trig引脚产⽣⼤于10us的脉冲********************************************/void delay(){uint8 i;for(i=0;i<100;i++);}//初始化void init(){EA=1;//开总中断IT0=0;//外部中断0,低电平触发TMOD|=0x01;//定时器0 ⼯作模式1TH0=0;TL0=0;TR0=0;}//串⼝设置void UART_init(){SCON=0x50;TMOD=0x20;TH1=0xFD;TL1=0xFD;TR1=1;}//发送⼀个字节void UART_send_byte(uint8 dat){SBUF=dat;while(TI==0);TI=0;}//发送⼀组测得的distancevoid UART_send_dat(uint16 temp){UART_send_byte((temp/10000)%10 + '0');UART_send_byte((temp/1000)%10 + '0');UART_send_byte((temp/100)%10 + '0');UART_send_byte((temp/10)%10 + '0');UART_send_byte('.');UART_send_byte(temp%10 + '0');UART_send_byte('c');UART_send_byte('m');}//主函数main(){UART_init();//初始化init(); //初始化Trig=0;//先把引脚拉低while(1)//进⼊循环{Trig=1;delay();//产⽣脉冲Trig=0;while(Echo==0);//等待引脚被拉⾼TR0=1;//打开定时器0EX0=1;//打开中断while(TH0<250);//正在测量数据,需要等待TR0=0;TL0=0;TH0=0;UART_send_dat(distance);//向串⼝发送测得的distanceUART_send_byte('\r');UART_send_byte('\n');}}void extra_interrupt() interrupt 0 //外部中断0{distance=(256*TH0+TL0)*0.184;//测得最⼩精度位mm(晶振为11059200Hz)//P0=Echo;EX0=0;//关闭中断}/********************关于上式的计算**************(256*TH0+TL0)机器周期个数⼀个机器周期*⾳速/2=(12/11059200)*340/2=0.184*************************************************/。
US-100超声波测距模块解析
US-100超声波测距模块解析1. 简介US-100超声波测距模块是一种用于非接触式测量距离的模块,它可以通过发送超声波信号并接收其回波,根据回波时间计算物体与模块的距离。
US-100模块是HC-SR04模块的升级版,具有较高的精度和更全面的功能。
US-100超声波测距模块有四个引脚:VCC、Trig、Echo和GND。
其中,VCC和GND是电源引脚,Trig是发射引脚,Echo是接收引脚。
模块可以通过直接连接到Arduino等微控制器上进行使用。
2. 原理超声波是一种高频音波,其频率通常在20kHz以上。
US-100模块工作原理是,当Trig引脚发出一个10微秒的高电平信号时,模块内部会产生一次20kHz的超声波发射。
当超声波遇到物体后反射回来,回波会被Echo引脚接收到。
模块会将Echo引脚的电平变化转换成一个时间信号,并将此信号与回波时间进行比较从而计算出距离。
通过改变Trig引脚产生高电平信号的持续时间,我们可以控制超声波的发送距离和精度。
US-100模块可以设置不同的模式,以改变Trig信号的长度和测量单位等参数。
3. 使用方法接线:•VCC引脚接3.3V或5V电源•GND引脚接地•Trig引脚接Arduino的数字输出引脚•Echo引脚接Arduino的数字输入引脚代码:```c int trigPin = 2; int echoPin = 3; long duration, cm, inches;void setup() { pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT);Serial.begin(9600); }void loop() { digitalWrite(trigPin, LOW); delayMicroseconds(2);digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); cm = duration / 58; inches = duration / 148;Serial.print(cm); Serial.print(。
创新创业教育 4.2.3 超声波模块应用
4.2.3 超声波模块应用超声波时序图控制程序#include <NewPing.h>#define TRIGGER_PIN 12 // 宏定义12号数字端口为触发#define ECHO_PIN 11 // 宏定义11号数字端口为接收模块反馈信号#define MAX_DISTANCE 200 //宏定义模块的最大测量距离,规格标450cm,但实测一般为200cmNewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); //声明模块的参数void setup() {Serial.begin(115200); // 设置串口的波特率,可以改为9600}void loop() {delay(500); // 每次测量的时间间隔,模块规格为40Hz,因此最小为25ms,但一般不少于30msSerial.print("Ping: ");Serial.print(sonar.ping_cm()); // 调用库里面的 ping_cm() 方法,直接输出距离Serial.println("cm");}在没有库文件的情况下也是可以使用超声波模块测出障碍物距离,控制程序如下:const int TrigPin = 2;const int EchoPin = 3;float distance;void setup(){ // 初始化串口通信及连接SR04的引脚Serial.begin(9600);pinMode(TrigPin, OUTPUT);// 要检测引脚上输入的脉冲宽度,需要先设置为输入状态 pinMode(EchoPin, INPUT);Serial.println("Ultrasonic sensor:");}void loop(){// 产生一个10us的高脉冲去触发TrigPindigitalWrite(TrigPin, LOW);delayMicroseconds(2);digitalWrite(TrigPin, HIGH);delayMicroseconds(10);digitalWrite(TrigPin, LOW);// 检测脉冲宽度,并计算出距离distance = pulseIn(EchoPin, HIGH) / 58.00; Serial.print(distance);Serial.print("cm");Serial.println();delay(1000);}超声波模块原理图。
单片机超声模块(HC-SR04)说明
单片机超声模块说明(HC-SR04)了解超声模块我们要分几步来理解,包括它的工作原理和在单片机上的运行情况,只有两者相互理解透才能更好的利用超声模块来开发一些东东!不同型号的超声模块其实大致是一样,也就没必要区分型号,除非你是特别要求,对于爱好者,初学者,则是没必要这么苛刻!第一步:超声模块的工作原理参数的设置时序图的说明第二步:单片机的连接上面我们知道怎么连接单片机的线了,对于TRIG发射端,ECHO 接受端,它们只需要四I/O端口就可以。
第三步:程序的编写和功能的开发这里我选择TRIG = P2^0 ECHO = P3^2设置一个报警器,当距离超过150cm是就报警,不超过是就不报警。
/******************************************板子:郭天祥老师的52单片机板?设计者:蒋时间:2012-4-29学校:南昌航空大学******************************************/#include <reg52.h>sbit dula=P2^6; //数码管段选,锁存器控制信号sbit wela=P2^7; //数码管位选,锁存器控制信号sbit a=P2^3;#define uchar unsigned char#define uint unsigned intint time;int succeed_flag;uchar timeL;uchar timeH;sbit Trig=P1^0;sbit Echo=P3^2;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f, 0x6f}; void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void delay_20us(){uchar a ;for(a=0;a<100;a++);}//显示数据转换程序void display(uint temp){uchar ge,shi,bai;bai=temp/100;shi=(temp%100)/10;ge=temp%10;dula=0;P0=table[ge]; //送数字8到段码端口dula=1;dula=0;wela=0;P0=0x7b; //数码管位选wela=1;wela=0;delay(5);dula=0;P0=table[shi]; //送数字8到段码端口dula=1;dula=0;wela=0;P0=0x7d; //数码管位选wela=1;wela=0;delay(5);dula=0;P0=table[bai]; //送数字8到段码端口dula=1;dula=0;wela=0;P0=0x7e; //数码管位选wela=1;wela=0;delay(5);if(temp>150)a=0;elsea=1;}void main(){uint distance;Trig=0; //首先拉低脉冲输入引脚EA=1; //打开总中断0TMOD=0x10; //定时器1,16位工作方式while(1){EA=0; //关总中断Trig=1; //超声波输入端delay_20us(); //延时20usTrig=0; //产生一个20us的脉冲while(Echo==0); //等待Echo回波引脚变高电平succeed_flag=0; //清测量成功标志EA=1;EX0=1; //打开外部中断0TH1=0; //定时器1清零TL1=0; //定时器1清零TF1=0; //计数溢出标志TR1=1; //启动定时器1delay(20); //等待测量的结果TR1=0; //关闭定时器1EX0=0; //关闭外部中断0if(succeed_flag==1){time=timeH*256+timeL;distance=time*0.0172; //厘米}if(succeed_flag==0){distance=0; //没有回波则清零}display(distance);}}//外部中断0,用做判断回波电平void exter() interrupt 0 // 外部中断0是0号{EX0=0; //关闭外部中断timeH =TH1; //取出定时器的值timeL =TL1; //取出定时器的值succeed_flag=1;//至成功测量的标志//定时器1中断,用做超声波测距计时void timer1() interrupt 3 //{TH1=0;TL1=0;}一遍可能看的有点糊涂!多看几遍就可以看懂!不明白问me+739141300技术付出的是金钱和汗水,收获的是一份自信!。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
int Trigpin = 7; //定义模块触发引脚
int Echopin = 5; //定义模块接收引脚
float Distance; //定义距离变量
void setup()
{
pinMode(Echopin,INPUT) ;
pinMode(Trigpin,OUTPUT);
Serial.begin(9600);//启动串口功能
}
void loop()
{
Distance = Measurement();//调用测量函数,将采得的值给变量Distance
Serial.print(Distance);//在端口输出距离
Serial.println("cm");//输出单位,并换行
delay(2000);
}
float Measurement()
{
float distance;//定义一个局部变量
digitalWrite(Trigpin,LOW); //初始化触发引脚
delayMicroseconds(2);
digitalWrite(Trigpin,HIGH);//给触发引脚一个信号,使模块发出声波
delayMicroseconds(10);
digitalWrite(Trigpin,LOW);//结束声波信号
distance = (pulseIn(Echopin,HIGH)*17)/1000;//计算距离
return distance;//将算得的距离返回给变量distance
}
伺服舵机+超声波模块
#include<Servo.h>
int Trigpin = 7; //定义模块触发引脚
int Echopin = 5; //定义模块接收引脚
float Distance; //定义距离变量
Servo myservo3;
void setup()
{
myservo3.attach(3);
pinMode(Echopin,INPUT) ;
pinMode(Trigpin,OUTPUT);
Serial.begin(9600);//启动串口功能
}
void loop()
{
myservo3.write(0);
delay(2000);
Distance = Measurement();//调用测量函数,将采得的值给变量Distance
Serial.print(Distance);//在端口输出距离
Serial.println("cm");//输出单位,并换行
myservo3.write(90);
delay(2000);
Distance = Measurement();//调用测量函数,将采得的值给变量Distance
Serial.print(Distance);//在端口输出距离
Serial.println("cm");//输出单位,并换行
myservo3.write(178);
delay(2000);
Distance = Measurement();//调用测量函数,将采得的值给变量Distance
Serial.print(Distance);//在端口输出距离
Serial.println("cm");//输出单位,并换行
}
float Measurement()
{
float distance;//定义一个局部变量
digitalWrite(Trigpin,LOW); //初始化触发引脚
delayMicroseconds(2);
digitalWrite(Trigpin,HIGH);//给触发引脚一个信号,使模块发出声波delayMicroseconds(10);
digitalWrite(Trigpin,LOW);//结束声波信号
distance = (pulseIn(Echopin,HIGH)*17)/1000;//计算距离
return distance;//将算得的距离返回给变量distance
}。