北邮基于单片机的超声波测距附源代码

合集下载

超声波测距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;}}}/************************************************************************************/。

单片机课程设计超声波测距设计代码注释

单片机课程设计超声波测距设计代码注释

尊敬的读者:感谢您对本篇文章的关注和阅读。

在本篇文章中,我将为您介绍单片机课程设计中超声波测距设计代码的注释。

希望这些注释能够帮助您更好地理解超声波测距的原理和代码实现。

注释一:引入头文件```c#include <reg52.h>#include <intrins.h>```这里引入了reg52.h和intrins.h两个头文件,reg52.h是51单片机的特殊寄存器及位字段定义,intrins.h包含了一系列嵌入汇编的内置函数,用于单片机的延时等操作。

注释二:定义IO口```csbit Trig = P1^0;sbit Echo = P1^1;```Trig表示超声波发射端的控制引脚,Echo表示超声波接收端的输入引脚。

注释三:延时函数定义```cvoid DelayUs2x(unsigned char t){while (--t);}void DelayMs(unsigned char t){while(t--){DelayUs2x(245);DelayUs2x(245);}}```这里定义了微秒级和毫秒级的延时函数,用于超声波测距模块的操作时序控制。

注释四:超声波测距函数```cunsigned int distance() {unsigned int long ms; Trig = 0;_nop_();_nop_();Trig = 1;DelayUs2x(10);Trig = 0;while(!Echo);ms = 0;while(Echo){DelayUs2x(1);ms++;if(ms > 5000)return 0;}return ms;}```这段代码是超声波测距的核心算法,首先通过Trig引脚发送一个10us的高电平脉冲,然后在Echo引脚接收超声波回波,并计算回波的时间,最后将时间转换成距离值返回。

注释五:主函数```cvoid m本人n(){unsigned int dis;while(1){dis = distance();if(dis){dis = dis * 1.7 / 58;}DelayMs(500);}}```在主函数中,不断调用distance函数获取距离值,然后根据超声波的传播速度将时间转换成距离,并进行延时500ms后再次进行测距。

基于单片机的超声波测距仪1

基于单片机的超声波测距仪1

XXXXX学院单片机课程设计报告题目:基于单片机的超声波测距仪学生姓名XX学号09XXX02专业电子信息工程专业班级2009级1班指导教师XXXX学部计算机科学与电气工程课程设计时间2012年6月18日基于单片机的超声波测距仪摘要测量距离的方法有很多种,短距离的可以用尺,远距离的有激光测距等,为了提高中长距离测量的简便性和精确度,本课题设计了一种基于51单片机的超声波测距仪。

系统以AT89C52单片机为核心,以超声波接收管和超声波发射管为传感器,利用单片机系统内部定时器来计算时间。

测出超声波从发射到遇到障碍物返回所经历的时间,再乘以超声波的速度就得到二倍的声源与障碍物之间的距离。

经测试,系统工作正常,达到设计要求。

关键词:超声波测距仪;AT89C52单片机;超声波传感器目录摘要 (I)第1章绪论 (3)1.1本设计的意义 (3)1.2本设计的发展前景 (3)1.3本设计的原理 (4)第2章本设计系统结构介绍 (5)2.1系统结构框图 (5)2.2各功能模块介绍 (5)2.2.1蜂鸣器、按键及液晶 (5)2.2.2超声波发射模块 (5)2.2.3超声波接收模块 (6)2.3本章小结 (6)第3章系统硬件电路设计 (7)3.1单片机介绍 (7)3.2单片机最小系统设计 (7)3.2.1单片机时钟电路介绍 (8)3.2.2单片机复位电路介绍 (9)3.3超声波发射电路介绍 (9)3.3.1 主要芯片功能介绍 (10)3.3.2 芯片内部结构图 (10)3.3.3 芯片引脚功能介绍 (10)3.4超声波接收电路介绍 (11)3.4.1 主要芯片功能介绍 (11)3.4.2 芯片内部结构图 (11)3.4.3 芯片引脚功能介绍 (11)3.5本章小结 (12)第4章系统软件调试环境介绍 (13)4.1 Keil编程软件介绍 (13)4.1.1软件功能 (13)4.1.2软件应用流程 (13)4.2 STC程序下载软件功能 (19)4.2.1软件应用流程 (19)4.3 本章小结 (22)第5章系统程序设计 (23)5.1系统程序设计流程图如图5-1所示 (23)5.2超声波发射模块详细流程图 (24)5.2.1程序流程图对应程序代码 (24)5.3液晶显示程序模块详细流程图 (26)5.3.1程序流程图对应程序代码: (27)5.4本章小结 (28)结论 (29)参考文献 (30)附录A (31)附录B (36)附录C (37)基于单片机的超声波测距仪第1章绪论超声波是指超过人的听觉范围以上(16KHZ)的声波。

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

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

基于单片机的超声测距系统设计摘要超声波测距法迅速,方便,计算简单,易于做到实时控制,提过基于单片机的超声测距系统的设计能更加深入地了解单片机的实际应用。

本课题完成整个超声波测距系统设计,包括单片机控制电路,发射电路,接收电路,LCD显示电路和温度补偿电路。

本课题硬件部分设计采用最小系统板和所需的超声波收发电路。

程序由计算机仿真并烧入单片机实际调试,最终实物是一个能在5至200cm范围内准确测量距离的便携式系统,经实际测量误差控制在5%以内。

该系统的设计过程加深了对单片机的理解。

本设计的产品也能在实际生活中有很广泛的应用。

关键词:超声波,测距,补偿,模块DESIGN OF ULTRASONIC RANGINGBASED ON SINGLECHIPABSTRACTUltrasonic ranging is so quick and useful,it can be easy to translationed and be controled on time.We can learn much about singlechip during the design of Ultrasonic ranging base on singlechip.The system is made up by singlechip part,send and receive part,LCD part and temperature detective part.With the helping of smallest system and computer,the product which can detective the distance from 5cm to 200cm comes out.The error is only 0.5%. The system can help you take a good learning about singlechip.On the other hand,the system can be used in many environment by its practicality.Key Words: Ultrasonic,Ranging, temperature detective目录摘要 (I)ABSTRACT (II)目录 .................................................................................................................................................. I II 第1章绪论 (1)1.1课题的背景和意义 (1)1.1.1 课题的背景 (1)1.1.2 课题的意义 (1)1.2超声波测距的发展现状趋势 (2)1.3本课题任务 (2)第2章单片机 (3)2.1单片机原理及应用 (3)2.1.1 单片机原理 (3)2.1.2 单片机的应用 (3)2.2单片机发展前景 (4)2.3单片机程序编译环境 (5)2.3.1 KEIL C51 (5)2.3.2 uVision2集成开发环境 (5)2.3.3 编辑器和调试器 (6)2.3.4 C51编译器 (6)2.3.5 部分代码优化 (7)2.3.6 RTX51实时核模块 (8)2.3.7 测试程序 (8)2.3.8 C51 V7版增强功能介绍 (9)第3章超声波测距原理 (10)3.1超声波原理及应用 (10)3.1.1 超声波原理 (10)3.1.2 超声波应用 (10)3.2超声波测距原理 (11)第4章测距系统构成与误差分析 (13)4.1单片机控制器 (13)4.2传感器 (13)4.2.1 超声波传感器原理与选型 (13)4.2.2 温度传感器选型 (14)4.3LCD显示屏 (15)4.4系统误差 (15)4.4.1 系统误差分析 (15)4.4.2 系统误差补偿 (16)第5章系统设计 (17)5.1系统框图 (17)5.2硬件 (17)5.2.1 发射电路 (17)5.2.2 接收电路 (18)5.3程序流程图 (20)5.4系统实物图 (21)5.5测试及数据分析 (21)第6章总结 (25)参考文献 (26)附录1部分程序 (28)致谢 (39)第1章绪论1.1课题的背景和意义1.1.1课题的背景随着科技的迅猛发展越来越多科技成果被广泛的运用到人们的日常生活当中,给我们的生活带来了诸多方便。

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

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

基于单片机的超声波测距仪设计LT摘要随着科技的发展、自动化程度的提高以及电子产品的普及,电子测距产品也走进了人们的视野。

相对于普通的测量工具,它具有数字式显示、测距精准以及可智能化控制等优点。

本系统是利用STC89C52单片机和超声波测距模块进行设计制作的智能化测距仪,主要实现距离的检测、数字式显示,以及超限报警等功能。

基于单片机的超声波测距仪是以单片机为控制核心,通过超声波测距模块对被测物体发射超声波,利用超声波在空气中的传播速度和发射到接收到超声波所用时间计算得到距离。

测距原理简单、容易实现,并且在生产生活中可以得到广泛使用和推广,具有实际性意义。

关键词:单片机STC89C52,超声波传感器,基于单片机的超声波测距仪。

Ultrasonic rangingAbstract:With the development of science and technology, the improvement of automation and the popularity of electronic products, electronic product range also went into people's horizons. Compared with the common measuring tool, it has a digital display, ranging precision and intelligent control, etc.This system is using STC89C52 MCU and ultrasonic ranging module to design the intelligent range finder, mainly realize the distance detection, digital display, and transfinite alarm and other functions. Based on single chip ultrasonic range finder based on single chip microcomputer as control core, the object to be measured by the ultrasonic ranging module of launch ultrasonic wave, using the ultrasonic velocity in air and launch time to calculate the distance used to receive the ultrasonic. Ranging principle is simple, easy to implement, and can be widely used in production and life and the promotion, has practical significance.Key words:microcontroller STC89C52, ultrasonic sensors, ultrasonic range finder based on singlechip.目录摘要.................................... Ultrasonic ranging .. (I)第一章绪论 01.1 需求分析 01.2可行性分析 (1)第二章单片机的概述 (2)2.1单片机的含义及组成 (2)2.2单片机的发展 (3)2.3单片机的特点 (3)2.4单片机的应用 (4)第三章基于单片机的超声波测距仪总体设计方案53.1超声波测距仪的系统设计 (5)3.2主控制器 (5)3.3 显示电路 (6)3.4 超声波测距模块 (7)3.4.1 HC-SR04超声波测距模块的特性 73.4.2 HC-SR04超声波测距模块的引脚 73.4.3 HC-SR04超声波测距模块的工作原理 (8)3.4.4 超声波时序图 (9)3.4.5 HC-SR04超声波测距模块的电路设计 (9)第四章基于单片机的超声波测距仪的硬件设计 114.1电源指示灯电路 (11)4.2 单片机主板电路 (11)4.2.1时钟电路 (11)4.2.2复位电路 (12)4.3数码管显示电路 (12)4.4距离测量电路 (13)4.5蜂鸣器电路 (14)4.6系统原理电路 (15)第五章基于单片机的超声波测距仪的软件设计 165.1主程序 (16)5.2距离测量子程序 (17)5.3距离显示子程序 (20)5.4超限距离调节子程序 (22)5.5 超限报警子程序 (24)总结 (26)致谢 (26)展望 (26)附录A (27)附录B (28)参考文献 (35)江苏师范大学本科生毕业设计基于单片机的超声波测距仪设计第一章绪论本文主要讲解的是基于单片机的超声波测距仪,它是以STC89C52为核心,以超声波测距模块为距离传感器的测距产品,其应用范围广泛,融入到各行各业。

51单片机超声波测距源代码

51单片机超声波测距源代码

51单片机超声波测距源代码/* 超声波模块的TRIG管脚接在单片机的P20口,ECHO管脚接在单片机的P21口其他的电源管脚接在单片机开发板上电源口即可。

*/#include"reg51.h"#include"intrins.h" //包含的头文件,用到了intrins.h的_nop_();延时文件sbit RX=P2^1; //定义管脚,用到的是P2上的两个双向I/O口sbit TX=P2^0;unsigned int time=0; //声明变量,注意单片机中一般都是用无符号的Unsigned类型变量,在Keil中,char是8位变量,int是16位变量unsigned int timer=0;unsigned char posit=0;unsigned int S=0;bit flag =0; //bit顾名思义,是1位的变量//--定义使用的IO--//#define GPIO_DIG P0 //此处定义的I/O是数码管显示要用到的I/O,若只用到串口则可以去掉sbit LSA=P2^2; //此处定义的是74LS138译码器的管脚,同理,只用到串口的话可以去掉sbit LSB=P2^3;sbit LSC=P2^4;//--定义全局变量--//unsigned char code DIG_CODE[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码,也是供数码管显示用的,可以去掉unsigned char disbuff[4] ={ 0,0,0,0,};/************************************************************** ****************** 函数名 : DigDisplay* 函数功能 : 使用数码管显示* 输入 : 无* 输出 : 无*************************************************************** ****************/void DigDisplay(){unsigned char i;unsigned int j;for(i=0;i<8;i++){switch(i) //位选,选择点亮的数码管,{case(0):LSA=0;LSB=0;LSC=0; break;//显示第0位case(1):LSA=1;LSB=0;LSC=0; break;//显示第1位case(2):LSA=0;LSB=1;LSC=0; break;//显示第2位case(3):LSA=1;LSB=1;LSC=0; break;//显示第3位case(4):LSA=0;LSB=0;LSC=1; break;//显示第4位case(5):LSA=1;LSB=0;LSC=1; break;//显示第5位case(6):LSA=0;LSB=1;LSC=1; break;//显示第6位case(7):LSA=1;LSB=1;LSC=1; break;//显示第7位}GPIO_DIG=disbuff[i]; //发送段码j=10; //扫描间隔时间设定while(j--);GPIO_DIG=0x00;//消隐}}/********************************************************/ void Conut(void){time=TH0*256+TL0; //根据定时器数据计算时间TH0=0; //初始化定时器TL0=0;S= (int)(time*0.17); //算出来是CMif((S>=4000)||flag==1) //超出测量范围显示“ERR0”{flag=0;disbuff[0]=0x3f; //“-”disbuff[1]=0x50; //“-”disbuff[2]=0x50; //“-”disbuff[3]=0x79; //“-”}else //分离各位显示的数字{disbuff[3]=DIG_CODE[S%10000/1000];disbuff[2]=DIG_CODE[S%1000/100];disbuff[1]=DIG_CODE[S%100/10];disbuff[0]=DIG_CODE[S%10/1];}}/********************************************************/void zd0() interrupt 1 //T0中断用来判断是否超过测距范围{flag=1; //若中断溢出,则超过测距范围,标记量置1。

基于51单片机控制的超声波测距程序

基于51单片机控制的超声波测距程序
sj2=40;
s=sj2;
}
void k3cl()
{
sj3=sj3+10;
if(sj3> 500)
sj3=100;
sj1-1;
sx1=sx1/csbc;
mqs=sx1/4.5;
}
void offmsd()
{
if (buffer[0] == 0x3f)
buffer[0] = 0x00;
if((P3&0x10)==0)//判断3位是否显示完
key=0;
digit> > =1; //循环右移1位
}
}
void timeToBuffer() //转换段码功能模块
{
xm0=s/100;
xm1=(s-100*xm0)/10;
xm2=s-100*xm0-10*xm1;
buffer[2]=convert[xm2];
void delay(j);//延时函数
void scanLED();//显示函数
void timeToBuffer();//显示转换函数
void keyscan();
void k1cl();
void k2cl();
void k3cl();
void k4cl();
void offmsd();
void main()//主函数
}
{
csbds=0;
cl=1;
}
}
void csbcj()
{
if(cl==1)
{
TR1=0;
TH0=0x00;
TL0=0x00;
i=10;
while(i--)
{
csbout=!csbout;

基于单片机的超声波测距仪的设计与实现毕业论文

基于单片机的超声波测距仪的设计与实现毕业论文

基于单片机的超声波测距仪的设计与实现中文摘要本设计基于单片机AT89C52,利用超声波传感器HC-SR04、LCD显示屏及蜂鸣器等元件共同实现了带温度补偿功能可报警的超声波测距仪。

我们以AT89C52作为主控芯片,通过计算超声波往返时间从而测量与前方障碍物的距离,并在LCD显示。

单片机控制超声波的发射。

然后单片机进行处理运算,把测量距离与设定的报警距离值进行比较判断,当测量距离小于设定值时,AT89C52发出指令控制蜂鸣器报警,并且AT89C52控制各部件刷新各测量值。

在不同温度下,超声波的传播速度是有差别的,所以我们通过DS18B20测温单元进行温度补偿,减小因温度变化引起的测量误差,提高测量精度。

超声波测距仪可以实现4m以内的精确测距,经验证误差小于3mm。

关键词:超声波;测距仪;AT89C52;DS18B20;报警Design and Realization of ultrasonic range finder basedABSTRACTThe design objective is to design and implement microcontroller based ultrasonic range finder. The main use of AT89C52, HC-SR04 ultrasonic sensor alarm system complete ranging production. We AT89C52 as the main chip, by calculating the round-trip time ultrasound to measure the distance to obstacles in front of, and displayed in the LCD. SCM ultrasonic transmitter. Then the microcontroller for processing operation to measure the distance and set alarm values are compared to judge distance, when measured distance is less than the set value, AT89C52 issue commands to control the buzzer alarm, and control each member refreshAT89C52 measured values. Because at different temperatures, ultrasonic wave propagation velocity is a difference, so we DS18B20 temperature measurement by the temperature compensation unit, reducing errors due to temperature changes, and improve measurement accuracy. Good design can achieve precise range ultrasonic distance within 4m, proven error is less than 3mm.Keywords:Ultrasonic;Location;AT89C52;DS18B20;Alarm目录第一章前言 (1)1.1 课题背景及意义 (1)1.1.1超声波特性 (1)1.1.2超声波测距 (2)1.2 超声波模块基本介绍 (3)1.2.1 超声波的电器特性 (3)1.2.2 超声波的工作原理 (5)1.3主要研究内容和关键问题 (6)第二章方案总体设计 (7)2.1 超声波测距仪功能 (7)2.2设计要求 (8)2.3系统基本方案 (9)2.3.1方案比较 (9)2.3.2方案汇总 (11)第三章系统硬件设计 (13)3.1 单片机最小系统 (13)3.2 超声波测距模块 (13)3.3 显示模块 (15)3.4温度补偿电路 (15)3.5 蜂鸣报警电路 (16)第四章系统软件设计 (17)4.1 A T89C52程序流程图 (17)4.2 计算距离程序流程图 (19)4.3 报警电路程序流程图 (19)4.4 超声波回波接收程序流程图 (20)第五章系统的调试与测试 (21)5.1 安装 (21)5.2 系统的调试 (21)第六章总结 (23)参考文献 (24)致谢.............................................................................................................................. 错误!未定义书签。

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

2013年小学期单片机设计实验报告题目:基于单片机的超声波测距班级:班内序号:实验组号:学生姓名:指导教师:实验摘要本次实验我们制作的超声波测距仪主要实现的功能是非接触式测距,应用于测量环境处于黑暗、有灰尘,烟雾,有毒的情况下的距离测量,利用超声波的直线传播性,较低速性,便于发射和接收,有较高的分辨率和精准度。

整个系统中,微控制器采用了Microchip公司的PIC16F877,软件设计中涉及Rc1、RB4用作超声波发射和接收管脚和LCD1602液晶显示屏用作显示测量结果。

本实验用单片机RB4管脚产生高电平使发射电路使能发射超声波,并开始计时,当接收电路接收到超声波后,电平由高变低,送入到单片机Rc1管脚,发送中断请求,停止计时,计算出超声波传播距离,实现测距。

其中发射电路由NE555电路40KHz超声波发生模块和由CD4069反相器构成的信号推挽放大模块组成,接收电路由CX20106模块组成。

概括来说,本实验就是用单片机通过记录超声波发射接收时间,并以此计算出距离。

A b s t r a c tIn this experiment we produce ultrasonic range finder functions of the main non-contact distance, used in the measurement environment is dark, dust, smoke, toxic case of distance measurement, using an ultrasonic wave transmission line resistance, low speed , ease of transmitting and receiving, a higher resolution and accuracy.Throughout the system, the microcontroller uses Microchip's PIC16F877, software design involves Rc1, RB4 for transmitting and receiving ultrasonic LCD1602 LCD monitor as a pin and display the measurement results. The experimental chip produces high RB4 pin enables the emission of ultrasonic transmitter circuit and start the timer, when the receiving circuit receives the ultrasonic waves, the level from high to low, Rc1 fed to the microcontroller pin interrupt request is sent, stop time, calculated from the ultrasonic wave propagation, to achieve ranging.Wherein the transmission circuit from 40KHz ultrasonic NE555 circuit CD4069 inverter module and constituted by a push-pull signal amplification module, the receiving circuit by the CX20106 modules. In summary, the present study is to use the microcontroller through the recording ultrasonic transmitting and receiving time, and thus calculate the distance.关键字单片机——microcontroller 芯片——CMOS chip超神波——Ultrasonic wave计时计算——Timing and calculation一.实验论证与比较1.超声波发射模块超声波测距的发射电路作用是有效发生较强的超声波寻向被测物,以供接收电路接收,其由NE555电路40KHz超声波发生模块和由CD4069反相器构成的信号推挽放大模块组成。

如图1所示:图11.1其中控制电路和震荡电路由555基本电路组成,这基本电路能通过改变电阻和电容的值可以改变频率和占空比。

如图2图21.2本电路采用CMOS 六反相器CD4069构成驱动电路,为了增大驱动电流,可以采用CD4069中两个甚至三个方向器并联的方式实现。

图3555多谐振荡电路的脉冲宽度TL 由电容C 的放电时间来决定:TL ≈0.7R2C TH 由电容C 的充电时间来决定:TH ≈0.7(R1+R2)C输出振荡信号的周期为:T = TL + TH频率为:输出脉冲占空比为: )2/()(2121R R R R D ++=若调整可调电阻VR1,可改变输出矩形波的频率和占空比。

当调整VR1使得输出为40kHz 时,由于(VR1+R4)>>R3,输出波形占空比约为50%,为近似理想对称方波。

555的强制复位端4脚由另一个555低频振荡器的输出取反后控制。

此电路结构称为桥式驱动方式,由于超声波传感器具有高阻特性,其正常工作时需要一定的驱动电流,而每个反相器的输出电流(负载能力)是一定的。

两个并联,输出电流加倍,驱动能力提高 121f 1/ 1.443/(2)T R R C =≈+2.超声波接收模块接收模块是通过cx20106a芯片和相应的的接收电路实现的。

其电路如图4图4Cx20106a的各管脚功能如下图图6以上资料摘自cx20106a的使用资料。

在以上网上提供的电路参数基础上,我们通过使用示波器调整R的阻值,使其接收的中心频率为40KHz左右二.系统总体设计系统模块总体框图如下:整个系统开始工作后,发射电路向障碍物发射1ms的超声波,间歇64ms后再发射一次,如此循环发射电磁波。

而接受电路一旦接收到障碍物反射回来的超声波,输出管脚7电位由高变低,单片机跳入中断,根据所计时计算出距离,并在显示屏上显示。

软件设计框图如下:三.硬件连接⒈发射接收模块连接整个发射接收电路在面包板上撘出,各个元器件的值起初都用电路图所示的值。

然后进行调试,根据发射电路原理,利用示波器,调试R1和R2的值,使发射的超声波频率为40khz,占空比为50%。

根据接收电路,利用信号发生器发射40khz信号,调测接收电路输出端由高电位变成地点位。

然后进行整体调试,及发射电路发射超声波,接收电路接收,并输出低电平。

⒉发射接收模块和单片机连接本实验中应用单片机RB4管脚产生高电平使发射电路使能发射超声波,并开始计时,当接收电路接收到超声波后,电平由高变低,送入到单片机Rc1管脚,发送中断请求,停止计时,计算出超声波传播距离,实现测距。

整个系统连接模块如下:四.调试过程这部分是由搭档林负责,摘自他报告。

⒈开始软仿真时RB0总是无法清0在刚开始做软仿真时,出现了RB0无论用任何语句,在WATCHWINDOW下观察均无法使之清0的麻烦,后经过询问老师问题得到解决,原来是在设置为输入管脚的前提下,外部语句是无法对寄存器值进行修改的。

2.单片机始终无法下载在开始阶段用单片机仿真时,总是出现OPERATION PROBLEM相关的字样,导致下载不成功。

更有一次单片机不停发热,最终导致单片机损坏。

后来发现是单片机与插槽接触不良,经过不断断电调整问题得到解决。

3.软仿真没问题,但硬仿真总是莫名其妙的跳到中断这个问题困扰了我整整一上午,这个问题很难被察觉,因为在软仿真上没有出现任何逻辑错误,但在硬仿真时却连总开关的作用都没起到就跳到了中断。

后来经过反复排查,发现是单片机的RB6和RB5两脚损坏,电平不稳导致单片机跳到RB中断,经过更换单片机问题得到解决。

4.在跳出中断是总是马上又回到中断在软仿真时,出现了永远在中断中循环,无法进行后面语句的问题。

后来经过排查反思,发现是中断标志位一直赋值为1,经过软件清0,问题得到解决。

5.在送往显示器时遇到了一定困扰因为计算出的数字在寄存器内是以2进制数的形式表示的,而在液晶屏的代码中仅与相应数字的十进制有关,这对送显造成了极大的困扰。

后来经过查阅资料,想到了先把二进制码转化为8421BCD码然后通过筛选前后四位来分别送显,问题得以解决。

五.参考文献:PIC单片机实用教程——基础篇北京航空航天大学出版社使用说明:的确是一本不可或缺的教材,本书列举了很多实用的具有实战意义的例子,单片机入门就是通过把这本书里的好例子一字一行敲进电脑去来实现的。

PIC单片机实用教程——提高篇李学海北京航空航天大学出版社使用说明:继承了前面基础篇的风格,例子也具有实战意义,主要讲RA、TMR2的使用和CCP模块的PWM脉宽调制功能。

六.实验心得体会整个实验过程历时15天左右,刚刚开始的时候,对单片机没什么概念,不得头绪,无从下手。

听学长学姐们介绍说,单片机实验其实很有趣,也比较“热血”,想想自己能亲手做出一个能实现简单功能的小应用产品,对于我们以前只是从课本中得来而不常动手实践的来说,绝对是一件增长知识,锻炼能力的事。

后经过老师们对实验的简单介绍,我们有了一个初步了解,也表现的信心满满。

在确定要做的实验题目时,我和我的搭档有些分歧,我坚持做这个超声波测距,而林小斐觉得做电子琴或音乐发生器什么的比较简单,容易完成,而超声波测距容易受外界干扰,不易出结果。

于是我和他交流,说简单的人人都愿意做,就没有什么挑战性,并且对于这个小学期,我对自己还是很有期望的,希望能做的比较好,不能应付了事。

最后我们达成一致意见,决定做这个实验。

我主要负责实验中硬件的部分,设计电路,搭电路,调试电路,焊电路。

等等一体手工工作由我负责,而林小斐负责程序部分,前期我们双管齐下,很快就把电路和程序都给弄出来了,到了调试的时候,发现接收电路出现一个问题,就是通过信号发生器发生的信号加在接收电路中有正常现象出现,即能输出方波,然而整机调试时就是接收不到超声波信号,经过多次尝试,多次更换元器件,仍然没有效果。

在这个问题上我们停滞了两天,由于时间的原因,我们及时改变方案,转换了思路,采用c x20106a芯片作为接收电路。

虽然,我们没有找出先前的接收电路有什么问题,但我们尝试了在有问题时另辟蹊径,及时找到替代方案。

相关文档
最新文档