超声波模块程序

合集下载

超声波避障程序

超声波避障程序

1./* 程序的开头要描述你的设备2.再来要说是脽写的日期版本3.然后碰到问题一次一次都要写清楚4.马达几个驱动电路都要描述5. L = 左6. R = 右7. F = 前8. B = 后9.*/10.#include <Servo.h>11.int pinLB=6; // 定义8脚位左后12.int pinLF=9; // 定义9脚位左前13.14.int pinRB=10; // 定义10脚位右后15.int pinRF=11; // 定义11脚位右前16.17.int inputPin = A0; // 定义超音波信号接收脚位18.int outputPin =A1; // 定义超音波信号发射脚位19.20.int Fspeedd = 0; // 前速21.int Rspeedd = 0; // 右速22.int Lspeedd = 0; // 左速23.int directionn = 0; // 前=8 后=2 左=4 右=624.Servo myservo; // 设 myservo25.int delay_time = 250; // 伺服马达转向后的稳定时间26.27.int Fgo = 8; // 前进28.int Rgo = 6; // 右转29.int Lgo = 4; // 左转30.int Bgo = 2; // 倒车31.32.void setup()33. {34. Serial.begin(9600); // 定义马达输出脚位35. pinMode(pinLB,OUTPUT); // 脚位 8 (PWM)36. pinMode(pinLF,OUTPUT); // 脚位 9 (PWM)37. pinMode(pinRB,OUTPUT); // 脚位 10 (PWM)38. pinMode(pinRF,OUTPUT); // 脚位 11 (PWM)39.40. pinMode(inputPin, INPUT); // 定义超音波输入脚位41. pinMode(outputPin, OUTPUT); // 定义超音波输出脚位42.43. myservo.attach(5); // 定义伺服马达输出第5脚位(PWM)44. }45.void advance(int a) // 前进46. {47. digitalWrite(pinRB,LOW); // 使马达(右后)动作48. digitalWrite(pinRF,HIGH);49. digitalWrite(pinLB,LOW); // 使马达(左后)动作50. digitalWrite(pinLF,HIGH);51. delay(a * 50);52. }53.54.void right(int b) //右转(单轮)55. {56. digitalWrite(pinRB,LOW); //使马达(右后)动作57. digitalWrite(pinRF,HIGH);58. digitalWrite(pinLB,HIGH);59. digitalWrite(pinLF,HIGH);60. delay(b * 20);61. }62.void left(int c) //左转(单轮)63. {64. digitalWrite(pinRB,HIGH);65. digitalWrite(pinRF,HIGH);66. digitalWrite(pinLB,LOW); //使马达(左后)动作67. digitalWrite(pinLF,HIGH);68. delay(c * 20);69. }70.void turnR(int d) //右转(双轮)71. {72. digitalWrite(pinRB,LOW); //使马达(右后)动作73. digitalWrite(pinRF,HIGH);74. digitalWrite(pinLB,HIGH);75. digitalWrite(pinLF,LOW); //使马达(左前)动作76. delay(d * 15);77. }78.void turnL(int e) //左转(双轮)79. {80. digitalWrite(pinRB,HIGH);81. digitalWrite(pinRF,LOW); //使马达(右前)动作82. digitalWrite(pinLB,LOW); //使马达(左后)动作83. digitalWrite(pinLF,HIGH);84. delay(e * 15);85. }86.void stopp(int f) //停止87. {88. digitalWrite(pinRB,HIGH);89. digitalWrite(pinRF,HIGH);90. digitalWrite(pinLB,HIGH);91. digitalWrite(pinLF,HIGH);92. delay(f * 50);93. }94.void back(int g) //后退95. {96.97. digitalWrite(pinRB,HIGH); //使马达(右后)动作98. digitalWrite(pinRF,LOW);99. digitalWrite(pinLB,HIGH); //使马达(左后)动作100. digitalWrite(pinLF,LOW);101. delay(g * 50);102. }103.104.void detection() //测量3个角度(0.90.179)105. {106.int delay_time = 250; // 伺服马达转向后的稳定时间107. ask_pin_F(); // 读取前方距离108.109.if(Fspeedd < 5) // 假如前方距离小于10公分110. {111. stopp(1); // 清除输出数据112. back(2); // 后退 0.2秒113. }114.115.if(Fspeedd < 10) // 假如前方距离小于25公分116. {117. stopp(1); // 清除输出数据118. ask_pin_L(); // 读取左方距离119. delay(delay_time); // 等待伺服马达稳定120. ask_pin_R(); // 读取右方距离121. delay(delay_time); // 等待伺服马达稳定122.123.if(Lspeedd > Rspeedd) //假如左边距离大于右边距离124. {125. directionn = Rgo; //向右走126. }127.128.if(Lspeedd <= Rspeedd) //假如左边距离小于或等于右边距离129. {130. directionn = Lgo; //向左走131. }132.133.if (Lspeedd < 5 && Rspeedd < 5) //假如左边距离和右边距离皆小于10公分134. {135. directionn = Bgo; //向后走136. }137. }138.else//加如前方不小于(大于)25公分139. {140. directionn = Fgo; //向前走141. }142.143. }144.void ask_pin_F() // 量出前方距离145. {146. myservo.write(90);147. digitalWrite(outputPin, LOW); // 让超声波发射低电压2μs148. delayMicroseconds(2);149. digitalWrite(outputPin, HIGH); // 让超声波发射高电压10μs,这里至少是10μs150. delayMicroseconds(10);151. digitalWrite(outputPin, LOW); // 维持超声波发射低电压152.float Fdistance = pulseIn(inputPin, HIGH); // 读差相差时间153. Fdistance= Fdistance/5.8/10; // 将时间转为距离距离(单位:公分)154. Serial.print("F distance:"); //输出距离(单位:公分)155. Serial.println(Fdistance); //显示距离156. Fspeedd = Fdistance; // 将距离读入Fspeedd(前速)157. }158.void ask_pin_L() // 量出左边距离159. {160. myservo.write(5);161. delay(delay_time);162. digitalWrite(outputPin, LOW); // 让超声波发射低电压2μs163. delayMicroseconds(2);164. digitalWrite(outputPin, HIGH); // 让超声波发射高电压10μs,这里至少是10μs165. delayMicroseconds(10);166. digitalWrite(outputPin, LOW); // 维持超声波发射低电压167.float Ldistance = pulseIn(inputPin, HIGH); // 读差相差时间168. Ldistance= Ldistance/5.8/10; // 将时间转为距离距离(单位:公分)169. Serial.print("L distance:"); //输出距离(单位:公分)170. Serial.println(Ldistance); //显示距离171. Lspeedd = Ldistance; // 将距离读入Lspeedd(左速)172. }173.void ask_pin_R() // 量出右边距离174. {175. myservo.write(177);176. delay(delay_time);177. digitalWrite(outputPin, LOW); // 让超声波发射低电压2μs178. delayMicroseconds(2);179. digitalWrite(outputPin, HIGH); // 让超声波发射高电压10μs,这里至少是10μs180. delayMicroseconds(10);181. digitalWrite(outputPin, LOW); // 维持超声波发射低电压182.float Rdistance = pulseIn(inputPin, HIGH); // 读差相差时间183. Rdistance= Rdistance/5.8/10; // 将时间转为距离距离(单位:公分)184. Serial.print("R distance:"); //输出距离(单位:公分)185. Serial.println(Rdistance); //显示距离186. Rspeedd = Rdistance; // 将距离读入Rspeedd(右速)187. }188.189.void loop()190. {191. myservo.write(90); //让伺服马达回归预备位置准备下一次的测量192. detection(); //测量角度并且判断要往哪一方向移动193.194.if(directionn == 2) //假如directionn(方向) = 2(倒车)195. {196. back(8); // 倒退(车)197. turnL(2); //些微向左方移动(防止卡在死巷里)198. Serial.print(" Reverse "); //显示方向(倒退)199. }200.if(directionn == 6) //假如directionn(方向) = 6(右转)201. {202. back(1);203. turnR(6); // 右转204. Serial.print(" Right "); //显示方向(左转)205. }206.if(directionn == 4) //假如directionn(方向) = 4(左转)207. {208. back(1);209. turnL(6); // 左转210. Serial.print(" Left "); //显示方向(右转)211. }212.if(directionn == 8) //假如directionn(方向) = 8(前进)213. {214. advance(1); // 正常前进215. Serial.print(" Advance "); //显示方向(前进)216. Serial.print(" ");217. }218. }。

超声波测距C语言源程序代码

超声波测距C语言源程序代码

/*{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 G* = P3^1;//K7 //P3^3口(K2)为修改键,sbit S* = P3^6;//K6 //P3^2(K3)为测量键.sbit B* = 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 *ia*ian(); //修改函数,用来修改下限void shang*ian(); //修改函数,用来修改上限UI min[3]={0,5,0}; //报警极限,拆分为"百十个"三位UI ma*[3]={3,0,0}; //MIN,MA* 用来存储最大和最小值void MIN*ianshi(UI); //最小围和最大围的显示void MA**ianshi(UI);UC code CharacterCode[10] = {0*3f,0*06,0*5b,0*4f,0*66,0*6d,0*7d,0*07,0*7f,0*6f};//数码管数字字符(P2口)/********************************主函数*********************************************/ void main(){TimeConfiguration(); //设置定时器0IntConfiguration(); //设置中断允许,K4键为修改键,K8键为确定键while(1){MIN*ianshi(40); //1.50169000sMA**ianshi(40); //1.50098300s}}/*******************************超声波测距函数********************************************/void zhongduan_0() interrupt 0 //测量中断函数(外部中断0){UI moshi = 0;UI juli = 0;UI time = 0;UI MA*, MIN;UI TT = 0;//用于第一次测量时给P1^5口置一,以便正确读取数值UI t1, t2, t3;UI GE = 0, SHI = 0, BAI = 0; //先定义三个变量,用来显示测量的距离.a = 0;b = 0;c = 0;P2 =~ 0*00; //防止最后显示的那个数码管一直亮MA* = ma*[0]*100 + ma*[1]*10 + ma*[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 =~ 0*00;//防止最后显示的那个数码管一直亮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 = 0*00;TL0 = 0*00; //定时器的初值,定时器的定时为65536us.goto loop;}time = TL0 + TH0*256; //接下来显示测量的距离TH0 = 0*00;TL0 = 0*00; //定时器的初值,定时器的定时为65536us.juli = ( int )( (time*0.034)/2 );BAI = ( (juli%1000)/100 ); SHI = ( (juli%100)/10 ); GE = ( juli%10 );/******************************************两种模式的距离显示********************************************/if(juli > MA*){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 = 0*00;//定时器的初值,定时器的定时为65536us,TL0 = 0*00;}/***********************************************************************************/ void zhongduan_2() interrupt 2 //修改键(K4)的中断函数(外部中断1){*ia*ian();while(QD==0);shang*ian();}/**********************************************************************************/ void MIN*ianshi(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 =~ 0*00;delay(55500);}void MA**ianshi(UI TT) //显示最大距离{while(TT--){a = 0;b = 1;c = 1;P2 =~ CharacterCode[ma*[0]];delay(500);a = 1;b = 0;c = 1;P2 =~ CharacterCode[ma*[1]];delay(500);a = 1;b = 1;c = 0;P2 =~ CharacterCode[ma*[2]];delay(500);}P2 =~ 0*00;delay(55500);}/***********************************************************************************/ void delay(UI T) //延时程序{while(T--);}/***********************************************************************************/ void IntConfiguration() //设置中断函数{//优先级设置PT2 = 0;PS = 0;PT1 = 0;P*1 = 0;PT0 = 1;P*0 = 0;IT1 = 1; //外部中断0为跳变沿触发E*1 = 1; //P3^3口(K4键)修改键,中断允许开启IT0 = 1; //外部中断1为跳变沿触发E*0 = 1; //P3^2口(K1键)测量键,中断允许开启ET0 = 1; //定时器0的中断允许开启EA = 1;}void TimeConfiguration() //设置定时器,以及定时器的初值{TMOD = 0*01;//设定只使用0号定时器; 模式:定时器; 工作方式:1号工作方式.//下面是定时器的初始值, TR0,TR1是用来开启定时器的TH0 = 0*00;//定时器的初值,定时器的定时为50us.TL0 = 0*00;/*1号定时器不用,所以没有TH1,TL1*/}/***********************************************************************************/ void *ia*ian() //修改下限{while(1){if(B*==0)//百位{P2=~0*00;min[0]++;if(min[0]==10)min[0]=0;delay(60000);}a = 0;b = 1;c = 1;P2 =~ CharacterCode[min[0]];delay(100);if(S*==0)//十位{P2=~0*00;min[1]++;if(min[1]==10)min[1]=0;delay(60000);}a = 1;b = 0;c = 1;P2 =~ CharacterCode[min[1]];delay(100);if(G*==0)//个位{P2=~0*00;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 = 0*ff;break;}}}void shang*ian() //修改上限{while(1){if(B*==0)//百位{P2=~0*00;ma*[0]++;if(ma*[0]==10)ma*[0]=0;delay(60000);}a = 0;b = 1;c = 1;P2 =~ CharacterCode[ma*[0]];delay(100);if(S*==0)//十位{P2=~0*00;ma*[1]++;if(ma*[1]==10)ma*[1]=0;delay(60000);}a = 1;b = 0;c = 1;P2 =~ CharacterCode[ma*[1]];delay(100);if(G*==0)//个位{P2=~0*00;ma*[2]++;if(ma*[2]==10)ma*[2]=0;delay(60000);}a = 1;b = 1;c = 0;P2 =~ CharacterCode[ma*[2]];delay(100);if(QD == 0){a = 0;b = 0;c = 0;P2 = 0*ff;while(QD == 0);break;}}}/************************************************************************************/。

HC-SR04 超声波模块 DEMO 程序(淳修良)

HC-SR04 超声波模块 DEMO 程序(淳修良)
#define TX P1_2
unsigned int time=0;
unsigned int timer=0;
float S=0;
bit flag =0;
/********************************************************/
void Conut(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.87)/100; //算出来是CM
if(flag==1) //超出测量
{
flag=0;
printf("-----\n");
while(!RX); //当RX为零时等待
TR0=1; //开启计数
while(RX); //当RX为1计数并等待
TR0=0; //关闭计数
Conut(); //计算
delayms(100); //100MS
}
}
/***********************************************************************************************************/
//HC-SR04 超声波测距模块 DEMO 程序
//晶振:11。0592
//程序
TH1=0xFD;
TL1=0xFD;
TH0=0;
TL0=0;
TR0=1;
ET0=1; //允许T0中断
TR1=1; //开启定时器
TI=1;
EA=1; //开启总中断

超声波的使用流程

超声波的使用流程

超声波的使用流程简介超声波是一种常用的非破坏性测试方法,通过使用超声波传感器检测物体内部的缺陷、密度和弹性等信息。

在工业、医疗等领域有广泛的应用。

本文将介绍超声波的使用流程,并提供一些使用超声波的注意事项。

使用流程1.准备工作–确保超声波设备和传感器处于正常工作状态。

–根据需要选择合适的超声波探头。

–连接超声波设备和传感器,确保连接牢固。

2.设置参数–打开超声波设备,进入参数设置界面。

–根据需要设置超声波的工作频率、增益、敏感度等参数。

–确保参数设置合理,以获取准确的测试结果。

3.校准仪器–使用标定块或标准试样校准超声波设备。

–将标定块或标准试样放置在设备预定位置上。

–根据设备的校准指南进行校准操作,确保设备的测量准确度。

4.准备被测物体–将被测物体放置在测试台上,确保物体与超声波传感器之间的接触良好。

–如有需要,可以在被测物体表面涂抹耦合剂,以提高超声波的传导效果。

5.进行测试–点击超声波设备上的测试按钮,开始进行测试。

–将超声波传感器缓慢移动在被测物体表面,确保整个表面都得到了测试。

–根据需要,可以记录下测试过程中的数据和图像。

6.分析结果–将测试结果导入分析软件或计算机程序。

–根据需要,对测试结果进行数据处理、图像增强或曲线拟合等操作。

–根据分析结果,判断被测物体的状态,如是否存在缺陷、密度异常或弹性变化等。

7.数据记录与报告–将测试结果保存为数据文件,并进行适当的命名和分类。

–根据需要,可以生成测试报告,并将关键结果和分析说明进行整理。

注意事项•在使用超声波测试之前,确保对设备进行了充分的学习和培训,了解超声波测试的原理和使用方法。

•对于不同类型的被测物体,需要选择不同的超声波探头和参数设置,以获得更准确的测试结果。

•在进行测试之前,确保被测物体的表面清洁,以防止污垢或杂质对测试结果的影响。

•在测试过程中,保持设备和传感器的稳定,避免振动或冲击,以确保测试的准确性。

•根据需要,可以进行多次测试并取平均值,以提高测试结果的可靠性。

[整理]超声波测量盲区

[整理]超声波测量盲区

超声波测量盲区测量盲区由于在硬件布置上发射探头与接受探头相邻,所以发射探头发出的超声波会第一个到达接收探头。

是接受探头检测到信号,但这一信号不是反射信号,即误信号。

而这一信号一旦被检测到就会被接收电路处理而产生出发单片机的中断信号,继而单片机对此做出响应,但这不是真正要测得值,属于误操作。

所以我们要在发出脉冲后演示一段时间才允许单片机接受中断信号。

这样,在延时这段时间里超声波所能走过的距离是不能被检测的,这就是产品的测量盲区。

模块工作原理:(1)采用IO触发测距,给TRIG至少10us的1信号;(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;(3)有信号返回,通过ECHO输出一0信号,TRIG=1到ECHO 持续的时间就是超声波从发射到返回的时间.测试距离=(高电平时间*声速(340M/S))/2; 注意但对测量精度要求较高时,应考虑温度对声波的传播速度的影响(4)当TRIG从0->1时,主控制板启动一10ms定时器控制本次测量的超时控制,当超时10ms时ECHO仍然没有出现150us的0信号,表示没有障碍.模块主要特点:(1)超微型,只相当于两个发射,接收头的面积,已经没法再小了.(2)无盲区(8mm内成三角形误差稍大).(3)反应速度快,10ms的测量周期,不容易丢失高速目标.(4)发射头,接收头紧靠,和被测目标基本成直线关系(8mm内还是大三角形,这个是发射,接收头的物理形状决定了).(5)模块上有LED指示,方便观察和测试!3:时序图(示波器截取)计算方法:设Trig=1的时刻为t1(单位为ms),Echo=0的时刻为t2(单位为ms),超声波发射头和接收头的内部晶体和外体有一个固定距离,电路也有固定延迟,总延迟时间为250us,目标的距离=340*(t2-t2-0.25)/2,单位为毫米(mm),当目标距离在10mm范围内,发射头,接收头,和目标形成大三角形,测量误差大,因此10mm范围内可以当作0距离处理,>10mm范围时,基本是线性关系,按上述公式处理.近距离时序图如下:当距离较远时时序图如下:常见问题(faq):1:超声波测距原理超声波是一种频率比较高的声音,指向性强.超声波测距的原理是利用超声波在空气中的传播速度为已知,测量声波在发射后遇到障碍物反射回来的时间,根据发射和接收的时间差计算出发射点到障碍物的实际距离。

超声波检测的程序

超声波检测的程序

本人刚刚接触单片机,不得不从基础学起,由于要完成一个任务,小车避障,所以我就买了一个超声波模块直接用来测距测距原理:超声波模块工作原理:(1)采用IO触发测距,给至少10us的高电平信号;(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;(3)有信号返回,通过IO输出一高电平,高电平持续的时间就是超声波从发射到返回的时间.测试距离=(高电平时间*声速(340M/S))/2;然后我就用单片机的P1.3与模块的发射端Trig相连,P3. 3作为外部中断1检测回波信号下降沿产生中断测距,P3.3与Echo相连。

测距后由四位一体的数码管显示并将测得距离(用厘米表示)发送给PC机。

本来一切进行的很顺利,但是出现了一个问题,想了几天还是不知道怎么回事,希望大家帮忙解决一下,我将不胜感激。

当测距距离显示65cm后,大于65后数码管就重新从0开始显示,比如实际距离为80CM时,它就显示15CM,不知道问题所在。

急死我了。

单片机晶振11.0592Mhz。

程序代码:#include <reg51.h>#include <intrins.h>#include <math.h>#define LED P0#define uint unsigned int#define uchar unsigned char//#define v 340sbit No1 = P1^4; //动态显示控制位sbit No2 = P1^5;sbit No3 = P1^6;sbit No4 = P1^7;sbit trig=P1^3; //超声波发射端sbit echo=P3^3; //超声波接收端/*********宏定义,定义数码管显示第几位***********/ #define DIS_NO1 No1=0; No2=1; No3=1; No4=1#define DIS_NO2 No1=1; No2=0; No3=1; No4=1#define DIS_NO3 No1=1; No2=1; No3=0; No4=1#define DIS_NO4 No1=1; No2=1; No3=1; No4=0uint t,distance;uchar i,j,flag;void delay(uint time);void display(uint num);void initial(void);void send_signal(void);void send(uint m);code uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x 82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xb f,0x7f,0xff};/*************************************************** *********************************//*TRIG端口发一个10US高电平,当TRIG变成0时,超声波模块开始发射超声波,主控制 *//*板就可以在ECHO等待0输出.从TRIG=1到ECHO=0的时间就为此次测距的时间,可算出距离 *//*************************************************** *********************************/void main(void){delay(50); //去抖动initial(); //初始化trig=0;delay(50);while(1){send_signal();while(!flag); //等待外部中断或定时器0溢出中断if(flag==1) //外部中断,测距{display(distance); //显示距离send(distance); //发送数据给PC机//send(0);}else //定时器0溢出中断{display(0);send(0);//send(1);}delay(10); //延时TL0=0x00; //定时器0重新设置值TH0=0x00;flag=0; //测试标志位置0}}//*延时程序void delay(uint time){while(time--);}//初始化void initial(void){TMOD = 0x21; //定时器1工作方式2,定时器0工作方式1SCON = 0x50; // uart 模式1 (8 bit), REN=1;TL1 = 0xfd; //波特率9600TH1 = 0xfd;TL0 = 0x00; //初始值;TH0 = 0x00;TR1=1;EA=1;}/*************************************************** ***********//*产生超声波并计时等待中断************************** ***********//*************************************************** ***********/void send_signal(void){trig=1;for(i=0;i<10;i++) _nop_();trig=0;for(j=0;j<65;j++) _nop_(); //避免发射波对回波产生干扰,延时TR0=1; //启动定时器1计时ET0=1; //定时器1允许中断EA=1; //开总中断EX1=1; //外部中断1开中断IT1=1; //下降沿触发}/*************************************************** *********//********定时器0溢出中断*************************** **********//*************************************************** ***********/void timer0(void) interrupt 1{TR0=0;EX1=0;ET0=0;flag=2;}/*************************************************** ***********//*******外部中断1中断测距************************** ************/void test(void) interrupt 2{TR0=0; //停止计数ET0=0; //关定时器0中断EX1=0; //关外部中断EA=0; //关总中断flag=1; //测距成功标志t=TH0; //读取测试时间t<<=8;t+=TL0;distance=17*t/1000; //声速340m/s,结果用cm表示}/*************************************************** ***********//*************************显示********************** *************//*************************************************** ***********/void display(uint num){// DIS_NO1; //选中第一只灯// LED=table[num/1000]; //指针指向下一位数据// delay(50);DIS_NO2; //选中第二只灯LED=table[num/100];delay(100);2011-05-04,19:38:47 资料邮件回引用回↓↓编辑删除2011-05-05,14:资料邮件回复引用回复编辑删除2011-05-06,13:资料邮件回复引用回复编辑删除2011-05-09,15:资料邮件回复引用回复编辑删除积分:2242011-05-09,18:资料邮件回复引用回复编辑删除ulong t;float distance; //很重要,防止溢出,距离计算出错uchar i,j,flag;const uint v=340;void delay(uint time);void display(uint num);void initial(void);void send_signal(void);void send(float m);code uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0x7f,0xff};/********************************************************************* ***************//*TRIG端口发一个10US高电平,当TRIG变成0时,超声波模块开始发射超声波,主控制 *//*板就可以在ECHO等待0输出.从TRIG=1到ECHO=0的时间就为此次测距的时间,可算出距离 *//********************************************************************* ***************/void main(void){delay(50); //去抖动initial(); //初始化trig=0;delay(50);while(1){send_signal();while(!flag); //等待外部中断或定时器0溢出中断if(flag==1) //外部中断,测距{display(distance); //显示距离send(distance);//if(distance<=1000&&distance>=400) send(0);//else send(1); //发送指令给PC机}else //定时器0溢出中断{display(0);send(0);}TL0=0x00; //定时器0重新设置值TH0=0x00;delay(50); //延时flag=0; //测试标志位置0}}//*延时程序void delay(uint time){while(time--){_nop_();}}//初始化void initial(void){TMOD = 0x21; //定时器1工作方式2,定时器0工作方式1 SCON = 0x50; // uart 模式1 (8 bit), REN=1;TL1 = 0xfd; //波特率9600TH1 = 0xfd;TL0 = 0x00; //初始值;TH0 = 0x00;TR1=1;EA=1;}/**************************************************************/ /*产生超声波并计时等待中断*************************************/ /**************************************************************/ void send_signal(void){trig=1;//for(i=0;i<10;i++) _nop_();delay(10);trig=0;while(echo==0); //等待Echo回波引脚变高电平//for(j=0;j<50;j++) _nop_(); //避免发射波对回波产生干扰,延时delay(30);flag=0; //清测量成功标志TR0=1; //启动定时器0计时ET0=1; //定时器0允许中断EA=1; //开总中断EX1=1; //外部中断1开中断IT1=1; //下降沿触发}/************************************************************/ /********定时器0溢出中断*************************************//**************************************************************/ void timer0(void) interrupt 1{TR0=0;EX1=0;ET0=0;flag=2;}/**************************************************************/ /*******外部中断1中断测距**************************************/ void test(void) interrupt 2{delay(50); //不能太长时间,有可能是2次中断if(echo==0){TR0=0; //停止计数ET0=0; //关定时器0中断EX1=0; //关外部中断EA=0; //关总中断flag=1; //测距成功标志t=TH0; //读取测试时间t<<=8;t+=TL0;distance=v*t/2000.0; //声速340m/s,结果用mm表示}}/**************************************************************/ /*************************显示***********************************/ /**************************************************************/ void display(uint num){DIS_NO1; //选中第一只灯LED=table[num/1000]; //指针指向下一位数据delay(50);DIS_NO2; //选中第二只灯LED=table[num/100];delay(50);DIS_NO3; //选中第三只灯LED=table[(num%100)/10];delay(50);2011-05-09,21:资料邮件回复引用回复编辑删除。

基于51单片机的超声波测距系统的毕业设计

基于51单片机的超声波测距系统的毕业设计

基于51单片机的超声波测距系统的毕业设计超声波测距系统是一种常见的非接触式测距技术,通过发送超声波信号并测量信号的回波时间来计算距离。

本文将介绍基于51单片机的超声波测距系统的毕业设计。

首先,我们需要明确设计的目标。

本设计旨在通过51单片机实现一个精确、稳定的超声波测距系统。

具体而言,我们需要实现以下功能:1.发送超声波信号:通过51单片机的IO口控制超声波发射器,发送一定频率和波形的超声波信号。

2.接收回波信号:通过51单片机的IO口连接超声波接收器,接收并放大返回的超声波信号。

3.信号处理:根据回波信号的时间延迟计算出距离,并在显示器上显示出来。

4.稳定性和精确性:设计系统时需考虑测量过程中误差的影响,并通过合适的算法和校准方法提高系统的稳定性和精确性。

接下来,我们需要选择合适的硬件和软件配合51单片机实现上述功能。

硬件方面:1.51单片机:选择一款性能稳定、易于编程的51单片机,如STC89C522.超声波模块:选择一款合适的超声波传感器模块,常见的有HC-SR04、JSN-SR04T等。

模块一般包括发射器和接收器,具有较好的测距性能。

3.显示设备:选择合适的显示设备,如7段LED数码管或LCD显示屏,用于显示测距结果。

软件方面:1.C语言编程:使用C语言编写51单片机的程序,实现超声波测距系统的各项功能。

2.串口通信:通过串口与上位机进行通信,可以对系统进行监控和远程控制。

3.算法设计:选择合适的算法计算超声波回波时间延迟,并根据时间延迟计算距离值。

在设计过程中,我们需要进行以下步骤:1.硬件连接:按照超声波模块的说明书,将模块的发射器和接收器通过杜邦线与51单片机的IO口连接。

2.软件编程:使用C语言编写51单片机的程序,实现超声波模块的控制、信号接收和处理、距离计算等功能。

3.系统测试:进行系统的功能测试和性能测试,验证系统的可靠性和准确性,同时调试系统中出现的问题。

4.系统优化:根据测试结果,对系统进行优化,提高系统的稳定性和精确性。

超声波操作程序A

超声波操作程序A

A篇平板对接焊缝超声波检验操作程序超声波检验流程图1.0总则1.1范围本操作规程适用于海洋工程中的钢板(含型钢对接及制管中的纵缝)对接焊中超声波检验中的基本操作方法。

超声波检验员应持有超声波检验II级或II级以上资格证书。

1.2超声波探伤——探头组合基本调试方法1.2.1探头入射点的测定a.所用试块IIW、CSK-1AV2b.测定步骤将斜探头置IIW(或CSK-1A)试块于半径为R100圆心附近的表面,且探头波束方向的中心线与R100拱形表面垂直,来回移动探头,以获得来自拱形表面的最高反射波,当确认为最高波时,试块R100圆心槽口左侧边沿所对应的探头刻度值即为入射点位置。

一般以mm表示,此操作至少进行三次才能确认或用三次所测数值的平均值。

1.2.2探头实际折射角的测定a.所用试块:IIW、CSK-A、V2等试块b.操作步骤:将已测定入射点的探头置IIW(或 CSK-1A、V2等)试块于刻有折射角度值的侧平面上,且探头波束方向指向R25拱形面,来回移动探头以获得来自拱形面的最高反射波。

当确认为最高波时,探头入射点位置所对应试块上折射角的刻度值即为实测折射角度。

其角度读数应精确到0.5度.此操作应至少测三次,才能确认,或用三次所测的平均值.1.3扫描速度的调整进行超声波检验之前,应调整仪器的扫描速度,即仪器的水平刻度与超声波检验中的声程或水平距离或深度成一定的比例,海洋工程中多用声程定位,ASME标准及国内标准规定用水平定位或深度定位。

1.3.1声程定位法1.3.1.1利用IIW标准试块调试声程1:1和1:1.25a.将探头置IIW试块R100圆心附近,前后移动探头,当确定最高波时,固定探头。

b.调节粗调旋,将始波调至与时基线O点重合,以确认始波,并结合粗调、扫描延迟钮,将R100的第一次反射波B1,置在水平刻度5大格(100mm)或4大格(100mm)的位置。

c.调节扫描延迟钮,使B1波调至O点,并提高仪器灵敏度,能观察到B2波。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//超声波模块程序
//超声波模块程序
//Trig = P2^0
//Echo = P3^2
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
int 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; //打开总中断0
TMOD=0x10; //定时器1,16位工作方式
while(1)
{
EA=0; //关总中断
Trig=1; //超声波输入端
delay_20us(); //延时20us
Trig=0; //产生一个20us的脉冲
while(Echo==0); //等待Echo回波引脚变高电平 succeed_flag=0; //清测量成功标志
EA=1;
EX0=1; //打开外部中断0
TH1=0; //定时器1清零
TL1=0; //定时器1清零
TF1=0; //计数溢出标志
TR1=1; //启动定时器1
delay(20); //等待测量的结果
TR1=0; //关闭定时器1
EX0=0; //关闭外部中断0
if(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 int
sbit lcdrs=P2^3;
sbit lcden=P2^2;
sbit trig=P2^0; //超声波发送
//sbit echo=P3^2; //超声波接受//P0____________DB0-DB7
uchar 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/58
return 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);
}
}。

相关文档
最新文档