基于单片机的超声波油位测量仪的研究和实现_第1页
基于单片机的超声波油位测量仪的研究和实现_第2页
基于单片机的超声波油位测量仪的研究和实现_第3页
基于单片机的超声波油位测量仪的研究和实现_第4页
基于单片机的超声波油位测量仪的研究和实现_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

]。已知超声波速度与温度的关系如下:式中:r—气体定压热容与定容热容的比值,对空气为1.40,R—气体普适常量,,M—气体分子量,空气为,T—绝对温度,273K+T℃。近似公式为:式中:C0为零度时的声波速度332m/s;T为实际温度(℃)。对于超声波油位测量仪精度要求达到1mm时,就必须把超声波传播的环境温度考虑进去。例如当温度0℃时超声波速度是332m/s,30℃时是350m/s,温度变化引起的超声波速度变化为18m/s。若超声波在30℃的环境下以0℃的声速测量100m距离所引起的测量误差将达到5m,测量1m误差将达到5mm。超声发生器可分为两类:一类是用电方法产生超声,另一类是用机械方法产生超声。电学模式包括压电模式和电学模式,机械模式包括卡尔顿笛子、液体哨子和空气哨子等,它们产生的超声波的频率、功率和谐波特性不同,其用途也不同。目前,压电式超声波传感器在短距离测量中得到了广泛的应用。

第三章系统硬件设计系统硬件主要由单片机系统和显示电路、超声波发射电路、超声波检测接收电路和温度补偿电路组成。随着超声波测量技术的不断进步,在任何目标物的超声波测量中都存在着超声波的发射和接收问题。当使用超声波技术测量多种目标时,超声波的传输和接收性能将会不足。超声波的作用与其大小、形状以及灵敏度都没有直接的关系,因为它们的原理都是相同的,因此需要提升超声测量的精度以及分辨力都需要在超声波的发射以及接受中着手,这是改良超声波测量仪器的重点与难点。发射电路利用单片机的P1.0端口对40kHz左右的方波脉冲信号进行编程输出,同时开启内部计数器t0。因为单片机端口输出的功率比较微弱,因此需要在电路中加上功率放大电路以达到油量测量的要求,以此让驱动超声传感器UCM-40T1发射超声波的距离较远。由于UCM40T的超声回波很弱(几十毫伏级),且噪声很强,因此在放大电路中必须考虑放大信号和噪声抑制。本文采用CX20106A集成电路对接收探头接收到的信号进行放大和滤波处理。这些信号通过P2.7端口发送到MCU进行处理。为了节省硬件考虑,显示电路采用动态扫描显示。通过单片机编程,将内部计数得到的时间数据转换成距离信息,由三个LED数码管显示。3.1发射电路设计超声波的发射部分主要是让超声波发射器TCT40-16T能够产生了40kHz左右的方波脉冲信号而设计的。一般产生40kHz左右的方波脉冲信号有以下两种方式:(1)使用由555振荡产生或软件编程输出;(2)用由单片机软件编程输出。本文选用的就是这种方式,编程是由单片机P1.0端口输出0kHz左右的方波脉冲信号,但是单片机的端口输出功率不能够满足要求,使40kHz方波脉冲信号变成了两路,其中一个给了由74HC04组成的推挽式电路来用作功率放大,使发射的距离增大,以达到油量测量的需求,另一个则给了超声波发射换能器TCT40-16T,最后以声波的形式发射到空气中。发射部分的电路如图3-1所示。一方面,图中输出端的上拉电阻r31和r32可以提高74hc04输出高电平的驱动能力,另一方面可以提高超声换能器的阻尼效应,缩短其自由振荡时间。图3-1超声波发射电路框3.1.1发射电路设计方案①发射波形的重复性为了获得高分辨率,发射电路的设计应保证发射的超声波波形具有良好的重复性;而且,发射的超声波应尽可能简单,即发射的每一个振动都应近似于同一频率的振动,从而使带阻放大器SS滤波器可以消除干扰,每次都能收到相同的振动峰值。为了避免超声波在障碍物表面反射造成的各种损失和干扰。超声波就是在换能器电晶片振动时由周围的空气而产生的波形,它的波形与晶片振动的频率应当是一样的。因此,发射电路的设计要科学,以减少对发射功率以及波形重复性的影响。传输电路通常分为单脉冲传输、多脉冲传输和连续传输。测距中使用的超声波通常是通过不连续的单脉冲传输的,每次测距时都会发射和接收一次。传感器晶片的振动是间歇性的。该方法距离测试距离太近,系统采用间歇多脉冲传输,系统自动识别测量距离,并设置发射脉冲数。②发射波形电压及功率传感器的发送器电压主要取决于发送器信号损耗和接收器的灵敏度。它综合了各种损耗因素,包括往返传输损耗、声传输损耗、声反射损耗和环境噪声损耗。另外,实际发射机的最大输入电压为20VP-P,单片机的最大输出电压为5V,发射机发射信号。功率直接决定了发射探头发射超声波信号的距离,因此在考虑电压的同时,应考虑如何提高功率,使发射电路更加合理。3.1.2发射电路常用方案从以上分析可知,发射电路设计的主要目的是提高发射探头的电压和功率输入。该系统用单片机P1.0传输一组方波脉冲信号。其输出波形稳定可靠,但输出电流和功率很低。它不能驱动发射传感器发出足够强度的超声波信号。因此这里增加了一个单电源B型互补对称功率放大器电路,如图3-2所示。图3-2超声波发射电路3.2接收电路设计当接收换能器晶片受到超声波的垂直作用时,由于共振,机械振动逐渐加强。由于压电效应晶片两侧的等电荷交替,电荷量很小。它只能提供很小的交流电压信号,不能提供电流信号。因此,自此应当加入一个前置放大电路是交变电压信号变大。此外,还要对有可能产生影响信号的因素进行处理,可以再加上一个滤波信号,驱动后的比较器输出电位跳变,作为确定接收到的时刻。前置放大器电路单元的功能是放大有用的信号,抑制其它噪声和干扰,从而达到最大的信噪比,有利于后续电路的设计。图3-3前置放大电路图电路如图3-3所示,由于超声换能器的输出电阻一般都比较大,所以前置放大器应当要有很大的输出阻抗;另外,换能器的输出电压一般都很低,因此前置放大器就必须要有很高的精度以及很小的输入偏置电压。前置放大器是一个反向比例的放大器,能够避免地线噪声的干扰,它的主要组成部分有阻抗放大器TL082、电阻R2、R3和Rp。组成反向比例放大电路,这样可以减小地线噪声的影响。由电路的基本知识,可列出:I(3-1)I(3-2)根据放大器理想化的两个重要概念:1.集成运放两个输入端之间的净输入电压U通常接近于零,即U=U-UO,若把它理想化,则有U=0,但不是短路,故常称为虚短。2.集成运放两输入端几乎不取用电流,即净输入电流I0,如把它理想化,则有,但不是断开,故常称为虚断。故可知本电路中:U,且I所以有(3-3)上式表明,输出电压与输入电压成比例运算关系,式中的负号表示与反相。电路的电压放大倍数为:(3-4)利用反相比例放大器可实现对交直流输入信号的放大,且电路结构简单,只需要调节和阻值即可实现调节电压放大倍数。图中运放的同相输入端接有电阻,参数选择时应使两输入端外接直流通路等效电阻平衡,即,静态时使输入级偏置电流平衡并让输入级的偏置电流在运算放大器的两个输入端的外接电阻上产生相等的压降,以便消除放大器的偏置电流及漂移对输出端的影响,故又称为平衡电阻。根据本设计系统需要,接收传感器输出电压很小(数十毫伏),故分别取;;,即放大电路将输入信号放大200倍。3.3单片机显示电路设计显示器是一种典型的输出设备,其应用非常广泛。几乎所有的电子产品都使用显示器,区别仅仅在于显示器的结构不同。最简单的显示器可以使LED发光二极管给出一个简单的开关信息,而更复杂和完整的显示器应该是CRT显示器或液晶显示器,在显示范围4米内有一个更大的屏幕,用三位LED来显示距离的XXXcm值。液晶屏。综合学科的实际需求用数码管显示,用单片机编程,表示距离的XXXcm值。LED数码管显示与单片机接口通常涉及以下几个问题:(1)LED数码管显示用普通阴极管或普通阳极管(2)用于从数字转换为行程信息的软硬件解码(3)动态扫描或静态扫描显示扫描问题1:使用共阴极数码管或共阳极数码管没有明显的优缺点。如图3-4(a)所示,每个数码管由八个发光二极管组成,其中七个由七个8形笔画组成,编号为A、B、C、D、E、F、G,以及一个标记为dp的小数点。当发光二极管打开时,相应的行程或点会亮起,通过控制不同的二极管打开可以显示不同的符号。发光二极管的阴极称为普通阴极数码管,如图3-4(b)所示,发光二极管的阳极称为普通阳极,如图3-4(c)所示。两种数码管在单片机编程时,只有不同的行程信息码。图3-4数码管结构图问题2:软件解码是将每个数字的笔画信息预存到内存中的表格中,然后根据要显示的每个数字执行查找过程,找到相应的笔画信息并发送到数码管显示器。硬件解码采用CD4511、74LS46、74LS47、74LS48、74LS49等七段BCD码直接锁存、解码和驱动笔画信息。问题3:动态扫描显示接口是单片机中应用最广泛的显示方式之一。其接口电路是将所有同名端显示器的八个行程段A-H连接起来,每个显示器的公共极COM由I/O线独立控制。当CPU将字体代码发送到现场输出端口时,所有的监视器都会收到相同的字体代码,但是显示是否亮取决于由I/O控制的COM终端,因此我们可以决定何时显示哪个。所谓动态扫描,就是我们用分时方法依次控制每个显示器的COM终端,使每个显示器都打开。在旋转上光扫描过程中,每个显示器的上光时间极短(约1毫秒)。然而,由于人类视觉的持续性和发光二极管的余辉效应,虽然实际上每台显示器都没有同时点亮,但只要扫描速度足够快,就会给人的印象是一组稳定的显示数据不会闪烁。采用静态扫描方式控制照明LED数码管的无位置信号,同时点亮各数码管。每个数码管应显示数字数据的笔画,并同时发送给每个数码管。它的原理相对简单。静态扫描显示易于编程,显示清晰,亮度一般较高,但它需要大量的I/O接口线和大量的硬件芯片,成本较高。因此,多采用动态扫描。AT89C52AT89C52图3-5显示部分电路图针对上述三个问题,从节约单片机的接口资源、降低硬件芯片成本等方面进行了实际考虑。本单元电路设计如图3-5所示。采用三位通用阴极数字显示管。显示字符从MCUP2端口发送到闩锁74HC574,然后由显示驱动芯片uln2o03显示以驱动数码管。P.1-P.3分别控制每个位的动态显示。3.3.1LCD显示部分本设计的显示部分采用字符LCD1602液晶显示测量距离值。LCD1602显示2行16字的容量。液晶显示器具有功耗低、体积小、显示内容丰富、超薄轻便、使用方便等优点,与数码管相比,更专业美观。使用时,p0可与LCD的数据线连接,p2口可与LCD的控制线连接,如图所示。图3-6LCD1602液晶显示电路其中,LCD1602的第四个RS是寄存器选择,第五个RW是读写信号线,第六个E是启用码。foot7-14:d0-d7是一条8位双向数据线。需要注意的是,为了便于接线,单片机终端的D0-D7为D1-D0,与LCD/602相连。相反,在编写软件时需要对其进行处理,使其正确阅读。3.3.2报警部分采用一个蜂鸣器,由P1.2输出一定频率的信号,在连接到蜂鸣器之前,经过一个三极管9012的放大。报警部分的连线,如图3-7所示。图3-10报警电路

第四章软件设计和测量结果分析4.1系统软件设计系统程序结构:(1)DS18B20温度传感器接口模块,分为初始化程序、写入命令以及读取子程序等部分;(2)基于YB1602的显示模块,分为初始化子程序、写入子程序以及显示子程序;(3)温度补偿与距离计算模块、分为超声波发送控制程序、接收处理程序、温度补偿子程序等;(4)本次设计使用C语言编写程序,C语言相比汇编有许多的优势;编译器使用KeilVersion2进行程序编译,Keil功能强大使用方便。主程序,分为系统初始化、按键处理以及各个子程序的调度管理等部分。如图4-1所示描述了各个模块的关系:图4-1系统软件方框图系统主程序:本设计主程序的思想如下:(1)温度为两位显示,距离为四位显示单位为mm;(2)温度每隔900ms采样一次,DS18B20在12位精度下转换周期为750ms,故900ms满足该速度要求;超声波每隔60ms发送一次。(3)按键S为测量启动键;(4)系统采用AT89S52的内时钟:12MHz;(5)没有使用看门狗功能;(6)超声波发送一定时间后才开始启动检测,避免直达信号造成误判。所以系统最小测量约为112mm;系统主程序如下:voidmain(void){uchari,j;for(i=0;i<255;i++)for(j=0;j<255;j++);//延时,等待系统外围复位完成sys_init();//初始化display();//显示sta_flag=0;//标准复位waitforstarting://检测按键while(START);for(i=0;i<20;i++)delay1ms();if(START)gotowaitforstarting;BUZZER=0;//蜂鸣器鸣音一次提示按键按下i=100000;while(i--);BUZZER=1;i=100000;while(i--);TR0=1;//启动定时器0ET0=1;testtemp();//启动温度转换while(1){if(sta_flag)//60MS到了,超声波已经发送{while(0==CSBIN);//等待超声波返回TR1=0;jsh=TH1;//停止计数jsl=TL1;if(15==count)//1S到,检测温度{temp=wd();count=0;testtemp();//重新启动转换display();//刷新显示}computer();//计算距离hextobcd();//转化成BCD码sta_flag=0;//标志清零}}}voidsys_init(void){uchari;for(i=0;i<29;i++)//显示清零{num[i]=0;}TMOD=0x11;TH0=0x15;TL0=0xA0;P0=0;CNT=0;//超声波发送关闭CSBIN=1;EA=1;//开放总中断Init_LCD();}4.2外部中断子程序如图所示,中断服务程序是响应单片机的外部中断。在系统主程序中,发射的4OKHz脉冲信号遇到障碍物反射后,经接收检测电路产生外中断信号至单片机。在中断服务程序中,首先进行必要的现场保护,然后读取并处理进入中断服务程序点的计数值,并计算出相应的距离值,转换成十进制,最后发送到P2显示输出端口。ET0=1;//开定时器0中断TR0=1;//启动定时器0TESTTEMP();//启动温度转换while(1){if(sta_flag)//10MS到了(sta_flag=1){while(0==CSBIN);//收到回波 TR1=0; //关闭计数器1jsh=TH1;jsl=TL1; //读取计数器高低位的数值HEXtoBCD();//转换成BCD码JULIJS();//计算距离if(15==count)//900MS到,检测温度{temp=GET_WD();//读取温度count=0;TESTTEMP();//重新启动转换LCD_DISP();//刷新显示}sta_flag=0; //标准位复位}if(distance<=110){beep(150);} } }}4.3定时器中断子程序定时器中断子程序流程图如图4-2所示。由于51单片机是16位定时器,最大计时时间为65536us,当测量距离很长时,定时器会溢出,因此为了使单片机正常工作,必须相应设置溢出中断。同时,由于电路的测量距离限制在5米以内,当测量距离超过5米时,接收探头无法检测到回波,即定时器不能在没有外部中断的情况下关闭。程序如下:voidDelay(uinttime){while(time--);}/****************************延时1MS*************************/voiddelay1ms(uintms){uinti,j;for(i=0;i<ms;i++)for(j=0;j<100;j++);}图4-2定时中断子程序流程4.4实现重要功能的程序分析4.4.1实现温度读取功能uintRead_Temperature(void) //读取温度,返回整数值{uintc; reset(); //复位18b20芯片 tu=0; //先置位温度正负标示为正if(r){ write(0xCC); //跳过多传感器识别skiorom write(0xBE); //发读内部9字节内容指令 c=read(); //读两个字 reset(); //读完两个字节后复位 write(0xCC); //跳过多传感器识别skiorom write(0x44); //发启动温度变换指令if(c>0x1000){c=c+1;tu=1;} //若温度小于0,tu=1 c>>=4; //去掉低四位即为整数温度值,无需*0.0625 returnc; }else{returnr;} //返回0XFF表示未检测到18B20芯片}4.4.2实现根据温度转化声速intC_speed(void)//根据温度查算声速值{uchary;y=Read_Temperature(); //采温度if(r){ //若温度有变化则按温度值取声速 { T_C=y; //温度值=变化后的温度值 if(tu==0)speed=332+T_C*0.607;//温度为正则+声速 elsespeed=332-T_C*0.607;//温度为负则-声速 } }elsespeed=346.5; //若1820不存在即无法读取温度,声速=346.5M/S(取25度)returnspeed;}4.4.3实现距离计算floatDis_count() //距离计算函数{ floatcm; cm=TH1*256+TL1; cm-=7610; //减去限制10M的初值+可调误差值 cm*=speed; //计算距离uS*34650m cm/=20000; //转换为s单程 returncm;}4.5测量结果分析如某台仪器有两把测尺,精尺长10m,粗尺长1000m,现各测得距离值为:精测(用10m测尺)5.524m粗测(用1000m测尺)866.6m显示距离865.524m显示距离值是取粗测的百米、十米位与精测的米位及小数位组合而成。但是由于仪器本身存在各种误差,以及外界条件的影响,使得各测尺的测量值总带有误差,会造成距离衔接上的错误。a)米位数值很大,而粗测米位又是偏大的正误差精测(用10m测尺)9.958m粗测(用1000m测尺)270.0m显示距离279.958mb)米位数值很小,而粗测米位又是偏小的负误差精测(用10m测尺)0.058m粗测(用1000m测尺)269.9m显示距离260.058m为了防止粗差,可以用“置中运算法”和“比较试探法”来有效地处理测尺衔接的问题。

结语本设计以AT89C52为核心,借助模拟数字电气技术与单片机技术的结合,解决了超声波油位测量仪中的一些难题。超声波能量转换集成电路作为超声波的接收电路,使用灵活。在论述超声波油位测量仪原理、硬件电路实现和软件设计方法的基础上,完成了超声波油位测量仪的设计要求。利用单片机的操作控制功能和超声波的特点,设计了一种简单的测距系统。随着科学技术的飞速发展,超声波的应用将越来越广泛。然而,就目前的技术水平而言,人们可以使用的超声波技术仍然非常有限。因此,这是一个蓬勃发展、前景无限的技术和产业领域。从选题、方案论证到具体设计,我查阅了大量的资料。对于一些困难的问题,我得到了老师和同学的帮助。在三年的专业学习和生活中,我一直感受到导师的细心指导和无私关怀,受益匪浅。在此,我谨对各位老师表示深切的感谢和崇高的敬意。

致谢历时几个多月的紧张学习和努力,我的毕业设计终于如期、顺利的完成了。此次毕业设计是对我们日常所学理论的一次综合性评测,也是将理论应用到实践的一项考察。首先我要感谢我的指导老师,在教学任务繁忙的情况下,抽出时间帮助我纠正我在设计当中出现的问题,并耐性地为我的论文作校正,是他的定期检查和指导使得我们的毕业设计高质量完成。同时,我也要感谢在设计过程中帮助过我的同学,是他们不厌其烦的解答才使得我的设计能够顺利完成。答辩组的导师对我论文进行了严格的考核,并且在我进行答辩的过程中提出了非常有用的意见,我都悉心的接受,并且重新发现论文的不足,尽快的修改完成,感谢答辩组的各位导师能够对我论文做出客观的评价。我还要感谢在大学的这几年学校对我们投入的精力,学校的老师不辞辛苦为我们上课和辅导,让我们更好的掌握的专业的知识,提高我们的实际问题的处理能力,这将成为我人生中难忘的经历。在最后要祝愿学校的领导教师以及和我一起奋斗的同学们工作顺利,事业有成,也要祝愿学校的前景更加辉煌。

参考文献[1]陶洁,肖桂凤,迟权德.基于AT89C52单片机的超声波油位测量仪仪的设计[J].电子设计工程,2012,02:135-137+140.[2]李翠花,梁德民,周晓美.高精度的超声波油位测量仪系统的设计与实现[J].合肥学院学报(自然科学版),2012,01:41-44.[3]沈燕,高晓蓉,孙增友,李金龙.基于单片机的超声波油位测量仪仪设计[J].现代电子技术,2012,07:126-129.[4]刘春,陈林.探析基于单片机测距仪的设计与实现[J].制造业自动化,2012,09:140-142.[5]徐军,孙振伟,王华东.基于ARM处理器的两路超声波油位测量仪仪设计[J].压电与声光,2012,06:958-962.[6]张敏,寇为刚.基于超声波的自动测距系统设计[J].自动化技术与应用,2011,04:106-110.[7]李世军,周惠芳,金徐欢.基于单片机的超声波油位测量仪仪的研究与设计[J].湖南工程学院学报(自然科学版),2011,02:13-15.[8]安长俊,周家婕.基于PICmicro系列单片机的超声波油位测量仪仪设计[J].科教文汇(上旬刊),2011,08:104+106.[9]张海英.基于单片机超声波油位测量仪仪的设计[J].科技信息,2011,22:557-558.[10]高美霞,柏建普.单片机控制的超声波油位测量仪仪汽车倒车系统的设计[J].自动化技术与应用,2011,11:58-60+65.[11]孔德华.谈超声波油位测量仪仪硬件系统中的单片机系统[J].电子世界,2011,15:13+16.[12]张野.基于STC89C52单片机的超声波油位测量仪仪设计[J].科技与企业,2015,03:91.[13]虞新军,邓玉良.基于MSP430单片机控制的超声波油位测量仪仪软件系统设计[J].科技传播,2015,10:161+160.[14]于姣.基于单片机带温度补偿的超声波油位测量仪仪设计[J].电子科技,2015,08:56-59.[15]JunWu,JiguiZhu,LinghuiYang,MengtingShen,BinXue,ZhexuLiu.Ahighlyaccurateultrasonicrangingmethodbasedononsetextractionandphaseshiftdetection[J].Measurement,2014,47.

附录1系统整体图

附录2源代码#include<reg52.h>#include<intrins.h>#include<math.h>#defineucharunsignedchar#defineuintunsignedintucharcodedispBUF[33]={"Temperature:Distance:mm"};ucharnumcode[10]={'0','1','2','3','4','5','6','7','8','9'};uintnum[29]={0};ucharjsh,jsl; //计数器的高低位ucharcount=0; //10秒计次数uintdistance; //距离uinttemp; //温度变量ucharbdataflag; //DS18B20存在标准sbitRS=P2^0; //LCDRSsbitRW=P2^1; //LCDRWsbitE=P2^2; //LCDEsbitDQ=P2^7; //DS18B20数字端口sbitBusy=P0^7; //LCD忙voidDelay(uinttime);voiddelay1ms(uintms);voiddelay();voiddelay15(ucharus);voidBUMA(void);voidB20_WDAT(uchardat);ucharB20_RDAT(void);voidInit_18B20(void); //初始化18B20voidWrite_Comm(uchar); //写入LCD命令voidWrite_Data(uchar); //写入LCD数据voidInit_LCD(void);sbitsta_flag=flag^0; //10MS到标准位,flag即通用标志位,当sta_flag=1时,表示到了10mssbitfuhao=flag^1; //温度的符号位sbitSTART=P1^0; //启动测距sbitCNT=P2^5; //发射超声波sbitCSBIN=P2^6; //返回信号sbitBUZZER=P3^7;/******************定时器1溢出***************************/voidtimer1(void)interrupt2using1 {TR1=0;} //关闭定时器/计数器1 /*********定时器0溢出中断函数,每60MS溢出****************/voidtimer0(void)interrupt1using0 //定时器0{TH0=0x15;TL0=0xA0; //定时器0设定初值TH1=0; TL1=0; //计数器1清零sta_flag=1; count++;_nop_();_nop_();_nop_();_nop_();CNT=1; //先延时,后开始发送40KHz的超声波_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//40KHZ的倒数就是25us,12个_nop_();就是24usCNT=0; //保持一段时间高电平_nop_();_nop_();_nop_();_nop_();TR1=1; //延时,避免直达信号干扰,启动定时器/计数器1delay15(50); //延时避开直达信号}/***************系统初始化*************************/voidSYS_INIT(){uchari;for(i=0;i<29;i++) //显示清零{num[i]=0;}TMOD=0x11; //工作方式寄存器TMOD,设置定时器/计数器0和1均为16位定时/计数器TH0=0x15;TL0=0xA0;//设置定时器/计数器0的初值,60ms溢出P0=0;CNT=0; //P2^5口,发射发射超声波CSBIN=1; //P2^6口,接收信号EA=1; //开总中断}/******************距离计算***************************/voidJULIJS()//使用全局变量,可以定义为空{floatc,d,s;uintt;if(temp<0x8000)c=331.4+0.61*temp*0.0625; else //温度为负c=331.4-0.61*temp*0.0625;t=jsh*256+jsl-120; //计算计数值d=(c*t*0.001)/2;d*=d;s=d-7.98;distance=sqrt(s); //修正后的值,数据通过全局变量distance传输}/****************转换成2进制***************/voidHEXtoBCD() {floattp;unsignedlonginttmp;fuhao=0; //温度符号位if(temp<0x8000)tp=temp*0.0625;else //温度为负,则求补码得到原码{BUMA();tp=temp*0.0625;fuhao=1;}tp*=10;tmp=tp;num[12]=tmp/100; //数据转换后放到显示数组里面if(fuhao)num[12]=num[12]|0x80; //最高位加上符号位num[13]=tmp/10-(tmp/100)*10;tmp=distance;num[25]=tmp/1000;tmp%=1000;num[26]=tmp/100;tmp%=100;num[27]=tmp/10;tmp%=10;num[28]=tmp/1;}/**************温度转换函数***************************/voidTESTTEMP(){Init_18B20(); //初始化18B20if(flag){B20_WDAT(0xCC); //跳过读序号列号的操作,忽略ROM匹配B20_WDAT(0x44); //发送温度转化命令}}/***********读取温度函数**************/uintGET_WD(void){uinta=0,b=0,t=0;Init_18B20(); //初始化18B20B20_WDAT(0xCC); //跳过读序号列号的操作B20_WDAT(0xBE); //发送读温度命令 a=B20_RDAT();b=B20_RDAT(); //读取一个字节(读出高8位和低8位)t=b;t<<=8;t=t|a; //字节合并return(t); //返回结果给调用}/***************18B20复位函数***********************/voidInit_18B20(){DQ=1; //DQ复位Delay(10);DQ=0; //单片机将DQ拉低Delay(80); //480usDQ=1; //拉高总线Delay(10); //稍做延时后如果x=0则初始化成功,x=1则初始化失败if(DQ)flag=0;elseflag=1;Delay(20);}/*******************读数据******************************/ucharB20_RDAT(void) //读取一个字节{uchari=0;uchardat=0;for(i=8;i>0;i--){DQ=0; //拉低数据线,开始读数据dat>>=1;DQ=1; //拉高数据线,停止读数据if(DQ)dat|=0x80; //拼装处理Delay(15);}return(dat); //注意读取的为补码}/*********************写数据****************************/voidB20_WDAT(uchardat){uchari=0;for(i=8;i>0;i--){DQ=0; //拉低数据线至少15us以作为起始信号DQ=dat&0x01; //取出低位的一位数据Delay(5); //稍作延时DQ=1; //将数据线拉高以作为停止信号dat>>=1; //移位,为写入下一位数据做准备}}/*******************数据转换函数**************************/voidBUMA(){temp=~temp; //按位取反 temp+=1;}/**************************LCD显示函数*******************/voidLCD_DISP(){uchara,b,d;Init_LCD();Write_Comm(0x01); //清显示Write_Comm(0x80); //写首地址for(a=0;a<16;a++){d=dispBUF[a];if((a>11)&&(a<14)) //如果是结果位到num[]里面读取{d=numcode[num[a]]; //待显示的结果}if(14==a){d=0xdf;}Write_Data(d); //写入要显示的数据}Write_Comm(0xc0); //换行,换到第二行for(b=16;b<33;b++){d=dispBUF[b];if((b>24)&&(b<29)){d=numcode[num[b]];}Write_Data(d); //写入要显示的数据(数据传输)}}/*********检查LCD忙状态***********/bitLCD_BUSY() //lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据{bitBS;RW=1;RS=0;E=1;delay1ms(1);BS=(bit)(P0&0x80);E=0;returnBS;}/*******************写指令函数******************************/voidWrite_Comm(ucharlcdcomm) //写指令{ while(LCD_BUSY());RS=0;RW=0;E=1;delay1ms(1); P0=lcdcomm;delay1ms(1);E=0;}/*********************写数据函数****************************/voidWrite_Data(ucharlcddata)//写数据{ while(LCD_BUSY()); RS=1;RW=0;E=1;delay1ms(1);P0=lcdd

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论