则表示正常液位,水位指示灯亮,呈红色,水泵工作开度最小,其指示灯有一个亮,呈红色;
若H3<=HX<=H1:
则表示处于下下限与下限液位之间,水泵处于正常开度状态,有俩个工作指示灯亮,呈红色;
若H2<=HX<=H4:
则表示处于上限与上上限液位之间,停止水泵供水,水泵工作指示灯全灭;液位正常指示灯灭;
若HX<=H3:
则表示达至下下限液位,水泵处于最大开度状态加水,三个工作指示灯全亮,并启动报警器报警;
若HX>=H4:
则表示达至上上限液位,水泵处于全关状态,三个工作指示灯全灭,并启动报警器报警;
同时数字温度传感器DS18B20把采集到的温度值送到单片机中经处理后,通过74LS164驱动的静态数码管显示其采集到的温度值。
压力传感器把采集到的数据经A/D0809转换之后送到单片机经过处理后,也通过数码管显示其压力值。
在设计中有一个温度与压力值交替显示的按键,它可以按人们的意愿去选择显示温度值还是压力值。
如果报警器启动后,设有报警消除按钮,消除报警;有温度和压力转换按钮,可以轮流显示温度和压力值。
系统设计的总体框图
在实际的硬件电路中,用3个发光二极管来模拟水泵的全开,半开,全关三种状态。
4个液位传感器用一个电位器来模拟,通过调节电位器的电压值大小,来模拟液位的几种状态。
执行机构为MOC3041双向可控硅来驱动水泵的工作,报警器件选择压电蜂鸣器。
键盘控制电路设计
为了便于实现各种的控制要求,智能调节器必须具备快速设置被控参数且操作方便,还必须增加键盘装置。
键盘控制有矩阵式和独立式两中。
矩阵式键盘又有编码式和非编码式。
单片机系统中普遍使用非编码式键盘,这类键盘应主要解决以下几个问题:
(1)键的识别。
(2)如何消除键的抖动。
(3)键的保护。
在以上几个问题中,最主要的是键的识别。
对于键的识别,既可以采用程序扫描的方法,也可以采用专用的可编程键盘显示接口8279.
独立式按键就是各按键相互独立,每个按键单独占用一根I/O口线,每根I/O口线的按键工作状态不会影响其他I/O口线上的工作状态。
因此,通过检测输入线的电平状态可以很容易判断哪个按键被按下了。
它的优点是:
电路配置灵活,硬件结构简单。
缺点是:
每个按键需占用一根I/O口线,在按键数量较多时,I/O口浪费大,电路结构显得复杂。
因此,此键盘是用于按键较少或操作速度较高的场合。
由于该设计中按键数量少,所以采用了独立式按键。
按键电路如图3-2所示。
图3-2键盘控制电路图
本电路中独立式按键电路,各按键开关均采用了上拉电阻,是为了保证在按键断开时,各I/O有确定的高电平;当按键按下时,去执行相应的功能。
如输入口线内部已有上拉电阻,则外电路的上拉电阻可省去。
按键的处理可以采用中断方式,也可以采用查询方式。
键盘工作方式的选取原则是既要保证能及时响应按键操作,又要不过多占用单片机的工作时间。
所以选择中断方式处理按键。
该设计中显示电路的选择
可以提供单独锁存的I/O接口电路很多,且静态显示的软件设计比较容易。
所以在设计中选择常用的串并转换电路74LS164静态显示电路。
STC89C51单片机串行口方式0为移位寄存器方式,外接3片74LS164作为3位LED显示器的静态显示接口,把STC89C51的RXD作为数据输出线,TXD作为移位时钟脉冲。
74LS164为TTL单向8位移位寄存器,可实现串行输入,并行输出。
其中A、B(第1、2脚)为串行数据输入端,2个引脚按逻辑与运算规律输入信号,共一个输入信号时可并接。
T(第8脚)为时钟输入端,可连接到串行口的TXD端。
每一个时钟信号的上升沿加到T端时,移位寄存器移一位,8个时钟脉冲过后,8位二进制数全部移入74LS164中。
R(第9脚)为复位端,当R=0时,移位寄存器各位复0,只有当R=1时,时钟脉冲才起作用。
Q1…Q8(第3-6和10-13引脚)并行输出端分别接LED显示器的hg···a各段对应的引脚上。
在给出了8个脉冲后,最先进入74LS164的第一个数据到达了最高位,再来一个脉冲,第一个脉冲就会从最高位移出。
该电路中3片7LS164首尾相串,而时钟端则接在一起,这样,当输入8个脉冲时,从单片机RXD端输出的数据就进入到了第一片74LS164中了,而当第二个8个脉冲到来后,这个数据就进入了第二片74LS164,而新的数据则进入了第一片74LS164,这样,当第3个8个脉冲完成后,首次送出的数据被送到了最低位的164中,其他数据依次出现在第一、二片74LS164中。
显示电路图如图3-6所示:
图3-6显示电路图
液位控制电路的设计
液位控制电路的工作原理及液位控制状态图
在设计中,液位的几种状态是通过电位器的不同电压来模拟的,采用的电位器电压范围为0—5V。
加水装置水泵的各种状态由三个发光二极管模拟,由于设计只是模拟系统,压力传感器不易买到,所以压力的显示直接采用软件赋值的方式。
设定电位器的电压值为1V表示下下限,2V表示下限,3V表示上限,4V表示上上限。
当电位器电压值0≦X<1时,说明液位处于下下限以下,此时水泵加水开度最大,水泵工作指示灯P2.4亮,且三个发光二极管全亮(P1.3—P1.5),同时启动报警装置进行报警,当操作人员听到报警声时,可以按下消除报警按钮(P1.0)停止报警,并对系统做相应的处理;当电位器的电压值1≦X<2时,说明液位处于下限与下下限之间,此时水泵依然加水(P2.4依然亮),开度处于正常流量,有俩个二极管亮(P1.3和P1.4);当电位器的电压值2≦X<3时,说明液位处于下限与上限之间,此时液位处于正常状态,液位正常指示灯P2.3亮,此时水泵依然加水(P2.4依然亮),开度最小,有一个二极管亮(P1.3),用于维持正常的液位;当电位器的电压值3≦X<4时,说明液位处于上限限与上上限之间,此时停止水泵加水(水泵工作指示灯P2.4灭),正常液位指示灯P2.3同时熄灭;当电位器的电压值4≦X时,说明液位超过上上限,启动报警装置报警,此时水泵依然不工作(水泵工作指示灯P2.4灭)。
其液位状态表示电路图如图3-7所示(其中图(a)所示是水泵开度大小的指示模拟电路,图(b)为液位正常与不正常时的指示灯电路,图(c)是液位报警电路)。
(a)水泵开度大小的模拟电路
(b)液位正常与不正常时的指示灯电路
(c)液位报警电路
图3-7液位控制状态电路图
3.5.2液位控制的控制电路
在设计中采用了双向可控硅MOC3041驱动电路控制水泵的启停的。
MOC304l芯片是一种集成的带有光耦的双向可控硅驱动电路。
它内部集成了发光二极管、双向可控硅和过零触发电路等器件,它的内部结构和外部引脚如图3-8所示。
图3-8MOC3041的内部结构
从图中可以看出,它由输入和输出两部分组成。
输入部分是一个砷化镓发光二极管,在5-15mA正向电流的作用下,发出足够强度的红外光,去触发输出部分。
输出部分包括一个硅光敏双向可控硅和过零触发器。
在红外线的作用下,双向可控硅可双向导通,与过零触发器一起输出同步触发脉冲,去控制执行机构一外部的双向可控硅。
由MOC304l组成的过零触发双向可控硅电路简单可靠,液位控制电路图如图3-9所示。
图3-9液位控制电路图
该部分的工作过程是:
当单片机的P2.5输出为低电平时,图3-9所示的MOC3041构成的输出通道图MOC3041内部导通,G端出现同步触发脉冲,控制可控硅导通,打开水泵;当P2.5为高电平时,MOC3041内部截止,可控硅断开,关闭水泵。
(设计中用一个二极管来模拟水泵的开与关。
)
第四章系统调试
硬件调试比较简单,首先用万用表检查硬件电路的焊接是否正确,是否有短路、断路、虚焊等。
在检查无误后,可通电检测LED显示器的点亮状况。
若亮度不理想,可以调整P0口的电阻大小。
软件调试
软件调试可以先编写显示程序并进行硬件的正确性检验,然后分别进行主程序、液位控制子程序、温度读取子程序、按键控制子程序的编译和调试,由于DS18B20与单片机采用的是串行数据传送,因此,对DS18B20进行读写编程时必须严格地保证读写时序,否则将无法读取测量结果。
在软件调试过程中,我们用到了KeiluVision和SLISP_V1605两个软件。
其中KeiluVision用于软件的编译,以生成目标代码。
SLISP_V1605是一个编程器可以用于烧录软件,用于将目标代码通过传输线烧录到单片机中,完成软硬件的结合。
编写好的软件先通过KeiluVision软件进行编译,具体步骤如下:
(1)打开KeiluVision软件,进入KeiluVision界面后,首先要新建一个工程,并选择单片机型号AT89C52。
(2)新建一个文件,保存为.c格式。
(3)添加该文件到新建的工程中,进行程序的编写。
(4)程序编写完成后,先保存,再进行编译,系统会自行检查程序中的语法错误,并将错误类型罗列在界面下方的OutWindows中,以便于用户修改。
(5)当OutWindows中显示0Error(s),0Warning(s)时,表示程序已经编译通过。
(6)软件编译结束,生成.HEX格式的文件。
(7)将.HEX格式的文件烧录到单片机中。
软硬件实时调试
在硬件调试和软件编译通过后,进行软硬件联合调试。
将形成的.HEX文件烧录到单片机中,接入电源,检查系统能否实现预定功能,然后根据出现的问题,及时调整硬件电路和程序,使系统达到预期功能。
硬件电路是系统功能实现的物质基础,因此,在软硬件联合调试之前必须仔细检查硬件,只有硬件电路检查无误,整个系统的调试才有可能成功,而且,排除了所有的硬件错误后,进入联合调试,一旦出现问题,就可以迅速排除硬件上的错误,集中精力检查软件。
这样就省去了许多不必要的麻烦,从而为调试赢得时间。
软硬件联合调试时,可以将程序分成了几个模块,一个个进行调试,在各个模块都调试成功以后,再将它们组合起来,这样成功的概率就大了许多。
根据设计要求,该系统应实现以下几个功能:
(1)加热炉液位自动控制:
低于下下限或者高于上上限时,系统自动报警,液位正常时,液位指示灯亮,液位只要低于下限系统便自动加水;
(2)三个个按键,分别执行不同功能,当某个按键按下时,其对应功能得以实现。
P1.0按下时,消除报警,P1.1按下时实现从温度显示自动切换到压力显示,
P1.2按下时,系统复位,用于紧急停止;
(3)三位数码显示器,第一位、第二位、第三位分别显示温度值的百位、十位和个位。
软、硬件调试结果,系统实现预期各个功能:
(1)加热炉液位能够自动控制,并且设置了加水量指示灯;
(2)三个按键控制功能完全实现。
(3)温度传感器DS18B20实现了测温,并且能随现场温度的变化而变化,三位数码显示器能准确显示温度,测量精度可达到1℃。
在这次实验中,电路的调试是最耗时间的一项工作。
整个调试就是出现问题和解决问题不断重复的过程。
第5章总结
关于此次单片机大作业的完成,收货颇多,单片机我觉得是众课程中比较难的一门课程,这个单片机大作业的难易程度就不用多说了。
刚拿到我的作业,我的第一步就是分析这个题目的要求,抓住重点和老师的要求,绝对不能凭自己的主观去做。
关于完成这个作业的最重要的一环是也是最难的一环是画原理图,说真的,这个真心难!
毕竟是第一次用这个软件,但机会难得,通过问同学,上网找方法,我收货颇多!
在这次设计中,我获得的不仅仅只是这个系统的实现,在更多的方面我有了进一步的学习。
虽然我做的不是最好的,但我很自豪,这是我做的!
因此,这个课题的研究目的是为了使我们对学过的计算机控制技术、过程控制系统、单片机应用等相关专业知识进行更深层的理解和掌握。
而整个设计的过程,不仅仅是对所学知识的一次回顾和串连,更多的是锻炼了我解决一个实际课题、实践的能力。
更重要的是一个人的知识和力量是有限的,不可能什么都懂,也不可能什么都会。
不会就要查,查不到就问,通过一切方法把这个问题弄明白,才是此次设计的重点!
附录一设计程序清单
#include
#defineuintunsignedint
#defineucharunsignedchar
uinttemp;
uchartplsb,tpmsb;//温度值低位、高位字节
unsignedcharcodetable1[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,0x00};
unsignedchardispbuf[3]={1,2,3};
unsignedcharflag;
floatx1,x2,x3,dianya;
unsignedchard;
sbitDQ=P2^0;//数据通信线DQ
sbitanjian1=P1^1;
sbitanjian0=P1^0;
sbitST=P3^6;
sbitOE=P3^7;
sbitEOC=P2^4;
sbitled=P1^6;
sbitCLK=P3^3;
sbitBJ=P2^2;
sbitYW=P2^3;
sbitJS1=P1^3;
sbitJS2=P1^4;
sbitJS3=P1^5;
sbitLB=P2^1;
sbitSB=P2^5;
voidTimeInitial()
{EA=0;
ET1=0;
TMOD=0x20;
TH1=216;
TL1=216;
EA=1;
ET1=1;
TR1=1;
}
voidDelay_2()
{unsignedcharm,n,s;
for(m=2000;m>0;m--)
for(n=200;n>0;n--)
for(s=248;s>0;s--);
}
voidDelay_1(unsignedinti)
{for(;i>0;i--);
}
voidyewei()
{if(anjian0==0)
{LB=1;
BJ=1;
Delay_2();
}
if((dianya>2)&&(dianya<3))
{LB=1;
YW=0;
JS1=0;
JS2=1;
JS3=1;
BJ=1;
SB=0;}
if(