11.1设计内容随着科学技术的快速发展,超声波将在传感器中的应用越来越广。超声波测距与其它非接触式的检测方式方法相比,如电磁的或光学的方法它不受光线,被测对象颜色,电磁干扰等影响。超声波对于被测物体处于黑暗,有灰尘,烟雾,电磁干扰,有毒等恶劣的环境有一定的适应能力[2]。因此在液位测量,机械手控制,车辆自动导航,物体识别等方面有广泛应用。特别是应用于空气测距,由于空气中波速较慢,其回波信号中包含的沿传播方向上的结构信息很容易检测出来,具有很高的分辩力,因而其准确度也较其它方法高,而且超声波传感器具有结构简单,体积小,信号处理可靠等特点[3]。本次设计主要是利用STC12LE5406AD单片机、超声波传感器完成测距报警系统的制作,以STC12LE5406AD为主控芯片,利用超声波对距离的检测,将前方物体的距离探测出来,然后单片机处理运算,与设定的报警距离值进行比较判断,当测得距离小于设定值时,STC12LE5406AD发出指令控制蜂鸣器报警。1.2设计要求随着科学技术的快速发展,超声波将在测距仪中应用越来越广泛。其原理是:以STC12LE5406AD为主控芯片,实现发射电路的控制和接收数据的处理,并用数码管显示测量的数据。具体指标要求是:指标1:测量精度-1~+1cm指标2:显示四位2本系统在“报警”方面进行创新,其功能是:创新1:设定报警距离值,当测得距离小于设定值时,蜂鸣器报警1.3系统总体结构本设计包括硬件和软件设计两个部分。模块划分为数据采集、按键控制、四位数码管显示、报警等子模块。电路结构可划分为:超声波传感器、蜂鸣器、单片机控制电路。就此设计的核心模块来说,单片机就是设计的中心单元,所以此系统也是单片机应用系统的一种应用。单片机应用系统也是有硬件和软件组成。硬件包括单片机、输入/输出设备、以及外围应用电路等组成的系统,软件是各种工作程序的总称。单片机应用系统的研制过程包括总体设计、硬件设计、软件设计等几个阶段。系统采用STC12LE5406AD单片机作为核心控制单元,当测得的距离小于设定距离时,主控芯片将测得的数值与设定值进行比较处理。然后控制蜂鸣器报警。系统总体的设计方框图如图1所示。4位数码管显示模块蜂鸣器报警模块超声波传感器模块STC12LE5406D主控制器模块按键控制电源3图1系统方框图附录1元器件清单CommentDescriptionDesignatorQuantity10UF电容C1122P电容C2,C32蜂鸣器ElectricalBellLS11超声波模块Header,4-PinP11PNP8550三极管Q2110K上拉电阻R1110k可调电阻R411K电阻R6110K电阻R71AJ按键SW1,SW2,SW33单片机U211602液晶U4112M晶振14附录2超声波测距电路原理图附录3程序清单#includeAT89X52.Hunsignedcharcodedispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0xa3,0x8c,0xc8};//0-9,a-f共阳数码管段码unsignedchardispbuf[4]={0,0,0,0};//0x76,0x3f,0x3f,0x4funsignedchartemp[4];unsignedchardispcount;unsignedchari;unsignedintx;unsignedlongl,time;//-----------------------定义管脚unsignedchartimecount;5unsignedchartestok;/*数码管控制*/sbitW0=P2^0;//数码管第一位位选对应P20sbitW1=P2^1;//数码管第二位位选对应P21sbitW2=P2^2;//数码滚第三位位选对应P22sbitW3=P2^3;//数码管第四位位选对应P23/*超声波定义*/sbitFS=P3^5;//定义发射的IO口sbitLS=P3^7;//蜂鸣器控制/*开关定义*/sbitK1=P1^0;//开始测距键bitk1;//按键标志位//bitflag;/*延时函数*/voiddelay100us(void)//延时子函数{unsignedchari,j;for(i=40;i0;i--)for(j=248;j0;j--);}voidcsfs(void)//超声波发射程序//{unsignedchartimes=0;while(TF1==0)//TF1定时器1溢出标志位使用查询法{unsignedcharj;for(j=12;j0;j--);//延时FS=~FS;times++;//翻转20次,发送10个脉冲信号的超声波//TF1=0;6if(times==10)break;}times=0;TH1=0x00;//(65536-4000)/256;TL1=0x00;//(65536-4000)%256;EX0=1;//外部中断0允许中断位TR1=1;//开定时器1ET1=1;//定时器T1中断允许位delay100us();}voidmain(void){testok=0;TMOD=0x10;/*定时器1为工作模式1*/T2MOD=0x00;/*定时器2为工作模式)*/T2CON=0x04;/*定时器2为自动重装定时工作模式)TR2=1*/RCAP2L=(65536-4000)%256;//给定时器T2装初值RCAP2H=(65536-4000)/256;TH1=0x00;//(65536-4000)/256;TL1=0x00;//(65536-4000)%256;IT1=1;//边沿触发方式EX0=1;TR2=1;//打开定时器中断1,2TR1=1;ET1=1;ET2=1;EA=1;//开总中断while(1){if(k1==1)//开始开始测距7{csfs();}if(testok==1)//{if(1==testok)//如果1=teskok{testok=0;//tesk清0x=l;//距离if(x!=0){for(i=0;i4;i++){temp[i]=0;}}i=0;while(x/10){temp[i]=x%10;x=x/10;i++;}temp[i]=x;dispbuf[3]=temp[0];//显示千位dispbuf[2]=temp[1];//显示百位dispbuf[1]=temp[2];//显示十位dispbuf[0]=temp[3];//显示个位timecount=0;if(l100)//当距离等于100cm时,蜂鸣器报警{LS=0;//蜂鸣器打开delay100us();LS=1;//蜂鸣器关闭8delay100us();}}}testok=0;if(K1==0&&k1==0)//如果第一次按下开关K1,开始测距{delay100us();//按键延时消抖if(K1==0&&k1==0){{k1=1;//按键标识位清1testok=1;}while(K1==0);//等待按键释放}}elseif(K1==0&&k1==1)//如果第二次按下开关K1,停止测距{{k1=0;testok=0;}while(K1==0);//等待按键释放}}voidint0(void)interrupt0using0//接收中断程序//{EX0=0;//关闭9TR1=0;//关定时器//ET1=0;//中断关闭time=TH1*256+TL1;//算出t的值,t的单位为us//RCAP2Hl=time*180;//l=l/10000;TH1=0x00;//(65536-4000)/256;TL1=0x00;//(65536-4000)%256;testok=1;}voidint2(void)interrupt3using0//超时中断程序//{EX0=0;TR1=0;//关定时器//ET1=0;//中断关闭TH1=0x00;//(65536-4000)/256;TL1=0x00;//(65536-4000)%256;testok=2;}voidt1(void)interrupt5using0{TF2=0;//T2定时器必须用软件清0timecount++;P0=dispcode[dispbuf[dispcount]];//控制数码管显示if(dispcount==0)//打开第一位数码管的位选{W0=0;W1=1;W2=1;W3=1;}10if(dispcount==1)//打开第二位数码管的位选{W0=1;W1=0;W2=1;W3=1;}if(dispcount==2)//打开第三位数码管的位选{W0=1;W1=1;W2=0;W3=1;}if(dispcount==3)//打开第四位数码管的位选{W0=1;W1=1;W2=1;W3=0;}dispcount++;if(dispcount==4)//当dispcount等于4时,清0dispcount=0;}