最经典的52单片机C语言HC -SR 04超声波测距程序
--超声波测距模块--测距--最简单的C代码
![--超声波测距模块--测距--最简单的C代码](https://img.taocdn.com/s3/m/2245e33b83c4bb4cf7ecd1f1.png)
sbit LED2=P1^3; //数码管位显示,dm位
sbit LED3=P1^4; //数码管位显示,cm位
sbit xiaoshudian=P2^0; //初始化控制数码管的小数点的位
if(juli<10){m=0;dm=0;cm=juli;}
}
/****************************************************************************************************************************************************/
/*本人是电子专业的大一学生,因为学校这学期还没开设相关的专业课程,所有现在是自学单片机,技术有限,没有加入温度补偿,数码管显示也没有用锁存芯片,凭着对C语言的一点掌握写出了这个最容易看懂并且能够有效运行的单片机程序,写的是自己想出来的最简单的代码,希望大家不要见笑。O(∩_∩)O*/
/*因为一直都很想尝试超声波测距,所以前些天买了个HC-R4的超声波模块,网上找了一下原理(原理很简单的),然后就自己尝试着写代码,下面的代码基本上都是自己想出来的,没有参照过别人的,并不是说我不想去参照别人的,而是因为网上高手很多但是他们写的代码我基本上还有很多看不懂呵,所以下面的程序应该还有很多可以改进的地方。*/
void yanshi(uint x) //延时函数
{
uchar i;
while(x--)
{
for(i=0;i<120;i++);
}
}
/****************************************************************************************************************************************************/
hc-sr04的使用流程为
![hc-sr04的使用流程为](https://img.taocdn.com/s3/m/0d75e67fa9956bec0975f46527d3240c8447a19b.png)
HC-SR04的使用流程流程概述本文档将介绍如何使用HC-SR04超声波模块进行测距,包括硬件连接和代码编写的详细步骤。
HC-SR04是一款常用的低成本超声波测距模块,通过发射超声波信号并接收回波来计算距离。
该模块广泛应用于机器人、自动避障系统等场景。
硬件连接使用HC-SR04超声波模块之前,首先需要进行正确的硬件连接。
下面是连接步骤:1.将HC-SR04超声波模块插入面包板中。
确保连接正确,模块的GND引脚与面包板的地线相连,VCC引脚与5V电源相连。
2.连接Trig引脚和Echo引脚。
Trig引脚连接到面包板的数字引脚,而Echo引脚连接到面包板的模拟引脚。
软件设置完成硬件连接后,需要进行相关的软件设置。
具体步骤如下:1.在Arduino开发环境中创建一个新的项目。
2.导入Ultrasonic.h库。
这个库提供了访问HC-SR04模块的函数和方法。
3.定义Trig和Echo引脚的数字引脚号。
4.在setup()函数中初始化HC-SR04模块。
使用Ultrasonic类的构造函数,并传入Trig和Echo引脚号。
5.在loop()函数中使用Ultrasonic类的read()方法来读取距离值。
代码示例下面是一个简单的代码示例,演示了如何使用HC-SR04超声波模块进行测距:```cpp #include <Ultrasonic.h>// 定义Trig和Echo引脚的数字引脚号 #define TRIG_PIN 2 #define ECHO_PIN 3Ultrasonic ultrasonic(TRIG_PIN, ECHO_PIN);void setup() { // 初始化HC-SR04模块 ultrasonic.init(); }void loop() { // 读取距离值 float distance = ultrasonic.read();// 输出距离值 Serial.print(。
HC-SR04超声波测距模块说明书
![HC-SR04超声波测距模块说明书](https://img.taocdn.com/s3/m/9f3ec63e7f21af45b307e87101f69e314332fa81.png)
HC-SR04超声波测距模块◼产品概述HC-SR04是一款升级的超声波测距模块。
新增加UART,IIC及1-WIRE(单总线)功能,模式可以通过外围电阻设置。
2CM超小盲区,4M典型最远测距,2mA超低工作电流。
采用自研超声波测距解调芯片,使其外围更加简洁,工作电压更宽(2.8-5.5V)。
驱动采用扫频技术,减少探头本身一致性对灵敏度的影响。
内部40K驱动频率采用正温度补偿,切合探头中心频率的温度特性,减小温度影响。
外部晶振为外观兼容而放置的晶振,不起任何作用,不焊接晶振的模块价格更有优势。
◼实物图片◼主要特性⚫采用专业解调芯片⚫工作电压:2.8-5.5V⚫工作电流:2mA⚫支持GPIO,UART,IIC及1-WIRE多种接口模式,默认输出模式兼容HC-SR04⚫2CM盲区,4M典型最远测距⚫200mS周期⚫可配置各种颜色及加固型探头◼典型应用⚫玩具,机器人避障⚫液位,水位测量⚫坐姿检测⚫其它测距应用◼性能参数◼GPIO/UART/IIC/1-WIRE模式选择◼测量操作一:GPIO模式工作模式同HC-SR04。
外部MCU给模块Trig脚一个大于10uS的高电平脉冲;模块会给出一个与距离等比的高电平脉冲信号,可根据脉宽时间“T”算出:距离=T*C/2(C为声速)声速温度公式:c=(331.45+0.61t/℃)m•s-1(其中330.45是在0℃)0℃声速:330.45M/S20℃声速:342.62M/S40℃声速:354.85M/S0℃-40℃声速误差7左右。
实际应用,如果需要精确距离值,必需要考虑温度影响,做温度补偿。
如有需要,可关注我司带温补单芯片RCWL-9700。
二:UART模式UART模式波特率设置:9600N1命令返回值说明0XA0BYTE_HBYTE_MBYTE_L 输出距离为:((BYTE_H<<16)+(BYTE_M<<8)+BYTE_L)/1000单位mm0XF1公司及版本信息连接串口。
树莓派控制HC-SR04超声波模块测距(新手向+C语言向)
![树莓派控制HC-SR04超声波模块测距(新手向+C语言向)](https://img.taocdn.com/s3/m/e1aa0810a66e58fafab069dc5022aaea998f4131.png)
树莓派控制HC-SR04超声波模块测距(新⼿向+C语⾔向) 因为作业要求使⽤c语⾔代码,这⾥先附上⼀段摘⾃⽹上的代码 感谢KalaerSun的c语⾔代码,摘⾃https:///qq_25247589/article/details/628921401 #include <wiringPi.h>2 #include <stdio.h>3 #include <sys/time.h>4#define Trig 45#define Echo 567void ultraInit(void)8 {9 pinMode(Echo, INPUT); //设置端⼝为输⼊10 pinMode(Trig, OUTPUT); //设置端⼝为输出11 }1213float disMeasure(void)14 {15struct timeval tv1; //timeval是time.h中的预定义结构体其中包含两个⼀个是秒,⼀个是微秒16/*17 struct timeval18 {19 time_t tv_sec; //Seconds.20 suseconds_t tv_usec; //Microseconds.21 };22*/2324struct timeval tv2;25long start, stop;26float dis;2728 digitalWrite(Trig, LOW);29 delayMicroseconds(2);3031 digitalWrite(Trig, HIGH);32 delayMicroseconds(10); //发出超声波脉冲33 digitalWrite(Trig, LOW);3435while(!(digitalRead(Echo) == 1));36 gettimeofday(&tv1, NULL); //获取当前时间开始接收到返回信号的时候3738while(!(digitalRead(Echo) == 0));39 gettimeofday(&tv2, NULL); //获取当前时间最后接收到返回信号的时候40/*41 int gettimeofday(struct timeval *tv, struct timezone *tz);42 The functions gettimeofday() and settimeofday() can get and set the time as well as a timezone.43 The use of the timezone structure is obsolete; the tz argument should normally be specified as NULL.44*/45 start = _sec * 1000000 + _usec; //微秒级的时间46 stop = _sec * 1000000 + _usec;4748 dis = (float)(stop - start) / 1000000 * 34000 / 2; //计算时间差求出距离4950return dis;51 }5253int main(void)54 {55float dis;5657if(wiringPiSetup() == -1){ //如果初始化失败,就输出错误信息程序初始化时务必进⾏58 printf("setup wiringPi failed !");59return1;60 }6162 ultraInit();6364while(1){65 dis = disMeasure();66 printf("distance = %0.2f cm\n",dis);67 delay(1000);68 }6970return0;71 } 因为是刚开始接触树莓派开发,所以⽂章中可能会出现错误,希望⼤神们能多多指教,不胜感激。
超声波模块HC-SR04简介以及编程
![超声波模块HC-SR04简介以及编程](https://img.taocdn.com/s3/m/b35dacb004a1b0717ed5dd05.png)
超声波模块HC-SR04简介以及编程1、本模块性能稳定,测度距离精确,模块高精度,盲区小。
产品应用领域:机器人避障物体测距液位检测公共安防停车场检测。
2、主要技术参数:1:使用电压:DC---5V2:静态电流:小于2mA3:电平输出:高5V4:电平输出:底0V5:感应角度:不大于15度6:探测距离:2cm-450cm7:高精度可达0.2cm实物图接线方式:VCC、trig(控制端)、 echo(接收端)、GND基本工作原理:(1)采用IO口TRIG触发测距,给至少10us的高电平信号;(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;(3)有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。
测试距离=(高电平时间*声速(340M/S))/2; 本模块使用方法简单,一个控制口发一个10US以上的高电平,就可以在接收口等待高电平输出.一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离.如此不断的周期测,即可以达到你移动测量的值5、操作:初始化时将trig和echo端口都置低,首先向给trig 发送至少10 us的高电平脉冲(模块自动向外发送8个40K的方波),然后等待,捕捉echo端输出上升沿,捕捉到上升沿的同时,打开定时器开始计时,再次等待捕捉echo的下降沿,当捕捉到下降沿,读出计时器的时间,这就是超声波在空气中运行的时间,按照测试距离=(高电平时间*声速(340M/S))/2 就可以算出超声波到障碍物的距离。
6、下面是飞思卡尔XS128单片机测距的程序:while(1){PT1AD0_PT1AD00 = 1;//给超声波模块输入高脉冲PITINTE_PINTE1=1; //打开PIT1定时器while(!(counter0>=4)); //等待20usPITINTE_PINTE1=0;counter0 = 0;//关闭定时器,计数清零PT1AD0_PT1AD00 = 0; //trig管脚拉低PORTB_PB0 = 0; //指示灯0while(!(PT1AD0_PT1AD01 == 1)); //等待echo输出上升沿PORTB_PB1 = 0; //指示灯1PITINTE_PINTE0=1; //打开PIT0定时器while(!(PT1AD0_PT1AD01 == 0)); //等待下降沿distance = counter*17/20; //计算距离,单位CMPITINTE_PINTE0=0; //关闭定时器PORTB_PB2 = 0; //指示灯2PITINTE_PINTE0=1; //打开定时器定时500ms,数码管显示 while(!(counter>=10000)){Showing(distance); //显示距离,精确1cm}PITINTE_PINTE0=0;counter=0; //关闭定时器,清零 }。
(完整word版)用51单片机实现HC-SR04超声波测距程序(word文档良心出品)
![(完整word版)用51单片机实现HC-SR04超声波测距程序(word文档良心出品)](https://img.taocdn.com/s3/m/422b4b41f111f18582d05a0d.png)
#include <reg52.h> //包括一个52标准内核的头文件#define uchar unsigned char //定义一下方便使用#define uint unsigned int#define ulong unsigned longsbit 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-9uint distance[4]; //测距接收缓冲区uchar ge,shi,bai,temp,flag,outcomeH,outcomeL,i; //自定义寄存器bit succeed_flag; //测量成功标志//********函数声明void conversion(uint temp_data);void delay_20us();void main(void) // 主程序{uint distance_data,a,b;uchar CONT_1;i=0;flag=0;test =0;Trig=0; //首先拉低脉冲输入引脚TMOD=0x11; //定时器0,定时器1,16位工作方式TR0=1; //启动定时器0IT0=0; //由高电平变低电平,触发外部中断ET0=1; //打开定时器0中断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*256+outcomeL;distance_data= (distance_data*1.87)/100;} //为什么除以58等于厘米,Y米=(X 秒*344)/2// X秒=(2*Y米)/344 ==》X 秒=0.0058*Y米==》厘米=微秒/58if(succeed_flag==0){distance_data=0; //没有回波则清零test = !test; //测试灯变化}/********************************************每循环3次就显示结果一次*********************************************/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);}}}//***************************************************************//外部中断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=0xfe;flag++;break;case 0x01:P0=shi;P2=0xfd;flag++;break;case 0x02:P0=bai;P2=0xfb;flag=0;break;}}//显示数据转换程序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++);}。
51单片机超声波模块的C语言程序
![51单片机超声波模块的C语言程序](https://img.taocdn.com/s3/m/c8c835cf5f0e7cd1852536b4.png)
//超声波模块程序//超声波模块程序//Trig = P2^0//Echo = P3^2#include <reg52.h>#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};uchar code table1[]={0,1,2,3,4,5,6,7};//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;P2=table1[2];P0=table[ge];delay(1);P2=table1[1];P0=table[shi];delay(1);P2=table1[0];P0=table[bai];delay(1);}//************************************************************** *void main(){uint distance;// test =0;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; //没有回波则清零// test = !test; //测试灯变化}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;}1602液晶显示的超声波模块程序接口程序里边都有、、#include<reg52.h>//#include<delay.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit lcdrs=P2^3;sbit lcden=P2^2;sbit trig=P2^0; //超声波发送//sbit echo=P3^2; //超声波接受//P0____________DB0-DB7uchar dis[]="Disp_HC-SR04";uchar num[]="0123456789";uint distance;void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=121;y>0;y--);}void HC_init(){TMOD=0x09;TR0=1;TH0=0;TL0=0;}uint HC_jisuan(){uint dist,timer;timer=TH0;timer<<=8;timer=timer|TL0;dist=timer/53; //晶振11.0592MHz 距离cm=微秒us/58return dist; //1个机器周期是12个时钟周期timer*12/(58*11.0592)=timer/53}void HC_run(){uint tempH=0x00,tempL=0x00;TH0=0;TL0=0;trig=0;trig=1;delay(1);trig=0;while((TH0-tempH!=0||TL0-tempL!=0)||(TH0==0&&TL0==0)){tempH=TH0;tempL=TL0;}delay(1);}void lcd_write_com(uchar com) //LCD写指令{lcdrs=0;P0=com;delay(1);lcden=1;delay(1);lcden=0;}void lcd_write_data(uchar date) //LCD写数据{lcdrs=1;P0=date;delay(1);lcden=1;delay(1);lcden=0;}void lcd_init() //LCD初始化{lcden=0;lcd_write_com(0x38);lcd_write_com(0x0c);lcd_write_com(0x06);lcd_write_com(0x01); }void lcd_display(uchar temp) {uint i;lcd_write_com(0x82);for(i=0;i<12;i++){lcd_write_data(dis[i]);}lcd_write_com(0x80+0x41);lcd_write_data('D');lcd_write_data('i');lcd_write_data('s');lcd_write_data('t');lcd_write_data('a');lcd_write_data('n');lcd_write_data('c');lcd_write_data('e');lcd_write_data(':');lcd_write_data(num[temp/100]); lcd_write_data(num[temp/10%10]); lcd_write_data(num[temp%10]);lcd_write_data('c');lcd_write_data('m');}void main(){lcd_init();HC_init();while(1){HC_run();distance=HC_jisuan();lcd_display(distance);delay(200);}}。
HC-SR04超声波测距模块及程序(坤)
![HC-SR04超声波测距模块及程序(坤)](https://img.taocdn.com/s3/m/f9a3921210a6f524ccbf8551.png)
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),但近距离误差较小。可以根据不同的模块作简单的修 正。
HC-SR04超声波测距数码管显示(原创)
![HC-SR04超声波测距数码管显示(原创)](https://img.taocdn.com/s3/m/624ba6d289eb172ded63b772.png)
超声波测距数码管显示第一次写稿子。
不足之处还望各位多提宝贵意见在这里。
模块使用的是HC-SR04的超声波模块。
淘宝网上有,很便宜的,我当时买的好像才7块5.但是距离不会很远。
只有60厘米。
在10厘米以内就非常的准确。
以上的话误差在1-2厘米!这里模块资料就不上传了,,,网上搜索一大把!况且现在买的模块都有送资料的看图!!!!!!!!!!不多说了,直接上图。
数码管的接法模块接法程序里会注释出来。
这里就不做介绍了:好了,说下程序基本原理:1、给至少一个10us的电平触发信号2、等待高电平的到来(如果是高电平,表示接收到信号)3、接收到高电平,启动计数器4、高电平结束,关闭计数器5、取出计数器的值,并计算6、显示距离,并清空计数器,回到第一步程序如下://晶振12M 测试时使用STC89C54RD+芯片端口一样的都可以使用#include <reg52.h> //头文件#define uint unsigned int //宏定义#define uchar unsigned charuchar codetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //段码uchar code tablee[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位码uchar temp[8]; //寄存器sbit TRIG = P1^0 ; //定义端口和模块上的引脚接一起电源应该都会接了吧端口都可以自行修改的sbit ECHO = P1^1 ;sbit duan=P2^1;sbit wei=P2^0;void xs(uint x,uint y); //声明子程序void delayms(uint t);void delayus(uint t);//定时器初始化//--------------------------------------------------------------------void Init_Timer0(void){TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响//TH0=0x00; //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出//TL0=0x00;EA=1; //总中断打开ET0=1; //定时器中断打开// TR0=1; //定时器开关打开}//主程序//-----------------------------------------------------void main(void){Init_Timer0(); //初始化while(1){uint s; //距离变量TRIG=1;delayus(12); //触发信号TRIG=0;while(!ECHO); //等待高电平TR0=1;while(ECHO); //高电平结束TR0=0;s=TH0*256+TL0; //计算高8位与低8位合并s=s/58; //为什么除以58等于厘米, Y米=(X秒*344)/2// X秒=( 2*Y米)/344 -> X秒=0.0058*Y米 -> 厘米=微秒/58//s=s*10;TH0=0;TL0=0;temp[0]=table[s/1000];temp[1]=table[(s%1000)/100];temp[2]=table[((s%1000)%100)/10];temp[3]=table[((s%1000)%100)%10];temp[4]=table[((((s%100000)%10000)%1000)%100)/10]; temp[5]=table[((((s%100000)%10000)%1000)%100)%10];xs(0,4); //调用显示delayus(100);//稍作延时。
超声波模块HC-SR04调试以及数码管显示
![超声波模块HC-SR04调试以及数码管显示](https://img.taocdn.com/s3/m/d64d25553c1ec5da50e2704f.png)
超声波模块HC-SR04简介以及编程1、本模块性能稳定,测度距离精确,模块高精度,盲区小。
产品应用领域:机器人避障物体测距液位检测公共安防停车场检测。
2 主要技术参数:1:使用电压:DC---5V2:静态电流:小于2mA3:电平输出:高5V4:电平输出:底0V5:感应角度:不大于15度6:探测距离:2cm-450cm7:高精度可达0.2cm实物图接线方式:VCC、trig(控制端)、echo(接收端)、GND基本工作原理:(1)采用IO口TRIG触发测距,给至少10us的高电平信号; (2)模块自动发送8个40khz的方波,自动检测是否有信号返回;(3)有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。
测试距离=(高电平时间*声速(340M/S))/2; 本模块使用方法简单,一个控制口发一个10US以上的高电平,就可以在接收口等待高电平输出.一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离.如此不断的周期测,即可以达到你移动测量的值操作:初始化时将trig 和echo 端口都置低,首先向给 trig 发送至少10 us 的高电平脉冲(模块自动向外发送8个40K 的方波),然后等待,捕捉 echo 端输出上升沿,捕捉到上升沿的同时,打开定时器开始计时,再次等待捕捉echo 的下降沿,当捕捉到下降沿,读出计时器的时间,这就是超声波在空气中运行的时间,按照 测试距离=(高电平时间*声速(340M/S))/2 就可以算出超声波到障碍物的距离。
下面是飞思卡尔XS128单片机测距的程序:while(1){PT1AD0_PT1AD00 = 1;//给超声波模块输入高脉冲PITINTE_PINTE1=1; //打开PIT1定时器while(!(counter0>=4)); //等待20usPITINTE_PINTE1=0;counter0 = 0;//关闭定时器,计数清零PT1AD0_PT1AD00 = 0; //trig管脚拉低PORTB_PB0 = 0; //指示灯0while(!(PT1AD0_PT1AD01 == 1)); //等待echo输出上升沿PORTB_PB1 = 0; //指示灯1PITINTE_PINTE0=1; //打开PIT0定时器while(!(PT1AD0_PT1AD01 == 0)); //等待下降沿distance = counter*17/20; //计算距离,单位CMPITINTE_PINTE0=0; //关闭定时器PORTB_PB2 = 0; //指示灯2PITINTE_PINTE0=1; //打开定时器定时500ms,数码管显示while(!(counter>=10000)){Showing(distance); //显示距离,精确1cm}PITINTE_PINTE0=0;counter=0; //关闭定时器,清零}。
超声波测距C语言源程序代码
![超声波测距C语言源程序代码](https://img.taocdn.com/s3/m/221d8cd4a0116c175e0e4825.png)
/*{HZ即单位s的倒数}本晶振为12MHZ,因此外部的时钟频率为12MHZ,所以内部的时钟频率为(12MHZ)/12=1MH即1000000HZ,而机械频率为1/(1MHZ),即每完成一次计算(即定时器的值加一)用时0.000001s,即1us(微秒).*//****************************************************************************** *****///具有模式选择.#include<reg52.h>#define UC unsigned char#define UI unsigned intvoid delay(UI); //延时9.56us程序sbit beep = P1^3; //用于声音报警sbit Lv = P1^7; //用于光报警sbit Hong = P1^6;sbit QD = P3^7;//K8 //P3^7口(K8)为确定键,sbit GX = P3^1;//K7 //P3^3口(K2)为修改键,sbit SX = P3^6;//K6 //P3^2(K3)为测量键.sbit BX = P3^0;//K5 //个(K7),十(K6),百(K5),三位修改键sbit a = P1^2;//百位//数码管位选sbit b = P1^1;//十位sbit c = P1^0;//个位sbit trig = P1^4; //方波发射端sbit echo = P1^5; //超声波接收端void IntConfiguration(); //用来"设置中断"的函数,P3^3口(K2)为修改键,P3^2(K3)为测量键.void TimeConfiguration(); //用来"设置定时器"的函数sbit K1 = P3^4;//动态sbit K4 = P3^5;//静态//用于进行模式切换(K1、K4键)void xiaxian(); //修改函数,用来修改下限void shangxian(); //修改函数,用来修改上限UI min[3]={0,5,0}; //报警极限,拆分为"百十个"三位UI max[3]={3,0,0}; //MIN,MAX 用来存储最大和最小值void MINxianshi(UI); //最小范围和最大范围的显示void MAXxianshi(UI);UC code CharacterCode[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管数字字符(P2口)/********************************主函数*********************************************/void main(){TimeConfiguration(); //设置定时器0IntConfiguration(); //设置中断允许,K4键为修改键,K8键为确定键while(1){MINxianshi(40); //1.50169000sMAXxianshi(40); //1.50098300s}}/*******************************超声波测距函数********************************************/void zhongduan_0() interrupt 0 //测量中断函数(外部中断0){UI moshi = 0;UI juli = 0;UI time = 0;UI MAX, MIN;UI TT = 0;//用于第一次测量时给P1^5口置一,以便正确读取数值UI t1, t2, t3;UI GE = 0, SHI = 0, BAI = 0; //先定义三个变量,用来显示测量的距离.a = 0;b = 0;c = 0;P2 =~ 0x00; //防止最后显示的那个数码管一直亮MAX = max[0]*100 + max[1]*10 + max[2]; //计算最大与最小值MIN = min[0]*100 + min[1]*10 + min[2];while(1)//下面进行测量{while(1) /*先进行模式判断*/{if(0 == K1){moshi = 1;break; //模式1为动态测量}if(0 == K4){moshi = 2;break; //模式2为静态测量}if(0 == QD)return; //结束测量函数}/********************************************计算距离************************************************/loop: beep = 1;//关掉定时器Lv = 1;Hong = 1;//关掉灯a = 0;b = 0;c = 0;P2 =~ 0x00;//防止最后显示的那个数码管一直亮if( (0 == QD)&&(1 == moshi) )break;if( (0 == QD)&&(2 == moshi) ){delay(55500);if(0 == QD){delay(55500);if(0 == QD)break;}}t1 = 35,t2 = 35;t3 = 35;trig = 0;echo = 0;delay(2); //初始化拉低两个端口trig = 1;delay(2);trig = 0; //输出端输出27us的高电压,并将输出端口拉低while(echo == 0); //判断是否有回波返回,有则开启定时器TR0 = 1; //当有高电平输出时,开启定时器while(echo == 1);TR0 = 0; //当高电平变成低电平时,关闭定时器++TT; //测量值加一,记录测量次数if(1 == TT){delay(55500);TH0 = 0x00;TL0 = 0x00; //定时器的初值,定时器的定时为65536us.goto loop;}time = TL0 + TH0*256; //接下来显示测量的距离TH0 = 0x00;TL0 = 0x00; //定时器的初值,定时器的定时为65536us.juli = ( int )( (time*0.034)/2 );BAI = ( (juli%1000)/100 ); SHI = ( (juli%100)/10 ); GE = ( juli%10 );/******************************************两种模式的距离显示********************************************/if(juli > MAX){Hong = 0;Lv = 1;while( t1-- ){a = 0;b = 1;c = 1;P2 =~ CharacterCode[BAI];delay(400);a = 1;b = 0;c = 1;P2 =~ CharacterCode[SHI];delay(400);a = 1;b = 1;c = 0;P2 =~ CharacterCode[GE];delay(390);beep = 0;if( (1 == moshi)&&(0 == t1) )goto loop;if(moshi == 2){t1 = 2;if(0 == QD)goto loop;}}}else if(juli < MIN){Lv = 0;Hong = 1;while( t2-- ){a = 0;b = 1;c = 1;P2 =~ CharacterCode[BAI];delay(500);a = 1;b = 0;c = 1;P2 =~ CharacterCode[SHI];delay(500);a = 1;b = 1;c = 0;P2 =~ CharacterCode[GE];delay(400);beep = 0;delay(100);beep = 1;if( (1 == moshi)&&(0 == t2) )goto loop;if(2 == moshi){t2 = 2;if(0 == QD)goto loop;}}}else{beep = 1;Lv = 1;Hong = 1;while( t3-- ){a = 0;b = 1;c = 1;P2 =~ CharacterCode[BAI];delay(600);a = 1;b = 0;c = 1;P2 =~ CharacterCode[SHI];delay(600);a = 1;b = 1;c = 0;P2 =~ CharacterCode[GE];delay(600);if( (1 == moshi)&&(0 == t3) )goto loop;if(2 == moshi){t3 = 2;if(0 == QD)goto loop;}}}//显示结束}}/****************************************************************************** *****/void zhongduan_1() interrupt 1 //定时器溢出时的中断,显示测得的距离(定时器中断0){TH0 = 0x00;//定时器的初值,定时器的定时为65536us,TL0 = 0x00;}/****************************************************************************** *****/void zhongduan_2() interrupt 2 //修改键(K4)的中断函数(外部中断1){xiaxian();while(QD==0);shangxian();}/****************************************************************************** ****/void MINxianshi(UI TT) //显示最小距离{while(TT--){a = 0;b = 1;c = 1;P2 =~ CharacterCode[min[0]];delay(500);a = 1;b = 0;c = 1;P2 =~ CharacterCode[min[1]];delay(500);a = 1;b = 1;c = 0;P2 =~ CharacterCode[min[2]];delay(500);}P2 =~ 0x00;delay(55500);}void MAXxianshi(UI TT) //显示最大距离{while(TT--){a = 0;b = 1;c = 1;P2 =~ CharacterCode[max[0]];delay(500);a = 1;b = 0;c = 1;P2 =~ CharacterCode[max[1]];delay(500);a = 1;b = 1;c = 0;P2 =~ CharacterCode[max[2]];delay(500);}P2 =~ 0x00;delay(55500);}/****************************************************************************** *****/void delay(UI T) //延时程序{while(T--);}/****************************************************************************** *****/void IntConfiguration() //设置中断函数{//优先级设置PT2 = 0;PS = 0;PT1 = 0;PX1 = 0;PT0 = 1;PX0 = 0;IT1 = 1; //外部中断0为跳变沿触发EX1 = 1; //P3^3口(K4键)修改键,中断允许开启IT0 = 1; //外部中断1为跳变沿触发EX0 = 1; //P3^2口(K1键)测量键,中断允许开启ET0 = 1; //定时器0的中断允许开启EA = 1;}void TimeConfiguration() //设置定时器,以及定时器的初值{TMOD = 0x01;//设定只使用0号定时器; 模式:定时器; 工作方式:1号工作方式.//下面是定时器的初始值, TR0,TR1是用来开启定时器的TH0 = 0x00;//定时器的初值,定时器的定时为50us.TL0 = 0x00;/*1号定时器不用,所以没有TH1,TL1*/}/****************************************************************************** *****/void xiaxian() //修改下限{while(1){if(BX==0)//百位{P2=~0x00;min[0]++;if(min[0]==10)min[0]=0;delay(60000);}a = 0;b = 1;c = 1;P2 =~ CharacterCode[min[0]];delay(100);if(SX==0)//十位{P2=~0x00;min[1]++;if(min[1]==10)min[1]=0;delay(60000);}a = 1;b = 0;c = 1;P2 =~ CharacterCode[min[1]];delay(100);if(GX==0)//个位{P2=~0x00;min[2]++;if(min[2]==10)min[2]=0;delay(60000);}a = 1;b = 1;c = 0;P2 =~ CharacterCode[min[2]];delay(100);if(QD==0){a = 0;b = 0;c = 0;P2 = 0xff;break;}}}void shangxian() //修改上限{while(1){if(BX==0)//百位{P2=~0x00;max[0]++;if(max[0]==10)max[0]=0;delay(60000);}a = 0;b = 1;c = 1;P2 =~ CharacterCode[max[0]];delay(100);if(SX==0)//十位{P2=~0x00;max[1]++;if(max[1]==10)max[1]=0;delay(60000);标准文档实用文案}a = 1;b = 0;c = 1;P2 =~ CharacterCode[max[1]]; delay(100);if(GX==0)//个位{P2=~0x00;max[2]++;if(max[2]==10)max[2]=0;delay(60000);}a = 1;b = 1;c = 0;P2 =~ CharacterCode[max[2]]; delay(100);if(QD == 0){a = 0;b = 0;c = 0;P2 = 0xff;while(QD == 0);break;}}}/****************************************************************************** ******/。
HC-SR04超声波测距模块程序
![HC-SR04超声波测距模块程序](https://img.taocdn.com/s3/m/5f5685419a6648d7c1c708a1284ac850ad0204fd.png)
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();}}。
超声波测距模块(HC-SR04)用户手册
![超声波测距模块(HC-SR04)用户手册](https://img.taocdn.com/s3/m/92cbbfabf12d2af90242e6de.png)
超声波测距模块(HC-SR04用户手册版本号:V1.0版本日期:2011-2-271. 产品特色2. 产品框图3. 接口定义4. 模块工作原理5. 注意事项1产品特色:1、典型工作用电压:5V。
2、超小静态工作电流:小于2mA3、感应角度:不大于15度。
4、探测距离:2cm-400cm5、高精度:可达0.3cm。
6、盲区(2cm)超近。
7、完全谦容GH-311防盗模块。
8、带金属USB外壳,坚固耐用。
2产品框图:⑷超声波从发射到返回的时间.测试距离=(高电平时间*声速(340M/S))/2;3接口定义:Vcc、Trig (控制端)、Echo (接收端)、Gnd本产品使用方法:控制口发一个10US以上的高电平,就可以在接收口等待高电平输出 . 有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离.如此不断的周期测,就可以达到你移动测量的值了。
4模块工作原理:(1) 采用10触发测距,给至少10us的高电平信号;(2) 模块自动发送8个40khz的方波,自动检测是否有信号返回;(3) 有信号返回,通过IO输出一高电平,高电平持续的时间就是⑷ 超声波从发射到返回的时间.测试距离 =(高电平时间*声速(340M/S))/2; 越声at 时序BB :10uS 的 TTL慰发信号______ 回响电平输出 与检测距离成上匕例圏二、超声波时序图以上时睜图表切你只需要提供一个1OuS 以匕脉冲触发信号,该模块内部将 发出&个4以缶周期电平井检测回波。
一 11检测到仔回波信巧则输出刖响信号口 回响信号的尿冲宽度弓所测的距离成正比“由此通过发射信号到收到的回响信号 时间间隔可以计算得到距离。
公式:uS/58=厘米或者uS/148=英寸;或是*距离 =高电平时间*声速(34OMS) 2:建议测舅周期为60ms W 上.以防止发射信号 对回响倩号的影响&5注意事项:1:此模块不宜带电连接,如果要带电连接,则先让模块的Gnd 端先连接。
基于51单片机的HC-SR04超声波测距系统制作
![基于51单片机的HC-SR04超声波测距系统制作](https://img.taocdn.com/s3/m/e9e7a79016fc700aba68fc75.png)
基于51单片机带温度补偿的HC-SR04超声波测距系统利用从网上购买的HC-SR04超声波模块制作了一个测距装置,HC-SR04自身不带温度补偿功能,所以加上一个使用DS18B20做的温度测量模块。
整个系统包括:51单片机最小系统,超声波测距模块、温度测量模块、液晶显示模块。
使用了如下主要元器件:元件说明数量STC90C516RC 51单片机 1HC-SR04 超声波测距模块 1DS18B20 温度测量模块 1lcd1602 液晶显示模块 1系统电路图51单片机最小系统单片机型号:STC90C516,晶振:12Mhz。
自己动手焊接的最小系统板。
LCD1602A液晶显示模块:HC-SR04超声波测距模块HC-SR04超声波测距模块可提供2cm至400cm的非接触式距离感测功能,测距精度可达3mm;模块自身包括超声波发射器、接收器与控制电路。
实物正反两面图HC-SR04电气参数:HC-SR04工作原理及说明:1、给Trig触发控制信号IO端口至少10us的高电平信号;2、模块自动发送8个40khz的方波,并自动检测是否有信号返回;3、有信号返回时,Echo回响信号输出端口输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间;4、两次测距时间间隔最少在60ms以上,以防止发射信号对回响信号的影响;超声波时序图单片机控制HC-SR04超声波测距说明:原理图中,单片机的P1.7口接HC-SR04的Trig端口,P1.6口接HC-SR04的Echo端口,超声波在传播时碰到障碍物即返回,HC-SR04模块收到回波信号后Echo口输出一个高电平,单片机检测到高电平后即启动计数器开始计数,直到单片机检测到Echo口变成低电平后结束计数,计数器的计数值乘以单片机计数周期就是超声波从发射到接收的往返时间,即距离S=v*t/2;由于在室温下,声速受温度的影响,其变化关系为:V=334.1+T*0.61(T为当前温度),利用DS18B20温度传感器可以得到环境温度,补偿温度对声速的影响。
用单片机实现HCSR超声波测距程序
![用单片机实现HCSR超声波测距程序](https://img.taocdn.com/s3/m/2669327c3a3567ec102de2bd960590c69ec3d815.png)
i n c l u d e<r e g52.h>//包括一个52标准内核的头文件defineucharunsignedchar//定义一下方便使用defineuintunsignedintdefineulongunsignedlongsbitTrig=P1^0;//产生脉冲引脚sbitEcho=P3^2;//回波引脚sbittest=P1^1;//测试用引脚ucharcodeSEG710={~0xC0,~0xF9,~0xA4,~0xB0,~0x99,~0x92,~0x82,~0xF8,~0x8 0,~0x90};//数码管0-9uintdistance4;//测距接收缓冲区ucharge,shi,bai,temp,flag,outcomeH,outcomeL,i;//自定义寄存器bitsucceed_flag;//测量成功标志//函数声明voidconversionuinttemp_data;voiddelay_20us;voidmainvoid//主程序{uintdistance_data,a,b;ucharCONT_1;i=0;flag=0;test=0;Trig=0;//首先拉低脉冲输入引脚TMOD=0x11;//定时器0,定时器1,16位工作方式TR0=1; //启动定时器0IT0=0;//由高电平变低电平,触发外部中断ET0=1;//打开定时器0中断EX0=0;//关闭外部中断EA=1;//打开总中断0while1//程序循环{EA=0;Trig=1;delay_20us;Trig=0;//产生一个20us的脉冲,在Trig引脚whileEcho==0;//等待Echo回波引脚变高电平succeed_flag=0;//清测量成功标志EX0=1;//打开外部中断TH1=0;//定时器1清零TL1=0;//定时器1清零TF1=0;//TR1=1;//启动定时器1EA=1;whileTH1<30;//等待测量的结果,周期65.535毫秒可用中断实现TR1=0;//关闭定时器1EX0=0;//关闭外部中断ifsucceed_flag==1{distance_data=outcomeH256+outcomeL;distance_data=distance_data1.87/100;}//为什么除以58等于厘米,Y米=X秒344/2//X秒=2Y米/344==X秒=0.0058Y米==厘米=微秒/58 ifsucceed_flag==0{distance_data=0;//没有回波则清零test=test;//测试灯变化}/每循环3次就显示结果一次/a=distance_data;ifb==aCONT_1=0;ifb=aCONT_1++;ifCONT_1>=3{CONT_1=0;b=a;conversionb;}}}////外部中断0,用做判断回波电平INTO_interrupt0//外部中断是0号{outcomeH=TH1;//取出定时器的值outcomeL=TL1;//取出定时器的值succeed_flag=1;//至成功测量的标志EX0=0;//关闭外部中断}////定时器0中断,用做显示timer0interrupt1//定时器0中断是1号{TH0=0xfd;//写入定时器0初始值TL0=0x77;switchflag{case0x00:P0=ge;P2=0xfe;flag++;break;case0x01:P0=shi;P2=0xfd;flag++;break;case0x02:P0=bai;P2=0xfb;flag=0;break; }}//显示数据转换程序voidconversionuinttemp_data{ucharge_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=SEG7bai_data;shi_data=SEG7shi_data;ge_data=SEG7ge_data;EA=0; //显示数据的时候不要测量bai=bai_data;shi=shi_data;ge=ge_data;EA=1;}//voiddelay_20us{ucharbt;forbt=0;bt<100;bt++;}。