最经典的52单片机C语言HC -SR 04超声波测距程序
--超声波测距模块--测距--最简单的C代码

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的使用流程流程概述本文档将介绍如何使用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超声波测距模块◼产品概述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语⾔向) 因为作业要求使⽤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简介以及编程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文档良心出品)

#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语言程序

//超声波模块程序//超声波模块程序//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超声波测距模块及程序(坤)

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),但近距离误差较小。可以根据不同的模块作简单的修 正。