原理
本课题设计基于单片机的水塔水位控制系统,以AT89C单片机>51单片机为核心处理器设计单片机最小系统,外加数码管显示模块、液位传感器、AD转换电路、继电器电路与水泵、独立按键模块。系统的结构图如下:
系统实现原理
AT89C单片机>51单片机具有32个可编程的I/O口、定时器、外部中断等资源,可连接许多外设电路。本设计中通过液位传感器检测水位的信息,再经过ADC0832转换为电信号,然后送给单片机处理,最后液位信息显示在数码管上。单片机通过比较设定好的液位上下限,当液位低于下限时控制继电器吸合启动水泵进行加水,当加水到上限时,控制继电器断开,停止加水。同时,通过一个独立按键实现手动加水。
硬件选型
AT89C51,ADC0832,按键,数码管,继电器,舵机,LED,电阻,晶振
晶振电路
晶振:又叫晶体振荡器,其作用是为单片机系统提供基准的时钟信号,单片机的内部资源都是根据时钟信号来进行工作的。单片机>51单片机各个外围电路的运行都有一个基准信号,这个基准信号就是时钟信号。单片机时钟的频率影响单片机的运行速度,时钟电路的稳定性直接影响单片机工作的稳定性。单片机的时钟有内部时钟和外部时钟两种,本设计中采用单片机的内部时钟。AT89C52单片机的18脚和19脚是晶振引脚,设计中选择12MHz的晶振,外加两个的电容帮助晶振起振,并维持震荡信号的稳定。晶振电路如下图所示:
液位传感器
液位传感器(静压液位计/液位变送器/液位传感器/水位传感器)是一种测量液位的压力传感器。静压投入式液位变送器(液位计)是基于所测液体静压与该液体的高度成比例的原理,采用隔离型扩散硅敏感元件或陶瓷电容压力敏感传感器,将静压转换为电信号,再经过温度补偿和线性修正,转化成标准电信号(一般为4~20mA/1~5VDC),适用于石油化工、冶金、电力、制药、供排水、环保等系统和行业的各种介质的液位测量。本设计的仿真中,使用一个变阻器来模拟液位传感器。
ADC0832
ADC0832 是美国国家半导体公司生产的一种8 位分辨率、双通道A/D转换芯片。由于它体积小,兼容性,性价比高而深受单片机爱好者及企业欢迎,已经有很高的普及率。
ADC0832 为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在0~5V之间。芯片转换时间仅为32μS,具有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。独立的芯片使能输入,使多器件挂接和处理器控制变的更加方便。通过DI 数据输入端,可以轻易的实现通道功能的选择。电路图如下:
数码管模块
本设计中选用3位的共阴极数码管来显示水位信息。共阴数码管:指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM 接到地线GND 上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。数码管的位选端连接到单片机的P2口,段选端连接到单片机的P0口,通过给位选端低电平就可以选中某一位数码管点亮,在编程时使用动态扫描的方法点亮数码管。数码管电路如下图所示。
继电器电路
本系统设计中通过继电器控制水泵加水,继电器部分通过一个三极管控制,当单片机的IO口输出低电平时,三极管导通,工作指示灯点亮,继电器工作,继电器的衔片吸合,水泵电路导通,从而进行加水。当IO口输出高电平时,三极管截止,继电器断开,水泵不工作。电路图如下。
主程序设计
主程序的任务是完成系统的初始化,获取各个模块的信息并进行处理,控制各个模块实现相应的功能。流程图如下:
数码管显示程序设计
本设计中采用动态扫描的方法控制数码管显示,在while循环中,循环扫描数码管。将数码管要显示的3位数据放到一个数组中,在数据更新时时,只需要将该数组的值更新即可,程序会将数组中的值显示到数码管上。
数码管扫描代码如下:
P0=0x00; //消隐
P2=0xfe; //选中第一位数码管
P0=table[water/100]; //百位
delayus(100);
P0=0x00; //消隐
P2=0xfd; //选中第二位数码管
P0=table[(water%100)/10]; //十位
delayus(100);
P0=0x00; //消隐
P2=0xfb; //选中第三位数码管
P0=table[water%10]; //个位
delayus(100);
3.3 按键扫描程序设计
按键扫描部分程序控制手动加水,在while循环中一致扫描按键端口,如果检测到端口为低电平,则表示按键按下,然后进行约10ms的消抖,再次检测按键是否按下,如果按键为按下状态,则表示按键确实按下。然后控制水泵加水。
代码如下:
if(!key) //扫描按键
{
if(!keyflag) //判断按键状态
{
delayus(1000); //延时消抖
if(!key) //再次扫描按键
{
keyflag=1; //按键按下状态
if(water<90) //水位小于90开始加水
{
motor=0; //启动水泵
flag=1; //表示在加水状态
}
}
}
} else keyflag=0; //按键松开状态
AD转换程序设计
使用ADC0832将液位的电信号转换为数字量。当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用,CLK 和DO/DI 的电平可任意。当要进行A/D转换时,须先将CS使能端置于低电平并且保持低电平直到转换完全结束。此时芯片开始转换工作,同时由处理器向芯片时钟输入端CLK 输入时钟脉冲,DO/DI端则使用DI端输入通道功能选择的数据信号。在第1 个时钟脉冲的下沉之前DI端必须是高电平,表示起始信号。在第2、3个脉冲下沉之前DI端应输入2 位数据用于选择通道功能。AD转换代码如下:
unsigned char ADC0832_Read(bit ch)
{
unsigned char i,dat;
CS=1; //一个转换周期开始
CLK=0; //为第一个脉冲作准备
CS=0; //CS置0,片选有效
DIO=1; //DIO置1,规定的起始信号
CLK=1; //第一个脉冲
CLK=0; //第一个脉冲的下降沿,此前DIO必须是高电平
DIO=1; //DIO置1, 通道选择信号
CLK=1; //第二个脉冲,第2、3个脉冲下沉之前,DI必须跟别输入两位数据用于选择通道,这里选通道CH0
CLK=0; //第二个脉冲下降沿
DIO=ch; //ch为几,则选择通道几
CLK=1; //第三个脉冲
CLK=0; //第三个脉冲下降沿
DIO=1; //第三个脉冲下沉之后,输入端DIO失去作用,应置1
CLK=1; //第四个脉冲
for(i=0; i<8; i++)//高位在前
{
CLK=1; //第四个脉冲
CLK=0;
dat<<=1; //将下面储存的低位数据向右移
dat|=(unsigned char)DIO; //将输出数据DIO通过或运算储存在dat最低位
}
CS=1; //片选无效
return dat; //将读出的数据返回
}
仿真图:
仿真结果分析
经过仿真测试,调节变阻器模拟液位改变,当液位低于20时,继电器吸合,工作指示灯点亮,水泵启动,开始加水。当加水到90时,继电器断开,水泵停止。同时,在水位低于90时,可以通过手动加水按键进行加水,同样的,加水到90时,继电器断开,水泵停止。经过多次测试分析,改系统实现了设计的所有功能。
proteus仿真定制前往某鱼:两栖电子,各种模板和定制仿真设计均有: