超声波模块程序

合集下载

超声波避障程序

超声波避障程序

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波。

51单片机超声波模块的C语言程序

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);}}。

超声波模块 说明

超声波模块 说明

1、本模块性能稳定,测度距离精确,是目前市面上性价比最高的超声波模块,本模块可实现2cm-4.5m的非接触测距功能,拥有2.4-5.5V的宽电压输入范围,静态功耗低于2mA,自带温度传感器对测距结果进行校正,同时具有GPIO,串口等多种通信方式,内带看门狗,工作稳定可靠。

2、主要技术参数:1)使用电压:DC5V2)静态电流:小于2mA3)电平输出:高5V低0V4)串口输出:波特率9600,起始位1位,停止位1位,数据位8位,无奇偶校验,无流控制。

5)感应角度:不大于15度6)探测距离:2cm-450cm7)高精度: 0.3cm+1%8)电路板尺寸20*45*1.6mm3.接线方式:VCC、trig(控制端)/TXD,echo/RXD(接收端),GND.4.使用方法:一个控制口发一个10US以上的高电平,就可以在接收口等待高电平输出.一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离.如此不断的周期测,就可以达到你移动测量的值了~~5.模块工作原理:只需要在Trig/TX管脚输入一个10US以上的高电平,系统便可发出8个40KHZ的超声波脉冲,然后检测回波信号。

当检测到回波信号后,模块还要进行温度值的测量,然后根据当前温度对测距结果进行校正,将校正后的结果通过Echo/RX 管脚输出。

在此模式下,模块将距离值转化为340m/s时的时间值的2倍,通过Echo端输出一高电平,可根据此高电平的持续时间来计算距离值。

即距离值为:(高电平时间*340m/s)/2。

注:因为距离值已经经过温度校正,此时无需再根据环境温度对超声波声速进行校正,即不管温度多少,声速选择340m/s即可。

与Arduino连接接线图Arduino测距界面Arduino测温度界面买就送如下资料已经详细使用说明书,Arduino测试程序,接线图等资料,让你一时间用好本模块。

毕业论文-基于STC89C52单片机的超声波测距报警系统设计

毕业论文-基于STC89C52单片机的超声波测距报警系统设计

基于STC89C52单片机的超声波测距报警系统设计目录摘要 ................................................................................................................ 错误!未定义书签。

1 绪论 (3)1.1 项目研究背景及意义 (3)2 总体设计方案及论证 (3)2.1 总体方案设计 (3)3 硬件实现及单元电路设计 (4)3.1 主控制模块 (4)3.2 电源设计 (5)3.3 超声波测试模块 (5)3.3.1 超声波的特性 (6)3.3.2 超声波换能器 (7)3.4 超声波传感器原理 (8)3.5 测距分析 (12)3.6 时钟电路的设计 (13)3.7 复位电路的设计 (14)3.8 声音报警电路的设计 (14)3.9 显示模块 (15)4 软件设计 (15)4.1 主程序工作流程图 (15)5 总结 (18)6 参考文献 (19)附录 (20)附件1:原理图 (21)附件2:程序 (22)附件3:元件清单 (31)附件4:实物图 (32)基于STC89C52单片机的超声波测距报警系统设计[摘要]STC89C52是STC系列单片机里应用比较广泛的一款,在自动控制领域里享有很高的价值,以其易用性和多功能性受到了广大电子设计爱好者的好评。

本次设计主要是利用STC89C52单片机、超声波传感器完成测距报警系统的制作,以STC89C52为主控芯片,利用超声波对距离的检测,将前方物体的距离探测出来,然后单片机处理运算,与设定的报警距离值进行比较判断,当测得距离小于设定值时,STC89C52发出指令控制蜂鸣器报警。

关键词:超声波传感器 STC89C52Design of ultrasonic distance measurement and alarm system based on single chip microcomputer[Abstract] STC is one of the most widely used STC89C52 series microcontroller, in the field of automatic control has a high value, its ease of use and multi-function by the majority of electronic design enthusiasts. This design is mainly to use STC89C52 microcontroller, ultrasonic sensor range alarm system of production, to STC89C52 as the main control chip, using ultrasonic wave to detect the distance, the distance to the object in front detected, then SCM processing, and set alarm distance values are compared and judged, when the measured distance is less than the set value of STC89C52 issued a directive control buzzer alarm.Key words: ultrasonic sensor STC89C521 绪论1.1 项目研究背景及意义由于超声测距是一种非接触检测技术,不受光线、被测对象颜色等的影响,较其它仪器更卫生,更耐潮湿、粉尘、高温、腐蚀气体等恶劣环境,具有少维护、不污染、高可靠、长寿命等特点。

超声波测距程序

超声波测距程序

#include <r eg52.h>//8052内核单片机#include <intrins.h>//调用_nop_()单周期延时//柳州市第一职业技术学校欧福强unsigned char L ED_SEG[]={0x28,0xee,0x32,0xa2,0xe4,0xa1,0x21,0xea,0x20,0xa0,0xf7,0 xff};unsigned char D1,D2,D3,D4;//数码管显示变量unsigned long j u_li;//距离变量unsigned int s hi_cha,haomi;//时差,以毫米为单位的长度unsigned char x un_huan_ci_shu;//记录主循环循环的次数unsigned char sqys,sdbxgs;//死区延时,设定波形输出个数sbit huibo=P1^7;//接收电路的回波信号sbit k ey1=P2^0;//调整死区时间sbit k ey2=P2^1;//调整波形个数void C SB_SC(unsigned char geshu)//超声波输出子程序,传递参数:超声波个数{//子程序开始P1=P1&0XFE;//准备输出do//do-while循环{//循环开始P1=P1^0X03;//P1.0和P1.1取反_nop_();_nop_();_nop_();//3µS延时_nop_();_nop_();_nop_();//3µS延时_nop_();_nop_();_nop_();//3µS延时_nop_();_nop_();//2µS延时,连同取反2µS共13µSP1=P1^0X03;//P1.0和P1.1取反_nop_();_nop_();_nop_();//3µS延时_nop_();_nop_();_nop_();//3µS延时_nop_();_nop_();//2µS延时}while(--geshu);//循环结束,跳转回开始需要2µS,共12µSP1=P1|0X03;//结束输出}//子程序结束void y an_shi(unsigned int shuju)//延时,地球人都知道{//延时开始while(--shuju);//延时主体,不断减1,耗时}//延时结束void chushihua(void)//初始化子程序{//开始TMOD=0x01;//定时器0工作于16位模式(0-65535)sqys=200;//死区延时开机设定为200sdbxgs=20;//初始化时设定每次发送20个周期波形}//结束void c e_ju(void)//测距主程序(科技含量在这){//开始T H0=0X00;//定时器计数清零(高八位)T L0=0X00;//定时器计数清零(低八位)T F0=0;//清溢出标志T R0=1;//启动定时器开始计时C SB_SC(sdbxgs);//立即按传来的参数输出超声波y an_shi(sqys);//延时一段时间,防止发射波干扰while(huibo && (T F0==0));//等待回波信号及溢出信号//即如果没有收到回波就一直等待下去//但也不能死等,等待超过65535µS后仍然没有回波就放弃T R0=0;//收到回波或超时,停止定时器,冻结定时器的值if(T F0)//判断是否超时(定时器是否溢出){//如果条件成立(确实超过65535µS未收到回波)D1=D2=D3=D4=10;//超时未收到回波,显示"----"}//成立时处理完毕else//未超时并收到回波{//未超时,确实在发出超声波65535µS内收到回波s hi_cha=T H0*256+T L0;//从定时器中取出计时值,即往返时差j u_li=170L*s hi_cha;//距离=声速×往返时间÷2,即距离=170×往返时差//得到的距离单位是µM,因为定时器计得的时间为微秒haomi=j u_li/1000;//把得到的距离除以1000,得到以毫米为单位的长度数据D1=haomi/1000;//除以1000,得到米D2=haomi%1000/100;//模1000,剩下几百几百的数,除以100,得到分米D3=haomi%100/10;//模100,剩下几十几十的数,除以10,得到厘米D4=haomi%10;//直接模10,剩下几的数,得到毫米}//未超时处理完毕}//测距子程序处理完毕void L ED_SCAN(void)//数码管扫描子程序{//扫描程序开始P2=P2|0XF0;//通过或操作将P2高四位置1,关闭数码管①P0=0XdF&L ED_SEG[D1];//输出段码在P0口②P2=P2&0xBF;//通过与的方式将P2.6变成低电平,打开D1③y an_shi(500);//延时一段时间④P2=P2|0XF0;//同①P0=L ED_SEG[D2];//同②P2=P2&0xDF;//类似③y an_shi(500);//同④P2=P2|0XF0;//同①P0=L ED_SEG[D3];//同②P2=P2&0xEF;//类似③y an_shi(500);//同④P2=P2|0XF0;//同①P0=L ED_SEG[D4];//同②,但还要跟0X7F进行与运算,将小数点位变0 P2=P2&0x7F;//类似③y an_shi(500);//同④}//扫描程序结束void main(void)//主程序{//主程序开始chushihua();//初始化,设置定时器工作模式while(1)//主循环{//主循环开始L ED_SCAN();//扫描数码管x un_huan_ci_shu++;//主循环每循环一次,变量加一if(x un_huan_ci_shu>=5)//每循环5次,就进行一次测距,控制测距间隔时间 {//已达5次主循环P2=P2|0XF0;//关闭数码管,避免某个数码管长时间被点亮ce_ju();//调用测距子程序进行测距xun_huan_ci_shu=0;//循环计数变量清零}//测距间隔时间控制处理完毕if(!k ey1)//死区延时按钮被按下{//按键处理开始sqys=sqys+5;//死区延时增加if(sqys>250){sqys=0;}//越界检测并抓回D1=11;//关闭第一个数码管D2=sqys/100;//获得百位D3=sqys%100/10;//获得十位D4=sqys%10;//获得各位while(!k ey1)//按键是否持续按下{//循环开始,等待按键松开L ED_SCAN();//如果没有松开,扫描数码管,显示死区延时}//循环尾}//按键处理结束,按键已松开if(!k ey2)//波形个数按钮被按下{//按键处理开始sdbxgs=sdbxgs+1;//输出波形数量增加if(sdbxgs>100){sdbxgs=0;}//越界检测并抓回D1=11;//关闭第一个数码管D2=sdbxgs/100;//获得百位D3=sdbxgs%100/10;//获得十位D4=sdbxgs%10;//获得各位while(!k ey2)//按键是否持续按下{//循环开始,等待按键松开L ED_SCAN();//如果没有松开,扫描数码管,显示发波个数}//循环尾}//按键处理结束,按键已松开}//主循环结束}//主程序结束。

超声波测距 含51单片机程序与电路图1

超声波测距 含51单片机程序与电路图1

超声波测距摘要该超声测距系统采用芯片STC89C52作为系统的主控制器,利用NE555作为本系统的脉冲发射源,结合3位7段数码管液晶显示,达到了较大的测试距离和较高的测量精度,并能实时显示且无明显失真。

关键字: 超声波测距实时第1章设计题目与要求1.1 设计要求采用压电式超声波换能器,使用单片机作为控制器,完成超声波测距仪的软硬件设计。

1.2 基本要求:(1)具有反射式超声波测距功能,测量距离0.1m~3.0m;(2)测量距离精度:误差±1cm;(3) 利用LED数码管显示测试距离;(4)实时显示测量的距离,显示格式为:□.□□米第2章系统总体方案论证2.1 系统总体方案题目要求设计一个利用超声波反射原理测量距离的超声波测距仪,并且具有实时同步显示,由此本系统可以划分为发射、接收、显示、主控制模块共四大模块,如图2.1所示:图2.1系统基本方框图针对技术指标的需要,为使系统的测量距离更远、精度更高,提高系统的整体完善性,现对以上系统各个功能模块进行一一的方案论证:2.2 主控制模块2.2.1 主控制模块概述主控制器模块其实就是一个简化的嵌入式系统。

嵌入式系统一般指非PC系统,有计算机功能但又不称之为计算机的设备或器材。

它是以应用为中心,软硬件可裁减的,适应应用系统对功能、可靠性、成本、体积、功耗等综合性严格要求的专用计算机系统。

嵌入式系统的核心是嵌入式微处理器。

2.2.2 主控制模块方案选择根据以上知识,考虑到目前市场上比较常用的AVR、61、51三种微控制器,我们有如下三种方案可供选择。

方案一:AVR单片机AVR单片机种类丰富,有AT tiny、AT90S、ATmeg系列,各个系列又有不同的型号,价格较适中。

相对来说,比起51单片机来说资源较丰富,内部也有集成A/D ,有PWM 输出,但在系统进一步扩展方面不是很好,这类单片机主要应用于工业控制领域,在语音处理方面没有什么优势。

方案二:SPCE061A.凌阳单片机的资源相对来说比较丰富,32K ×16bitFlash ,两路D/A ,1个全双工异步串行口(UART )方便其跟其他为控制通信。

超声波测距程序_代码全

超声波测距程序_代码全

/*----------------------------------超声波子程序1、采用定时器0产生40KHZ的方波,同时也进行时间计数,等待中断;2、若超过30ms后,重新发送方波,重新计数,直到有中断(接收到返回信号)再做显示或其它处理。

3、在处理之后又后重新初始化定器0和中断0,又执行第一步------------------------------------*/#include <reg52.h>//1602已定义了#include "1602.h"#include "delay.h"#include <stdio.h>//包含sprintf函数sbitpwm=P3^7;//40KHZsbit led=P1^3;//接收到后亮灯unsigned intnum=0;//计数float s; //测出的距离bit flag=0;//中断0标志位unsigned char out_time=0;//超时标志位/*---------------------------------------定时器0用于产生40KHZ频率初始化---------------------------------------*/void T0_init(){TMOD=0X02; //定时器0工作在方式2,自动重装数据TL0=256-12; //产生40KHZTH0=256-12; //T=1/40k*1000000=25us即12.5us取反一次EA=1;ET0=1;TR0=1;}/*--------------------------------定时器0中断服务程序//用于工作计时、同时产生40KHZ方波---------------------------------*/void T0_time() interrupt 1{num++;if(num<30) pwm=~pwm;//产生15个40KHZ的方波if(num==2500) {num=0;out_time++;}//30ms后清除标志,同时}/*-----------------------------外部中断0初始化------------------------------*/void INT0_init(){IT0=1;//低电平触发方式EX0=1;//打开外部中断// PX0=1;//外部中断0为高优先级}/*-----------------------------外部中断0中断服务程序------------------------------*/void INT0_d() interrupt 0{EX0=0; //当中断了,证明接收到信号,关闭外断中断TR0=0; //关闭定时器0flag=1; //标志外部中断0产生}/*-------------------------------超声波测距函数//s的值为返回测距值--------------------------------*/void measure(){if(flag==1) //中断0标志,进入{flag=0; //清除标志位out_time=0; //清除超时标志位led=~led; //观察DelayMs(100); //延时,**适用STC12C5A60S2,低速单片机,要减少延时**s=(num*12)/2*0.34*0.001;//测距返回值TH0=256-12; //定时器0重新初始化TL0=256-12;TR0=1; //运行定时器0INT0_init(); //启动外部中断0}}/*-------------------------------超声波显示部分--------------------------------*/void display(){char displaytemp[16];//定义显示区域临时存储数组if(out_time==33) //大约1s的超时时间,再将显示为0.000{out_time=0; //清除标志位s=0; //显示0}sprintf(displaytemp,"distance:% 6.3f",s);//将数字转成字符串LCD_Write_String(0,1,displaytemp);//显示}//*********************主程序***********************//void main(){LCD_Init(); //1602初始化LCD_Clear(); //清屏T0_init(); //定时器0初始化INT0_init(); //启动外部中断0while(1){measure(); //超声波测距函数display(); //显示}}附链接文件程序:/* 1602.c *//*-----------------------------------------------名称:LCD1602引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include<intrins.h>#include "1602.h"#include "delay.h"sbit RS = P2^6; //定义端口sbit RW = P2^5;sbit EN = P2^7;#define RS_CLR RS=0#define RS_SET RS=1#define RW_CLR RW=0#define RW_SET RW=1#define EN_CLR EN=0#define EN_SET EN=1#define DataPort P0/*------------------------------------------------判忙函数------------------------------------------------*/ bitLCD_Check_Busy(void){DataPort= 0xFF;RS_CLR;RW_SET;EN_CLR;_nop_();EN_SET;return (bit)(DataPort& 0x80);}/*------------------------------------------------写入命令函数------------------------------------------------*/ voidLCD_Write_Com(unsigned char com) {while(LCD_Check_Busy()); //忙则等待RS_CLR;RW_CLR;EN_SET;DataPort= com;_nop_();EN_CLR;}/*------------------------------------------------写入数据函数------------------------------------------------*/ voidLCD_Write_Data(unsigned char Data){while(LCD_Check_Busy()); //忙则等待RS_SET;RW_CLR;EN_SET;DataPort= Data;_nop_();EN_CLR;}/*------------------------------------------------清屏函数------------------------------------------------*/voidLCD_Clear(void){LCD_Write_Com(0x01);DelayMs(5);}/*------------------------------------------------写入字符串函数------------------------------------------------*/voidLCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) {if (y == 0){LCD_Write_Com(0x80 + x); //表示第一行}else{LCD_Write_Com(0xC0 + x); //表示第二行}while (*s){LCD_Write_Data( *s);s ++;}}/*------------------------------------------------写入字符函数------------------------------------------------*//* void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) {if (y == 0){LCD_Write_Com(0x80 + x);}else{LCD_Write_Com(0xC0 + x);}LCD_Write_Data( Data);}*//*------------------------------------------------初始化函数------------------------------------------------*/voidLCD_Init(void){LCD_Write_Com(0x38); /*显示模式设置*/DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);LCD_Write_Com(0x08); /*显示关闭*/LCD_Write_Com(0x01); /*显示清屏*/LCD_Write_Com(0x06); /*显示光标移动设置*/DelayMs(5);LCD_Write_Com(0x0C); /*显示开及光标设置*/}/* 1602.h *//*-----------------------------------------------名称:LCD1602.h引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK ------------------------------------------------*/#ifndef __1602_H__#define __1602_H__bitLCD_Check_Busy(void) ;voidLCD_Write_Com(unsigned char com) ;voidLCD_Write_Data(unsigned char Data) ;voidLCD_Clear(void) ;voidLCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) ; voidLCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) ; voidLCD_Init(void) ;#endif/* delay.c*/#include "delay.h"/*------------------------------------------------uS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned int t){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/voidDelayMs(unsigned int t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/* delay.h*/#ifndef __DELAY_H__#define __DELAY_H__/*------------------------------------------------uS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned int t);/*------------------------------------------------mS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/voidDelayMs(unsigned int t);#endif。

基于51单片机超声波测距仪设计

基于51单片机超声波测距仪设计

基于51单片机超声波测距仪设计超声波测距仪是一种应用较为广泛的测量设备,可以用于测量物体与超声波传感器之间的距离。

本文将基于51单片机设计一个简单的超声波测距仪,并介绍其原理、硬件电路和程序设计。

一、原理介绍:超声波测距仪的工作原理是利用超声波传感器发射超声波,并接收其反射回来的波,通过计算发射和接收之间的时间差,从而确定物体与传感器之间的距离。

超声波的传播速度在空气中近似为331.4m/s,根据速度与时间关系,可以通过测量时间来计算距离。

二、硬件电路设计:1.超声波模块:选用一个常见的超声波模块,包括超声波发射器和接收器。

2.51单片机:使用51单片机作为控制器,负责控制超声波模块和处理测距数据。

3.LCD显示屏:连接一个LCD显示屏,用于显示测距结果。

4.连接电路:将超声波发射器和接收器分别连接到单片机的引脚,将LCD显示屏连接到单片机的相应引脚。

三、程序设计:1.初始化:包括初始化单片机的GPIO引脚、定时器以及其他必要的设置。

2.发送信号:发射一个超声波信号,通过超声波模块的引脚控制。

此时,启动定时器开始计时。

3.接收信号:当接收到超声波的反射信号时,停止定时器,记录计时的时间差。

根据超声波传播速度,可以计算出距离。

4.显示结果:将测得的距离数据显示在LCD显示屏上。

四、实现效果:通过以上设计,可以实现一个简单的超声波测距仪。

在实际应用中,可以根据需求扩展功能,例如增加报警功能、计算速度等。

总结:本文基于51单片机设计了一个超声波测距仪,包括硬件电路设计和程序设计。

通过该设备可以实现对物体与超声波传感器之间的距离进行测量,并将结果显示在LCD显示屏上。

该设计只是一个基本的框架,可以根据需要进行进一步的改进和优化。

水位控制远端(hc-sr04)

水位控制远端(hc-sr04)
unsigned char dist_buf[2]={0,0}; //水位数据缓存
/*数码管显示*/
void Display(void)
{
if(posit==0)
{
seg1=0;
P0=dist_code[dist_buf[posit]]; //0x7f为小数点,第一位加小数点
unsigned int timer=0; //多任务计时
unsigned char posit=0; //数码管位选
unsigned long S=0; //超声波距离
bit dist_flag =0; //超声波计时溢出标识
unsigned char const dist_code[10] ={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //P0控制共阳极数码管0,1,2,3,4,5,6,7,8,9
//接线:模块TRIG接 P2.7 TX ECH0 接P2.6 RX
//数码管:共阳数码管P0接数据口,P2.2 P2.1 P2.0接选通数码管
/***********************************************************************************************************/
sbit RX=P2^6; //超声波接收口
sbit TX=P2^7; //超声波控制口
sbit seg1=P2^1; //数码管1位选
sbit seg2=P2^2; //数码管2位选
unsigned int time=0; //超声波计时
/***********************************************************************************************************/
  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);
}
}。

相关文档
最新文档