基于单片机的水塔水位控制系统

摘 要

水塔是在日常生活和工业应用中经常见到的蓄水装置,基于单片机的水塔水位控制系统使水塔水位自动保持在一定的位置,通过对其水位的控制对外供水,以满足需要。该系统使用水位传感器对水塔水位进行检测并将检测到的信号传给单片机STC89C52进行处理,通过调整定时器的定时时间来增大或者缩小占空比,并采用C 语言编写控制程序,从而实现电机的调速。最后,使用带字库的LCD1602液晶屏显示当前水位状态以及电动机的转速。该系统实现了过低水位蜂鸣器鸣笛报警、过低警戒水位自动处理、正常水位蜂鸣器鸣笛报警以及正常水位处理、手动按键调整PWM(Pulse Width Modulation)电机调速等功能。本系统适应在不同的用水场合下的用水速度需要,节省工作时间,提高了整体工作的效率,实现水塔水位的自动控制。

关键词:单片机控制;水位检测;LCD1602显示;PWM 电机调速

ABSTRACT

The water tower is commonly seen in daily life and industrial as application of storage device. The system is based on single-chip microcomputer control system help to keep water towers in certain water level and according to the automatic level of control to supply the needs of water. Water level sensor is used for towers on the examination detect signal and transfer the signal to STC89C52 , through the adjustment of the time to increase or narrow the duty ratio, and using C language program, so as to realize the compilation control of motor speed. Finally, current levels and motor speed are shown with 1602 LCD screen in this system. This system realizes the buzzer low level alarm, low whistle warning level automatic processing, normal level alarm or normal water buzzer sirens and manual buttons Pulse Width Modulation. This system realizes the automatic control in different water situation of water to save the working time, speed, and also improves the overall efficiency of water towers.

Key Words:SCM control; Water detection; LCD1602 display; PWM motor speed;

目 录

1

2 引 言 ....................................................................................................................... 1 1.1 课题简介 . ...................................................................................................... 1 系统的整体方案设计 ............................................................................................. 3

2.1 功能要求 . ...................................................................................................... 3

2.2 设计要求 . ...................................................................................................... 3

2.3 系统基本方案选择和论证 . .......................................................................... 3

2.3.1 单片机芯片的选择方案论证 . ............................................................. 4

2.3.2 显示模块选择方案论证 . ..................................................................... 4

3 系统的硬件设计 ..................................................................................................... 5

3.1 电路设计框图 . .............................................................................................. 5

3.2 MCU 主控芯片简介..................................................................................... 5

3.2.1 主控制器芯片STC89C52概述 . ......................................................... 5

3.2.2 芯片下载程序 . ..................................................................................... 7

3.3 液晶屏1602的简单介绍 . ............................................................................ 7

3.3.1 液晶屏1602的简要概述 . ................................................................... 7

3.3.2 液晶屏1602的使用具体 . ................................................................... 8

3.4 系统功能电路 . ............................................................................................ 12

3.4.1 最小工作系统原理 . ........................................................................... 12

3.4.2 蜂鸣器报警电路原理 . ....................................................................... 14

3.4.3 电机驱动电路原理 . ........................................................................... 14

3.4.4 按键功能电路原理 . ........................................................................... 15

3.4.5 液晶1602显示功能电路图 . ............................................................. 15

3.5 系统总体原理图设计 . ................................................................................ 16 4 系统的软件设计 ................................................................................................... 17

4.1 编程语言介绍 . ............................................................................................ 17

4.1.1 C 语言简介 ......................................................................................... 17

4.1.2 C 语言的特点 ..................................................................................... 17

4.1.3 C 源程序的结构特点 ......................................................................... 18

4.2 PWM 调速控制概述 .................................................................................. 19

4.2.1 PWM 脉宽调制简介 .......................................................................... 19

4.2.2 PWM 调节的具体过程 ...................................................................... 19

4.3 系统程序的设计 . ........................................................................................ 20

4.3.1 程序设计步骤 . ................................................................................... 20

4.3.2 软件的安全冗余设置 . ....................................................................... 21

4.3.3 程序流程图 . ....................................................................................... 21

4.4 程序源代码 . ................................................................................................ 23 5 调试 ....................................................................................................................... 24

5.1 调试过程 . .................................................................................................... 24

5.2 电路检测 . .................................................................................................... 24

5.2.1 调试步骤 . ........................................................................................... 24

5.2.2 调试遇到的问题及解决方案 . ........................................................... 25

5.3 功能实现 . .................................................................................................... 25

结 论 ............................................................................................................................ 26

参考文献 ...................................................................................................................... 27

附录一 系统原理图 .................................................................................................... 28

附录二 程序源代码 .................................................................................................... 29 致 谢 ...................................................................................... 错误!未定义书签。

1 引 言

1.1 课题简介

水塔是在日常生活和工业应用中经常见到的蓄水装置,通过对其水位的控制对外供水以满足需要,其水位控制具有普遍性。水塔水位的单片机控制系统水塔水位控制在铁路、油田、化工等部门有着广泛的应用。水位控制在日常生活及工业领域中应用相当广泛,自动检测水位的检测系统能根据水位变化的情况自动调节。水塔供水的主要问题是塔内水位应始终保持在一定范围,避免“空塔”、“溢塔”现象发生。在水塔中的水位到达水位下限时自动启动电机,给水塔供水;在水塔水位达到正常水位的时候自动关闭电机,停止供水。并能在供水系统出现异常的时候能够发出警报,以及时排除故障,随时保证水塔的对外的正常供水作用。

在工业和我们的日常生活中,对水位的监测是非常必要的。大到对江河,水库等的水位,特别在洪灾或者旱灾的时候,需要及时得到第一手数据;小到对水箱,热水器水位等家用贮水容器的监测,可以减少很多危险和不必要的损[1]。现举一例:在煤矿的开采过程中,会产生大量的水。为了保证煤矿的安全和开采煤矿的正常进行,应将这些水通过水仓安全排放,因此不仅应控制水仓水位在一定的范围之内,同时要保持一定的上下限,超过了限度则报警,从而给其排水[2]。

目前,控制水塔水位方法较多,其中较为常用的是由单片机控制实现自动运行,使水塔内水位保持恒定,以保证连续正常地供水。实际供水过程中要确保水位在允许的范围内浮动,应采用水位传感器测量水位变化,从而控制电动机,保证水位正常[3]。因此,这里给出以STC89C52单片机为核心器件的水塔水位检测控制系统,该系统能实现水塔水位检测、LCD1602显示当前水位功能以及蜂鸣器鸣笛报警,手动按键调整PWM 电机调速功能,实现过低警戒水位报警、过低警戒水位处理的系统要求。

80年代以来,我国又发展了以自记遥测为主的水位测量技术。它主要是建立自记水位计,实现水位自动采集、存储、远传。同期,还发展了无人立尺观测技术,这种技术采用激光测距仪与经纬仪接口配套组成的一套设备,利用激光测距仪无须反射棱镜测定距离(测距精度:0~5m )的性能,配以经纬仪测角测定目标高程的一种测量方法。

随着近代科学技术的发展和新材料新器件的开发,采用传感器研制水位计近年来有较大发展[4]。主要采用的传感器有超声波、光电、压力、接触式、浮于式等几种。超声波式水位计是将换能器向水面发射超声波,测量超声波传播时间,计算出水位。压力式水位计也是不需要水位测并,其基本原理是测量静水压力来实现水深的测量,

已采用过波纹管和水银位移式压力传感器等方法。固态压力传感器由于其灵敏度高、体积小、寿命长、且有抗腐蚀性而受到重视,但由于半导体传感器受温度影响大等原因,使其实用受到限制。近年来固态传感器温度自动补偿问题有了进展,固态压阻式水位计已经得到应用[5]。接触式水位计使用机电的方法用探头跟踪井内水面高低变化测量水位,已在少数领域使用,浮子式水位计,利用水球(或其它浮子) 作敏感器件,避免了温度、湿度等因素的影晌,性能稳定,工作可靠,因而得到长期使用和发展。

我国使用的自记水位计,最常见的为浮子式水位计。近年来,由于土建工程费用不断上涨,无需水位量的压力式水位计随着现代技术的发展和进步也日趋稳定和成熟,致使人们越来越重视使用压力式水位计。

单片机自20世纪70年代问世以来,以极其高的性能价格比受到人们的重视和关注,所以应用很广,发展很快。单片机的特点是体积小、集成度高、重量轻、抗干扰能力强,对环境要求不高,价格低廉,可靠性高,灵活性好,开发较为容易。正因为单片机有如此多的优点,因此其应用领域之广,几乎到了无孔不入的地步[6]。在我国,单片机已被广泛地应用在工业自动化控制、自动检测、智能仪表、智能化家用电器、航空航天系统和和国防军事、尖端武器等各个方面。单片机的潜力越来越被人们所重视。特别是当前用CMOS 工艺制成的各种单片机,由于功耗低,使用的温度范围大,抗干扰能力强、能满足一些特殊要求的应用场合,更加扩大了单片机的应用范围,也进一步促使单片机性能的发展。我们可以开发利用单片机系统以获得很高的经济效益。虽然单片机的引入使控制系统大大“软化”,但与其它计算机应用问题相比,单片机控制应用中的硬件内容仍然较多,所以说单片机控制应用有软硬件相结合的特点。为此,在单片机的应用设计中需要软、硬件统筹考虑,设计者不但要熟练掌握汇编语言等编程技术,而且还要具备较扎实的单片机硬件方面的理论和实践知识。更重要的意义是单片机的应用改变了控制系统传统的设计思想和方法。以前采用硬件电路实现的大部分控制功能,正在用单片机通过软件方法来实现[7]。这种以软件结合硬件或取代硬件并能提高系统性能的控制技术称为微控制技术。例如,本文所要论述的基于单片机的水塔水位控制系统。

2 系统的整体方案设计

2.1 功能要求

实际供水过程中要确保水位在允许的范围内浮动,应采用水位传感器测量水位变化,从而控制电动机,保证水位正常。因此,这里给出以STC89C52单片机为核心器件的水塔水位检测控制系统,该系统能实现水塔水位检测、LCD1602显示当前水位功能以及蜂鸣器鸣笛报警,手动按键调整PWM 电机调速功能,实现过低和正常警戒水位报警、过低和正常警戒水位处理的系统要求。

2.2 设计要求

按下电源按钮后,灯会闪烁几下,然后是常亮状态,蜂鸣器会响。电机不会转的,此时系统在待机状态,且为正常状态。要先选择好电机的抽水速度是哪个档位,共有4个档位。档位越高,速度越快。在电机转的时候,按下选择档位,电机立马会停止的,这个是一个软件安全冗余的设计理念。电机在水位模拟传感器端口(低水位)按下后,说明水位太低,电机转动,此时蜂鸣器会响一下,灯会闪烁几下,以此表示报警,并且液晶也会显示水位太低。当水位模拟传感器端口(正常水位)按下后,说明水位已经到正常状态,电机停转,此时蜂鸣器也会响一下,灯一样会闪烁,以此表示报警,且液晶屏也会显示水位正常。而PWM 速度调整就是档位的选择,必须在电机停止的状态下去选择电机输出的速度。

2.3 系统基本方案选择和论证

此系统可以采用多种的方式设计,能采用液罐液压检测的方式来做,这样在不同的水位时因为有不同的压力值,所以我们可以根据不同的压力值来确定到底水位在某个状态,但是这样的系统设计理念用处比较狭窄,因为这样的设计理念的前提必须是一个液压的封闭系统,这样才能有精确的压力值传送,保证系统的稳定性。但是目前很多用到的水塔水位控制系统都不是封闭的水罐,所以这个方案有一定局限性。

而采用特殊的水位传感器,就可以克服上述的困难。因为液位检测器可以很精确的检测到液位系统,同样达到预期的目的,且系统的应用面很广,而且系统的安全性能很好,因此我们采取检测液位作为系统的设计思想。

2.3.1 单片机芯片的选择方案论证

目前市场上的单片机的种类有很多种,最多的51单片机、avr 单片机,和Msp430,以及PIC 单片机,但是由于单片机的种类很多,功能各不一样,我们不需要多先进,功能多强大的单片机,我们设计的要求就是够用即可,因为性能低劣了,系统功能实现不了,并且系统的稳定性很差,用的单片机性能太好了,由于高性能的单片机不只是价钱昂贵,且有很多资源都不会用到,这样造成了很大的浪费。因此我们选用目前市场上用到比较多的、且可以满足系统设计要求的51单片机。

因为Atmel 公司的51单片机需要专门的编程器,这样无形中加重了系统的成本,而STC 公司单片机不仅支持ISP, 还支持IAP 等多种下载程序的方式,并且STC 公司单片机工作在宽电压范围内,电压的波动对系统的影响不大,这样提高了系统的稳定性,另外STC 单片机的加密性能也由于其他单片机,并且STC 的单片机是增强型的51单片机[8]。因此我们选用STC89C52单片机作为系统的主控芯片。

2.3.2 显示模块选择方案论证

显示模块是系统的人机交互模块,增加了显示模块增加了系统的交互性。目前市场上用到的显示模块有很多种,有数码管显示,还有液晶显示,因为数码管只是显示数字,不能显示字符,而此系统需要用到显示当前的水位状态。这样就必须要用到字符显示的液晶显示器,液晶显示器也有很多种,但根据系统的需要我们选用的是LCD1602, 很大程度上增加了系统的人机交互功能,让使用者可以得到更多系统工作的信息,更方便的使用此系统。

3 系统的硬件设计

3.1 电路设计框图

系统的总体框图主要由主控芯片基本电路、按键电路、电动机和蜂鸣器驱动电路、液晶显示电路组成。除主控芯片电路外,其他的都是外围功能性电路。蜂鸣器和电动机电路驱动原理基本相同,都为三极管驱动电路,按键电路为平常的独立按键电路,液晶电路参考设计手册既可。电路设计框图如图3-1所示:

图3-1电路设计框图

3.2 MCU 主控芯片简介

3.2.1 主控制器芯片STC89C52概述

STC89C52是一款完全兼容8051内核指令的芯片,是宏晶科技公司的新一代增强性的8051单片机[9]。采用最新的加密技术解决了全球89系列单片机都被解密的困惑。并且管脚完全兼容,性能更好,驱动力更强,功耗更低,价格也比传统的89系列低[10]。STC89C52的引脚说明图如图3-1。STC89C52单片机的特点如下:

1. 增强性6时钟/机器周期,12时钟/机器周期 8051 CPU

2. 工作电压:5.5v-3,4v (5v 单片机)/3.8V-2.0V(3V单片机)

3. 工作频率范围:0-40MHZ, 相当于普通8051的0-80MHZ ,实际工作频率可达48MHZ

4. 用户应用程序空间4K/8K/13K/16K/20K/32K/64K,字节片上集成1280字节/512字节RAM

5. 通用I/O口(32//36个),复位后为:P1/P2/P3/P4是准双向口/若上拉(普通8051传统I/O口。P0口是开漏输出,作为总线扩展用时,不用加上拉电阻,作为I/0口用时,需要上拉电阻。

6.ISP (在系统可编程)/IAP(在应用可编程) ,无需专用编程器/仿真器可通过串口(P3.0/P3.1)之下载用户程序,8K 程序3秒即可完成一片。

7. 共三个16位定时器/计数器,其中定时器0还可以当成2个8为定时器使用

8. 外部中断4路,下降沿中断或低电平触发中断,Power Down 模式可由外部中断低电平触发中断方式唤醒

9. 通用异步串行口(UART ), 还可用定时器软件实现多个UART.

10. 内部Flash 擦写次数为100,000次以上,STC89C51RC/RD+ 系类单片机加密性强,出厂时就已经加密。

图3-2 STC89C52的引脚图说明

3.2.2 芯片下载程序

对于STC89C52的单片机而言,程序不需要专门的编程器或者仿真器去下载程序,而只是使用串口通讯的两个引脚就可以把程序烧写到程序里,十分方便简洁,并且有相关配套的官方软件,使用起来也十分方便[11]。图3-2是程序下载的线路连接图:

图3-3 程序下载线路连接图

3.3 液晶屏1602的简单介绍

3.3.1 液晶屏1602的简要概述

液晶显示器以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,在袖珍式仪表和低功耗应用系统中得到越来越广泛的应用[12]。 字符型液晶模块是一种用5×7点阵图形来显示字符的液晶显示器,根据显示的容量可以分为1行16个字、2行16个字、2行20个字等等。

字符型液晶显示模块是一类专用于显示字母、数字、符号等的点阵型液晶显示模块。之所以称字符型液晶显示模块是因为其液晶显示器件的电极图形是由若干个5×8或5×11点阵块组成的字符块集。每一个字符块是一个字符位,每一位都可以显示一个字符,字符位之间空有一个点距的间隔起着字符间距和行距的作用,这是其一;其二是这类模块使用的是专用于字符显示控制与驱动的IC 芯片[13]。这两种因素确定了这类模块的应用范围仅局限于字符而显示不了图形,所以称其为字符型液晶显示模块。

字符型液晶显示驱动控制器广泛应用于字符型液晶显示模块上。目前最常用的字符型液晶显示驱动控制器是HD44780U ,也出现使用HD667O1或HD66702等字符型液晶显示驱动控制器单片控制的字符型液晶显示模块。液晶显示驱动器为HD44100及其替代品。

字符型液晶显示模块在世界上是比较通用的,而且接口格式也是比较统一的,其主要原因可能是各制造商所采用的模块控制器都是HD44780U 及其兼容品,不管它的显示屏的尺寸如何,它的操作指令及其形成的模块接口信号定义都是兼容的。所以会使用一种字符型液晶显示模块,就会通晓所有的字符型液晶显示模块。

3.3.2 液晶屏1602的使用具体

液晶1602有三条控制线,RS/数据命令端,RW/读写选择端、EN/使能端,一个8位的数据端口。常用指令说明如表3-1:

表3-1常用指令说明

(一) 指令详细解释如下:

1). 该指令完成下列功能:

将空码(20H )写入 DDRAM的全部 80个单元内;

将地址指针计数器AC 清零,光标或闪烁归home 位;

设置输入方式参数 I/D=1,即地址指针 AC为自动加一输入方式。

该指令多用于上电时或更新全屏显示内容时。在使用该指令之前要确认DDRAM 的当前内容是否有用。

2). 归

该指令将地址指针计数器AC 清零。执行该指令的效果有;将光标或闪烁位返回到显示屏的左上第一字符位上,即DDRAM 地址00H 单元位置;这是因为光标和闪烁位都是以地址指针计数器 AC当前值定位的。如果画面已滚动,则撤消滚动效果,将画面拉回到home 位[14]。

3). 该指令的功能在于设置了显示字符的输入方式,即在计算机读/写DDRAM 或CGRAM 后,地址指针计数器AC 的修改方式,反映在显示效果上,当写入一个字符后画面或光标的移动。该指令的两个参数位 1/D 和 S确定了字符的输入方式。 I/D 表示当计算机读/写 DDRAM或 CGRAM的数据后,地址指针计数器 AC的修改方式,由于光标位置也是由AC 值确定,所以也是光标移动的方式。

I/D =0 AC为减1计数器,光标左移一个字符位。

I/D =1 AC为加 1计数器,光标右移一个字符位。

S 表示在写入字符时,是否允许显示画面的滚动。

S=0禁止滚动。

S=1允许滚动。

S=1且I /D =O 显示画面向右滚动一个字符位。

S=1且I /D =1显示画面向左滚动一个字符位。

4). 状态位分别控着画面,光标和闪烁的显示状态。

D 画面显示状态位。当D =1时为开显示,D =0时为关显示。注意关显示仅是画面不出现,而DDRAM 内容不变。这与清屏指令截然不同。

C 光标显示状态位。当C =1时为光标显示,C =0时为光标消失。光标为底线形式(5×1点阵),出现在第八行或第十一行上。光标的位置由地址指针计数器 AC确定,并随其变动而移动。当 AC值超出了画面的显示范围,光标将随之消失。

B 闪烁显示状态位。当B =l 时为闪烁启用,B =0时为闪烁禁止。闪烁是指一个字符位交替进行正常显示态和全亮显示态,闪烁频率在控制器工作频率为250kHz 时为2.4Hz 。闪烁位置同光标一样受地址指针计数器AC 的控制。闪烁出现在有字符

该指令控制着画面,光标及闪烁的开关。该指令有三个状态位D 、C 、B ,这三个

或光标显示的字符位时,正常显示态为当前字符或光标的显示;全亮显示态为该字符位所有点全显示。若出现在无字符或光标显示的字符位时,正常显示态为无显示,全亮显示态为该字符位所有点全显示。这种闪烁方式可以设计成块光标,如同计算机CRT 上块状光标闪烁提示符的效果。

5).

执行该指令将产生画面或光标向左或向右滚动一个字符位。如果定时间隔地执行该指令将产生画面或光标的平滑滚动。画面的滚动是在一行内连续循环进行的,也就是说一行的第一单元与最后一个单元连接起来,形成了闭环式的滚动[15]。当未开光标显示时,执行画面滚动指令时不修改地址指针计数器 AC值;有光标显示时,由于执行任意一条滚动指令时都将使光标产生位移,所以地址指针计数器AC 都需要被修改。光标的滚动是在DDRAM 内全程进行的,它不分是一行显示还是两行显示。如果用光标的指针——地址指针计数器AC 加一和减一功能来解释,就能理解光标从第1显示位左移至第80显示位,或从第80显示位右移至第1显示位原理了。光标的滚动功能可以用于搜寻需要修改的显示字符。

该指令有两个参数位:

1.S /C 滚动对象的选择

S /C =l 画面滚动

S /C =0光标滚动

2.R /L 滚动方向的选择

R /L =l 向右滚动

R /L =0向左滚动

该指令与输入方式设置指令都可以产生光标或画面的滚动,区别在于该指令专用于滚动功能,执行一次,显示呈现一次滚动效果;而输入方式设置指令仅是完成了一种字符输入方式的设置,仅在计算机对DDRAM 等进行操作时才能产生滚动的效果。

6).

该指令设置了控制器的工作方式,包括有控制器与计算机的接口形式和控制器显示驱动的占空比系数等。该指令有三个参数DL ,N 和F .它们的作用是:

DL设置控制器与计算机的接口形式。接口形式体现在数据总线长度上。

DL=1设置数据总线为8位长度,即DB7~DBO 有效。

DL=0设置数据总线为4位长度,即DB7~DB4有效。在该方式下8位指令代码和数据将按先高4位后低4位的顺序分两次传输。

N设置显示的字符行数。

N=0为一行字符行。

N=1为两行字符行。

F设置显示字符的字体。

F=0为5×7点阵字符体。

F=1为 5 × 10点阵字符体。

该指令可以说是字符型液晶显示控制器的初始化设置指令,也是唯一的软件复位指令。HD44780U 虽然具有复位电路,但为了可靠的工作,HD44780U 要求计算机在征作HD44780U 时首先对其进行软件复位。也就是说在控制字符型液晶显示模块工作时首先要进行的软件复位[16]。

该指令将6位的CGRAM 地址写入地址指针计数器AC 内,随后计算机对数据的操作是对 CGRAM的读/写操作。

8).DDRAM 该指令将 7位的DDRAM 地址写入地址指针计数器AC 内,随后计算机对数据的操作是对 DDRAM的读/写操作。

9). 计算机对指令寄存器通道读操作(RS =0,R /W =l )时,将读出此格式的“忙”标志BF 值和7位地址指针计数器AC 的当前值。计算机随时都可以对HD44780U 读“忙”操作。BP 值反映HD4478OU 的接口状态。计算机在对HD44780U 每次操作时首先都要读BF 值判断HD44780U 的当前接口状态,仅有在BF =01时计算机才可以向HD44780U 写指令代码或显示数据和从HD44780U 读出显示数据。

计算机读出的地址指针计数器AC 当前值可能是 DDRAM地址也可能是 CGRAM的地址,这取决于最近一次计算机向AC 写入的是哪类地址[17]。

10). 写数据(Write Data to CG or DD RAM)

计算机向数据寄存器通道写入数据,HD44780U 根据当前地址指针计数器AC 值的属性及数值将该数据送入相应的存储器内的AC 所指的单元里。如果AC 值为DDRAM 地址指针,则认为写人的数据为字符代码并进入DDRAM 内AC 所指的单元里;如果AC 值为CGRAM 的地址指针,则认为写入的数据是自定义字符的字模数据并送入 CGRAM内 AC所指的单元里[18]。所以计算机在写数据操作之前要先设置地址指针或人为的确认地址指针的属性及数值。在写人数据后地址指针计数器AC 将根据最近设置的输入方式自动修改。

由此可知,计算机在写数据操作之前要作两项工作,其一是设置或确认地址计数器AC 值的属性及数值,以保证所写数据能够正确到位;其二是设置或确认输入方式,以保证连续写入数据时AC 值的修改方式符合要求。

11). 读数据(Read Data from CG or DD RAM)

在HD44780U 的内部运行时序的操作下,地址指针计数器AC 的每一次修改,包括新的AC 值的写入,光标滚动位移所引起的AC 值的修改或由计算机读写数据操作后所产生的AC 值的修改,HD44780U 都会把当前AC 所指单元的内容送到接口部数据输出寄存器内,供计算机读取[19]。如果AC 值为DDRAM 地址指针,则认为接口部数据输出寄存器的数据为DDRAM 内 AC所指单元的字符代码;如果AC 值为CGRAM 的地址指针,则认为数据输出寄存器的数据是CGRAM 内AC 所指单元的自定义字符的字模数据。

计算机的读数据是从数据寄存器通道中数据输出寄存器读取当前所存放的数据。所以计算机在首次读数据操作之前需要重新设置一次地址指针AC 值,或用光标滚动指令将地址指针计数器AC 值修改到所需的地址上,然后进行的读数据操作将能获得所需的数据。在读取数据后地址指针计数器AC 将根据最近设置的输入方式自动修改。

由此可知,计算机在读数据操作之前要作两项工作,其一是设立或确认地址计数器AC 值的属性及数值,以保证所读数据的正确性。

3.4 系统功能电路

3.4.1 最小工作系统原理

图3-4 最小系统原理图

此图是单片机工作的最小系统原理图,在这个电路中又可以分为复位电路和晶振电路,如图3-4和图3-5所示:

图3-5复位电路

复位电路可以分为上电复位和手动按键复位两种。在系统上电的一瞬间单片机上电复位,原理是利用电容两端的电压不能突变,在一上电的瞬间电容好比短路,所以加在第九脚RST 的电平是高电平,虽然时间很短,但是足以让单片机系统复位。

手动按键复位的原理是,在系统正常工作的过程中可以手动触动按键使单片机复位。具体原理是,按下S1按键,因此5V 电压经过一个200欧姆的电阻分压后加到系统的RST 上,手动按键按下到抬起的过程足以使系统复位。

图3-6晶振电路

对于单片机系统而言,晶振电路就好比是人的心脏一样,是一个跳动的动力来源,18,19号引脚接的是11.0592M 的晶振。

3.4.2 蜂鸣器报警电路原理

图3-7蜂鸣器报警功能电路

蜂鸣器报警功能电路使用的是三极管8550驱动,三极管8550是PNP 三极管,射极接电源+5V,基极通过一个电阻连接到P1.0口,集电极接蜂鸣器,当P1.0为高电平时,三极管截止,蜂鸣器没有不响,当P1.0为低电平时,三极管导通,蜂鸣器发出响声。

3.4.3 电机驱动电路原理

图3-8电机驱动电路

电机驱动电路和蜂鸣器的电路基本相同,同样使用8550三极管驱动,三极管的基极接P1.1,当P1.1为高电平时,电机不转动,当P1.1为低电平时,电机转动。

3.4.4 按键功能电路原理

图3-9按键功能电路

按键功能电路里面有两种按键,一种按键是模仿水塔水位开关的功能按钮,一种是电机PWM 输出的调整按钮。原理是通过一个10k 的电阻接到+5v电源线上,当按键没有按下时,按键没有导通,所以没有电流,但对于连到引脚上的那一端来讲是高电平。当按键按下时,因为电路导通,有电流流过,和单片机引脚接触的那一端接地,所以是低电平。因此能检测到信号的变化,交给程序处理后做出相关的动作。

3.4.5 液晶1602显示功能电路图

图3-10液晶1602显示电路图

液晶1602从左到右依次有16根引脚,每个引脚定义不同。有三根控制引线和八根信号线,必须注意的一点是3号引脚是背光电源指示端。背光电阻选择的不同有不同的结果。我们这里选择2.7k 电阻做为背光电阻。

3.5 系统总体原理图设计

系统总体原理图即是这些功能电路的组合,主要包括最小系统电路、按键电路、电机和蜂鸣器驱动电路、液晶电路组成,还包括一个按键指示灯。详细电路见附录一。

4 系统的软件设计

4.1 编程语言介绍

4.1.1 C 语言简介

C 语言是在70年代初问世的。一九七八年由美国电话电报公司(AT&T)贝尔实验室正式发表了C 语言。同时由B.W.Kernighan 和D.M.Ritchit 合著了著名的“THE C PROGRAMMING LANGUAGE”一书[20]。通常简称为《K&R》,也有人称之为《K&R》标准。但是,在《K&R》中并没有定义一个完整的标准C 语言,后来由美国国家标准学会在此基础上制定了一个C 语言标准,于一九八三年发表。通常称之为ANSI C。

早期的C 语言主要是用于UNIX 系统。由于C 语言的强大功能和各方面的优点逐渐为人们认识,到了八十年代,C 开始进入其它操作系统,并很快在各类大、中、小和微型计算机上得到了广泛的使用。成为当代最优秀的程序设计语言之一。

C 语言是一种结构化语言。它层次清晰,便于按模块化方式组织程序,易于调试和维护。C 语言的表现能力和处理能力极强。它不仅具有丰富的运算符和数据类型,便于实现各类复杂的数据结构。它还可以直接访问内存的物理地址,进行位(bit)一级的操作。由于C 语言实现了对硬件的编程操作,因此C 语言集高级语言和低级语言的功能于一体。既可用于系统软件的开发,也适合于应用软件的开发。此外,C 语言还具有效率高,可移植性强等特点。因此广泛地移植到了各类各型计算机上,形成了多种版本的C 语言。

C 语言对操作系统和系统使用程序以及需要对硬件进行操作的场合,用C 语言明显优于其它高级语言,许多大型应用软件都是用C 语言编写的。

C语言具有绘图能力强,可移植性,并具备很强的数据处理能力,因此适于编写系统软件,三维,二维图形和动画它是数值计算的高级语言。

4.1.2 C 语言的特点

(1)简洁紧凑、灵活方便:C语言一共只有32个关键字,9种控制语句,程序书写自由,主要用小写字母表示。它把高级语言的基本结构和语句与低级语言的实用性结合起来。C 语言可以和汇编语言一样对位、字节和地址进行操作, 而这三者是计算机最基本的工作单元[21]。

(2)运算符丰富:C的运算符包含的范围很广泛,共有种34个运算符。C 语言把括号、赋值、强制类型转换等都作为运算符处理。从而使C 的运算类型极其丰富表达式类型多样化,灵活使用各种运算符可以实现在其它高级语言中难以实现的运算。

(3)数据结构丰富:C的数据类型有:整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等。能用来实现各种复杂的数据类型的运算。并引入了指针概念, 使程序效率更高。另外C 语言具有强大的图形功能, 支持多种显示器和驱动器。且计算功能、逻辑判断功能强大。

(4) C是结构式语言:结构式语言的显著特点是代码及数据的分隔化, 即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰, 便于使用、维护以及调试。C 语言是以函数形式提供给用户的, 这些函数可方便的调用, 并具有多种循环、条件语句控制程序流向, 从而使程序完全结构化。

(5) C语法限制不太严格、程序设计自由度大:一般的高级语言语法检查比较严,能够检查出几乎所有的语法错误。而C 语言允许程序编写者有较大的自由度。

(6) C语言允许直接访问物理地址,可以直接对硬件进行操作:因此既具有高级语言的功能,又具有低级语言的许多功能,能够象汇编语言一样对位、字节和地址进行操作, 而这三者是计算机最基本的工作单元,可以用来写系统软件。

(7) C语言程序生成代码质量高,程序执行效率高:一般只比汇编程序生成的目标代码效率低10へ20%。

(8) C 语言适用范围大,可移植性好:C语言有一个突出的优点就是适合于多种操作系统, 如DOS 、UNIX, 也适用于多种机型。

4.1.3 C 源程序的结构特点

(1)一个C 语言源程序可以由一个或多个源文件组成。

(2)每个源文件可由一个或多个函数组成。

(3)一个源程序不论由多少个文件组成,都有一个且只能有一个main 函数,即主函数。

(4)源程序中可以有预处理命令(include 命令仅为其中的一种) ,预处理命令通常应放在源文件或源程序的最前面。

(5)每一个说明,每一个语句都必须以分号结尾。但预处理命令,函数头和花括号“}”之后不能加分号。

(6)标识符,关键字之间必须至少加一个空格以示间隔。若已有明显的间隔符,也可不再加空格来间隔。

4.2 PWM 调速控制概述

4.2.1 PWM 脉宽调制简介

脉宽调制(PWM)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。

简而言之,PWM 是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM 信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM 进行编码。

随着电子技术的发展,出现了多种PWM 技术,其中包括:相电压控制PWM 、脉宽PWM 法、随机PWM 、SPWM 法、线电压控制PWM 等,而在镍氢电池智能充电器中采用的脉宽PWM 法,它是把每一脉冲宽度均相等的脉冲列作为PWM 波形,通过改变脉冲列的周期可以调频,改变脉冲的宽度或占空比可以调压,采用适当控制方法即可使电压与频率协调变化。可以通过调整PWM 的周期、PWM 的占空比而达到控制充电电流的目的。 模拟信号的值可以连续变化,其时间和幅度的分辨率都没有限制。9V 电池就是一种模拟器件,因为它的输出电压并不精确地等于9V ,而是随时间发生变化,并可取任何实数值。与此类似,从电池吸收的电流也不限定在一组可能的取值范围之内。模拟信号与数字信号的区别在于后者的取值通常只能属于预先确定的可能取值集合之内,例如在{0V, 5V}这一集合中取值。

尽管模拟控制看起来可能直观而简单,但它并不总是非常经济或可行的。其中一点就是,模拟电路容易随时间漂移,因而难以调节。能够解决这个问题的精密模拟电路可能非常庞大、笨重(如老式的家庭立体声设备) 和昂贵。模拟电路还有可能严重发热,其功耗相对于工作元件两端电压与电流的乘积成正比。模拟电路还可能对噪声很敏感,任何扰动或噪声都肯定会改变电流值的大小。

通过以数字方式控制模拟电路,可以大幅度降低系统的成本和功耗。此外,许多微控制器和DSP 已经在芯片上包含了PWM 控制器,这使数字控制的实现变得更加容易了。

4.2.2 PWM 调节的具体过程

脉冲宽度调制(PWM )是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM 信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有

(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的[22]。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM 进行编码。

多数负载(无论是电感性负载还是电容性负载) 需要的调制频率高于10Hz ,通常调制频率为1kHz 到200kHz 之间。

许多微控制器内部都包含有PWM 控制器。例如,Microchip 公司的PIC16C67内含两个PWM 控制器,每一个都可以选择接通时间和周期。占空比是接通时间与周期之比;调制频率为周期的倒数。执行PWM 操作之前,这种微处理器要求在软件中完成以下工作:

1、设置提供调制方波的片上定时器/计数器的周期。

2、 在PWM 控制寄存器中设置接通时间。

3、设置PWM 输出的方向,这个输出是一个通用I/O管脚。

4、启动定时器。

5、使能PWM 控制器。

4.3 系统程序的设计

4.3.1 程序设计步骤

程序设计就是用计算机所能接受的语言把所需解决问题的步骤逐一描述出来,也就是编制计算机的程序,在设计应用系统时,软件的编制是重要环节。软件的质量直接影响整个系统功能的实现。应用程序的设计因系统而异,但程序设计总是有共同特点及其规律的。在编写程序时,采取如下几个步骤:

(1)分析问题,明确所要解决问题的要求,将软件分成若干个相对独立的部分。根据功能关系和时序关系,设计出合理的软件总体结构。

(2)定程序框图,即根据所选择的计算方法制定框图,这不仅是程序设计的一个重要组成,而且是决定成败的关键部分。

(3)合理分配系统资源,包括定时器/计数器、中断、堆栈等。分配好单元后,进一步将程序框图画成详细的操作流程。

(4)根据程序的流程图和指令系统编写出程序。注意在程序的有关位置处写上功能注释,提高程序的可读性。

(5)程序调试。通过编辑软件编辑出的源程序,必须用编译程序汇编后生成目标代码。如果源程序有语法错误,需修改源文件后继续编译,直到无语法错误为止,然后利用目标代码通过仿真器进行程序调试,排除设计和编程中的错误直到成功。

(6)程序优化。使各功能程序模块化,子程序化,缩短程序的长度,加快运算速度和节省数据存储空间,减少程序执行的时间。

4.3.2 软件的安全冗余设置

因为是水塔水位自动控制系统,而且用到了电动机和调速,所以我们必须考虑系统的安全性能,在电机转动的时候去调动电机的转速是很危险的,所以我们要求要在电机停止的情况下去调节电机的速度。这样对人和对电机、整个系统都是必须的。所以在软件中我们做了安全的冗余设置,当电机在转动时按下电机调速键,电机会立即停止。

4.3.3 程序流程图

图4-1 PWM按键调整子程序流程图

图4-2程序总体流程图

在进入PWM 按键子程序后,首先要做的事是先检测是否确定有按键按下,这个过程延时15ms ,在确认有按键按下后,判断是哪一个按键按下,如果是速度加按键按下,电机不管在什么状态,都是首先停止,然后是调整PWM 调制时间,液晶屏显示速度增加,按下减按键,也是先停止电机,调整PWM 调制时间,液晶屏显示速度减少。具体流程图如图4-1所示。

当系统按下电源开关,且确定有电源存在时候,系统进入初始化状态,灯会闪烁、蜂鸣器响一声、液晶初始化, 初始化完以后,进入PWM 按键调速选择,如有按键按下,进入PWM 按键调整子程序,若没有,进入主程序等待状态,检测水塔水位的液位状态,当模拟液位低水位按键按下后,电机以显示速度启动,模拟抽水过程,此时蜂鸣器报警,灯闪烁,且液晶会显示水位过低状态。当模拟水位正常按键正常按键按下后,电机停止转动,蜂鸣器报警、液晶显示当前正常状态,然后程序进入循环,继续检测模拟水位状态按键。具体流程图的如图4-2所示。

4.4 程序源代码

程序源代码使用C 语言编写,使用C 语言编写程序效率高,调用方便。程序主要由LCD1602液晶驱动子程序,电机PWM 调速功能子程序、按键扫描子程序等功能程序组成,详细源代码见附录二。

5 调试

5.1 调试过程

本系统的调试主要分为硬件调试、软件调试等两大部分。经过初步的分析设计后,在制作硬件电路的同时,调试也在穿插进行。这样有利于问题的分析和解决,不会造成问题的积累,而且不会因为一个小问题而进行整体电路的检查,从而可以节约大量的调试时间。软件编程中,首先编写单元模块的程序,并且在硬件上调试成功问题,即可以做系统整体程序的调试。联机调试是最重要的一部分,同时也是本设计成功的关键。

5.2 电路检测

上电后观察电路工作性能,如不能正常工作,按原理图分模块进行电路检测,是否有虚焊或漏焊现象;如焊接正常,在按信号传递的方向逐级检测,找出出问题的一级,并向该级的上级进行检测,直到将故障排除。对于虚焊和漏焊的情况最好的办法是先找到一个比较大的电路回路,如果用的是指针式万用表,打到欧姆档1X10欧姆档就可以测,如果是指针摆到最右端,说明我们的线路连接是正常的!如果用的是数字万用表,我们可以调整到短路档位,接上要测的点直接就可以测,如果有蜂鸣响说明线路连接正常。

5.2.1 调试步骤

1. 元件安装前的测量:在元件没有在万能板上进行焊接的时候我们是不能直接拿过来就进行使用的,必须经过检测,像LED 灯可以用万用表测试一下看其是否会发光,测试三级管的好坏,器件的检测工作都要在焊接之前做好。

2. 调试按键输入部分:用万用表接到按键的信号输入端口,如果按键按下信号肯定会有变化,并且会在万用表上直接测试读出,这样直接通过硬件测量按键是否能打到预期的效果。

3.软件测试:写一个功能小程序,来具体单个的功能硬件电路是否有问题,如果有问题再具体看是硬件的问题还是软件的问题,若没有问题,则可以进行下一个功能电路的测试。

5.2.2 调试遇到的问题及解决方案

(一) .硬件问题解决方案:

1. LED灯通电不亮。主要查看是否把LED 灯的阴阳极接反。

2. 蜂鸣器不响。一是要查看蜂鸣器是否接反。而是看三极管8550驱动管是否损坏,具体的检测方法是首先看8550射极是否为高电压,如果为高电压继续,脱离单片机给基极一个低电平,此时蜂鸣器应该会响,但是若不响,电压档测量射极是否为低电平,若是,则需要具体找一个6v 直流电串上一个10k 的电阻进行直接通电,看蜂鸣器是否损坏。

3. 电机的原理和蜂鸣器的驱动原理基本一样。方法同上。

4.LCD1602不显示或者显示但是后面的对比度太差。对于LCD1602液晶有一个背光电源还有一个对比度的调节电阻,我们选用的是2k7的,一般选用10k 的可调电阻,来选择比较适合的液晶显示对比度。当然液晶的使用还是很有技巧性的,应该先写一个液晶的小功能子程序把液晶测试好。还有一个地方需要声明,如果要是用P0口接液晶的控制端口需要上拉10K 的电阻,因为51系列的单片机P0口是漏极开路电路,不然是没有任何控制指令控制液晶的。液晶的主要电路是接线多,所以如果发现问题,要细致的去看看每一根线是否接好。是否有虚焊或者短接的现象发生。

(二). 软件问题及解决方案:

1、LCD1602液晶的初始化时间及发送控制命令的等待时间要参考手册,并且用C 编程序很大的一个毛病就是时间不能很好的掌握,所以需要多做几次实验或者参考比较成熟的延时程序。

2. 按键按一下会跳好几个数字:这在软件中叫做按键的抖动,因为按键机械结构的原因,不可能滤除的很好,那么只能软件里防范. 检测到按键后延时一个15ms 的时间,然后再一次检测,如果按键确实按下,执行按键按下命令。然后在执行完程序后我们要做一个按键是否释放的检测,这样就能在软件里把这个按键的抖动问题比较好的处理掉。

5.3 功能实现

最后系统实现模拟供水过程中确保水位在允许的范围内浮动。LCD1602显示当前水位、蜂鸣器鸣笛报警,手动按键调整电机PWM 输出,低警戒水位报警并启动发动机,正常水位是报警停止等基本系统功能。

结 论

此课题属于设计类,在分析了设计任务后,查阅大量的资料和相关的书籍,最终选定了以SCT89C52单片机为核心控制器来进行系统设计。在本设计电路完成后,实现了基于单片机STC89C52的水塔水位模拟检测控制系统。该系统能实现水塔水位检测、LCD1602显示当前水位功能以及蜂鸣器鸣笛报警,手动按键调整PWM(Pulse Width Modulation) 电机调速功能,实现过低警戒水位报警、过低警戒水位自动处理的系统要求。系统程序语言是使用比较广泛的C 语言进行编写,结构清晰,达到的系统控制效果很好。了解并熟练掌握了液晶LCD1602的使用方法和具体的操作过程。清楚了目前液晶LCD1602的具体使用范围和一些市场开发的前景。通过PWM 电机调速完全可以适应在不同的用水场合下的用水速度需要,节省工作时间,提高了整体工作的效率,实现水塔水位的自动控制,节约了人力资源。

参考文献

[1]陈学煌,马俊. 电子自旋共振仪中嵌入单片机测控系统的设计[J].传感器技术,2005,24(12):61-63.

[2] 王建新,杨世凤,史永江,等. 系统测试中的软件抗干扰技术[J].国外电子测量技术,2005,24(10):18-20.

[3] 李刚民,曹巧媛. 单片机原理及使用技术[M].北京:高等教育出版社,2005.

[4] 徐爱钧.8051单片机实践教程[M].北京:电子工业出版社,2005.

[5] 胡汉才. 单片机原理及其接口技术[M].2版. 北京:清华大学出版社,2004.

[6] 周润景.PROTEUS 入门实用教程[M].北京:机械工业出版社,2007.

[7] 徐模辉.Protues 单片机仿真中的uC/OS-II移植[J].单片机与嵌入式系2007

(10):74-76.

[8] 丁元杰 单片微机原理及应用 机械工业出版社 2000

[9] 腾召胜 罗隆福 智能检测系统与数据融合 机械工业出版社 2000

[10] 孙虎章 自动控制原理 中央广播电视大学出版社 1999

[11]《单片微型计算机技术》 刘国荣 编 机械工业出版社

[12]《单片微型计算机原理、应用及接口技术》 张迎新 编 国防工业出版社

[13]《单片机实用系统设计技术》 房小翠 编 国防工业出版社

[14]《单片机应用系统设计》 何立民 编 北航出版社

[15]《单片机原理及接口技术》 曹琳琳编 国防科技大学出版社

[16] [美] Intel: Microcontroller Handbook,1988.

[17] ATME L. CORPORATION. AT90S8515.REV72001.

[18] Joe Campbell. 串行通信C 程序指南[M] . 北京:清华大学出版社,1995:31-32.

[19] [德]克劳斯·贝伊特. 电子元件[M].北京:北京科技出版设,1999.

[20] 超星数字图书馆. http://www.ssreader.com.cn

[21] 中国电子网. http://www.21ic.com

[22]《软件世界》杂志. http://www.softwareworld.com.cn

附录一 系统原理图

附录二 程序源代码

#include

#define uint unsigned int

#define uchar unsigned char

sbit led=P0^1; //led灯显示, 低电平亮

sbit speaker=P1^0; //蜂鸣器,低电平报警

sbit lcd_rs=P0^7; //1602数据选择命令端

sbit lcd_rw=P0^6;

sbit key_up=P3^0; //pwm速度调整端口,电机速度加一

sbit key_down=P3^1; //pwm速度调整端口,电机速度减一

sbit monter=P1^1;//电机驱动端口,pwm 控制输出

sbit water_normal=P1^6;//水位过高传感器模拟按键端口,低电平报警

sbit water_low=P1^7;//水位过低传感器模拟按键端口,低电平报警

uchar code pwm_t[]={45,90,100,130};//模式下的pwm 值,人为已经设定的时间是100,可以调整上限值

uint model=1,pwmT=150,time_count=0;

void key_scan(); //按键扫描函数

void check_water_level(); //检测水位是否正常函数

void delay(uint z) //延时函数

{ uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

//1602读写选择端 sbit lcd_enable=P0^5; //1602 使能端定义

//*******************1602液晶显示函数************************// void lcd_write_comd(uchar comd) //1602写指令函数

{ lcd_rs=0; //选择指令

lcd_rw=0; //选择写

}

void lcd_write_data(uchar date) //1602写数据函数

{

}

void lcd_set_xy(uchar x,uchar y) //定位具体位置

{ uint address;

if(y==1)

address=0x80+x; //第一行的位置

}

delay(5); P2=comd; //取命令 lcd_enable=1; //使能有效 delay(8); lcd_enable=0; delay(8); lcd_rs=1; delay(5); P2=date; delay(8); //选择数据 //选择写操作 //取数据操作 //使能有效 lcd_rw=0; lcd_enable=1; delay(8); lcd_enable=0; else address=0xc0+x; //第二行的位置 lcd_write_comd(address);

void lcd_write_char(uchar x,uchar y,uchar date)

{

lcd_set_xy(x,y); //设定位置

} lcd_write_data(date); //写入数据 //写一个字符函数

void lcd_write_string(uchar x,uchar y,uchar *s) // 写一个字符串函数

{

while(*s)

}

//********电机PWM 调速函数及程序主函数*******//

void init() //初始化函数

{ uchar i,count=25;

led=1;

{

led=~led; delay(count); }

count=count+5; //开机led 灯闪烁 for(i=0;i

lcd_write_comd(0x38);//设置16*2行显示,5*7点阵,8位数据接口 lcd_write_comd(0x0c); //开显示

lcd_write_comd(0x01); //清屏

lcd_write_comd(0x80); //设定初始位置

lcd_write_string(0,1,"Water Lev:Normal");

lcd_write_string(0,0,"Monter Speed: 1");

speaker=0; //蜂鸣器鸣响一声

delay(1000);

speaker=1;

//定时0,定时时间为150us ,工作在方式2

//开总中断

//开定时器0的中断

//定时器0不启动 TMOD=0X02; TL0=TH0; EA=1; ET0=1;

}

void main() //主函数

{ init();

while(1)

}

void timre_0() interrupt 1

{ time_count++;

if(time_count==pwmT) //和PWM 脉宽的时间比较,时间到了定时器清零,重新开始

{ time_count=0;

}

if(time_count

{

monter=0; } {

TH0=(256-150)%256; TR0=0; { key_scan(); check_water_level(); //检测水位是否正常函数 } //定时器0的中断子函数 else

}

monter=1; }

void check_water_level() //检测水位是否正常函数 { uchar i;

if(water_low==0) //水位过低检测 { led=1; TR0=1; //开启电机 monter=0; speaker=0; //蜂鸣器报警 lcd_write_string(0,1,"Water Lev:Normal");//液晶屏显示 for(i=0;i

} speaker=1; }

void key_scan() //按键扫描函数 { uchar i;

if(key_up==0)

} model++; if(model==5) model=1; i=model+0x30; //按键是否释放检测 //pwm速度定制值调整加大 { delay(15); if(key_up==0) { TR0=0; // 有按键按下,电机一定要停止转动 //检测是否增加按键按下 lcd_write_char(14,0,i); //液晶显示变化 while(!key_up); } } if(key_down==0) { delay(15); if(key_down==0) { T R0=0; // 有按键按下,电机一定要停止转动 //pwm速度定制值调整减少 model--; if(model==0) model=4; i=model+0x30; //液晶显示变化 //按键是否释放检测 //检测是否减少按键按下 lcd_write_char(14,0,i); while(!key_down); } }

摘 要

水塔是在日常生活和工业应用中经常见到的蓄水装置,基于单片机的水塔水位控制系统使水塔水位自动保持在一定的位置,通过对其水位的控制对外供水,以满足需要。该系统使用水位传感器对水塔水位进行检测并将检测到的信号传给单片机STC89C52进行处理,通过调整定时器的定时时间来增大或者缩小占空比,并采用C 语言编写控制程序,从而实现电机的调速。最后,使用带字库的LCD1602液晶屏显示当前水位状态以及电动机的转速。该系统实现了过低水位蜂鸣器鸣笛报警、过低警戒水位自动处理、正常水位蜂鸣器鸣笛报警以及正常水位处理、手动按键调整PWM(Pulse Width Modulation)电机调速等功能。本系统适应在不同的用水场合下的用水速度需要,节省工作时间,提高了整体工作的效率,实现水塔水位的自动控制。

关键词:单片机控制;水位检测;LCD1602显示;PWM 电机调速

ABSTRACT

The water tower is commonly seen in daily life and industrial as application of storage device. The system is based on single-chip microcomputer control system help to keep water towers in certain water level and according to the automatic level of control to supply the needs of water. Water level sensor is used for towers on the examination detect signal and transfer the signal to STC89C52 , through the adjustment of the time to increase or narrow the duty ratio, and using C language program, so as to realize the compilation control of motor speed. Finally, current levels and motor speed are shown with 1602 LCD screen in this system. This system realizes the buzzer low level alarm, low whistle warning level automatic processing, normal level alarm or normal water buzzer sirens and manual buttons Pulse Width Modulation. This system realizes the automatic control in different water situation of water to save the working time, speed, and also improves the overall efficiency of water towers.

Key Words:SCM control; Water detection; LCD1602 display; PWM motor speed;

目 录

1

2 引 言 ....................................................................................................................... 1 1.1 课题简介 . ...................................................................................................... 1 系统的整体方案设计 ............................................................................................. 3

2.1 功能要求 . ...................................................................................................... 3

2.2 设计要求 . ...................................................................................................... 3

2.3 系统基本方案选择和论证 . .......................................................................... 3

2.3.1 单片机芯片的选择方案论证 . ............................................................. 4

2.3.2 显示模块选择方案论证 . ..................................................................... 4

3 系统的硬件设计 ..................................................................................................... 5

3.1 电路设计框图 . .............................................................................................. 5

3.2 MCU 主控芯片简介..................................................................................... 5

3.2.1 主控制器芯片STC89C52概述 . ......................................................... 5

3.2.2 芯片下载程序 . ..................................................................................... 7

3.3 液晶屏1602的简单介绍 . ............................................................................ 7

3.3.1 液晶屏1602的简要概述 . ................................................................... 7

3.3.2 液晶屏1602的使用具体 . ................................................................... 8

3.4 系统功能电路 . ............................................................................................ 12

3.4.1 最小工作系统原理 . ........................................................................... 12

3.4.2 蜂鸣器报警电路原理 . ....................................................................... 14

3.4.3 电机驱动电路原理 . ........................................................................... 14

3.4.4 按键功能电路原理 . ........................................................................... 15

3.4.5 液晶1602显示功能电路图 . ............................................................. 15

3.5 系统总体原理图设计 . ................................................................................ 16 4 系统的软件设计 ................................................................................................... 17

4.1 编程语言介绍 . ............................................................................................ 17

4.1.1 C 语言简介 ......................................................................................... 17

4.1.2 C 语言的特点 ..................................................................................... 17

4.1.3 C 源程序的结构特点 ......................................................................... 18

4.2 PWM 调速控制概述 .................................................................................. 19

4.2.1 PWM 脉宽调制简介 .......................................................................... 19

4.2.2 PWM 调节的具体过程 ...................................................................... 19

4.3 系统程序的设计 . ........................................................................................ 20

4.3.1 程序设计步骤 . ................................................................................... 20

4.3.2 软件的安全冗余设置 . ....................................................................... 21

4.3.3 程序流程图 . ....................................................................................... 21

4.4 程序源代码 . ................................................................................................ 23 5 调试 ....................................................................................................................... 24

5.1 调试过程 . .................................................................................................... 24

5.2 电路检测 . .................................................................................................... 24

5.2.1 调试步骤 . ........................................................................................... 24

5.2.2 调试遇到的问题及解决方案 . ........................................................... 25

5.3 功能实现 . .................................................................................................... 25

结 论 ............................................................................................................................ 26

参考文献 ...................................................................................................................... 27

附录一 系统原理图 .................................................................................................... 28

附录二 程序源代码 .................................................................................................... 29 致 谢 ...................................................................................... 错误!未定义书签。

1 引 言

1.1 课题简介

水塔是在日常生活和工业应用中经常见到的蓄水装置,通过对其水位的控制对外供水以满足需要,其水位控制具有普遍性。水塔水位的单片机控制系统水塔水位控制在铁路、油田、化工等部门有着广泛的应用。水位控制在日常生活及工业领域中应用相当广泛,自动检测水位的检测系统能根据水位变化的情况自动调节。水塔供水的主要问题是塔内水位应始终保持在一定范围,避免“空塔”、“溢塔”现象发生。在水塔中的水位到达水位下限时自动启动电机,给水塔供水;在水塔水位达到正常水位的时候自动关闭电机,停止供水。并能在供水系统出现异常的时候能够发出警报,以及时排除故障,随时保证水塔的对外的正常供水作用。

在工业和我们的日常生活中,对水位的监测是非常必要的。大到对江河,水库等的水位,特别在洪灾或者旱灾的时候,需要及时得到第一手数据;小到对水箱,热水器水位等家用贮水容器的监测,可以减少很多危险和不必要的损[1]。现举一例:在煤矿的开采过程中,会产生大量的水。为了保证煤矿的安全和开采煤矿的正常进行,应将这些水通过水仓安全排放,因此不仅应控制水仓水位在一定的范围之内,同时要保持一定的上下限,超过了限度则报警,从而给其排水[2]。

目前,控制水塔水位方法较多,其中较为常用的是由单片机控制实现自动运行,使水塔内水位保持恒定,以保证连续正常地供水。实际供水过程中要确保水位在允许的范围内浮动,应采用水位传感器测量水位变化,从而控制电动机,保证水位正常[3]。因此,这里给出以STC89C52单片机为核心器件的水塔水位检测控制系统,该系统能实现水塔水位检测、LCD1602显示当前水位功能以及蜂鸣器鸣笛报警,手动按键调整PWM 电机调速功能,实现过低警戒水位报警、过低警戒水位处理的系统要求。

80年代以来,我国又发展了以自记遥测为主的水位测量技术。它主要是建立自记水位计,实现水位自动采集、存储、远传。同期,还发展了无人立尺观测技术,这种技术采用激光测距仪与经纬仪接口配套组成的一套设备,利用激光测距仪无须反射棱镜测定距离(测距精度:0~5m )的性能,配以经纬仪测角测定目标高程的一种测量方法。

随着近代科学技术的发展和新材料新器件的开发,采用传感器研制水位计近年来有较大发展[4]。主要采用的传感器有超声波、光电、压力、接触式、浮于式等几种。超声波式水位计是将换能器向水面发射超声波,测量超声波传播时间,计算出水位。压力式水位计也是不需要水位测并,其基本原理是测量静水压力来实现水深的测量,

已采用过波纹管和水银位移式压力传感器等方法。固态压力传感器由于其灵敏度高、体积小、寿命长、且有抗腐蚀性而受到重视,但由于半导体传感器受温度影响大等原因,使其实用受到限制。近年来固态传感器温度自动补偿问题有了进展,固态压阻式水位计已经得到应用[5]。接触式水位计使用机电的方法用探头跟踪井内水面高低变化测量水位,已在少数领域使用,浮子式水位计,利用水球(或其它浮子) 作敏感器件,避免了温度、湿度等因素的影晌,性能稳定,工作可靠,因而得到长期使用和发展。

我国使用的自记水位计,最常见的为浮子式水位计。近年来,由于土建工程费用不断上涨,无需水位量的压力式水位计随着现代技术的发展和进步也日趋稳定和成熟,致使人们越来越重视使用压力式水位计。

单片机自20世纪70年代问世以来,以极其高的性能价格比受到人们的重视和关注,所以应用很广,发展很快。单片机的特点是体积小、集成度高、重量轻、抗干扰能力强,对环境要求不高,价格低廉,可靠性高,灵活性好,开发较为容易。正因为单片机有如此多的优点,因此其应用领域之广,几乎到了无孔不入的地步[6]。在我国,单片机已被广泛地应用在工业自动化控制、自动检测、智能仪表、智能化家用电器、航空航天系统和和国防军事、尖端武器等各个方面。单片机的潜力越来越被人们所重视。特别是当前用CMOS 工艺制成的各种单片机,由于功耗低,使用的温度范围大,抗干扰能力强、能满足一些特殊要求的应用场合,更加扩大了单片机的应用范围,也进一步促使单片机性能的发展。我们可以开发利用单片机系统以获得很高的经济效益。虽然单片机的引入使控制系统大大“软化”,但与其它计算机应用问题相比,单片机控制应用中的硬件内容仍然较多,所以说单片机控制应用有软硬件相结合的特点。为此,在单片机的应用设计中需要软、硬件统筹考虑,设计者不但要熟练掌握汇编语言等编程技术,而且还要具备较扎实的单片机硬件方面的理论和实践知识。更重要的意义是单片机的应用改变了控制系统传统的设计思想和方法。以前采用硬件电路实现的大部分控制功能,正在用单片机通过软件方法来实现[7]。这种以软件结合硬件或取代硬件并能提高系统性能的控制技术称为微控制技术。例如,本文所要论述的基于单片机的水塔水位控制系统。

2 系统的整体方案设计

2.1 功能要求

实际供水过程中要确保水位在允许的范围内浮动,应采用水位传感器测量水位变化,从而控制电动机,保证水位正常。因此,这里给出以STC89C52单片机为核心器件的水塔水位检测控制系统,该系统能实现水塔水位检测、LCD1602显示当前水位功能以及蜂鸣器鸣笛报警,手动按键调整PWM 电机调速功能,实现过低和正常警戒水位报警、过低和正常警戒水位处理的系统要求。

2.2 设计要求

按下电源按钮后,灯会闪烁几下,然后是常亮状态,蜂鸣器会响。电机不会转的,此时系统在待机状态,且为正常状态。要先选择好电机的抽水速度是哪个档位,共有4个档位。档位越高,速度越快。在电机转的时候,按下选择档位,电机立马会停止的,这个是一个软件安全冗余的设计理念。电机在水位模拟传感器端口(低水位)按下后,说明水位太低,电机转动,此时蜂鸣器会响一下,灯会闪烁几下,以此表示报警,并且液晶也会显示水位太低。当水位模拟传感器端口(正常水位)按下后,说明水位已经到正常状态,电机停转,此时蜂鸣器也会响一下,灯一样会闪烁,以此表示报警,且液晶屏也会显示水位正常。而PWM 速度调整就是档位的选择,必须在电机停止的状态下去选择电机输出的速度。

2.3 系统基本方案选择和论证

此系统可以采用多种的方式设计,能采用液罐液压检测的方式来做,这样在不同的水位时因为有不同的压力值,所以我们可以根据不同的压力值来确定到底水位在某个状态,但是这样的系统设计理念用处比较狭窄,因为这样的设计理念的前提必须是一个液压的封闭系统,这样才能有精确的压力值传送,保证系统的稳定性。但是目前很多用到的水塔水位控制系统都不是封闭的水罐,所以这个方案有一定局限性。

而采用特殊的水位传感器,就可以克服上述的困难。因为液位检测器可以很精确的检测到液位系统,同样达到预期的目的,且系统的应用面很广,而且系统的安全性能很好,因此我们采取检测液位作为系统的设计思想。

2.3.1 单片机芯片的选择方案论证

目前市场上的单片机的种类有很多种,最多的51单片机、avr 单片机,和Msp430,以及PIC 单片机,但是由于单片机的种类很多,功能各不一样,我们不需要多先进,功能多强大的单片机,我们设计的要求就是够用即可,因为性能低劣了,系统功能实现不了,并且系统的稳定性很差,用的单片机性能太好了,由于高性能的单片机不只是价钱昂贵,且有很多资源都不会用到,这样造成了很大的浪费。因此我们选用目前市场上用到比较多的、且可以满足系统设计要求的51单片机。

因为Atmel 公司的51单片机需要专门的编程器,这样无形中加重了系统的成本,而STC 公司单片机不仅支持ISP, 还支持IAP 等多种下载程序的方式,并且STC 公司单片机工作在宽电压范围内,电压的波动对系统的影响不大,这样提高了系统的稳定性,另外STC 单片机的加密性能也由于其他单片机,并且STC 的单片机是增强型的51单片机[8]。因此我们选用STC89C52单片机作为系统的主控芯片。

2.3.2 显示模块选择方案论证

显示模块是系统的人机交互模块,增加了显示模块增加了系统的交互性。目前市场上用到的显示模块有很多种,有数码管显示,还有液晶显示,因为数码管只是显示数字,不能显示字符,而此系统需要用到显示当前的水位状态。这样就必须要用到字符显示的液晶显示器,液晶显示器也有很多种,但根据系统的需要我们选用的是LCD1602, 很大程度上增加了系统的人机交互功能,让使用者可以得到更多系统工作的信息,更方便的使用此系统。

3 系统的硬件设计

3.1 电路设计框图

系统的总体框图主要由主控芯片基本电路、按键电路、电动机和蜂鸣器驱动电路、液晶显示电路组成。除主控芯片电路外,其他的都是外围功能性电路。蜂鸣器和电动机电路驱动原理基本相同,都为三极管驱动电路,按键电路为平常的独立按键电路,液晶电路参考设计手册既可。电路设计框图如图3-1所示:

图3-1电路设计框图

3.2 MCU 主控芯片简介

3.2.1 主控制器芯片STC89C52概述

STC89C52是一款完全兼容8051内核指令的芯片,是宏晶科技公司的新一代增强性的8051单片机[9]。采用最新的加密技术解决了全球89系列单片机都被解密的困惑。并且管脚完全兼容,性能更好,驱动力更强,功耗更低,价格也比传统的89系列低[10]。STC89C52的引脚说明图如图3-1。STC89C52单片机的特点如下:

1. 增强性6时钟/机器周期,12时钟/机器周期 8051 CPU

2. 工作电压:5.5v-3,4v (5v 单片机)/3.8V-2.0V(3V单片机)

3. 工作频率范围:0-40MHZ, 相当于普通8051的0-80MHZ ,实际工作频率可达48MHZ

4. 用户应用程序空间4K/8K/13K/16K/20K/32K/64K,字节片上集成1280字节/512字节RAM

5. 通用I/O口(32//36个),复位后为:P1/P2/P3/P4是准双向口/若上拉(普通8051传统I/O口。P0口是开漏输出,作为总线扩展用时,不用加上拉电阻,作为I/0口用时,需要上拉电阻。

6.ISP (在系统可编程)/IAP(在应用可编程) ,无需专用编程器/仿真器可通过串口(P3.0/P3.1)之下载用户程序,8K 程序3秒即可完成一片。

7. 共三个16位定时器/计数器,其中定时器0还可以当成2个8为定时器使用

8. 外部中断4路,下降沿中断或低电平触发中断,Power Down 模式可由外部中断低电平触发中断方式唤醒

9. 通用异步串行口(UART ), 还可用定时器软件实现多个UART.

10. 内部Flash 擦写次数为100,000次以上,STC89C51RC/RD+ 系类单片机加密性强,出厂时就已经加密。

图3-2 STC89C52的引脚图说明

3.2.2 芯片下载程序

对于STC89C52的单片机而言,程序不需要专门的编程器或者仿真器去下载程序,而只是使用串口通讯的两个引脚就可以把程序烧写到程序里,十分方便简洁,并且有相关配套的官方软件,使用起来也十分方便[11]。图3-2是程序下载的线路连接图:

图3-3 程序下载线路连接图

3.3 液晶屏1602的简单介绍

3.3.1 液晶屏1602的简要概述

液晶显示器以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,在袖珍式仪表和低功耗应用系统中得到越来越广泛的应用[12]。 字符型液晶模块是一种用5×7点阵图形来显示字符的液晶显示器,根据显示的容量可以分为1行16个字、2行16个字、2行20个字等等。

字符型液晶显示模块是一类专用于显示字母、数字、符号等的点阵型液晶显示模块。之所以称字符型液晶显示模块是因为其液晶显示器件的电极图形是由若干个5×8或5×11点阵块组成的字符块集。每一个字符块是一个字符位,每一位都可以显示一个字符,字符位之间空有一个点距的间隔起着字符间距和行距的作用,这是其一;其二是这类模块使用的是专用于字符显示控制与驱动的IC 芯片[13]。这两种因素确定了这类模块的应用范围仅局限于字符而显示不了图形,所以称其为字符型液晶显示模块。

字符型液晶显示驱动控制器广泛应用于字符型液晶显示模块上。目前最常用的字符型液晶显示驱动控制器是HD44780U ,也出现使用HD667O1或HD66702等字符型液晶显示驱动控制器单片控制的字符型液晶显示模块。液晶显示驱动器为HD44100及其替代品。

字符型液晶显示模块在世界上是比较通用的,而且接口格式也是比较统一的,其主要原因可能是各制造商所采用的模块控制器都是HD44780U 及其兼容品,不管它的显示屏的尺寸如何,它的操作指令及其形成的模块接口信号定义都是兼容的。所以会使用一种字符型液晶显示模块,就会通晓所有的字符型液晶显示模块。

3.3.2 液晶屏1602的使用具体

液晶1602有三条控制线,RS/数据命令端,RW/读写选择端、EN/使能端,一个8位的数据端口。常用指令说明如表3-1:

表3-1常用指令说明

(一) 指令详细解释如下:

1). 该指令完成下列功能:

将空码(20H )写入 DDRAM的全部 80个单元内;

将地址指针计数器AC 清零,光标或闪烁归home 位;

设置输入方式参数 I/D=1,即地址指针 AC为自动加一输入方式。

该指令多用于上电时或更新全屏显示内容时。在使用该指令之前要确认DDRAM 的当前内容是否有用。

2). 归

该指令将地址指针计数器AC 清零。执行该指令的效果有;将光标或闪烁位返回到显示屏的左上第一字符位上,即DDRAM 地址00H 单元位置;这是因为光标和闪烁位都是以地址指针计数器 AC当前值定位的。如果画面已滚动,则撤消滚动效果,将画面拉回到home 位[14]。

3). 该指令的功能在于设置了显示字符的输入方式,即在计算机读/写DDRAM 或CGRAM 后,地址指针计数器AC 的修改方式,反映在显示效果上,当写入一个字符后画面或光标的移动。该指令的两个参数位 1/D 和 S确定了字符的输入方式。 I/D 表示当计算机读/写 DDRAM或 CGRAM的数据后,地址指针计数器 AC的修改方式,由于光标位置也是由AC 值确定,所以也是光标移动的方式。

I/D =0 AC为减1计数器,光标左移一个字符位。

I/D =1 AC为加 1计数器,光标右移一个字符位。

S 表示在写入字符时,是否允许显示画面的滚动。

S=0禁止滚动。

S=1允许滚动。

S=1且I /D =O 显示画面向右滚动一个字符位。

S=1且I /D =1显示画面向左滚动一个字符位。

4). 状态位分别控着画面,光标和闪烁的显示状态。

D 画面显示状态位。当D =1时为开显示,D =0时为关显示。注意关显示仅是画面不出现,而DDRAM 内容不变。这与清屏指令截然不同。

C 光标显示状态位。当C =1时为光标显示,C =0时为光标消失。光标为底线形式(5×1点阵),出现在第八行或第十一行上。光标的位置由地址指针计数器 AC确定,并随其变动而移动。当 AC值超出了画面的显示范围,光标将随之消失。

B 闪烁显示状态位。当B =l 时为闪烁启用,B =0时为闪烁禁止。闪烁是指一个字符位交替进行正常显示态和全亮显示态,闪烁频率在控制器工作频率为250kHz 时为2.4Hz 。闪烁位置同光标一样受地址指针计数器AC 的控制。闪烁出现在有字符

该指令控制着画面,光标及闪烁的开关。该指令有三个状态位D 、C 、B ,这三个

或光标显示的字符位时,正常显示态为当前字符或光标的显示;全亮显示态为该字符位所有点全显示。若出现在无字符或光标显示的字符位时,正常显示态为无显示,全亮显示态为该字符位所有点全显示。这种闪烁方式可以设计成块光标,如同计算机CRT 上块状光标闪烁提示符的效果。

5).

执行该指令将产生画面或光标向左或向右滚动一个字符位。如果定时间隔地执行该指令将产生画面或光标的平滑滚动。画面的滚动是在一行内连续循环进行的,也就是说一行的第一单元与最后一个单元连接起来,形成了闭环式的滚动[15]。当未开光标显示时,执行画面滚动指令时不修改地址指针计数器 AC值;有光标显示时,由于执行任意一条滚动指令时都将使光标产生位移,所以地址指针计数器AC 都需要被修改。光标的滚动是在DDRAM 内全程进行的,它不分是一行显示还是两行显示。如果用光标的指针——地址指针计数器AC 加一和减一功能来解释,就能理解光标从第1显示位左移至第80显示位,或从第80显示位右移至第1显示位原理了。光标的滚动功能可以用于搜寻需要修改的显示字符。

该指令有两个参数位:

1.S /C 滚动对象的选择

S /C =l 画面滚动

S /C =0光标滚动

2.R /L 滚动方向的选择

R /L =l 向右滚动

R /L =0向左滚动

该指令与输入方式设置指令都可以产生光标或画面的滚动,区别在于该指令专用于滚动功能,执行一次,显示呈现一次滚动效果;而输入方式设置指令仅是完成了一种字符输入方式的设置,仅在计算机对DDRAM 等进行操作时才能产生滚动的效果。

6).

该指令设置了控制器的工作方式,包括有控制器与计算机的接口形式和控制器显示驱动的占空比系数等。该指令有三个参数DL ,N 和F .它们的作用是:

DL设置控制器与计算机的接口形式。接口形式体现在数据总线长度上。

DL=1设置数据总线为8位长度,即DB7~DBO 有效。

DL=0设置数据总线为4位长度,即DB7~DB4有效。在该方式下8位指令代码和数据将按先高4位后低4位的顺序分两次传输。

N设置显示的字符行数。

N=0为一行字符行。

N=1为两行字符行。

F设置显示字符的字体。

F=0为5×7点阵字符体。

F=1为 5 × 10点阵字符体。

该指令可以说是字符型液晶显示控制器的初始化设置指令,也是唯一的软件复位指令。HD44780U 虽然具有复位电路,但为了可靠的工作,HD44780U 要求计算机在征作HD44780U 时首先对其进行软件复位。也就是说在控制字符型液晶显示模块工作时首先要进行的软件复位[16]。

该指令将6位的CGRAM 地址写入地址指针计数器AC 内,随后计算机对数据的操作是对 CGRAM的读/写操作。

8).DDRAM 该指令将 7位的DDRAM 地址写入地址指针计数器AC 内,随后计算机对数据的操作是对 DDRAM的读/写操作。

9). 计算机对指令寄存器通道读操作(RS =0,R /W =l )时,将读出此格式的“忙”标志BF 值和7位地址指针计数器AC 的当前值。计算机随时都可以对HD44780U 读“忙”操作。BP 值反映HD4478OU 的接口状态。计算机在对HD44780U 每次操作时首先都要读BF 值判断HD44780U 的当前接口状态,仅有在BF =01时计算机才可以向HD44780U 写指令代码或显示数据和从HD44780U 读出显示数据。

计算机读出的地址指针计数器AC 当前值可能是 DDRAM地址也可能是 CGRAM的地址,这取决于最近一次计算机向AC 写入的是哪类地址[17]。

10). 写数据(Write Data to CG or DD RAM)

计算机向数据寄存器通道写入数据,HD44780U 根据当前地址指针计数器AC 值的属性及数值将该数据送入相应的存储器内的AC 所指的单元里。如果AC 值为DDRAM 地址指针,则认为写人的数据为字符代码并进入DDRAM 内AC 所指的单元里;如果AC 值为CGRAM 的地址指针,则认为写入的数据是自定义字符的字模数据并送入 CGRAM内 AC所指的单元里[18]。所以计算机在写数据操作之前要先设置地址指针或人为的确认地址指针的属性及数值。在写人数据后地址指针计数器AC 将根据最近设置的输入方式自动修改。

由此可知,计算机在写数据操作之前要作两项工作,其一是设置或确认地址计数器AC 值的属性及数值,以保证所写数据能够正确到位;其二是设置或确认输入方式,以保证连续写入数据时AC 值的修改方式符合要求。

11). 读数据(Read Data from CG or DD RAM)

在HD44780U 的内部运行时序的操作下,地址指针计数器AC 的每一次修改,包括新的AC 值的写入,光标滚动位移所引起的AC 值的修改或由计算机读写数据操作后所产生的AC 值的修改,HD44780U 都会把当前AC 所指单元的内容送到接口部数据输出寄存器内,供计算机读取[19]。如果AC 值为DDRAM 地址指针,则认为接口部数据输出寄存器的数据为DDRAM 内 AC所指单元的字符代码;如果AC 值为CGRAM 的地址指针,则认为数据输出寄存器的数据是CGRAM 内AC 所指单元的自定义字符的字模数据。

计算机的读数据是从数据寄存器通道中数据输出寄存器读取当前所存放的数据。所以计算机在首次读数据操作之前需要重新设置一次地址指针AC 值,或用光标滚动指令将地址指针计数器AC 值修改到所需的地址上,然后进行的读数据操作将能获得所需的数据。在读取数据后地址指针计数器AC 将根据最近设置的输入方式自动修改。

由此可知,计算机在读数据操作之前要作两项工作,其一是设立或确认地址计数器AC 值的属性及数值,以保证所读数据的正确性。

3.4 系统功能电路

3.4.1 最小工作系统原理

图3-4 最小系统原理图

此图是单片机工作的最小系统原理图,在这个电路中又可以分为复位电路和晶振电路,如图3-4和图3-5所示:

图3-5复位电路

复位电路可以分为上电复位和手动按键复位两种。在系统上电的一瞬间单片机上电复位,原理是利用电容两端的电压不能突变,在一上电的瞬间电容好比短路,所以加在第九脚RST 的电平是高电平,虽然时间很短,但是足以让单片机系统复位。

手动按键复位的原理是,在系统正常工作的过程中可以手动触动按键使单片机复位。具体原理是,按下S1按键,因此5V 电压经过一个200欧姆的电阻分压后加到系统的RST 上,手动按键按下到抬起的过程足以使系统复位。

图3-6晶振电路

对于单片机系统而言,晶振电路就好比是人的心脏一样,是一个跳动的动力来源,18,19号引脚接的是11.0592M 的晶振。

3.4.2 蜂鸣器报警电路原理

图3-7蜂鸣器报警功能电路

蜂鸣器报警功能电路使用的是三极管8550驱动,三极管8550是PNP 三极管,射极接电源+5V,基极通过一个电阻连接到P1.0口,集电极接蜂鸣器,当P1.0为高电平时,三极管截止,蜂鸣器没有不响,当P1.0为低电平时,三极管导通,蜂鸣器发出响声。

3.4.3 电机驱动电路原理

图3-8电机驱动电路

电机驱动电路和蜂鸣器的电路基本相同,同样使用8550三极管驱动,三极管的基极接P1.1,当P1.1为高电平时,电机不转动,当P1.1为低电平时,电机转动。

3.4.4 按键功能电路原理

图3-9按键功能电路

按键功能电路里面有两种按键,一种按键是模仿水塔水位开关的功能按钮,一种是电机PWM 输出的调整按钮。原理是通过一个10k 的电阻接到+5v电源线上,当按键没有按下时,按键没有导通,所以没有电流,但对于连到引脚上的那一端来讲是高电平。当按键按下时,因为电路导通,有电流流过,和单片机引脚接触的那一端接地,所以是低电平。因此能检测到信号的变化,交给程序处理后做出相关的动作。

3.4.5 液晶1602显示功能电路图

图3-10液晶1602显示电路图

液晶1602从左到右依次有16根引脚,每个引脚定义不同。有三根控制引线和八根信号线,必须注意的一点是3号引脚是背光电源指示端。背光电阻选择的不同有不同的结果。我们这里选择2.7k 电阻做为背光电阻。

3.5 系统总体原理图设计

系统总体原理图即是这些功能电路的组合,主要包括最小系统电路、按键电路、电机和蜂鸣器驱动电路、液晶电路组成,还包括一个按键指示灯。详细电路见附录一。

4 系统的软件设计

4.1 编程语言介绍

4.1.1 C 语言简介

C 语言是在70年代初问世的。一九七八年由美国电话电报公司(AT&T)贝尔实验室正式发表了C 语言。同时由B.W.Kernighan 和D.M.Ritchit 合著了著名的“THE C PROGRAMMING LANGUAGE”一书[20]。通常简称为《K&R》,也有人称之为《K&R》标准。但是,在《K&R》中并没有定义一个完整的标准C 语言,后来由美国国家标准学会在此基础上制定了一个C 语言标准,于一九八三年发表。通常称之为ANSI C。

早期的C 语言主要是用于UNIX 系统。由于C 语言的强大功能和各方面的优点逐渐为人们认识,到了八十年代,C 开始进入其它操作系统,并很快在各类大、中、小和微型计算机上得到了广泛的使用。成为当代最优秀的程序设计语言之一。

C 语言是一种结构化语言。它层次清晰,便于按模块化方式组织程序,易于调试和维护。C 语言的表现能力和处理能力极强。它不仅具有丰富的运算符和数据类型,便于实现各类复杂的数据结构。它还可以直接访问内存的物理地址,进行位(bit)一级的操作。由于C 语言实现了对硬件的编程操作,因此C 语言集高级语言和低级语言的功能于一体。既可用于系统软件的开发,也适合于应用软件的开发。此外,C 语言还具有效率高,可移植性强等特点。因此广泛地移植到了各类各型计算机上,形成了多种版本的C 语言。

C 语言对操作系统和系统使用程序以及需要对硬件进行操作的场合,用C 语言明显优于其它高级语言,许多大型应用软件都是用C 语言编写的。

C语言具有绘图能力强,可移植性,并具备很强的数据处理能力,因此适于编写系统软件,三维,二维图形和动画它是数值计算的高级语言。

4.1.2 C 语言的特点

(1)简洁紧凑、灵活方便:C语言一共只有32个关键字,9种控制语句,程序书写自由,主要用小写字母表示。它把高级语言的基本结构和语句与低级语言的实用性结合起来。C 语言可以和汇编语言一样对位、字节和地址进行操作, 而这三者是计算机最基本的工作单元[21]。

(2)运算符丰富:C的运算符包含的范围很广泛,共有种34个运算符。C 语言把括号、赋值、强制类型转换等都作为运算符处理。从而使C 的运算类型极其丰富表达式类型多样化,灵活使用各种运算符可以实现在其它高级语言中难以实现的运算。

(3)数据结构丰富:C的数据类型有:整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等。能用来实现各种复杂的数据类型的运算。并引入了指针概念, 使程序效率更高。另外C 语言具有强大的图形功能, 支持多种显示器和驱动器。且计算功能、逻辑判断功能强大。

(4) C是结构式语言:结构式语言的显著特点是代码及数据的分隔化, 即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰, 便于使用、维护以及调试。C 语言是以函数形式提供给用户的, 这些函数可方便的调用, 并具有多种循环、条件语句控制程序流向, 从而使程序完全结构化。

(5) C语法限制不太严格、程序设计自由度大:一般的高级语言语法检查比较严,能够检查出几乎所有的语法错误。而C 语言允许程序编写者有较大的自由度。

(6) C语言允许直接访问物理地址,可以直接对硬件进行操作:因此既具有高级语言的功能,又具有低级语言的许多功能,能够象汇编语言一样对位、字节和地址进行操作, 而这三者是计算机最基本的工作单元,可以用来写系统软件。

(7) C语言程序生成代码质量高,程序执行效率高:一般只比汇编程序生成的目标代码效率低10へ20%。

(8) C 语言适用范围大,可移植性好:C语言有一个突出的优点就是适合于多种操作系统, 如DOS 、UNIX, 也适用于多种机型。

4.1.3 C 源程序的结构特点

(1)一个C 语言源程序可以由一个或多个源文件组成。

(2)每个源文件可由一个或多个函数组成。

(3)一个源程序不论由多少个文件组成,都有一个且只能有一个main 函数,即主函数。

(4)源程序中可以有预处理命令(include 命令仅为其中的一种) ,预处理命令通常应放在源文件或源程序的最前面。

(5)每一个说明,每一个语句都必须以分号结尾。但预处理命令,函数头和花括号“}”之后不能加分号。

(6)标识符,关键字之间必须至少加一个空格以示间隔。若已有明显的间隔符,也可不再加空格来间隔。

4.2 PWM 调速控制概述

4.2.1 PWM 脉宽调制简介

脉宽调制(PWM)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。

简而言之,PWM 是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM 信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM 进行编码。

随着电子技术的发展,出现了多种PWM 技术,其中包括:相电压控制PWM 、脉宽PWM 法、随机PWM 、SPWM 法、线电压控制PWM 等,而在镍氢电池智能充电器中采用的脉宽PWM 法,它是把每一脉冲宽度均相等的脉冲列作为PWM 波形,通过改变脉冲列的周期可以调频,改变脉冲的宽度或占空比可以调压,采用适当控制方法即可使电压与频率协调变化。可以通过调整PWM 的周期、PWM 的占空比而达到控制充电电流的目的。 模拟信号的值可以连续变化,其时间和幅度的分辨率都没有限制。9V 电池就是一种模拟器件,因为它的输出电压并不精确地等于9V ,而是随时间发生变化,并可取任何实数值。与此类似,从电池吸收的电流也不限定在一组可能的取值范围之内。模拟信号与数字信号的区别在于后者的取值通常只能属于预先确定的可能取值集合之内,例如在{0V, 5V}这一集合中取值。

尽管模拟控制看起来可能直观而简单,但它并不总是非常经济或可行的。其中一点就是,模拟电路容易随时间漂移,因而难以调节。能够解决这个问题的精密模拟电路可能非常庞大、笨重(如老式的家庭立体声设备) 和昂贵。模拟电路还有可能严重发热,其功耗相对于工作元件两端电压与电流的乘积成正比。模拟电路还可能对噪声很敏感,任何扰动或噪声都肯定会改变电流值的大小。

通过以数字方式控制模拟电路,可以大幅度降低系统的成本和功耗。此外,许多微控制器和DSP 已经在芯片上包含了PWM 控制器,这使数字控制的实现变得更加容易了。

4.2.2 PWM 调节的具体过程

脉冲宽度调制(PWM )是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM 信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有

(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的[22]。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM 进行编码。

多数负载(无论是电感性负载还是电容性负载) 需要的调制频率高于10Hz ,通常调制频率为1kHz 到200kHz 之间。

许多微控制器内部都包含有PWM 控制器。例如,Microchip 公司的PIC16C67内含两个PWM 控制器,每一个都可以选择接通时间和周期。占空比是接通时间与周期之比;调制频率为周期的倒数。执行PWM 操作之前,这种微处理器要求在软件中完成以下工作:

1、设置提供调制方波的片上定时器/计数器的周期。

2、 在PWM 控制寄存器中设置接通时间。

3、设置PWM 输出的方向,这个输出是一个通用I/O管脚。

4、启动定时器。

5、使能PWM 控制器。

4.3 系统程序的设计

4.3.1 程序设计步骤

程序设计就是用计算机所能接受的语言把所需解决问题的步骤逐一描述出来,也就是编制计算机的程序,在设计应用系统时,软件的编制是重要环节。软件的质量直接影响整个系统功能的实现。应用程序的设计因系统而异,但程序设计总是有共同特点及其规律的。在编写程序时,采取如下几个步骤:

(1)分析问题,明确所要解决问题的要求,将软件分成若干个相对独立的部分。根据功能关系和时序关系,设计出合理的软件总体结构。

(2)定程序框图,即根据所选择的计算方法制定框图,这不仅是程序设计的一个重要组成,而且是决定成败的关键部分。

(3)合理分配系统资源,包括定时器/计数器、中断、堆栈等。分配好单元后,进一步将程序框图画成详细的操作流程。

(4)根据程序的流程图和指令系统编写出程序。注意在程序的有关位置处写上功能注释,提高程序的可读性。

(5)程序调试。通过编辑软件编辑出的源程序,必须用编译程序汇编后生成目标代码。如果源程序有语法错误,需修改源文件后继续编译,直到无语法错误为止,然后利用目标代码通过仿真器进行程序调试,排除设计和编程中的错误直到成功。

(6)程序优化。使各功能程序模块化,子程序化,缩短程序的长度,加快运算速度和节省数据存储空间,减少程序执行的时间。

4.3.2 软件的安全冗余设置

因为是水塔水位自动控制系统,而且用到了电动机和调速,所以我们必须考虑系统的安全性能,在电机转动的时候去调动电机的转速是很危险的,所以我们要求要在电机停止的情况下去调节电机的速度。这样对人和对电机、整个系统都是必须的。所以在软件中我们做了安全的冗余设置,当电机在转动时按下电机调速键,电机会立即停止。

4.3.3 程序流程图

图4-1 PWM按键调整子程序流程图

图4-2程序总体流程图

在进入PWM 按键子程序后,首先要做的事是先检测是否确定有按键按下,这个过程延时15ms ,在确认有按键按下后,判断是哪一个按键按下,如果是速度加按键按下,电机不管在什么状态,都是首先停止,然后是调整PWM 调制时间,液晶屏显示速度增加,按下减按键,也是先停止电机,调整PWM 调制时间,液晶屏显示速度减少。具体流程图如图4-1所示。

当系统按下电源开关,且确定有电源存在时候,系统进入初始化状态,灯会闪烁、蜂鸣器响一声、液晶初始化, 初始化完以后,进入PWM 按键调速选择,如有按键按下,进入PWM 按键调整子程序,若没有,进入主程序等待状态,检测水塔水位的液位状态,当模拟液位低水位按键按下后,电机以显示速度启动,模拟抽水过程,此时蜂鸣器报警,灯闪烁,且液晶会显示水位过低状态。当模拟水位正常按键正常按键按下后,电机停止转动,蜂鸣器报警、液晶显示当前正常状态,然后程序进入循环,继续检测模拟水位状态按键。具体流程图的如图4-2所示。

4.4 程序源代码

程序源代码使用C 语言编写,使用C 语言编写程序效率高,调用方便。程序主要由LCD1602液晶驱动子程序,电机PWM 调速功能子程序、按键扫描子程序等功能程序组成,详细源代码见附录二。

5 调试

5.1 调试过程

本系统的调试主要分为硬件调试、软件调试等两大部分。经过初步的分析设计后,在制作硬件电路的同时,调试也在穿插进行。这样有利于问题的分析和解决,不会造成问题的积累,而且不会因为一个小问题而进行整体电路的检查,从而可以节约大量的调试时间。软件编程中,首先编写单元模块的程序,并且在硬件上调试成功问题,即可以做系统整体程序的调试。联机调试是最重要的一部分,同时也是本设计成功的关键。

5.2 电路检测

上电后观察电路工作性能,如不能正常工作,按原理图分模块进行电路检测,是否有虚焊或漏焊现象;如焊接正常,在按信号传递的方向逐级检测,找出出问题的一级,并向该级的上级进行检测,直到将故障排除。对于虚焊和漏焊的情况最好的办法是先找到一个比较大的电路回路,如果用的是指针式万用表,打到欧姆档1X10欧姆档就可以测,如果是指针摆到最右端,说明我们的线路连接是正常的!如果用的是数字万用表,我们可以调整到短路档位,接上要测的点直接就可以测,如果有蜂鸣响说明线路连接正常。

5.2.1 调试步骤

1. 元件安装前的测量:在元件没有在万能板上进行焊接的时候我们是不能直接拿过来就进行使用的,必须经过检测,像LED 灯可以用万用表测试一下看其是否会发光,测试三级管的好坏,器件的检测工作都要在焊接之前做好。

2. 调试按键输入部分:用万用表接到按键的信号输入端口,如果按键按下信号肯定会有变化,并且会在万用表上直接测试读出,这样直接通过硬件测量按键是否能打到预期的效果。

3.软件测试:写一个功能小程序,来具体单个的功能硬件电路是否有问题,如果有问题再具体看是硬件的问题还是软件的问题,若没有问题,则可以进行下一个功能电路的测试。

5.2.2 调试遇到的问题及解决方案

(一) .硬件问题解决方案:

1. LED灯通电不亮。主要查看是否把LED 灯的阴阳极接反。

2. 蜂鸣器不响。一是要查看蜂鸣器是否接反。而是看三极管8550驱动管是否损坏,具体的检测方法是首先看8550射极是否为高电压,如果为高电压继续,脱离单片机给基极一个低电平,此时蜂鸣器应该会响,但是若不响,电压档测量射极是否为低电平,若是,则需要具体找一个6v 直流电串上一个10k 的电阻进行直接通电,看蜂鸣器是否损坏。

3. 电机的原理和蜂鸣器的驱动原理基本一样。方法同上。

4.LCD1602不显示或者显示但是后面的对比度太差。对于LCD1602液晶有一个背光电源还有一个对比度的调节电阻,我们选用的是2k7的,一般选用10k 的可调电阻,来选择比较适合的液晶显示对比度。当然液晶的使用还是很有技巧性的,应该先写一个液晶的小功能子程序把液晶测试好。还有一个地方需要声明,如果要是用P0口接液晶的控制端口需要上拉10K 的电阻,因为51系列的单片机P0口是漏极开路电路,不然是没有任何控制指令控制液晶的。液晶的主要电路是接线多,所以如果发现问题,要细致的去看看每一根线是否接好。是否有虚焊或者短接的现象发生。

(二). 软件问题及解决方案:

1、LCD1602液晶的初始化时间及发送控制命令的等待时间要参考手册,并且用C 编程序很大的一个毛病就是时间不能很好的掌握,所以需要多做几次实验或者参考比较成熟的延时程序。

2. 按键按一下会跳好几个数字:这在软件中叫做按键的抖动,因为按键机械结构的原因,不可能滤除的很好,那么只能软件里防范. 检测到按键后延时一个15ms 的时间,然后再一次检测,如果按键确实按下,执行按键按下命令。然后在执行完程序后我们要做一个按键是否释放的检测,这样就能在软件里把这个按键的抖动问题比较好的处理掉。

5.3 功能实现

最后系统实现模拟供水过程中确保水位在允许的范围内浮动。LCD1602显示当前水位、蜂鸣器鸣笛报警,手动按键调整电机PWM 输出,低警戒水位报警并启动发动机,正常水位是报警停止等基本系统功能。

结 论

此课题属于设计类,在分析了设计任务后,查阅大量的资料和相关的书籍,最终选定了以SCT89C52单片机为核心控制器来进行系统设计。在本设计电路完成后,实现了基于单片机STC89C52的水塔水位模拟检测控制系统。该系统能实现水塔水位检测、LCD1602显示当前水位功能以及蜂鸣器鸣笛报警,手动按键调整PWM(Pulse Width Modulation) 电机调速功能,实现过低警戒水位报警、过低警戒水位自动处理的系统要求。系统程序语言是使用比较广泛的C 语言进行编写,结构清晰,达到的系统控制效果很好。了解并熟练掌握了液晶LCD1602的使用方法和具体的操作过程。清楚了目前液晶LCD1602的具体使用范围和一些市场开发的前景。通过PWM 电机调速完全可以适应在不同的用水场合下的用水速度需要,节省工作时间,提高了整体工作的效率,实现水塔水位的自动控制,节约了人力资源。

参考文献

[1]陈学煌,马俊. 电子自旋共振仪中嵌入单片机测控系统的设计[J].传感器技术,2005,24(12):61-63.

[2] 王建新,杨世凤,史永江,等. 系统测试中的软件抗干扰技术[J].国外电子测量技术,2005,24(10):18-20.

[3] 李刚民,曹巧媛. 单片机原理及使用技术[M].北京:高等教育出版社,2005.

[4] 徐爱钧.8051单片机实践教程[M].北京:电子工业出版社,2005.

[5] 胡汉才. 单片机原理及其接口技术[M].2版. 北京:清华大学出版社,2004.

[6] 周润景.PROTEUS 入门实用教程[M].北京:机械工业出版社,2007.

[7] 徐模辉.Protues 单片机仿真中的uC/OS-II移植[J].单片机与嵌入式系2007

(10):74-76.

[8] 丁元杰 单片微机原理及应用 机械工业出版社 2000

[9] 腾召胜 罗隆福 智能检测系统与数据融合 机械工业出版社 2000

[10] 孙虎章 自动控制原理 中央广播电视大学出版社 1999

[11]《单片微型计算机技术》 刘国荣 编 机械工业出版社

[12]《单片微型计算机原理、应用及接口技术》 张迎新 编 国防工业出版社

[13]《单片机实用系统设计技术》 房小翠 编 国防工业出版社

[14]《单片机应用系统设计》 何立民 编 北航出版社

[15]《单片机原理及接口技术》 曹琳琳编 国防科技大学出版社

[16] [美] Intel: Microcontroller Handbook,1988.

[17] ATME L. CORPORATION. AT90S8515.REV72001.

[18] Joe Campbell. 串行通信C 程序指南[M] . 北京:清华大学出版社,1995:31-32.

[19] [德]克劳斯·贝伊特. 电子元件[M].北京:北京科技出版设,1999.

[20] 超星数字图书馆. http://www.ssreader.com.cn

[21] 中国电子网. http://www.21ic.com

[22]《软件世界》杂志. http://www.softwareworld.com.cn

附录一 系统原理图

附录二 程序源代码

#include

#define uint unsigned int

#define uchar unsigned char

sbit led=P0^1; //led灯显示, 低电平亮

sbit speaker=P1^0; //蜂鸣器,低电平报警

sbit lcd_rs=P0^7; //1602数据选择命令端

sbit lcd_rw=P0^6;

sbit key_up=P3^0; //pwm速度调整端口,电机速度加一

sbit key_down=P3^1; //pwm速度调整端口,电机速度减一

sbit monter=P1^1;//电机驱动端口,pwm 控制输出

sbit water_normal=P1^6;//水位过高传感器模拟按键端口,低电平报警

sbit water_low=P1^7;//水位过低传感器模拟按键端口,低电平报警

uchar code pwm_t[]={45,90,100,130};//模式下的pwm 值,人为已经设定的时间是100,可以调整上限值

uint model=1,pwmT=150,time_count=0;

void key_scan(); //按键扫描函数

void check_water_level(); //检测水位是否正常函数

void delay(uint z) //延时函数

{ uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

//1602读写选择端 sbit lcd_enable=P0^5; //1602 使能端定义

//*******************1602液晶显示函数************************// void lcd_write_comd(uchar comd) //1602写指令函数

{ lcd_rs=0; //选择指令

lcd_rw=0; //选择写

}

void lcd_write_data(uchar date) //1602写数据函数

{

}

void lcd_set_xy(uchar x,uchar y) //定位具体位置

{ uint address;

if(y==1)

address=0x80+x; //第一行的位置

}

delay(5); P2=comd; //取命令 lcd_enable=1; //使能有效 delay(8); lcd_enable=0; delay(8); lcd_rs=1; delay(5); P2=date; delay(8); //选择数据 //选择写操作 //取数据操作 //使能有效 lcd_rw=0; lcd_enable=1; delay(8); lcd_enable=0; else address=0xc0+x; //第二行的位置 lcd_write_comd(address);

void lcd_write_char(uchar x,uchar y,uchar date)

{

lcd_set_xy(x,y); //设定位置

} lcd_write_data(date); //写入数据 //写一个字符函数

void lcd_write_string(uchar x,uchar y,uchar *s) // 写一个字符串函数

{

while(*s)

}

//********电机PWM 调速函数及程序主函数*******//

void init() //初始化函数

{ uchar i,count=25;

led=1;

{

led=~led; delay(count); }

count=count+5; //开机led 灯闪烁 for(i=0;i

lcd_write_comd(0x38);//设置16*2行显示,5*7点阵,8位数据接口 lcd_write_comd(0x0c); //开显示

lcd_write_comd(0x01); //清屏

lcd_write_comd(0x80); //设定初始位置

lcd_write_string(0,1,"Water Lev:Normal");

lcd_write_string(0,0,"Monter Speed: 1");

speaker=0; //蜂鸣器鸣响一声

delay(1000);

speaker=1;

//定时0,定时时间为150us ,工作在方式2

//开总中断

//开定时器0的中断

//定时器0不启动 TMOD=0X02; TL0=TH0; EA=1; ET0=1;

}

void main() //主函数

{ init();

while(1)

}

void timre_0() interrupt 1

{ time_count++;

if(time_count==pwmT) //和PWM 脉宽的时间比较,时间到了定时器清零,重新开始

{ time_count=0;

}

if(time_count

{

monter=0; } {

TH0=(256-150)%256; TR0=0; { key_scan(); check_water_level(); //检测水位是否正常函数 } //定时器0的中断子函数 else

}

monter=1; }

void check_water_level() //检测水位是否正常函数 { uchar i;

if(water_low==0) //水位过低检测 { led=1; TR0=1; //开启电机 monter=0; speaker=0; //蜂鸣器报警 lcd_write_string(0,1,"Water Lev:Normal");//液晶屏显示 for(i=0;i

} speaker=1; }

void key_scan() //按键扫描函数 { uchar i;

if(key_up==0)

} model++; if(model==5) model=1; i=model+0x30; //按键是否释放检测 //pwm速度定制值调整加大 { delay(15); if(key_up==0) { TR0=0; // 有按键按下,电机一定要停止转动 //检测是否增加按键按下 lcd_write_char(14,0,i); //液晶显示变化 while(!key_up); } } if(key_down==0) { delay(15); if(key_down==0) { T R0=0; // 有按键按下,电机一定要停止转动 //pwm速度定制值调整减少 model--; if(model==0) model=4; i=model+0x30; //液晶显示变化 //按键是否释放检测 //检测是否减少按键按下 lcd_write_char(14,0,i); while(!key_down); } }


相关文章

  • 水塔水箱水位自动控制器
  • 扬州工业职业技术学院 2009 -2010学年 第 二 学期 毕业论文 课题名称: 水塔水箱水位自动控制器的设计 设计时间: 2010.02.01-2010.05.21 系 部: 电子信息工程系 班 级: 姓 名: 指导教师: 总目录 第一 ...查看


  • [机电控制系统仿真与软件设计]
  • 机械与车辆学院 <机电控制系统仿真与软件设计> 报告 (2014-2015学年第一学期) 课程设计题目:水塔水位机电控制系统设计与仿真 一.课程设计性质和目的 机械电子工程专业是一个对实践.应用能力要求很强的专业,机电控制系统设 ...查看


  • 水塔水位课程设计心得及遇到问题解决
  • 课程设计心得和遇到问题的解决 这次水塔水位控制系统的课程设计中,我和陈达通一组, 我们在理解了系统的原理基础上,先查阅了各个元器件的参数和管脚图, 然后进行总体设计,画出了硬件的原理图以及板上布线的连接图, 同时,我们还利用proteus软 ...查看


  • 机电专业毕业设计选题
  • 机电一体化技术 毕业设计参考选题 1.并联型直流稳压电源的设计 (1)设计课题:并联可调式直流稳压电源. (2)设计任务和要求设计一个直流稳压电源,独立完成系统设计,要求所设计的电路具有以下功能: ①具有输出电压可调功能,输出电压范围3-1 ...查看


  • 自动浇花控制系统的设计(简版)
  • 学位论文独创性声明 本人郑重声明: 1.坚持以"求实.创新"的科学精神从事研究工作. 2.本论文是我个人在导师指导下进行的研究工作和取得的研究成 果. 3.本论文中除引文外,所有实验.数据和有关材料均是真实的. 4.本论 ...查看


  • 水位报警器毕业设计(3)(1)
  • <水位报警器毕业设计> 题目: 学生姓名: 学号: 专 业: 电子工程 院(系): 物理工程学院 完成时间: 2015年5月20日 2015年 5 月20日 目 录(摘要页码问题到排版的时候让打印店解决!) 摘要 ....... ...查看


  • 基于单片机的水位报警器
  • 水位报警器 摘 要 目前,国内许多水文站监测水位和降雨量仍采用人工方法.该方法不但存在测量的人身安全问题,而且还存在数据测量难准确.监测实时性不强等问题.为了实时准确监测水位及降雨量,设计了一套单片机控制的水位与降雨量监测系统.本系统以感应 ...查看


  • 通信工程毕业设计题目精选
  • 我7岁1就始做做开发的推批销,就更加员会到挣体的不轻钱.易活生的艰了.人家做辛个小8时我就做1,6小时. 个为失败少理找由 多成为找功法 大多方数想要改革这人世界个 不晓得即时却小事做从起 信工程通毕业计题设精选目 . 1智压力能传感系统器 ...查看


  • 基于超声波传感器的水位自动控制系统
  • 基于超声波传感器的水位自动控制系统 作者: 作者单位: 刊名: 英文刊名: 年,卷(期): 被引用次数:李严, 张民, LI Yan, ZHANG Min李严,LI Yan(青岛理工大学计算机工程学院,266033), 张民,ZHANG M ...查看


热门内容