基于单片机的水位控制系统设计.docx
《基于单片机的水位控制系统设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的水位控制系统设计.docx(11页珍藏版)》请在冰豆网上搜索。
基于单片机的水位控制系统设计
基于单片机的水位控制系统设计
单片机原理及系统课程设计
评语:
考勤10分
守纪10分
过程30分
设计报告30分
答辩20分
总成绩(100)
专业:
自动化
班级:
自动化1201
姓名:
王文玉
学号:
201209005
指导教师:
苟军年
图2水塔水位控制系统结构框
3.1主要芯片的介绍
AT89C51:
89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)的低电压、高性能CMOS8位微处理器。
单片机的可擦除只读存储器可以反复擦除100次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的89C51是一种高效微控制器。
L298:
L298是SGS公司的产品,比较常见的是15个脚Multiwatt的L298N,内部同样包含4通道逻辑驱动电路,可以方便的驱动两个直流电机,或一个两相步进电机,是一款电机驱动芯片。
3.2水位检测接口电路
为了便于实现水位检测功能,用一个两位的拨码开关模拟b、c端的状态(1、0),正电极接+5V电源,每个负电极分别通过4.7kΩ的电阻接地。
将单片机的端口接开关开。
假设被水淹没的负电极都为高电平,此时开关置合;露在水面的负电极都为低电平,开关此时置为0。
单片机通过负电极重复采集检测水位,当缺水时(此时两个开关均置0),电机必须带动水泵抽水;若水位在正常范围内时,检测信号为高,低电平;当水位过高时,检测信号为高电平单片机检测到端口为高电平后,电机反转带动水泵排水。
即可检测到水位的变化。
3.3报警接口电路
为了避免系统发生故障时,水位失去控制造成严重后果,在超出、低于警戒界水位时,报警信号从高、低警界水位电极获得,通过51单片机控制进行报警,警示水位在非正常水位。
单片机通过给控制电机的两个控制端口高低电平从而控制电机的正转、停转和反转,控制电机工作;两端口都为高电平,电机停止工作,两端口为一高一低两种不同电平时,电机开始正转或反转。
电机故障报警由单片机控制,电机故障报警信号由显示器显示。
水位超过高警戒水位,单片机控制系统使电机反转,从水塔内开始抽水,直至水位降至正常水位,电机才能停止工作,即可根据水位的显示发出警报。
4系统软件设计
4.1流程图
水塔水位控制程序流程图如图3所示
Y
N
Y
NY
N
Y
N
N
Y
图3水塔水位控制程序流程图
4.2实验源程序
实验源程序如附录。
5实验仿真结果
根据所设计系统的软件流程图,编写相应的程序在Proteus软件环境下实际仿真。
实验结果表明,该系统能成功实现了水位检测、电机故障检测、处理和报警等功能,具有良好的检测控制功能,可移植性和扩展性强。
实验仿真图如图4所示。
图4实验仿真图
总结
该系统设计是基于在单片机嵌入式系统而设计的,充分利用单片机强大控制功能和方便通信接口,该检测控制系统在实验室某实验水冷却系统得到成功实践,实现水位检测、电机故障检测、处理和报警等功能,提高了实验的自动控制能力。
因此,该系统在农村水塔,城市水源检测控制等领域有着广阔的应用前景。
参考文献
[1]陈海宴.51单片机原理及其应用[M].北京:
北京航空航天大学出版社,2010.3
[2]何希才.传感器及其应用实例[M].北京:
机械工业出版社,2004.9
[3]李广弟.单片机基础[M].北京:
北京航空航天大学出版社,2007.6
[4]童诗白.数字电子技术[M].北京:
高等教育出版社,2001.6
[5]王思明.单片机原理及应用[M].北京:
科学出版社,2012.9
附录
实验源程序
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitmotor1=P2^6;
sbitmotor2=P2^7;//定义两个电机控制位
sbitLED=P2^0;//定义电机工作指示灯控制位
sbitbeep=P3^6;//定义蜂鸣器发生控制位
sbitgao=P3^0;
sbitzhong=P3^1;
sbitdi=P3^2;//定义高中低三个水位指示灯的相应控制位
codeuchartab[]={0x3f,0x06,
0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f};
voiddelay(uintn)
{
uchara,b;
for(a=n;a>0;a--)
for(b=110;b>0;b--);
}
voiddidi()
{
beep=0;//蜂鸣器发声
delay(100);
beep=1;//蜂鸣器停止发声
delay(100);
}
voidLED_SHOW()
{
if(P1==0xff)
{
zhong=1;
di=1;
P0=tab[8];//数码管显示水位为8,为高水位
didi();//低水位报警
LED=0;//电机工作指示灯亮
gao=0;//点亮高水位指示灯
motor1=1;
motor2=0;//电机开始反转,从水塔排水
}
if(P1==0xfe)
{
zhong=1;
di=1;
P0=tab[7];//数码管显示水位为7,为高水位
LED=0;
gao=0;
motor1=1;
motor2=0;
}
if(P1==0xfc)
{
gao=1;
di=1;
P0=tab[6];//数码管显示水位为6,为正常水位
LED=1;//电机工作指示灯熄灭
zhong=0;//点亮中水位指示灯
motor1=0;
motor2=0;//电机停转
}
if(P1==0xf8)
{
gao=1;
di=1;
P0=tab[5];//数码管显示水位为5,为正常水位
LED=1;
zhong=0;
motor1=0;
motor2=0;
}
if(P1==0xfc0)
{
gao=1;
di=1;
P0=tab[4];//数码管显示水位为4,为正常水位
LED=1;
zhong=0;
motor1=0;
motor2=0;
}
if(P1==0xe0)
{
gao=1;
di=1;
P0=tab[3];//数码管显示水位为3,为正常水位
LED=1;
zhong=0;
motor1=0;
motor2=0;
}
if(P1==0x80)
{
gao=1;
zhong=1;
P0=tab[2];//数码管显示水位为2,为低水位
LED=0;
di=0;
motor1=0;
motor2=1;
}
if(P1==0x00)
{
gao=1;
zhong=1;
P0=tab[1];//数码管显示水位为1,为低水位
didi();//低水位报警
LED=0;//电机工作指示灯亮
di=0;//点亮高水位指示灯
motor1=0;
motor2=1;//电机开始正转,向水塔加水
}
}
voidmain()
{P0=0;
while
(1)
{
LED_SHOW();
}
}