基于51单片机控制恒压供水系统设计论文
早期的供水系统各方面都不好,自从变频器在各个领域的广泛应用,供水技术水平从90年代初开始了一次飞跃。短短几年内,供水技术经历了一个逐步完善的发展过程,目前国外的恒压供水系统成熟可靠,恒压控制技术先进。但维护成本比国内较高,而国内现在不少公司在从事变频恒压供水的研制推广,技术也日益成熟。恒压供水系统是现代化城市和生活小区供水的发展方向。代表着先进的科技发展前沿,而且采用单片机控制的变频供水系统具有工
摘 要
早期的供水系统各方面都不好,自从变频器在各个领域的广泛应用,供水技术水平从90年代初开始了一次飞跃。短短几年内,供水技术经历了一个逐步完善的发展过程,目前国外的恒压供水系统成熟可靠,恒压控制技术先进。但维护成本比国内较高,而国内现在不少公司在从事变频恒压供水的研制推广,技术也日益成熟。恒压供水系统是现代化城市和生活小区供水的发展方向。代表着先进的科技发展前沿,而且采用单片机控制的变频供水系统具有工作可靠,实现容易,价格低廉的特点。是较理想的控制器。目前供水系统正在向集成化、维护操作简单化发展。
设计通过控制变频器的输出频率从而自动调节水泵电机的转速,实现管网水压的闭环调节, 使供水系统自动恒压值稳于设定的压力值。用户可以自行设定水管中的水压,低功耗低噪音高性能高寿命的特点使得本设计在同类产品中脱颖而出。使用 Keil C 和 Proteus 等先进 EDA软件进行了高效率地设计实现和仿真验证。
关键词:恒压;高效率;水泵转速;变频器
1引 言
1.1课题研究背景及意义
恒压供水系统是指用户端不管用水量大小,总保持管网中水压基本恒定。这样,既可满足各部位的用户对用水量的需求。又不会产生电动机空转,造成电能的浪费。为实现上述目标,需要变频器根据给定压力信号和反馈压力信号,调节水泵转速,从而达到控制管网中水压恒定的目的。一般的恒压供水系统是由单片机、变频器、压力传感器等器件组成的压力闭环控制系统。其原理是将压力变成模拟信号,经过一系列的转换最终调解水泵的转速,按实际用水量供水并使压力恒定。随着社会的发展,水在人们生活中越来越重要,随之便是科技的成果——恒压供水系统。现在很多地方面临水资源短缺,水污染严重的威胁,且不同时段对供水压力要求不一,单靠水厂人员根据往常经验进行手动调节很难处理供水问题。恒压供水系统是现代化城市和生活小区供水的发展方向。代表着先进的科技发展前沿,而且采用单片机控制的变频供水系统具有工作可靠,实现容易,价格低廉的特点。是较理想的控制器。目前供水系统正在向集成化、维护操作简单化发展。
1.2国内外研究现状
早期的供水系统各方面都不好,自从变频器在各个领域的广泛应用,供水技术水平从90年代初开始了一次飞跃。短短几年内,供水技术经历了一个逐步完善的发展过程,早期的单泵被多泵取代,目前国外的恒压供水系统成熟可靠,恒压控制技术先进,但维护成本比国内较高。
现在国内的一些恒压供水系统存在很多缺点如下:
(1)耗能大,浪费水电资源;
(2)水压不稳,容易发生事故;
(3)供水质量差,影响人体健康;
(4)运行效率低,很难满足供水需求;
(5)自动化程度低,操作麻烦;
1.3本课题主要研究内容
了解基于单片机的恒压供水系统的运作,优缺点;对其发展趋势进行认识,为研发生产新型供水系统作好准备。毕业设计的具体内容:
(1)设计通过压力传感器、控制器和变频器组成闭环回路自动调节电机的转速,从而调节水泵 的供水量,确保供水压力恒定。
(2)设计以单片机为主控制器,系统通过压力传感器对压力进行采集,经过A/D转换送入主控制器,变频器控制电机水泵机组。
(3)系统能够实时显示水管的压力值、变频器的频率和各水泵工作的时间及控制参数。
(4)设计键盘模块要求能输入任意设定值。结合上述课题研究的主要内容,预期通过压力传感器,控制器和变频器组成闭环回来路来控制电机水泵组来实现恒压供水,并用显示管显示水管的一些数据。
1.4设计目标
该系统主要以单片机为主控模块,通过控制变频器的输出频率从而自动调节水泵电机的转速,实现管网水压的闭环调节,使供水系统自动恒稳于设定的压力值,实现恒压供水。即用水量增加时,频率升高,水泵转速加快,供水量相应增大;用水量减少时,频率降低, 水泵转速减慢, 供水量相应减小。 采用该供水系统不需建造高位水箱或水塔,水质无二次污染,是一种理想的现代化建筑供水方案。本次设计的预期目标是:完成系统硬件电路的设计,并绘制出相应的原理电路图;完成所需控制软件的流程设计和编程任务。
2系统总体方案设计
通过查阅大量相关技术资料,并结合自己的实际知识,选择用单片机来实现功能,确定了以下的方案。本系统采用压力传感器反馈电压信号至处理器,经闭环控制系统。其输出频率的大小由处理器控制,使电机的转速自动增加或降低,以期保持供水压力恒定。这样不但减小了电动机的无功功率,而且提高了水泵的工作效率,节约了能源。采用变频控制方式;其操作方便,无须手动调节进水阀门;启动噪音低,由于启动电流很小,减小了对电网的冲击,保护了用电设备。而且其系统实现起来比较简单,并且系统价格相对来说也比较便宜。
2.1硬件设计方案
把整个硬件电路分成多个单元模块电路(如图2-1硬件结构图所示):
(1)时钟模块:时钟电路用于产生单片机工作所需要的时钟信号。
(2)复位电路:单片机的 RST引脚为主机提供一个外部复位信号输入端口。
(3)稳压电源模块:提供一个稳定的直流电压,来使电子电路与电子设备保持正常的工作。
(4)A/D转换模块:将模拟信号转换为数字信号。
(5)显示模块:提供水压信息显示。
(6)电机控制模块:控制电机的转速。
(7)按键电路:提供手动控制系统的功能。
(8)芯片STC89C52:
STC89C52RC是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K字节系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但是做了很多的改进使得芯片具有传统的方法51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、极有效的解决方案。
具有以下标准功能:8k字节Flash,512字节RAM,32位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。另外 STC89C52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35MHz,6T/12T可选。
图2-1 硬件结构图
2.2软件设计方案
通过查阅大量相关技术资料,并结合自己的实际知识,我主要提出了这种技术方案来实现系统功能。下面我将首先对这这种方案的组成框图和实现原理分别进行说明,并分析比较它们的特点,然后阐述我最终选择方案的原因,如图2-2所示。
本设计所使用的软件工具如下:
(1)开发平台: KeilC51;
(2)编写语言: C/C++;
(3)仿真软件使用:Proteus;
程序流程设计:设定水压值→获取水压→对比当前水压→驱动电机加减速

图2-2 程序原理流程图
此方案系统由泵机和变频驱动组成。如图 2-2 所示,以AT89C52为核心构成控制器,将设定值与压力反馈值进行对比。系统通过压力传感器将电器部分与泵组联系起来,构成闭环系统,按照设定好的泵机转动速度与水压相比,来动态调节泵机的转速。
3恒压供水系统硬件设计
本节主要介绍系统各单元模块的具体功能、电路结构、工作原理、以及各个单元模块之间的联接关系;同时本节也会对相关电路中的参数计算、元器件选择、以及核心器件进行必要说明。
3.1时钟模块设计
时钟电路用于产生单片机工作所需要的时钟信号,单片机本身就是一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在惟一的时钟信号控制下严格地按时序进行工作 。该时钟电路由两个电容和一个晶体振荡器组成。 XTAL1是接外部晶体管的一个引脚。 在单片机内部, 它是一个反相放大器的输入端, 这个放大器构成了片内振荡器。输出端为引脚 XTAL2,在芯片的外部通过这两个引脚接晶体振荡器和微调电容,形成反馈电路,构成一个稳定的自激振荡器。单片机工作的速度是由时钟电路提供的。在单片机的XTAL1和 XTAL2两个引脚间,接一只晶振及两只电容就构成了单片机的时钟电路,如图3-1 所示。电路中的器件选择可以通过计算和实验确定,也可以参考一些典型电路的参数。电路中电容 C3和 C4对振荡频率有微调作用,通常的取值范围 30±10pF;石英晶体选择 6MHz或 12MHz都可以。 其结果只是机器周期时间不同, 影响记数器的记数初值和运算速度。
3.2复位电路的设计
单片机的 RST引脚为主机提供一个外部复位信号输入端口。复位信号是高电平有效的持续时间应为2个机器周期以上。复位后,单片机内部各部件恢复到初试状态,单片机从 ROM的 0000H开始执行程序。单片机复位电路设计的好坏,直接影响到整个系统工作的可靠性。许多人在设计完单片机系统,并在实验室调试成功后,在现场却出现了“死机”、“程序走飞”等现象,这主要是单片机的复位电路设计不可靠引起的。在单片机应用系统工作时,除了进入系统正常的初始化之外,当由于程序运行出错或操作错误使系统处于死锁状态时,为摆脱困境,也需按复位键以重新启动。所以,系统的复位电路必须准确、可靠地工作。如图3-2所示。
单片机的复位都是靠外部电路实现的,在时钟电路工作后,只要在单片机的 RST引脚上出现24个时钟振荡脉冲以上的高电平,单片机便实现初始化状态复位。 为了保证应用系统可靠地复位,在设计复位电路时,通常使 RST保持高电平。只要 RST保持高电平,则单片机就循环复位。本次设计采用上电自动复位电路。
3.7稳压电源模块
大部分的电子电路与电子设备都需要有一个稳定的直流电源提供能量,而且对于我们通常所接触的控制器而言,一般都是利用电网提供的交流电源,经过整流、滤波、稳压后,滤去其不稳定的脉动、干扰成分,提供一个稳定的直流电压,来使电子电路与电子设备保持正常的工作。并且,我们目前绝大部分电子电路与电子设备都是使用线性电源,即通过降压、整流、滤波、稳压后提供稳定的直流电压给电子电路及芯片工作的。固定式三端稳压电源 (7805) 是由输出脚 Vo,输入脚 Vi 和接地脚 GND组成 , 它的稳压值为+5V,它属于 LM78xx系列的稳压器 , 输入端接电容可以进一步的滤波 , 输出端也要接电容可以改善负载的瞬间影响 , 此电路的稳定性也比较好。
系统的原理电路图

4恒压供水系统软件设计
软件设计原理及设计所用工具
软件的主要功能是根据系统的工作原理,框图,先制定各部分程序的流程图,然后 再根据流程图编写各部分程序,通过调试各部分程序运行正确无误后,再进行主程序的 调试,看是否能实现预期的功能。
为了能够实现仿真,在仿真时用滑动变阻器来模拟水管水压。通过调节电阻的大小来改变水管的水压值。在调节电阻值的时候,LCD1602上所显示的值随之变化。
本设计所使用的软件工具如下:
(1)开发平台:KeilC51 ;
(2)编写语言:C/C++;
Proteus 软件是 Labcenter Electronics 公司的一款电路设计与仿真软件,它包括ISIS 、 ARES等软件模块, ARES模块主要用来完成 PCB的设计,而 ISIS 模块用来完成电路原理图的布图与仿真。 Proteus 的软件仿真基于 VSM技术,它与其他软件最大的不同也是最大的优势就在于它能仿真大量的单片机芯片,比如 MCS-51系列、 PIC 系列等等,以及单片机外围电路,比如键盘、 LED、 LCD等等。通过 Proteus 软件的使用我们能够轻易地获得一个功能齐全、实用方便的单片机实验室。软件仿真有很多特点和优势, 如: 可以随意方便的更换和改变电路中的器件及线路,仿真的过程中不会损坏器件,从而降低了产品开发的成本。本文中由于我们主要使用 Proteus 软件在单片机方面的仿真功能,所以我们重点研究 ISIS 模块的用法, 在下面的内容中, 如不特别说明, 我们所说的 Proteus 软件特指其ISIS 模块。
主程序流程图
主要包括:A/D 转换程序;按键扫描程序。程序流程图如下:如图4-1示
(1)A/D 转换子程序:
其主要任务是把压力传感器检测的压力转换成数字量,并送入单片机处理,程序见附录。
(2)按键扫描子程序:
其主要作用是扫描按键的状态来获取指令,程序见附录。
图 4-1 主程序流程图
动态显示压力程序
字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,本次使用的LCD1602为16*2型。
(1)基本操作时序:
读状态:输入:RS=L,Rw=H,E=H 输出:D0~D7=状态字;
写指令:输入:RS=L,Rw=L,D0~D7=指令码,E=高脉冲,输出:无;
读数据:输入:RS=H,Rw=H,E=H 输出:D0~D7=数据;
写数据:输入:RS=L,Rw=H,D0~D7=数据,E=高脉冲,输出:无;
(2)状态字说明:
STA7……STA0
D7……D0
STA0~6为当前数据地址指针的数值;STA7为读写操作使能 1 禁止 0 允许;
第一行取地址为80 第二行为80+40;
(3)初始化设置:
显示模式设置
00111000(0x38)
显示开关及光标设置
指令码
00001DCB D=1开显示 ,D=0关
C=1显示光标,C=0关
B=1光标闪烁,B=0关
000001NS N=1 当读或写一个地址后字符指针加一,且光标加一
N=0 减 减
S=1 写一个字符,整屏显示左移(N=1)或右移(N=0)以得到光标不移动而屏移动
S=0 不移动
(4)指示码:
80H+地址码(0-27H 40-67H)(只显示每行前十六位)
01H 显示清屏:1、数据指针清零 2、所有显示清零
02H 显示回车:数据指针清零
(5)初始化过程(复位过程):
1)延时15ms
2)写指令38H(不检测忙信号)
3)延时5ms
4)写指令38H(不检测忙信号)
5)延时5ms
6)写指令38H(不检测忙信号)
7)写指令38H:显示模式设置
8)写指令08H:显示关闭
9)写指令01H:显示清屏
10)写指令06H:显示光标移动设置
11)写指令0cH:显示开及光标设置
4.7系统测试仿真
(1)Proteus软件介绍:
Proteus软件是 Labcenter Electronics 公司的一款电路设计与仿真软件,它包括ISIS、ARES等软件模块,ARES模块主要用来完成 PCB的设计,而ISIS模块用来完成电 路原理图的布图与仿真。Proteus的软件仿真基于 VSM技术,它与其他软件最大的不同也是最大的优势就在于它能仿真大量的单片机芯片,比如 MCS-51系列、PIC系列等等,以及单片机外围电路,比如键盘、LED、LCD等等。通过 Proteus 软件的使用我们能够轻 易地获得一个功能齐全、实用方便的单片机实验室。 软件仿真有很多特点和优势, 如:可以随意方便的更换和改变电路中的器件及线路,仿真的过程中不会损坏器件,从而降低了产品开发的成本。本文中由于我们主要使用Proteus 软件在单片机方面的仿真功能,所以我们重点研究ISIS模块的用法,在下面的内容中,如不特别说明,我们所说的 Proteus软件特指其ISIS模块。
(2)系统水压显示测试:
为了能够实现仿真,在仿真时用滑动变阻器来模拟水管水压。通过调节电阻的大小来改变水管的水压值。在调节电阻值的时候,显示管上所显示的值随之变化。启动电路系统工作,系统开始工作,显示出当前水压默认当前水压为130,调节滑动变阻器显示值的大小随其变化,如图4-2所示。

(3)按键功能测试:
按下【设定压力加】按键,如图4-2所示第一行的设定压力值显示在原理默认的150上又增加了5,说明功能正常。

按下【设定压力减】按键,如图4-3所示第一行的设定压力值显示在原理默认的150上又减小了5,说明功能正常。
(4)系统水压动态调节测试:
按下【自动/手动切换】按键,如图4-4所示,系统通过压力值的对比发现当前值小于设定值,电机的转速再不断上升,当前压力值也不断的再增加,说明自动水压调节正常。
**系统的相关程序**
#include <reg52.h>
/*---------------宏定义-----------------*/
#define uint unsigned int
#define uchar unsigned char
#define PWM_CYC 50 //PWM周期
#define AUTO_SPEED 2000 //数字越大越慢
#define delay(x) {uint i,j;for(i = x;i>0;i--)for(j=50;j>0;j--);}
#define THC0 ((65536 - 10000)/256) //10ms定时器定时值
#define TLC0 ((65536 - 10000)%256)
/*--------------引脚定义-----------------*/
/* AD0809引脚 */
sbit OE = P3^7;
sbit EOC = P3^6;
sbit ST = P3^5;
sbit CLK = P3^4;
sbit ALE = P3^3;
#define ADCV P1
/* lcd016 引脚 */
sbit RS = P2^0;
sbit RW = P2^1;
sbit E = P2^2;
#define LCDData P0
/* 按键 */
sbit BTN_UP = P2^3;
sbit BTN_DN = P2^4;
sbit BTN_AUTO = P2^5;
/* 电机PWM脚 */
sbit PWM = P2^7;
/* LED */
sbit LED = P2^6;
/*---------------全局变量----------------*/
const uchar display1[] = "set pressure ";
const uchar display2[] = "cur pressure ";
uchar water_vol=0; //水压
uchar set_vol = 150; //设置压力
uchar motor_speed = 6; //电机速度
uchar auto_flag = 0;
/*---------------全局函数----------------*/
void LCD_init(); //LCD初使化
void Display(uchar setv,uchar waterv); //显示程序
uchar Get_WaterV(void); //水压获取
void Moter_Drive(void); //电机驱动
void SetVol_UP(void); //设定压力加
void SetVol_DN(void); //设定压力减
void SetMotorSpeed(void); //电机速度设置
void Key_Scan(void); //按键扫描
void AutoSpeed(void); //自动模式
void SetVol_AUTO(void); //手动 自动 切换
/*---------------------------------
* 函数:SysTemInit 初使化
*----------------------------------*/
void SysTemInit(void)
{
TMOD = 0x02; //定时器0 采用16位定时器
TH0 = THC0; //设定定时值
TL0 = TLC0;
ET0 = 1; //定时器T0 溢出中断允许
TR0 = 1; //启动定时器0
EA = 1; //中断总开关开
LED = 0;
}
/*---------------------------------
* 函数:main 程序主入口
*----------------------------------*/
void main(void)
{
static char showcount=0;
PWM = 0;
SysTemInit();
LCD_init();
for(;;)
{
Moter_Drive(); //PWM驱动电机
if(auto_flag==0)water_vol = Get_WaterV(); //手动模式时获取水压
else AutoSpeed();
showcount++;
Key_Scan(); //扫描按键、
if(showcount == 100)
{
Display(set_vol,water_vol); //显示
SetMotorSpeed(); //调整速度
showcount = 0;
}
}
}
/*---------------------------------
* 函数:time0 10ms定时器0中断入口 用于ADC时钟
*----------------------------------*/
void time0() interrupt 1
{
CLK = ~CLK;
}
/*---------------------------------
* 函数:SetMotorSpeed 设置电机速度
*----------------------------------*/
void SetMotorSpeed(void)
{
if(water_vol > set_vol) //如果测到的水压大于设置压力
{
if(motor_speed > 4)motor_speed--; //控制占空比增大 电机减速
}
else if(water_vol < set_vol)
{
if(motor_speed < 40) motor_speed ++; //控制占空比减小 电机增速
}
}
/*---------------------------------
* 函数:AutoSpeed 自动速度
*----------------------------------*/
void AutoSpeed(void)
{
static uint auto_speed = 0; //自动的速度控制
auto_speed ++;
if(auto_speed == AUTO_SPEED)
{
if(water_vol > set_vol) //如果测到的水压大于设置压力
{
water_vol--; //控制占空比增大 电机减速
}
else if(water_vol < set_vol)
{
water_vol++; //控制占空比减小 电机增速
}
auto_speed = 0;
}
}
/*---------------------------------
* 函数:Key_Scan 按键扫描
*----------------------------------*/
void Key_Scan(void)
{
static uchar keyupstate = 0;
static uchar keydnstate = 0;
static uchar keyupcount = 0;
static uchar keydncount = 0;
static uchar keyautostate = 0;
static uchar keyautocount = 0;
switch(keyupstate) //按键加状态
{
case 0:
if(BTN_UP == 0) //如果加键按下
{
keyupcount++; //记录
if(keyupcount>1)
{
keyupstate = 1; //记录超过3次跳转到按下状态
keyupcount = 0;
}
}
else keyupcount = 0;
break;
case 1:
SetVol_UP(); //确认按键已按下运行一次
keyupstate = 2;
break;
case 2:
if(BTN_UP) //按键松开恢复状态
{
keyupstate = 0;
keyupcount = 0;
}
break;
}
switch(keydnstate) //按键减状态
{
case 0:
if(BTN_DN == 0) //如果加键按下
{
keydncount++; //记录
if(keydncount>1)
{
keydnstate = 1; //记录超过3次跳转到按下状态
keydncount = 0;
}
}
else keydncount = 0;
break;
case 1:
SetVol_DN(); //确认按键已按下运行一次
keydnstate = 2;
break;
case 2:
if(BTN_DN) //按键松开恢复状态
{
keydnstate = 0;
keydncount = 0;
}
break;
}
switch(keyautostate) //按键自动控制状态
{
case 0:
if(BTN_AUTO == 0) //如果加键按下
{
keyautocount++; //记录
if(keyautocount>1)
{
keyautostate = 1; //记录超过3次跳转到按下状态
keyautocount = 0;
}
}
else keyautocount = 0;
break;
case 1:
SetVol_AUTO(); //确认按键已按下运行一次
keyautostate = 2;
break;
case 2:
if(BTN_AUTO) //按键松开恢复状态
{
keyautostate = 0;
keyautocount = 0;
}
break;
}
}
/*---------------------------------
* 函数:SetVol_AUTO 自动手动切换
*----------------------------------*/
void SetVol_AUTO(void)
{
if(auto_flag == 0)
{
auto_flag = 1;
LED = 1;
}
else
{
auto_flag = 0;
LED = 0;
}
}
/*---------------------------------
* 函数:SetVol_UP 压力加
*----------------------------------*/
void SetVol_UP(void)
{
if(set_vol<255) set_vol+=5; //设置压力步进5
}
/*---------------------------------
* 函数:SetVol_Dn 压力减
*----------------------------------*/
void SetVol_Dn(void)
{
if(set_vol>0) set_vol-=5; //设置压力步进5
}
/*---------------------------------
* 函数:Moter_Drive 电机驱动
* 参数:cmd 指令
*----------------------------------*/
void Moter_Drive(void)
{
static uchar cnt = 0;
cnt++;
if(cnt < motor_speed) PWM = 1; //通过执行空语句来实现空占比
else PWM = 0;
if(cnt > PWM_CYC) cnt = 0;
}
/*---------------------------------
* 函数:Get_WaterV 获取水压
* 返回:滑动变阻器电压值 0-255 对应0-5V
*----------------------------------*/
uchar Get_WaterV(void)
{
uchar vol = 0; //定义一个变量来存储获取到的数值
ST = OE = 0; //关闭STE、OE通道
ALE = 1; //开放ALE通道
ST = 1; //启动START
ALE = 0; //关闭ALE通道
ST = 0; //关闭START
while(EOC == 0); //读取数值直到停止信号
OE = 1; //数据允许通道打开
vol = ADCV; //将获取到的数值赋值给全局变量ADCV
return vol;
}
/*---------------------------------
* 函数:Write_cmd LCD写指令
* 参数:cmd 指令
*----------------------------------*/
void Write_cmd(uchar cmd)
{
RS=0;
RW=0;
LCDData=cmd;
delay(1);
E=1;
delay(1);
E=0;
}
/*---------------------------------
* 函数:Write_data LCD写数据
* 参数:date 数据
*----------------------------------*/
void Write_data(uchar date)//
{
RS=1;
RW=0;
LCDData=date;
delay(1);
E=1;
delay(1);
E=0;
}
/*---------------------------------
* 函数:LCD_init LCD初使化
*----------------------------------*/
void LCD_init()
{
E=0;
Write_cmd(0x38); //16*2,5*7,8 位数据
Write_cmd(0x0c); // 显示开,光标不显示,不闪烁
Write_cmd(0x06); // 地址加1,光标加1,整屏不移动
Write_cmd(0x80); // 地址初始
}
/*---------------------------------
* 函数:Display LCD显示
* 参数:setv 设置压力
* waterv 当前水压
*----------------------------------*/
void Display(uchar setv,uchar waterv)
{
uchar i;
//Write_cmd(0x01); // 清屏
for(i = 0;i < 17;i++) //显示第一行
{
Write_data(display1[i]);
}
Write_cmd(0x80+0x40); //显示第二行
for(i = 0;i < 17;i++)
{
Write_data(display2[i]);
}
Write_cmd(0x80 + 13); //第一行第13位开始显示设置压力
Write_data(0x30 + setv/100);
Write_data(0x30 + setv%100/10);
Write_data(0x30 + setv%10);
Write_cmd(0x80 + 0x40 + 13); //第二行第13位开始显示当前压力
Write_data(0x30 + waterv/100);
Write_data(0x30 + waterv%100/10);
Write_data(0x30 + waterv%10);
}
结论
本论文的研究主要完成了以下内容: 通过对变频恒压供水控制系统的工作原理和控制原理的分析,用单片机汇编语言结合硬件电路,设计出以 STC89C52 为核心的恒压供水控制器。恒压供水控制器中,使得用户在使用时更加方便快捷。变频调速恒压供水是现代化城市和生活小区供水的发展方向,采用单片机控制的变频供水系统具有工作可靠、实现容易、价格低廉等特点,是较理想的控制器。当然由于自己能力所限和时间的紧迫,这个设计还有很多缺陷,无法应用于实际,在电路设计方面也有考虑不足,由于没能做出实物,还无法对电路进行调试。只有在以后的工作中去完善。
经历两个多月的时间,本次毕业设计:基于单片机的恒压供水系统设计已经圆满完成。本设计完成的是应用在工业生活领域的实践性设计。通过这次的毕业设计,我基本上掌握了一般的设计步骤:首先明确设计任务,以及工业生产和社会生活所要求控制达到的具体的技术指标通过讨论思考及必要的简单实验和实际考查完成对总体工业生产实际系统的了解;进而要对整个设计系统经过深入的方案论证、计算以及联系实际的生产工况、生产条件、企业经济等一系列条件,确立自己的设计方案,然后就是对自己确立的方案进行硬件实现,包括所用元器件选型,以及控制部分整个单片机系统的硬件选型与设计。 我进行了软件部分的设计, 我经过流程图绘制, 搞清楚各个部分实现的功能,进而对整个系统进行软件编程实现, 到此基本上这个系统设计已经完成大半虽然完成了设计工作,但由于本人的时间和能力有限,所以目前还有很多不足之处,有待进一步的完善与发现。
谢辞
在本次毕业设计过程中我的指导教师给予了我无私的帮助与耐心的指导,期间解决了我在设计过程中的许许多多的疑问,同时对于自己设计过程中的某些知识盲点也耐心地给予讲述,从而使得自己的毕业设计能顺利完成。在此,对于陈永强老师的无私帮助表示最真诚的感谢。同时,整个设计过程得到了学校的大力帮助,提供了很好的设计环境,使用学校的设备机房,使得自己不论在收集资料还是做实验、撰写设计论文等方面都很方便。对此特别表示感谢。当然,设计的评阅也花费了老师们很大的精力,并且对于自己整个设计的不足之处,也给予了热心的指正。对此,表示衷心地感谢!
更多推荐



所有评论(0)