毕业设计论文基于485总线的超声波的液位测量与控制系统.docx
《毕业设计论文基于485总线的超声波的液位测量与控制系统.docx》由会员分享,可在线阅读,更多相关《毕业设计论文基于485总线的超声波的液位测量与控制系统.docx(47页珍藏版)》请在冰点文库上搜索。
毕业设计论文基于485总线的超声波的液位测量与控制系统
基于485总线的超声波的液位测量与控制系统
一、设计任务和性能指标
设计任务
1、从机能够在现场对油罐或水罐的液位高度和现场的温度进行采集,能够基于液位的情况对油泵或水泵进行控制,能够把现场采集到的信息和设备的状态信息传送给上位机(485总线)。
2、对上位机,要求能够动态显示不同485节点的液位、温度及泵的工作状态。
能够方便的通过人机界面对通讯参数进行设置。
3、基于上述要求,用protel完成硬件系统设计(主要是485节点的硬件部分,要考虑电磁兼容和抗干扰设计等内容)。
4、软件系统设计,要求学院能够熟练应用VB(或VC)、汇编、C语言等工具编写应用程序(从机数据采集、通讯、上位机人机界面设计、通讯程序)。
性能指标
液位显示:
用三位LED数码管进行显示(单位是CM);在上位机上动态显示。
环境温度:
用四位数码管进行显示温度,单位是mm。
测距范围:
20mm到4000mm之间。
键盘功能定义:
1.当enter键按下之后,锁定led,使显示的数字固定,便于计数。
cancel键按下之后,取消led锁定。
2.按下up键,屏幕显示当前温度,按下cancel键后,恢复显示位移单片机接口:
5.P3.3为触发信号的输出TRIG,
P3.2外部方式0,接回响信号ECHO,
P3.4为RS-485的控制信号,
P0.6接18b20的端口,
P0.4为设备1的接口,
P0.5为设备2的接口。
6.通信标准:
转换部件把上位机的RS—232转换成RS—485,然后单片机接收到485电平之后,通过MAX485把485电平转换成TTL电平,从而实现了上位机和单片机的通信
二、设计方案
按照系统设计的功能的要求,初步确定设计系统由单片机主控模块、电源模块、显示模块、键扫描模块、超声波发射模块,超声波接收模块,温度补偿模块共七个模块组成。
主控芯片使用51系列STC89C52单片机,该单片机工作性能稳定,同时也是在单片机课程设计中经常使用到的控制芯片。
本设计在接受模块采用了由索尼公司生产的CX2016A红外接收芯片来实现超声波的接收。
本大作业用的是HC-SR04超声波传感器,可提供20mm—4000mm的非接触式距离感测功能,测距精度可达3mm;模块包括超声波发射器、接收器与控制电路。
工作电压为DC5v,测量角度为15度,输入触发信号为10us的TTL脉冲,输出TTL电平信号,与射程成比例。
实验证明其具有很高的灵敏度和较强的抗干扰能力。
同时通过改变部分参数来改变接受电路的灵敏度和抗干扰能力,所以我们采用该芯片作为接收模块主要组成部分。
HC-SR04超声波模块测距采用IO口TRIG触发测距,给至少10us的高电平信号,模块自动发送8个40khz的方波,自动检测是否有信号返回。
有信号返回,则通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。
测试距离=(高电平时间*声速)/2;系统设计框图如图2-1
三、系统硬件设计
硬件电路的设计主要包括单片机系统及显示电路、温度补偿电路,超声波发射电路和超声波检测接收电路四部分。
单片机采用STC89S52或其兼容系列。
采用12MHz高精度的晶振,以获得较稳定时钟频率,减小测量误差。
单片机用P端口输出超声波换能器所需的40kHz的方波信号,利用外中断0口监测超声波接收电路输出的返回信号。
显示电路采用简单实用的4位共阳LED数码管,段码用74LS273驱动。
3.1单片机最小系统
5l系列单片机中典型芯片(STC89S52)采用40引脚双列直插封装(DIP)形式,内部由CPU,ROM、RAM、定时/计数器TO和T1,4个8位的全双工IO端P0,P1,P2,P3,一个全双功串行通信口等组成。
特别是该系列单片机片内的Flash可编程、可擦除只读存储器(E~PROM),使其在实际中有着十分广泛的用途,在便携式、省电及特殊信息保存的仪器和系统中更为有用。
该系列单片机所组成的最小系统如图3-1所示。
3.2超声波发射电路
超声波发射电路原理图如图2-2所示。
单片机P1.0端口输出的40kHz的方波信号.
HC-SR04超声波模块测距采用IO口TRIG触发测距,给至少10us的高电平信号,模块自动发送8个40khz的方波,自动检测是否有信号返回。
有信号返回,则通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。
测试距离=(高电平时间*声速)/2。
P1.0连接TRIG引脚,发送驱动信号,INT0连接ECHO引脚接收回响信号。
VCC接+5V引脚,GND接地。
3.3超声波检测
超声波通过ECHO接收超声波发生器产生的超声波的回响信号,然后接收引脚产生一段时间的高电平,然后这就是超声波从发送到接收到的时间。
如果测出这段时间的长度,就可以求出具体的距离是多少。
3.4温度补偿电路
温度传感器使用了DSl8B20数字温度计提供可选择的12位(二进制)温度读数来指示周围环境的温度信息。
经过单线接口DQ与单片机进行数据交互。
从主机CPU到DSl8B20仅需一条数据接线(和地线)。
DSl8B20的电源可以由数据线本身提供而不需要接外部电源。
由于每一个DSl8B20在出厂时已经给定了唯一的序号因此任意多个DSl8B20可以存放在同一条单线总线上实现多点温度测量。
温度传感器DSl8B20的测温范围从-55摄氏度到+125摄氏度增量值为度可在ls(典型值)内把温度变换成数字量,因此采用DS18B20实现温度补偿电路的设计。
3.5显示电路
显示电路主要由74ls273芯片驱动,用PNPC8550三级管进行位选,七段共阳极数码管显示,硬件电路图如图3-5所示:
四.系统软件设计
4.1主程序设计
主程序中包括温度补偿子程序,计算子程序,显示子程序,键盘扫描程序,测距程序,校正偏差程序:
在主程序设计中,我们采用了汇编编程。
首先进行系统初始化。
然后键盘扫描,判断那个键按下,然后执行相应的操作。
第三,执行测距程序,测得当前的距离对应的时间,然后通过时间*速度=位移,求出相应的距离,然后放在显示缓冲区(数码管)显示。
第四,复位18b20,然后经过一系列过程测得当前的温度。
第五,因为超声波在空气中的传播速度跟温度有关,所以根据第四步得到的温度进行温度校正。
最后,运行显示程序,显示得到的距离。
;*******主程序************************
MAIN:
MOVSP,#70H
CLRP3.2;与超声波传感器有关的接口
MOVA,#00H
MOVBUFGAO,A
MOVBUF0,#00H;最后温度
MOVBUF1,A
MOVBUF2,A
MOVBUF3,A
CLRFLAG_SERIAL
CLRFLAG03
CLRFLAG07
CLRFLAG11
CLRFLAG13
CLRFLAG14
CLRFLAG15
MOVKEY_NUM,#00H
CLRFLAG3;正or负标志位
CLRFLAG1;初始化标志
SETBEA;开总中断
SETBET0;T0
MOVTMOD,#21H;T0方式1,T1方式2
MOVTL1,#0FDH;设置T1的波特率
MOVTH1,#0FDH
SETBTR1
MOVSCON,#50H;方式1,REN=1允许接受
;MOVSCON,#0F0H
SETBES
CLRP3.4;控制RS_485的控制引脚,使RS-485处于接收状态
MOVTL0,#00H
MOVTH0,#00H
MOVTEMP,#2
LOOP:
LCALLKEY_SCAN
;*******以下为标志位定义*****************************************
;判断各标志位是否为1,然后执行相应的动作
JNBFLAG_SERIAL,C0;串行中断标志位如果为1,则把当前求出的位移,一定时间内往上位机发送一次。
C0:
JNBFLAG14,C1;cancel键
CLRFLAG03
CLRFLAG07
CLRFLAG11
CLRFLAG13
CLRFLAG14
CLRFLAG15
C1:
JNBFLAG03,C2;up键
LJMPDDDD
C2:
JNBFLAG07,C3;down键
C3:
JNBFLAG11,C4;setup键
C4:
JNBFLAG13,C5;偏移量为十三的,键按下,动作,小数点
C5:
JNBFLAG15,C6;enter键
LJMPBBBB
C6:
LCALLDISPLAY
DJNZTEMP,LOOP
LCALLMEASURE;测得时间
LCALLCHULI;时间*速度=位移
LCALLJIAOZHENG;校正偏差
LCALLBTOD;把二进制转换成十进制,然后放在显示区显示;
LCALLDISPLAY
LCALLDISPLAY
DDDD:
LCALLINITIAL;复位程序
JBFLAG1,AAAA;复位成功跳转
RET
AAAA:
LCALLTEMPERATURE;复位成功跳转
JNBFLAG03,CCCC;显示温度
MOVA,BUF0;取出温度
MOVB,#100
DIVAB
MOVBUF1,A;BUF1是第四位置上的led,最右边的
MOVA,B
MOVB,#10
DIVAB
MOVBUF2,A;BUF2是第三位置上的led,倒数第二位
MOVBUF3,B;BUF3是第二位置上的led,第二位
CCCC:
LCALLDISPLAY
LCALLGET_CURRENT_V
BBBB:
LCALLDISPLAY
LCALLDISPLAY
MOVTEMP,#0;100
LJMPLOOP
温度补偿子程序
DS18B20正常工作需要严格的工作时序,操作起来很复杂,图4-2给出的是DS18B20的时序图,其控制程序如下:
TEMP:
SETBDQ
NOP
CLRDQ
MOVR0,#0FBH
TSR1:
DJNZR0,TSR1
SETBDQ
MOVR0,#25H;TSR2:
JNBDQ
TSR3DJNZR0,TSR2;
TSR3:
SETBFLAG1
CLRP2.0
AJMPTSR5
TSR4:
CLRFLAG1
LJMPTSR7
TSR5:
MOVR0,#06BHTSR6:
DJNZR0,TSR6
TSR7:
SETBDQRET
********读转换后的温度值******
GET_TEMPER:
SETBDQ
LCALLTEMP
JBFLAG1,TSS2
RETTSS2:
MOVA,#0CCHLCALLWRITE_18B20
MOVA,#44HLCALLWRITE_18B20
LCALLTEMP
MOVA,#0CCHLCALLWRITE_18B20
MOVA,#0BEH;
LCALLWRITE_18B20
LCALLREAD2_18B20;
RET
********写ds18b20汇编程序***
WRITE_18B20:
MOVR2,#8
CLRC
WR1:
CLRDQ
MOVR3,#6
DJNZR3,$
RRCA
MOVDQ,C
MOVR3,#23
DJNZR3,$
SETBDQ
NOP
DJNZR2,WR1
SETBDQ
RET
;**读18B20程序,读出两个字节的温度**
READ2_18B20:
MOVR4,#2;
MOVR1,#29H
RE00:
MOVR2,#8
RE01:
CLRC
SETBC
NOP
NOP
CLRDQ
NOP
NOP
NOP
SETBDQ
MOVR3,#7
DJNZR3,$
MOVC,DQ
MOVR3,#23
DJNZR3,$
RRCA
DJNZR2,RE01
MOV@R1,A
DECR1
DJNZR4,RE00
RET
*****读出的温度进行数据转换***
CHANGE:
MOVA,29H;
MOVC,28H.0RRCA
RRCA
RRCA
RRCA
MOV29H,A
测距程序设计
HC-SR04超声波模块测距采用IO口TRIG触发测距,给至少10us的高电平信号,模块自动发送8个40khz的方波,自动检测是否有信号返回。
有信号返回,则通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。
测试距离=(高电平时间*声速)/2
程序如下:
;*******测距程序****************************************************
;入口信息:
无
;出口信息:
位移mm为单位,位于R2,R3中
;影响资源:
R1~R7
MEASURE:
MOVR0,#06H;等待大于10us
DJNZR0,$
JNCA1;等待接收回响信号
;*************计时程序*******************************************************
TIMER:
SETBTR0;外部中断0,计算回响信号的时间进行测距
A2:
MOVC,P3.2;p3.2是echo信号,等待端口变为低电平
JCA2
CLRTR0
CLREX0
MOVA,TH0;时间的高位放在60H
MOV60H,A
MOVA,TL0;时间的低位放在61H
MOV61H,A
MOVTL0,#00H
MOVTH0,#00H
RET
单片机编程中问题处理
1.在编程序时最好直接用medwin编程。
否则,有的逗号·分号medwin不能够识别,会使程序产生错误的判断。
直接用仿真软件会避免这些错误。
2.在位运算中,从20H,到2FH这16个单元,每个内存单元对应8个位地址。
从20H单元的D0位开始,至2FH单元的D7位,对应的地址依次为00H到7FH,即有:
位地址=(单元地址-20H)*8+位。
如22H单元第零位的位地址为:
位地址=(22H-20H)*8+0=10H。
在程序中会定义许多标志位,这就用到了定义位,必须了解上面的位操作才能够正确的分配位地址。
然后正确定义位,然后用位操作完成相应的操作,因为汇编语言中的位操作语句很多,用起来很方便。
3.在单片机编程中,会有很多函数需要编写,在编写的时候最好在函数的头部写明白入口的那几个寄存器,有什么作用,这个函数有什么作用等,让自己以后一看这个函数的开始就能够知道这个函数具体干什么的,方面自己以后在修改或者调用函数。
并且,在汇编中调用函数的时候很多需要的量都是通过先前的寄存器传入函数的,所以一定要标记各个寄存器作用。
养成良好的编程习惯。
以前,编程不太注意这个,然后就是什么内容都写在主函数中,看起来很乱,但是这次编程写的比较好,具体见后面的程序清单。
五.上位机程序设计
在上位机中主要采用的是visualbasic编程,通过mscomm控件把下位机测得的距离和温度传输到电脑中进行动态显示,并且通过上位机(电脑)控制着单片机的设备的起停。
以及监控单片机的工作情况。
5.1Mscomm控件编程
PrivateSubMSComm1_OnComm()
DimiAsInteger
Dimoutbte(0)AsByte'定义为byte型0~255
DimindataAsVariant
Dimz1AsInteger
Dimz2AsInteger
Dimz3AsInteger
Dimbte(0To5)AsByte
Ifflag_commandword=TrueThen'保证以下程序只执行一次
Ifflag_send=TrueThen
IfVal(Text9.Text)=&HB1Then
Timer1.Interval=0'关闭定时器1,避免时序冲突,影响单片机活动
out(0)=Val(Text8.Text)
out
(1)=&HA1
out
(2)=&HB1'接受温度
Fori=0To2
outbte(0)=out(i)
MSComm1.OutBufferCount=0'发送缓冲区清零
MSComm1.Output=outbte'把num发送出去
Nexti
Timer1.Interval=500'开放定时器1,使定时器继续发送上位机命令
flag_commandword=False
EndIf
EndIf
EndIf
CasecomEvReceive
bte(0)=AscB(indata)
bte
(1)=AscB(Mid(indata,2,1))
Ifout
(2)<>&HB1Then'如果上位机要求停止接受温度是,关闭发送标志位
Shape14.Width=0'把温度显示的进度条宽度变为0
Text2.Text=""'清空温度显示
flag_send=False
EndIf
Ifflag_send=TrueThen'如果发送键按下之后,则接收后两个字节
Ifout
(2)=&HB1Then
bte
(2)=AscB(Mid(indata,3,1))
bte(3)=AscB(Mid(indata,4,1))
EndIf
EndIf
5.2VisualBisic界面
5.3VisualBasic程序问题处理
1.在上位机编程中用到了延时程序,由于单片机中用到的是软件延时,但是在vb中很难实现。
于是用下面一种方法进行延时,既能够达到延时的目的,又能够不耽误其他的程序执行。
PrivateDeclareFunctiontimeGetTimeLib"winmm.dll"()AsLong
PublicFunctionYanShi(HaoMiaoAsDouble)'延时子程序,以毫秒为单位,调用时yanshi1000,就是延时1s
Dimt1
t1=timeGetTime
While(timeGetTime-t1DoEvents
Wend
EndFunction
2.当在画动态显示液位的时候要画液罐,而且要形象立体的展现在面前,我画成双层的,外面是罐壁,里面是显示具体的液位,这个灵感来源于上的电池中的电量显示。
具体形状见上图的总体vb界面。
3.在控制单片机工作的时间上,由于单片机只有两个定时器,一个用来产生波特率,另一个用来测得echo返回的高电平时间。
因此不够用,我就把启动定时设备的时间设置在上位机上,用上位机的定时器来进行定时。
然后完成相应的动作。
4.当然还遇到了很多问题大多是借助了MSDN解决的,尤其是对许多函数不太了解的时候,通常用“帮助”然后查询具体的参数是怎么样定义的,这个很有用,再就是在函数出错时,MSDN会直接给出错误原因并且有解决的建议,调试程序的时候有了它真的很方便。
所以学会用它,对自己的vb学习是很有帮助的。
六.调试及性能分析
6.1调试步骤
调试的时候,我是调试单片机的程序,因为单片机测距是主要实现的功能,所以先要调试,根据显示程序的显示结果进行调试,这样可以更快的调试出程序。
把各部分程序调试成功之后然后合在一起,再看看有没有互相矛盾的地方,这样单片机的程序就调试完了。
上位机的调试也是重点,关键在mscomm控件处的调试。
这个控件负责串行通信是否成功,关系到单片机测得的温度和距离能否传到上位机,上位机的控制命令字能否传到单片机,即上位机能否控制单片机的设备。
这个地方处理完后,在调试与温度,液位的显示相关的程序,因为它们是一些辅助的功能,为了更好的实现人机交互,所以也是重要的环节,在这也要引起足够的重视。
6.2性能分析
虽然结果和预想的有很大的差距,但总体来说已经基本上达到了要求,刚开始没有矫正的时候,1m误差大约有10cm,但是经过校正之后,误差在2mm左右,基本上达到要求。
测试的距离也没有厂家说的那么远,不能达到4m,造成这种原因我想有以下几个方面:
1.由于我们采用的是11.0592MHZ的晶振,理论上是按照12MHZ的晶振计算的,所以对系统造成了一定的误差。
2.由于温度传感器DS18B20距离单片机较近,所采集到的温度严重受到单片机的影响,造成系统误差。
6.3系统电平标准转化
1.本大作业中用到了RS-485通信,用的就是RS-485电平,信号传播距离远。
单片机的TTL电平经过单片机电路板上的MAX485把电平转化成485电平,然后通过网线把单片机和上位机连接在一起。
在网线的另一端接上一个RS-485转RS-232的接口器件,把电平转换成计算机用的电平(RS-232电平)标准,实现单片机与计算机的通信过程。
七.心得体会
在这次完成大作业的过程中,我感觉受益匪浅,尤其是对单片机的理解上,更是上了一层楼,我觉得单片机如果你给了他完美的程序他就会像人一样去思考去工作,很是智能的去完成任务。
现在可以做一个比喻,我们平时的许多行为在单片机上都有实现。
比如我们现在正在工作,突然肚子饿了,我们就回去吃饭。
在这个过程中,就像单片机的一个中断处理程序,产生了一个内部中断,像单片机的定时器产生的中断一样是来自内部的。
在这个中断程序中单片机来完成“吃饭”这件事情。
刚想要去吃饭,一看外面下雨了,然后我们就会带上伞。
在单片机中,这有对应着外部中断,比如INT0,INT1一样,中断时来自外部的情况,这样单片机就会通过中断处理程序来完成带伞这个动作。
另外还有串行通信,在平时我们要通过接收很多信息,当接收到短信时会有提示音或者是震动,这样就会引起我们的注意,然后就引发串行中断,我们看短信回短信的过程就完成了单片机的串行中断中的接受和发送数据的过程。
在完成大作业期间,必须自己设计整个系统,根据系统资源整体完成系统的资源分配。
比如单片机的定时器不够用,那么有很多定时就必须放在上位机上完成。
还有IO口的安排上,也是不能够重复的。
因为系统比较大,所以有很多外部设备需要接在IO口上,这样就必须分配好,具体的分配情况要做出详细的说明,以便以后阅读或者有新的功能需要添加的时候,知道哪个口已经用过哪个口没有用过,可以很快的选择好,这样以后功能扩展就会很轻松。
现在感觉编程序容易调试程序难,编程序就是按照自己的想法完成编写,但是有时候会出现语法或者逻辑上的错误,这样就要调试,很多情况要都要花上编程的