基于单片机的超声波测距专业系统设计.doc
目录一、摘要3二、正文31、引言32、系统设计方案42.1超声波测距原理 42.2设计框图 42.3 US-100超声波收发模块42.4 单片机电路 62.5 蜂鸣器报警电路 82.6显示电路 92.7供电及程序下载电路103 软件编程 103.1软件流程图103.2主程序 114、下载调试195、实物图196 元件选取 20三、总结20四、参照文献20一、 摘要超声波具备指向性强,能量消耗缓慢,传播距离较远等长处,因此,在运用传感器技术和自动控制技术相结合测距方案中,超声波测距是当前应用最普遍一种,它广泛应用于防盗、倒车雷达、水位测量、建筑施工工地以及某些工业现场。本设计详细简介了超声波传感器原理和特性,分析了超声波测距原理基本上,指出了设计测距系统思路和所需考虑问题,给出了以STC89c52单片机为核心低成本、高精度、微型化数字显示超声波测距仪硬件电路和软件设计办法。该系统电路设计合理、工作稳定、性能良好、检测速度快、计算简朴、易于做到实时控制,并且在测量精度方面能达到工业实用规定。核心词:超声波 单片机 测距 STC89c52AbstractUltrasonic wave has strong pointing to nature ,slowly energy consumption ,propagating distance farther ,so,in utilizing the scheme of distance finding that sensor technology and automatic control technology combine together ,ultrasonic wave finds range to use the most general one at present ,it applies to guard against theft ,move backward the radar ,water level measuring ,building construction site and some industrial scenes extensively。This subject has introduced principle and characteristic of the ultrasonic sensor in detail ,on the basis of analyzing principle that ultrasonic wave finds range ,the systematic thinking and questions needed to consider that have pointed out that designs and finds range ,provide low cost ,the hardware circuit of high accuracy ,ultrasonic range finder of miniature digital display and software design method taking STC89c52 as the core ,this circuit of system is reasonable in design,working stability,performance good measuring speeding soon ,calculating simple ,apt to accomplish real-time control ,and can reach industry's practical demand in measuring the precision 。Key Words:Ultrasonic wave;One-chip computer;Range finding;STC89c52 二、 正文1 、引言:测量距离办法有诸各种,短距离可以用米尺,远距离有激光测距等,超声波测距合用于高精度中长距离测量。由于超声波在原则空气中传播速度为331.45米/秒,由单片机负责计时,系统测量精度理论上可以达到毫米级。2、系统设计方案2.1超声波测距原理超声波测距原理普通采用渡越时间法TOF(time of flight),也可以称为回波探测法,如图所示。超声波发射器向某一方向发射超声波,在发射时刻同步开始计时,超声波在介质中传播,途中遇到障碍物就及时返回来,超声波接受器收到反射波就及时停止计时。依照传声介质不同,可分为液介式、气介式和固介式三种。依照所用探头工作方式,又可分为自发自收单探头方式和一发一收双探头方式。而倒车雷达普通是装在车尾,超声波在空气中传播,超声波在空气中(20)传播速度为340m/s(实际速度为344m/s这里取整数),依照计时器记录时间就可以计算出发射点距障碍物距离,公式S=340*t/2。图1 超声波测距原理由于超声波也是一种声波,其声速c与温度关于,表1列出了几种不同温度下声速。在使用时,如果温度变化不大,则可以为声速是基本不变。如果测距精度规定很高,则应通过温度补偿办法加以校正。表1 声速与温度关系2.2设计框图本研究设计超声波测距仪框图如图所示。超声波测距仪方框图2.3 US-100超声波收发模块该超声波收发模块可自己产生40kHz方波,并经放大电路驱动超声波发射探头发射超声波,发射出去超声波经障碍物反射后由超声波接受探头接受。经接受电路检波放大,积分整形,在ECHO引脚上产生方波脉冲,该脉冲宽度与被测距离成线性关系。详细过程如图3所示。US-100超声波收发模块工作时序图上图表白:只需要在Trig/TX管脚输入一种10us以上高电平,系统便可发出8个40KHZ超声波脉冲,然后检测回波信号,当检测到回波信号后,模块还要进行温度值测量,然后依照当前温度对测距成果进行校正,将校正后成果通过Echo/RX管脚输出。在此模式下,模块将距离值转化为340m/s时时间值2倍,通过Echo端输出一种高电平,可依照此高电平持续时间来计算距离值。即距离值为:(高电平时间*340m/s)/2注:由于距离值已经通过温度校正,此时无需再依照环境温度对超声波声速进行校正,也就是不论温度多少,声速选取340m/s即可。使用US-100超声波收发模块进行距离测量测量时,单片机只需要输出触发信号,并监视回响引脚,通过定期器计算回响信号宽度,并换算成距离即可。该模块简化了发送和接受模仿电路,工作稳定可靠,其参数指标如表2所示。 表2 US-100模块电气参数应注意测量周期必要在60毫秒以上,防止发射信号对回响信号影响。US-100超声波模块外形图2.4 单片机电路本设计选用单片机STC89C52,其管脚如图所示。 STC89C52单片机管脚图该芯片为52内核8位单片机,兼容Intel等52内核单片机,支持ISP下载,合用于惯用检测控制电路。由STC89C52构成单片机系统原理图如图6所示。图中TRIG引脚为单片机发送触发信号引脚,ECHO引脚为US-100模块送回回响信号引脚,接至单片机外部中断P3.2脚上,可以运用外部中断测量回响信号宽度。当测量距离不大于阈值20cm时,单片机通过管脚P3.6发出灯光报警信号,触发LED报警灯亮,同步通过管脚P3.7发出声音报警信号beep,该信号用以触发蜂鸣器鸣响报警。 图6 单片机系统及超声波模块接口原理图2.5 蜂鸣器报警电路图7所示为蜂鸣器报警电路。由于单片机管脚灌电流比拉电流容量大,因而电路设计为低电平输出时蜂鸣器响,高电平关闭。当P3.7脚输出低电平时,PNP型三极管8550导通,有集电极电流通过,蜂鸣器鸣响。当P3.7脚输出高电平时,三极管截止,蜂鸣器关闭。 图7 蜂鸣器报警电路2.6显示电路显示某些采用SMC 1602液晶屏进行数据显示,其重要技术参数为:表3 液晶屏技术指标接口信号阐明如表4所示。 表4 液晶屏接口信号阐明与单片机接口 电路如图8所示。 图8 LCD与单片机接口电路2.7供电及程序下载电路本设计采用USB接口供电,电源电压5V。同步,USB接口通过内含PL2303芯片转换电路对单片机进行程序编写。其电路原理如图9所示。 图9 供电及程序下载电路3 软件编程3.1软件流程图本设计软件主程序流程图如图10所示, (a)为主程序流程图,(b)为定期中断子程序流程图,(c)为外部中断子程序流程图。 (a) 主程序流程图 (b) 外部中断流程图 图10 程序流程图3.2主程序(1) 头文献和某些宏定义/*/ /*超声波测距仪*/ /*(液晶屏显示)*/*晶振 11.0592MHz*/#include <reg52.h>#include "1602.h"typedef unsigned char U8;/* defined for unsigned 8-bits integer variable无符号8位整型*/ typedef signed char S8;/* defined for signed 8-bits integer variable有符号8位整型*/typedef unsigned int U16;/* defined for unsigned 16-bits integer variable无符号16位整型*/typedef signed int S16;/* defined for signed 16-bits integer variable有符号16位整型*/ typedef unsigned long U32;/* defined for unsigned 32-bits integer variable无符号32位整型*/ typedef signed long S32;/* defined for signed 32-bits integer variable 有符号32位整型*/ typedef float F32;/* single precision floating point variable (32bits)单精度浮点数32位长度*/ typedef double F64;/* double precision floating point variable (64bits)双精度浮点数64位*/定期器0定期值为1mS,即11059/12=922个时钟脉冲,其补为65536-922=64614 #define SYSTEMCLK 921600 /11059200/12#define T0CLK 921600 /11059200/12#define T1CLK 921600 /11059200/12#define T1PERIOD 1000000/921600 /T1周期时间,以微秒为单位,约为1.085uS #define TIMER0H 0xFC /64614/256=252#define TIMER0L 0x66 /54447%256=102(2) 管脚、常量、变量定义和函数声明/管脚定义sbit Trig = P13;sbit Echo = P32;/回波必要接在外部中断引脚上sbit LedAlarm = P36;/报警灯,低电平亮sbit Beep = P37;/报警蜂鸣器/定义标志volatile bit FlagSucceed = 0;/测量成功标志volatile bit FlagDisplay = 0;/显示标志/定义全局变量U16 DisplayCount=0;U16 time=0;U32 distance=0;/函数声明void delay_20us();void Start_Module();void INT0_Init(void);void Data_Init();void Timer0_Init();void Timer1_Init();(3) 各子程序/20us延时程序,不一定很准void delay_20us()U16 bt ;for(bt=0;bt<100;bt+);/8M晶振是100/数据初始化void Data_Init()/外部中断初始化函数void INT0_Init(void)IT0 = 0;/负边沿触发中断EX0=0;/关闭外部中断/外部中断解决用做判断回波电平void INT0_ISR (void) interrupt 0time =TH1*256+TL1;/取出定期器值FlagSucceed = 1;/置成功测量标志EX0=0;/关闭外部中断/定期器0初始化,16位定期模式,初始化为1ms中断一次。 void Timer0_Init()TMOD = 0x11;/定期器0和1工作在16位方式TH0 = TIMER0H;TL0 = TIMER0L;TR0 = 1;/启动定期器 ET0 = 1;/容许定期器0中断 Trig = 0;distance = 0;DisplayCount = 0;/定期器0中断,用做显示计时void Timer0_ISR(void) interrupt 1 / 定期器0中断是1号 TH0 = TIMER0H;TL0 = TIMER0L;DisplayCount +;if (DisplayCount >= 1000) /1秒钟显示一次 FlagDisplay = 1;DisplayCount = 0;/定期器1初始化,16位计数模式,时钟为11059200/12=921600Hz/60ms计数为55296,即0xD800void Timer1_Init()TMOD = 0x11;/定期器0和1工作在16位方式 TH1 =0;TL1= 0;ET1 = 1;/启动模块,Trig管脚20us正脉冲void Start_Module()Trig=1;Trig=0;/* * 名称 :Main()* 功能 :主函数*/ void main()U16 i,j;EA = 0;INT0_Init();Timer0_Init();/定期器0初始化Timer1_Init();/定期器1初始化Data_Init();EA = 1;L1602_init();L1602_string(1,1,"Welcome to my ");L1602_string(2,1,"distance meter!");/延时 for (i=0;i<1000;i+) /启动模块 /启动一次模块 delay_20us();for (j=0;j<1000;j+) ; while(1) EA= 0;/如下为一次检测过程:先发出Trig电平,打开外部中断,清零T1, /最后在外部中断下降沿触发时取出T1当前值,计算出Trig脉冲宽度。 Start_Module();while(Echo=0);/等待Echo回波引脚变高电平FlagSucceed = 0;EX0=1;TH1= 0;TL1= 0;TF1= 0;TR1=1;/启动定期器1开始计数EA = 1;while (TH1<80) ;/盲区 TR1 = 0 ;/关闭定期器1 EX0 = 0;/关闭外部中断if(FlagSucceed=1) /一次测试成功,则计算距离,单位为厘米 distance = time * 1.085 ;/计算得到脉冲时间(以微秒为单位) /将微秒时间转变成厘米距离算法: Y米=(X秒*344)/2 / X秒=( 2*Y米)/344 =X秒=0.0058*Y米 =厘米=微秒/58 distance /=58;/如果距离不大于20cm,则声光报警if (FlagSucceed = 1) && (distance < 20) LedAlarm = 0;Beep = 0; else LedAlarm = 1;Beep = 1;if (FlagDisplay = 1) /1秒显示时间到 if(FlagSucceed=0) /LCD提示无回波L1602_string(1,1,"OutOfRange(0-4m)");L1602_string(2,1," - ");else/LCD显示数据L1602_string(1,1,"Distance Result:");L1602_string(2,1," cm "); L1602_int(2,5,distance ); FlagDisplay = 0;3.3显示程序/* * 文献名 : 液晶1602显示.c* 描述 :该程序实现了对液晶1602控制。*/ #include "1602.h"#include "math.h"/* * 名称 :delay()* 功能 :延时,延时时间大概为140US。* 输入 :无* 输出 :无*/void delay();int i,j;for(i=0;i<=10;i+) for(j=0;j<=2;j+)/* * 名称 :Convert(uchar In_Date)* 功能 :由于电路设计时,P0.0-P0.7接法刚好与资料中相反,因此设计该函数。 * 输入 :1602资料上值* 输出 :送到1602值*/ uchar Convert(uchar In_Date)/*uchar i,Out_Date = 0,temp = 0;for(i=0;i<8;i+)temp = (In_Date >> i) & 0x01;Out_Date |= (temp << (7 - i);return Out_Date;*/return In_Date;/* * 名称 :enable(uchar del)* 功能 :1602命令函数* 输入 :输入命令值* 输出 :无*/void enable(uchar del)/* * 名称 :write(uchar del)* 功能 :1602写数据函数* 输入 :需要写入1602数据* 输出 :无*/void write(uchar del)P0 = Convert(del);P0 = Convert(del);RS = 0;RW = 0;E = 0;delay();E = 1;delay();RS = 1;RW = 0;E = 0;delay();E = 1;delay();/* * 名称 :L1602_init() * 功能 :1602初始化 * 输入 :无* 输出 :无*/ void L1602_init(void) enable(0x01);enable(0x38);enable(0x0c);enable(0x06);enable(0xd0);/* * 名称 :L1602_char(uchar hang,uchar lie,char sign)* 功能 :变化液晶中某位值,如果要让第一行,第五个字符显示"b" ,调用该函数如下 L1602_char(1,5,'b')* 输入 :行,列,需要输入1602数据 * 输出 :无*/ void L1602_char(uchar hang,uchar lie,char sign) /* * 名称 :L1602_string(uchar hang,uchar lie,uchar *p)* 功能 :变化液晶中某位值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下uchar a;if(hang = 1) a = 0x80;if(hang = 2) a = 0xc0;a = a + lie - 1;enable(a);write(sign);L1602_string(1,5,"ab cd ef;") * 输入 :行,列,需要输入1602数据 * 输出 :无*/ void L1602_string(uchar hang,uchar lie,uchar *p) uchar a;if(hang = 1) a = 0x80;if(hang = 2) a = 0xc0;a = a + lie - 1;enable(a);while(1) if(*p = '0') break;write(*p);p+; /显示整型温湿度数据用,共占用4位,其中一位符号位 void L1602_int(uchar hang,uchar lie,int num) uint temp;uint gewei,shiwei,baiwei,sign;if (num >= 0) sign = 0; else sign = 1;temp = abs(num);baiwei = temp / 100;temp = temp - baiwei*100;shiwei = temp / 10;gewei = temp - shiwei*10;num = abs(num);if (num>=100) if (sign = 1) /负数L1602_char(hang,lie,'-');L1602_char(hang,lie+1,baiwei+48);L1602_char(hang,lie+2,shiwei+48);L1602_char(hang,lie+3,gewei+48);else if (num>=10)if (sign = 1)L1602_char(hang,lie+1,'-');L1602_char(hang,lie+2,shiwei+48);L1602_char(hang,lie+3,gewei+48); elseif (sign = 1)L1602_char(hang,lie+2,'-');L1602_char(hang,lie+3,gewei+48); 4 下载调试当程序在uVision环境下编写完毕,并编译生成.hex文献后,就可如下载并进行调试了。若无法写入程序,要检查下载器与否安装对的,若无误就检查电路与否有漏焊虚焊元件与否正常等问题5 实物图6 元件选取超声波测距仪(报警)元器件清单元件名 C1 C2 C3 C4 C5 R1 R2 R3 R4 R5 R6 L1 L2 K1 D1 Y1 U1 U2液晶屏 J1 J2 B1 V1单片机插座 LCD转接插座 USB下载线 连接导线 电路板标称值 10uF/16V 20pF 20pF 0.1uF 22uF/16V 1k 10k 1k 10k 1k 1k 绿色 红色1N4148 11.0572M STC89C52 US-100 LCD1602 USB插座 显示接口 蜂鸣器 三极管 阐明电解电容电解电容发光管 发光管 电源按钮晶振 单片机超声波模块4脚插针 16脚插座855016脚插针三、 总结超声波测距是工业上用比较多一种技术,便宜,精度高,适合于人员无法实地测量场合,缺陷是对环境规定非常高,非常容易受到干扰。在调试过程中需要非常大耐心,由于有些很细小问题是很难发现,例如调试时就浮现了一种引脚虚焊和最小系统接错状况,用万用表找了好久才找到问题。 四、 参照文献1 邹应全 51单片机原理与实验教程. 西安电子科技大学出版社2 郭天祥 51单片机C语言教程北京:电子工业出版社 3 韩久强 当代遥控遥测技术与系统. 北京:清华大学出版社4 谭浩强 C程序设计. 北京:清华大学出版社5 求是科技 单片机典型模块设计实例导航. 北京:人民邮电出版社6 求是科技 8051系列单片机C程序设计. 北京:人民邮电出版社7 张毅刚 新编MCS-51单片机应用设计. 哈尔滨:哈尔滨工业大学出版社8 宏晶科技 STC Microcontroller Handbook