您好,欢迎来到九壹网。
搜索
您的当前位置:首页毕业设计:水位检测仪设计

毕业设计:水位检测仪设计

来源:九壹网
目 录

摘要 ..................................................... 1 1 引言 .................................................. 2

1.1水位检测仪器的现状和发展前景 ................................ 2 1.2 本文的结构安排 ............................................. 2

2 水位监测仪的基本原理 .......................................... 3

2.1功能说明 .................................................... 3 2.2整体架构 .................................................... 3

3 硬件设计 ............................................... 5

3.1水位检测与数据采集 .......................................... 5 3.2数码管与LED显示 ............................................ 7 3.2.1 相关芯片简介 ......................................... 7 3.2.2 显示部分工作原理 ..................................... 9

4 系统软件设计 .......................................... 12

4.1 初始化程序 ................................................ 12 4.1.1 I/O端口方向控制寄存器 ............................... 12 4.1.2 TMR1初始化 .......................................... 12 4.1.3 TMR0初始化 .......................................... 13 4.2 定时/计数器 ............................................... 13 4.2.1 TMR1中断服务程序 .................................... 14 4.2.2 TMR0中断服务程序 .................................... 15 4.3 数据转换子程序 ............................................ 17

结束语 .................................................. 19 致谢 .................................................... 20 参考文献 ................................................ 21 附录 .................................................... 22

附录 程序清单及注释 ........................................... 22

水位检测仪设计

摘要:水位检测和显示仪表装置在工业上有着广泛的应用,本文设计了一种能实时检测并显示水位

的仪器----水位检测仪。设计主要论述对水位数据采集系统的设计与实现,其主要功能是完成数据采集、处理、显示、数据存储等。根据对数据采集系统体系结构及功能要求的分析,以PIC16F877单片机为核心设计并实现的采集系统,结合CD4051实现对水位的检测,结构简单,实现可靠。在PIC单片机中实现了数据存储和处理,获取了当前的水位,并设计实现了数码管的驱动显示电路。该设计是基于单片机技术设计实现的低功耗水位数据采集装置,是一个具有一定实用性的实时数据采集系统。最后的实验结果验证了水位监测仪的总体设计思路及硬件、软件设计方案正确,能够准确地实现了水位的自动检测。

关键词:PIC单片机;水位检测;LED显示

Design of Water-level Detecting Meter

Abstract: Water level detection and display devices has a wide range of applications in industry, this article design a real-time detection and display equipment ---- water level detector.This design focuses on the design and implementation of data acquisition system for the water level,and its main function is to complete the data collection, processing, display, data storage and so on.According to the data acquisition system architecture and functional requirements analysis,the article design and accomplish the acquisition system with simple structure using PIC16F877 single-chip as the core,it can detect the water level with CD4051 reliably.It implements the data storage and processing in the PIC MCU, access to the current water level, and design digital display drive control circuit.The design is a low-power water-level data acquisition device based on single-chip technology,it's a practical real-time data acquisition system.Finally, the experimental results verify the water level monitor the overall design ideas and hardware, software design is correct, can be achieved accurately the water level auto-detection.

Keywords:PIC Single-chip Computer; Water level detection; LED display

1

第1章 引言

1.1 水位检测仪器的现状和发展前景

随着科学技术的不断发展,我国的监测仪器已具有一定研究、开发和生产能力,特别是各种仪器的数据处理系统及自动控制系统的最新研究成果,使我国仪器研制和在用仪器改造的升级,迈上了一个新的台阶。目前国产仪器在功能齐全、性能稳定等方面,与国际上较为先进的同类产品不相上下,完全能够满足水位检测的需要,且价格比国外进口仪器便宜得多。

虽然我国的地下水环境监测仪器,从工艺力量和工艺装备,从行业生产水平和专业化水平等方面来看,与发达国家相比有较大差距,但在某些方面,已具有一定的优势,特别是各种仪器数据处理系统及自动控制系统的最新研究成果,使我国仪器研制和在用仪器改造的升级,迈上了一个新的台阶,而就功能设置与软件编辑来说,更适合我国的国情。

在水位检测仪器方面,国外具有较为先进产品,但不适合我国国情,突出表现在:仪器设备昂贵,操作步骤复杂,质控程序繁琐。我们应采取有效措施,扬长避短,将国外的先进技术引入国内消化吸收,建立既适合我国国情又尽可能与国际接轨的监测方法。在地下水监测仪器的研制中,要在多品种和提高技术水平上下功夫,真正做到能准确、及时、真实的数据反映地下水状况和变化规律[1]。

水位检测和显示仪表装置在工业上有着广泛的应用[2-9]。为了适应我国自动检测的发展现状,本文设计了一种能实时检测并显示水位的仪器----水位监测仪

1.2 本文的结构安排

本文主要分三个章节介绍水位监测仪的开发流程:

第二章介绍水位监测仪的基本原理,简单介绍水位监测仪的功能以及整体架构 第三章介绍硬件设计,从数据采集和显示两个方面分别介绍

第四章介绍软件设计,从TMR1中断服务程序、子程序转换程序、TMR0中断服务程序三部分进行系统分析。

2

第2章 水位监测仪的基本原理

2.1 功能说明

对偏离零点的水位进行检测,然后将带符号的水位置(低于或高于零点)用数码管显示出来,并通过双色发光二极管LED阵列对水位高度进行模拟显示。

(1)水位检测:在0mm、±10mm,±25mm、±50mm、±80mm、±120mm、±160mm、±240mm共15点的基础上,检测水位偏离零点的大小。

(2)水位显示:将上一步检测结果用数码管显示出来,显示值以比实际水位小的最近点为准,同时用15个竖直排列的双色LED阵列直观地模拟当前水位高度,当水位没有达到某点时相应的LED显示红色、达到或超过则显示绿色。当水位低于-240mm时报警灯显示绿色,高于240mm是报警灯显示红色,当水位恢复正常时报警灯熄灭。

2.2 整体架构

水位监测仪主要由三部分组成:水位检测与数据采集电路、PIC16F877单片机以及数码管与LED显示电路。整体框图如图2.1所示。

水位数据采集电路 PIC16F877 数码管及LED显示电路 电源 图2.1 水位监测仪整体构架框图

水位数据采集电路将采集到的数据通过采样通道输入口传输给PIC16F877单片机,PIC单片机对数据进行处理后信号输出给显示电路,数码管及LED显示电路将水位显示出来。

本设计引入一种独特的扫描思想----循环扫描,由于水位检测的数据采集及显示的实时性要求不是很高,而单片机的的运行速度相对很快,如果分时选通各个采样及显示通道,整体开来近似为同时进行的,只要不断的重复这一扫描过程,就可以完成无间隔数据采集和无闪烁显示。

水位检测与数据采集电路部分采用电接点水位检测方法,在每一个预定水位检测点处,将两个电极安装在容器壁,使其一端能够与没过该点的水充分接触,另一端引出到容器外面同检测电路相连接,两个电极等高度并间隔一定距离。当水位没有达到该检定点是,两个电极间电阻为无穷大;而一旦水位上升到该点高度,则两个电极同时没入水中,由于水的导电性,两个电极导通。通过检测两个电极是否导通就可以检测水位的高度了。

数码管与LED显示电路部分主要由15个双色发光二极管和4个数码管组成。模拟

3

水位高度由15个双色发光二极管(LED)来完成,共分4组。数字水位高度显示由四个数码管来完成,分别表示正负、百位、十位和各位。

在某一特定时刻,每组LED与一个数码管一起被选通(4组LED对应4个数码管),两个8位的移位寄存器74LS1级联,将单片机送出的2个字节串行数据转化为16位并行数据,分别送选通的LED和数码管。在不同时刻,系统对4组LED和数码管快速的循环扫描,就完成了面板显示的功能。

4

第3章 硬件设计

本部分介绍多通道水位循环检测的硬件设计、利用串行芯片扩展I/O端口的方法以及循环扫描方式实现面板显示的硬件结构。水位检测仪的电路原理图如图3.1所示。

图3.1 水位监测仪电路原理图

3.1 水位检测与数据采集

本设计采用电接点水位检测方法,通过检测两个电极是否导通就可以检测水位的高度了。对15个检测点相应有15个检测通道,本设计运用两片8通道的多路选择开关CD4051,对各个通道循环检测来实现数据采集。

CD4051是一种双向8通道的多路开关,可以8路选通输入,1路输出;也可以1路输入,8路选通输出。通过3为数据位A,B,C进行通道选择。禁止输入输出端INH可以禁止和允许工作。其引脚定义如图3.2所示,真值表如表1所示。

5

IN/OUT

VDD 1 0 3 A B C 16 15 14 13 12 11 10 9 0 1 2 3 4 5 6 7 8 4 6 OUT/IN 7 5 INH VEE VSS

IN/OUT IN/OUT

图3.2 CD4051引脚图

表1 CD4051真值表 选通通道 INHIBIT 0 1 2 3 4 5 6 7 NONE 0 0 0 0 0 0 0 0 1 C 0 0 0 0 1 1 1 1 * 输入状态 B 0 0 1 1 0 0 1 1 * A 0 1 0 1 0 1 0 1 * 尽管水位检测原理简单,但应用时却不能仅仅用每路的通断来判断水位时否没过该路的点击。实际上水的电阻因水的所含成分不同有很大的差异,例如蒸馏水就不到点,就不能用这种方法来检测。另一方面,空气电阻也不是无穷大的,也跟其成分有关,例如饱和蒸汽的组织大概有1M欧左右。所以,不能通过判断单片机的数据采集引脚输入电平高低来判断水位是否到达某点,否则介于高低电平之间的电平状态就无法做出判断,而这种情况可能存在。

一个可靠的方法就是对输入引脚的数据进行采样,然后将结果与一个阀值电压进行比较,从而得出结论。

根据这个原理设计的水位检测仪数据采集部分的电路如图3.3所示。从图中可以看出,RD3口是地址扩展口,其与一个非门连接,结合INH引脚,将2个8路选通开关扩展为一个16路选通开关。通过RD0~3口进行采样通道地址译码,在不同时刻选通15

6

个通道中的1个,循环扫描15个通道。当水位上升到某一对电极高度时,相应通道的采样电压将会较低;若没有上升到电极高度,那么上拉电阻将会把采样值箝位到+5V。通过判断采样电压的高低,就可以判断选通的通道是否没于水中,进而判断水位高度,RA0口作为A/D采样的通道输入口。POLE0~14为15对模拟水位高度的电极。

图3.3 数据采集原理图

3.2 数码管与LED显示

键盘和显示器是单片机系统中人机对话不可缺少的一部分。在许多智能仪表的设计中,多用LED数码管来显示。这是因为LED数码管驱动简单,成本较低并且能适应恶劣的环境。用于数码管显示驱动的芯片有很多种,常见的有MAX7219、MAX7221、ZLG7290、ICM7218B以及8279等。这些专用芯片使用方便,功能较强,但价格偏高。本设计中采用循环扫描的方式,充分利用单片机快速的处理能力对各显示单元分时选通,只需普通的串行移位芯片,就可以达到显示驱动的目的。 3.2.1 相关芯片的介绍

显示部分用到的芯片包括移位寄存器74LS1、数据缓冲器74LS244以及多路开关CD4051。下面就74LS1和74LS244作简单介绍。

(1)移位寄存器 74LS1。74LS1引脚定义如图3.4所示,起真值表如表2所示,其功能是将外部输入的串行数据转化为8位的并行数据输出,+5V供电,串行传输的频率由外部时钟控制,其数据输出具有锁存功能。A,B端为穿行数据输入端,QA~QH为并行数据输出端,CLK为外部时钟输入端,CLR为清零端。当清除端CLEAR为低电平时,输出端(QA~QH)均为低电平。串行数据输入端(A、B)可控制数据,当A、B任意一个为低电平,则禁止新数据输入,在时钟端(CLOCK)脉冲上升沿作用下QA为低电平。当A、B有一个为高电平则另一个就允许数据输入,并在CLOCK上升沿作用下决定QA的状态。

7

图3.4 74LS1引脚图

[10]

表2 74LS1的真值表

输入 CLEAR L H H H H CLOCK X L ↑ ↑ ↑ A B X X X X H H L X X L 输出 QA QB QH L L L QA0 QB0 QH0 H QAn QGn L QAn QGn L QAn QGn 注: QA0、 QB0、QH0为在稳态输入条件建立之前QA 、QB 和QH相应的电平;QAn 、QGn 为 在最近的时钟↑转换前QA或QG的电平,表示移1位。

(2)数据缓冲器74LS244。由于74LS1在高电平输出时,其输出最大电流为0.4mA;低电平输出时,起输出最大电流为8mA,不足以驱动数码管或发光二极管正常工作,所以在本设计中外加数据缓冲器以增大驱动能力,使数码管和二极管可以正常工作。 74LS244缓冲器常用作三态缓冲或总线驱动,+5V供电,其高电平时输出最大电流可达15mA,低电平输出时最大电流可达24mA,足以驱动数码管和LED工作。74LS244共8个输入输出通道,通过门控端1G和2G来选择其通断,其引脚图如图3.5所示。

8

图3.5 74LS244内部结构及引脚图

从图中可以看出,当引脚1G为低电平时,输入通道1A1~1A4与输出通道1Y1~1Y4连通;当引脚1G为高电平时则截止。当引脚2G为低电平时,输入通道2A1~2A4与输出通道2Y1~2Y4连通;当引脚2G为高电平时,输入通道2A1~2A4与输出通道2Y1~2Y4截止。

3.2.2 显示部分工作原理

首先介绍一下双色二极管的功能和用法。如图3.6所示,1个双色二极管有3个引脚,引脚1,2均为信号“+”端,引脚3为GND端(信号“-”端)。引脚电平(TTL电平)与LED显示颜色如表3所示。

图3.6 双色二极管外观图

表3 双色二极管的功能表 引脚1 0 0 1 1 引脚2 0 1 0 1 二极管状态 熄灭 绿色 红色 混合颜色 9

数码管及LED显示电路如图3.7所示,其主要功能流程是:将单片机输出的串行数据通过74LS1移位寄存器转化并行数据,经74LS244数据缓冲器驱动数码管及LED显示。

RC5口作为串行数据输出端,与74LS1的数据输入端相连,当单片机输出的串行数据输入74LS1;RC3口作为串行数据的同步时钟端,与74LS1的时钟同步输入端相连。两片移位寄存器74LS1的并行数据输出端则分别与两片数据缓冲器74LS244的输入端相连,两片74LS244分别驱动数码管和LED的显示,RD7口作为数据缓冲器74LS244的门控信号输出端,控制74LS244的通断。

图3.7 数码管及LED显示电路

每4个双色二极管和1个数码管一组,二极管的8个信号“+”端分别与第一片74LS244的8位数据输出端相连,数码管的8为数据输入端分别与第二片74LS244的8为数据输出端相连,每组二极管和数码管的GND端都与CD4051的1个输入通道相连,CD4051的输出端与系统的“地”相连。RE0~RE1口作为地址译码输出端口,用于多路开关CD4051的4路通道选择,每一时刻只有一组共4个二极管和一个数码管被选通,其GND端同系统的“地”构成通路,其他的二极管与数码管则不能构成通路。

每向74LS1传送完2个字节共16位数据,通过RD7口使能74LS244,将数据送到二极管和数码管的输入口,然后通过RE0~RE1口打开一条通道,则被选通的数码管和二极管就会按照接收的数据进行相应的显示。不断的发送新数据并利用CD4051循环的扫描4个通道,则所有的二极管和数码管就会持续的发光显示。利用人的视觉暂留现象,每个LED或数码管两次被选通的时间间隔不能大于100ms。

10

另外由一个双色二极管作为报警灯,RD5口与二极管引脚1相连,作为上限报警灯;RD4口与二极管的引脚2相连,作为上限报警灯。

11

第4章 系统软件设计

本设计关键的核心是两个不循环执行的中断程序:TMR0中断用于驱动数码管和LED显示;TMR1中断用于采集水位值并且将采集结果送缓冲寄存器供显示部分读取,同时对采集结果进行简单的分析,判断其是否超过水位上限和下限,若超过则点亮相应的报警灯。

整个软件大体可以分为初始化程序、TMR0中断服务程序、数据转换子程序、TMR1中断服务程序4个部分,以下分别加以描述。

4.1 初始化程序

初始化程序位于主程序开始部分,主要对3部分进行初始化:I/O端口、TMR1和TMR0。各部分的初始化步骤如下描述。 4.1.1 I/O端口方向控制寄存器

 RA0端口用于将采集到的数据输入,故将A/D端口RA0设置为输入方式  串行数据同步端口RC3,设置为输出方式  串行数据输出端口RC5,设置为输入方式

 采样通道地址译码端口RD0~RD3,设置为输出方式  显示部分地址译码端口RE0~RE1,设置为输出方式  报警输出端口RD4~RD5,设置为输出 4.1.2 TMR1初始化

TMR1初始化步骤如下:

 将第一外设中断标志寄存器PIR1(地址为0CH)中的TRM1溢出中断标志位TMR1IF(Bit0)清零。

 将第一外设中断屏蔽寄存器PIE1(地址为8CH)中的TMR1溢出中断屏蔽位TMR1IE(Bit0)置位。

 通过TMR1中断控制寄存器T1CON(地址为10H)设置时钟及分频比等。 即:①时钟源选择位TMR1CS(Bit1)清零,选择内部时钟源

②分频比选择位T1CKPS0~T1CKPS1(Bit5~4)置位11,选择分频比1:8

 给TMR1计数器TMR1H(地址为0FH)、TMR1L(地址为0EH)赋初值

 将中断控制寄存器INTCON(地址为0BH)中的全局中断屏蔽位GIE(Bit7)置位,响应所有外围设备模块产生的中断请求

 将中断控制寄存器INTCON(地址为0BH)中的外设中断屏蔽位PEIE(Bit6)置位,开放第二级别的外围中断

12

4.1.3 TMR0初始化

TMR0初始化步骤如下:

 通过选项寄存器OPTION_REG(地址为81H)设置TMR0的分频比及时钟 即:①时钟选择位T0CS(Bit5)清零,由内部提供的指令周期信号作为时钟源 ②分频器分配为PSA(Bit3)清零,分频器分配给TMR0

③分频器分频比选择位PS2~PS0(Bit2~0)置位111,选择分频比1:128

 将INTCON寄存器(地址为0BH)中的TMR0中断标志位T0IF(Bit2)清零并将中断屏蔽位T0IE(Bit5)置位

 将中断控制寄存器INTCON(地址为0BH)中的全局中断屏蔽位GIE(Bit7)置位,响应所有外围设备模块产生的中断请求

 将中断控制寄存器INTCON(地址为0BH)中的外设中断屏蔽位PEIE(Bit6)置位,开放第二级别的外围中断

 给TMR0计数器赋初值

4.2定时/计数器

定时/计数器其功能都是靠寄存器计数值的累积来实现的,PIC单片机采用递增方式,计数值累加到上限后会产生溢出,相应的会在溢出中断标志位上反映出来。计数值的累加又是靠时钟来触发的,它可以是单片机内部时钟,也可以来自外部。定时的长短以及数值的上限都是定时/计数器的位宽、分频器的分频值有关。PIC16F87X系列单片机集成3个定时/计数器模块TMR0、TMR1、TMR2。在结构和功能上不尽相同,其定时长短,计数上限因此也不一样,应用场合也不同[11]。

TMR0为8位宽,与WDT共用一个可选的预分频器,用于一般的通用目的。TMR1为16位宽,附带一个可编程的预分频器以及一个可选的低频时基振荡器,不仅可以用来计数,还可与CCP模块一起实现输入捕捉与输出比较功能。TMR2也是一个8位宽的定时/计数器,附带一个可编程的预分频器,一个可编程的后分频器,一个周期寄存器和比较器,只能用于定时,不能用于计时,可与CCP模块一起实现PWM功能(即产生脉宽调制信号)。

TMR0的特点:  8位宽定时/计数器  计数器TMR0内容可读可写  8位软件可编程预分频器

 内部/外部时钟可选,外部时钟触发边沿可选  溢出中断功能 TMR1的特点:  16位宽定时/计数器

13

 计数器TMR1内容可读可写  3位软件可编程预分频器

 累加计数信号源可选内部时钟、外部触发信号或自带时基振荡器信号  溢出中断功能 TMR2的的特点:  8位宽的定时器

 计数器TMR2内容可读可写

 2位软件可编程与预分频器,4位软件可编程后分频器

 累加计数信号源可选内部时钟信号,因此只能工作在定时器模式  8位周期寄存器

 溢出次数经过分频后溢出中断  可以由用户软件关闭退出定时 本设计应用到了TRM0和TMR1 4.2.1 TMR1中断服务程序

设定系统的水位刷新时间为1S,即单片机每秒钟对采样通道进行一遍A/D转换、软件上则设定TMR1定时器每秒产生一次中断,执行数据采样程序,从最高水位采样通道向下执行,并不断将每次采样结果与系统设定的门限值比较(采样结果如果小于门限值,说明电平低,即电容两极同时没于水中,水位已经超过该电极)当检测到水位超过某一对电极时,则退出采样程序。接下来判断水位是否越限,若是则点亮相应的报警灯,否则使报警灯熄灭。然后调用数据转换子程序,将水位采样结果转化为相应数码管和LED显示段码值存入显示数据缓冲寄存器。由于PIC单片机的中断矢量只有一个,而本设计中用到两个中断(TMR1和TMR0),故而在中断服务程序入口处,需要对中断源进行判断,这是通过判断相应的中断标志寄存器来实现的。TMR1中断服务程序流程图如图4.1所示。

设置TMR1定时器分频比为1:8,采用内部时钟源,系统采用2M晶振。那么TMR1的时钟脉冲周期为2μs,由于分频比为1:8,则每16μs计数一次,1s需要计数62500次,即从计时开始到62500个计数周期后,TMR1寄存器达到上限65536并溢出,所以TMR1寄存器初始值65536-62500=3036,即0BDCH。

下面对流程图中的关键部分进行简单说明:

(1)关于ADC控制寄存器ADCON0的设置:AD转换时钟选择位Bit7~6置位01,选择系统时钟,频率为fosc/8,模拟输入通道选择位Bit5~3置位000,选择通道0(RA0/AN0)。

(2)关于ADC控制器ADCON1的设置:A/D转换结果格式选择位(Bit7)清零,A/D转换结果左对齐,ADRESH有效,ADRESL的低六位为0,A/D端口控制位(Bit3~0)置

14

位1110,选择RA0口为模拟输入口

(3)采样开始部分,要先关闭A/D转换器(Bit0=0),令其退出工作状态,等待采样值稳定后在重新开启A/D转换器(Bit0=1),开始采样。并通过检测A/D转换状态位GO/DONE(Bit2)是否为0,确定采样是否结束。

图4.1 TMR1中断服务程序流程图

4.2.2 TMR0中断服务程序

TMR0中断用于数码管及LED显示,每次中断将两个字节的数据串行发送发送至以为寄存器,后经74LS244驱动一组LED和1个数码管发光。由于每个LED或数码管两次被选通的时间最大不能烧过100ms(利用人的视觉暂留现象,否则就会出现闪烁),加之TMR1中断可能占用的时间,所以每次TMR0中断溢出时间不能太长;两一方面,TMR0中断溢出时间又不能太短,必须保证串行发送正常发送完毕。综合两方面因素,将TMR0溢出时间设定为10ms。TMR0中断服务程序流程图如图4.2所示。

设置TMR0定时器分频比为1:128,采用内部时钟源,系统采用2M晶振。那么TMR0的时钟脉冲周期为1μs,由于分频比为1:128,则每256μs计数一次,10ms需要计数

15

39次,即从计时开始到39个计数周期后,TMR0寄存器达到上限256并产生溢出,所以TMR0寄存器初始值256-39=217,即0D9H。

图4.2 TMR0中断服务程序流程图

下面对流程图中的关键部分进行简单说明:

(1)发送的两个字节,根据硬件电路原理可知,先发送的字节经过移位寄存器74LS1及数据缓冲器74LS244驱动一组LED;后发送的字节经过移位寄存器74LS1及数据缓冲器74LS244驱动一个数码显示管。

(2)发送字节过程中,需清74LS244使能位,暂时禁止数据输出显示,待发送完

16

毕后,置74LS244使能位,允许数据输出显示。

(3)当使用SPI来进行数据发送时,采用软件对标志位查询的方式来完成。 (4)关于同步串口控制寄存器SSPCON的设置:同步串行口允许位SSPEN(Bit5)

置位,允许串口工作;同步串行口工作模式选择位SSPM3~0(Bit3~0)置位0000,选择SPI主控模式,并且时钟频率为系统时钟的1/4。

4.3 数据转换子程序

在进行水位检测后,会产生一个水位的高度值(设置为HEIGHT),但它并不是一个真实的水位值,只是一个标识水位高度的通道号,其值为0~15中的某个数,分别表示没有水以及15种水位高度共16种情况。故而需要将其转化为LED和数码管的实际显示段码值。表4列出了高度值HEIGHT、LED段码值LED1~LED4和数码管显示数据SEG1~SEG4的对应关系,表5则为数码管的七段码值遇显示符号的对应关系。

表4 高度值与显示段码对照表

HEIGHT LED1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0F0H 0E1H 0C3H 87H 0FH 0FH 0FH 0FH 0FH 0FH 0FH 0FH 0FH 0FH 0FH 0FH LED2 0F0H 0F0H 0F0H 0F0H 0F0H 0E1H 0C30 87H 0FH 0FH 0FH 0FH 0FH 0FH 0FH 0FH LED3 0F0H 0F0H 0F0H 0F0H 0F0H 0F0H 0F0H 0F0H 0F0H 0E1H 0C3H 87H 0FH 0FH 0FH 0FH LED4 0F0H 0F0H 0F0H 0F0H 0F0H 0F0H 0F0H 0F0H 0F0H 0F0H 0F0H 0F0H 0F0H 0E1H 0C3H 87H

SEG1 - - - - - - - - SEG2 - 2 1 1 1 1 2 SEG3 - 4 6 2 8 5 2 1 1 2 5 8 2 6 4 SEG4 - 0 0 0 0 0 5 0 0 0 5 0 0 0 0 0 17

表5 数码管七段码

显示符号 共阳极七段码 0 1 2 3 4 5 0C0H 0F9H 0A4H 0B0H 99H 92H 共阴极七段码 3FH 06H 5BH 4FH 66H 6DH 显示符号 共阳极七段码 6 7 8 9 - 全灭 82H 0F8H 80H 90H 0BFH FFH 共阴极七段码 7DH 07H 7FH 6FH 40H 00H 有三种方法对LED和数码管显示缓冲寄存器写入数据:第一种是采用查表的方法,将各个高度值对应的数据预先存入一块缓冲区内,通过对指令指针赋值来访问特定数据单位,返回转换后的数值;第二种是采用逐个比较的方法,将采样结果与1~15的数逐个比较,若相等则向缓冲区赋相应值;第三种方法是根据表的特征来赋值,很显然,第二、三种方法比较费时间,第一种方法虽然程序代码最大,但执行起来速度快,本设计采用第一种方法,具体可参见查表子程序的程序代码。

18

结束语

由于许多数据采集、显示的实时性要求不是很高,因此单片机的执行速度相对于这些过程要快得多,若分时选通各个采样或显示通道,虽然单片机对各个通道的处理是依次进行的,但是只要这一过程达到一定速度,总的看来几乎同时执行,不断重复这一过程,就产生了循环扫描的思想,它在单片机系统设计中得到了广泛的应用。

本设计中的水位采样通道设计以及数码管、LED显示都是基于这一思想。主要是通过移位的方法,用74LS1芯片将每个通道的串行数据转化为并行方式,在通过数据缓冲器74LS244输出,用CD4051循环对每个通道选通,从而实现对数码管的驱动。串行通信上则利用PIC的CCP模块,采用硬件SPI方式进行串行通信。软件上采用了两个中断程序分别进行采样和显示。

19

致谢

本次毕业设计历时两个多月,从选题、开题答辩到设计的完成,设计的完稿。其间每一过程都得到指导教师王灵矫老师的悉心指导,在此表达我对他的深深的敬意和由衷的感谢!

同时,我要向我的家人表达我深深的感激!在我的求学生涯中,他们给了我最无私的关怀和鼓励。如果没有他们无限的支持和帮助,我也不能在我的学习之路上勇往直前。 最后,我要感谢一同学习了4年的同学们和所有关心我的朋友们,他们给予了我大量的帮助和支持,在我犹豫和困惑的时候,他们的支持帮我坚定了目标,走出了困境,他们是我一生的财富。

20

参考文献

[1]史云.我国地下水监测仪器的现状与发展[电子文献]北京:地质环境信息网,2005年

[2]杨恢先、黄辉先.单片机原理及应用[M].北京:人民邮电出版社,2006年

[3]罗翼、张宏伟.PIC单片机应用系统开发典型实例[M].北京:中国电力出版,2005年

[4]李学海. PIC单片机实用教程-基础篇[M]. 北京:北京航空航天大学出版设,2007年

[5]李学海. PIC单片机实用教程-提高篇[M]. 北京:北京航空航天大学出版设,2007年. [6]李学海.PIC单片机原理[M]北京:北京航空航天大学出版社,2004年 [7]彭树生.PIC单片机原理及应用[M]机械工业出版社,2002年 [8]杨圣.PIC系列单片机的原理与实践[M]合肥:中国科学技术大学出版社,2003 [9]刘启中、李荣正等.PIC单片机原理及应用[M].北京:北京航空航天大学出版社,2003 [10]阎石.数字电子技术基础[M].北京:高等教育出版社,2005年

[11]求是科技. PIC单片机典型模块设计实例导航[M]. 北京:人民邮电出版社,2005年

21

附录

附录 程序清单及注释

LIST P=16F877 INCLUDE P16F877.INC STATUS EQU 03H

;定义状态寄存器地址

PCL EQU 02H ;定义程序计数器低8位指针地址 PORTA EQU 05H PORTC EQU 07H PORTD EQU 08H PORTE EQU 09H TRISA EQU 85H TRISC EQU 87H TRISD EQU 88H TRISE EQU H INTCON EQU 0BH

;定义端口RA的数据寄存器地址 ;定义端口RC的数据寄存器地址 ;定义端口RD的数据寄存器地址 ;定义端口RE的数据寄存器地址 ;定义端口RA的方向控制寄存器地址 ;定义端口RC的方向控制寄存器地址 ;定义端口RD的方向控制寄存器地址 ;定义端口RE的方向控制寄存器地址 ;定义中断控制寄存器地址

T1CON EQU 10H ;定义TMR1中断控制寄存器 TMR0 EQU 01H PIR1 EQU 0CH

;定义TMR0寄存器地址

;定义第一外设中断标志寄存器地址

PIE1 EQU 8CH ;定义第一外设中断屏蔽寄存器地址 ADRESH EQU 1EH

;定义ADC结果寄存器高字节地址

ADCON0 EQU 1FH ;定义ADC控制寄存器0地址 ADCON1 EQU 9FH T1CON EQU 10H

;定义ADC控制寄存器1地址 ;定义TMR1控制寄存器地址

TMR1L EQU 0EH ;定义TMR1低字节地址 TMR1H EQU 0FH

;定义TMR1高字节地址

SSPBUF EQU 13H ;定义SPI收发缓冲寄存器地址 SSPCON EQU 14H ;定义同步串口控制寄存器地址 SSPSTAT EQU 94H ;定义同步串口状态寄存器地址 OPTION_REG EQU 81H ;定义选项寄存器

;=====================变量声明=========================== TEMP EQU 20H ;定义暂存寄存器

HEIGHT EQU 22H ;定义采样结果寄存器,用以标识水位高度 SELECT_COUNT EQU 23H ;定义翻转计数器,用以标识选通的显示通道 AD_COUNT EQU 24H ;定义翻转计数器,用以标识选通的采样通道

22

TX_LED EQU 25H ;LED数据串行发送暂存寄存器 TX_DATA EQU 26H ;数码管数据串行发送暂存寄存器 LED1 EQU 29H ;发光二极管显示数据寄存器1 LED2 EQU 30H ;发光二极管显示数据寄存器2 LED3 EQU 31H ;发光二极管显示数据寄存器3 LED4 EQU 32H ;发光二极管显示数据寄存器4 SEG1 EQU 33H ;数码管显示数据寄存器1 SEG2 EQU 34H ;数码管显示数据寄存器2 SEG3 EQU 35H ;数码管显示数据寄存器3 SEG4 EQU 36H ;数码管显示数据寄存器4 ;====================常量声明========================= TMR1LB EQU 0DCH TMR1HB EQU 0BH

;定义TMR1低字节寄存器初始值 (定时1秒) ;定义TMR1高字节寄存器初始值

TMR0B EQU 0D9H ;定义TMR0寄存器初始值(定时10毫秒) GATE_VALUE EQU 07FH ;定义采样结果门槛值,用以区分水和空气阻值 ; ***************复位矢量和中断矢量*****************

ORG 000H ;复位矢量 NOP

GOTO MAIN

ORG 004H ;中断矢量

;****************中断服务程序*********************

BTFSC PIR1,0 ;检测是否是TMR1中断

GOTO TMR1_INT ;是,则转TMR1中断 BTFSC INTCON,2 ;否,检测是否是TMR0中断 GOTO TMR0_INT ;是,则转TMR0中断 RETFIE ;否,中断返回 ;===============TMR1中断服务程序================ TMR1_INT BCF PIR1,0 ;清TMR1中断标志位 BCF STATUS,5

MOVLW 0FH ;水位检测通道为15个 MOVWF AD_COUNT ;通道数送翻转计数器 TEST_LOOP DECF AD_COUNT,0

IORLW 0F0H ;屏蔽高4位

ANDWF PORTD,1 ;输出到CD4051通道译码端,以选通某一采样通道

23

BSF STATUS,5 MOVLW 0EH

MOVWF ADCON1 ;AD采样结果左对齐,选择RA0口为模拟量输入口 BCF STATUS,5 MOVLW 41H

MOVWF ADCON0 ;选择系统时钟8分频,通道0,关闭AD启动位 NOP ; NOP ; NOP ; BSF ADCON0,2 ;AD_LOOP NOP

BTFSC ADCON0,2 ; GOTO AD_LOOP ; MOVF ADRESH,0 ; MOVWF TEMP ; MOVF AD_COUNT,0

MOVWF HEIGHT ; DECFSZ AD_COUNT,1 ; GOTO TMR1_NEXT1 ; MOVLW 00H ; MOVWF HEIGHT

GOTO TMR1_NEXT2 ;TMR1_NEXT1 MOVF TEMP

SUBWF GATE_VALUE,0 ; BTFSC STATUS,0 ; GOTO TEST_LOOP ;TMR1_NEXT2 BCF PORTD,4 ; BCF PORTD,5 ; BCF STATUS,0 ; MOVLW 15H

SUBWF HEIGHT ; BTFSS STATUS,0 ; GOTO TMR1_NEXT3 ; BSF PORTD,5 ;

等待采样值稳定 等待采样值稳定 等待采样值稳定 启动AD采样 检测采样是否结束 否,继续检测

是,读取采样结果高8位 采样结果送暂存寄存器TEMP 将当前通道数送HEIGHT 当前通道数减1后是否为0 否,将采样结果与门限值比较 是,置水位高度为0 退出采样循环 门限值减去采样结果 检测是否产生借位

否,继续进行下一个通道采样 是,熄灭下限报警灯 熄灭上限报警灯 清借位标志位 采样结果与上限值比较 检测借位标志位是否为1 否,转下限检测 是,点亮上限报警灯

24

TMR1_NEXT3 BCF STATUS,2 ;清零标志位 MOVLW 00H

SUBWF HEIGHT ;采样结果与下限值比较 BTFSS STATUS,2 ;检测零标志位是否为1 GOTO TMR1_NEXT4 ;否,转采样结果转换 BSF PORTD,4 ;是,点亮下限报警灯 TMR1_NEXT4 CALL ADRES_CON ;调转采样结果转换子程序 MOVLW 04H

MOVWF SELECT_COUNT ;将显示通道选择翻转计数器赋初值 MOVLW TMR1LB

MOVWF TMR1L ;写入TMR1寄存器低字节数 MOVLW TMR1HB

MOVWF TMR1H ;写入TMR1寄存器高字节数 RETFIE ;中断返回

;===================TMR0中断服务程序==================== TMR0_INT BCF INTCON,2 ;清TMR0中断标志位 BCF STATUS,0 DECF SELECT_COUNT,0

MOVWF TEMP ;将翻转计数器内容减1送TEMP寄存器 RLF TEMP,0 ;TEMP寄存器内容乘以2,作为查询显示数据

;的地址偏移量

ADDWF PCL,1 ;将地址偏移量与程序计数器值叠加 MOVF LED1 GOTO TMR0_NEXT1 MOVF LED2 GOTO TMR0_NEXT1 MOVF LED3 GOTO TMR0_NEXT1 MOVF LED4

TMR0_NEXT1 MOVWF TX_LED ;将本次显示的LED数据送LED发送寄存器 RLF TEMP ;TEMP寄存器内容乘以2,作为查询显示数据

;的地址偏移量

ADDWF PCL,1 ;将地址偏移量与程序计数器值叠加 MOVF SEG1

25

GOTO TMR0_NEXT2 MOVF SEG2 GOTO TMR0_NEXT2 MOVF SEG3 GOTO TMR0_NEXT2 MOVF SEG4

TMR0_NEXT2 MOVWF TX_DATA ;将本次显示的数码管数据送数码管发送寄存器 BCF PORTD,7 ;清74LS244使能位,暂时禁止数据输出显示 BSF STATUS,5

CLRF SSPSTAT ;SPI方式清SMP位、CKE位和BF位,在脉冲上 ;沿移位输出数据跳 MOVLW 30H

MOVWF SSPCON ;允许串口工作,时钟频率为系统时钟的1/4 MOVF TX_LED,0 ;将第一个待发送的字节送缓冲寄存器 CALL SPI_TX ;调发送完成查询子程序

MOVF TX_DATA,0 ;将第二个待发送的字节送缓冲寄存器 CALL SPI_TX ;调发送完成查询子程序 DECF SELECT_COUNT,0 ;通道寄存器减1 MOVWF PORTE ;选通待显示的通道

BSF PORTD,7 ;置74LS244使能位,允许数据输出显示 DECFSZ SELECT_COUNT,1 ;通道寄存器减1,并检测是否为0 GOTO TMR0_NEXT3 ;否,转TMR0_NEXT3

MOVLW 04H ;是,重新对通道寄存器赋初值 MOVWF SELECT_COUNT TMR0_NEXT3 MOVLW TMR0B

MOVWF TMR0 ;TMR0寄存器赋初值 RETFIE ;中断返回 ;******************主程序************************ MAIN BSF STATUS,5 MOVLW 01H

MOVWF TRISA ;置RA0口为输入方式 MOVLW 00H

MOVWF TRISC ;置RC口为输出方式 MOVWF TRISD ;置RD口为输出方式

26

MOVWF TRISE ;置RE口为输出方式 ;=================TMR0初始化==================== MOVLW 07H

MOVWF OPTION_REG ;分频器给TMR0,分频比1:128,选用系统时钟 BCF STATUS,5 MOVLW 0E0H

MOVWF INTCON ;开全局中断,允许响应TMR0及第二梯队中断 ;请求(TMR1中断),TM0中断标志位清零 MOVLW TMR0B

MOVWF TMR0 ;TMR0寄存器赋初值 ;====================TMR1初始化====================

BSF STATUS,5 MOVLW 01H

MOVWF PIE1 ;允许TMR1中断 BCF STATUS,5 MOVLW 00H

MOVWF PIR1 ;TMR1中断标志位清零

MOVLW 30H

MOVWF T1CON ;分频比为1:8,选用内部时钟源 MOVLW TMR1LB

MOVWF TMR1L ;TMR1寄存器低字节赋初值 MOVLW TMR1HB

MOVWF TMR1H ;TMR1寄存器高字节赋初值 BSF T1CON,0 ;启动TMR1定时

MOVLW 04H

MOVWF SELECT_COUNT ;显示通道寄存器赋初值

MAIN_LOOP GOTO MAIN_LOOP

;**************SPI发送完成查询子程序**************** SPI_TX MOVWF SSPBUF BCF STATUS,6 SPI_LOOP BSF STATUS,5

BTFSS SSPSTAT,0 ;查询发送受否完成 GOTO SPI_LOOP ;否,继续查询 BCF STATUS,5 ;是,选择BANK0

27

MOVF SSPBUF ;将缓冲寄存器的数据读出,不管数据是否有用 RETURN ;子程序返回 ;***************数据转换子程序**************** ADRES_CON

;================LED1赋值===================== MOVF HEIGHT,0 CALL LED1_CON MOVWF LED1

;===============LED2赋值====================== MOVF HEIGHT,0 CALL LED2_CON MOVWF LED2

;===============LED3赋值====================== MOVF HEIGHT,0 CALL LED3_CON MOVWF LED3

;===============LED4赋值====================== MOVF HEIGHT,0 CALL LED4_CON MOVWF LED4

;===============SEG1赋值===================== MOVF HEIGHT,0 CALL SEG1_CON MOVWF SEG1

;===============SEG2赋值===================== MOVF HEIGHT,0 CALL SEG2_CON MOVWF SEG2

;===============SEG3赋值=====================

MOVF HEIGHT,0

CALL SEG3_CON MOVWF SEG3

;===============SEG4赋值=====================

MOVF HEIGHT,0

28

CALL SEG4_CON MOVWF SEG4 RETURN

;===============LED1查表子程序=============== LED1_CON ADDWF PCL,1 RETLW 0F0H RETLW 0E1H RETLW 0C3H RETLW 87H RETLW 0FH RETLW 0FH RETLW 0FH RETLW 0FH RETLW 0FH RETLW 0FH RETLW 0FH RETLW 0FH RETLW 0FH RETLW 0FH RETLW 0FH RETLW 0FH

;===============LED2查表子程序=============== LED2_CON ADDWF PCL,1 RETLW 0F0H RETLW 0F0H RETLW 0F0H RETLW 0F0H RETLW 0F0H RETLW 0E1H RETLW 0C3H RETLW 87H RETLW 0FH RETLW 0FH RETLW 0FH

29

RETLW 0FH RETLW 0FH RETLW 0FH RETLW 0FH RETLW 0FH

;===============LED3查表子程序=============== LED3_CON ADDWF PCL,1 RETLW 0F0H RETLW 0F0H RETLW 0F0H RETLW 0F0H RETLW 0F0H RETLW 0F0H RETLW 0F0H RETLW 0F0H RETLW 0F0H RETLW 0E1H RETLW 0C3H RETLW 87H RETLW 0FH RETLW 0FH RETLW 0FH RETLW 0FH

;===============LED4查表子程序================ LED4_CON ADDWF PCL,1 RETLW 0F0H RETLW 0F0H RETLW 0F0H RETLW 0F0H RETLW 0F0H RETLW 0F0H RETLW 0F0H RETLW 0F0H RETLW 0F0H

30

RETLW 0F0H RETLW 0F0H RETLW 0F0H RETLW 0F0H RETLW 0E1H RETLW 0C3H RETLW 87H

;===============SEG1查表子程序================ SEG1_CON ADDWF PCL,1 RETLW 40H RETLW 40H RETLW 40H RETLW 40H RETLW 40H RETLW 40H RETLW 40H RETLW 00H RETLW 00H RETLW 00H RETLW 00H RETLW 00H RETLW 00H RETLW 00H RETLW 00H RETLW 00H

;===============SEG2查表子程序================ SEG2_CON ADDWF PCL,1 RETLW 40H RETLW 5BH RETLW 06H RETLW 06H RETLW 00H RETLW 00H RETLW 00H

31

RETLW 00H RETLW 00H RETLW 00H RETLW 00H RETLW 00H RETLW 00H RETLW 06H RETLW 06H RETLW 5BH

;===============SEG3查表子程序================ SEG3_CON ADDWF PCL,1 RETLW 40H RETLW 66H RETLW 7DH RETLW 5BH RETLW 7FH RETLW 6DH RETLW 5BH RETLW 06H RETLW 00H RETLW 06H RETLW 5BH RETLW 6DH RETLW 7FH RETLW 5BH RETLW 7DH RETLW 66H

;===============SEG4查表子程序================ SEG4_CON ADDWF PCL,1 RETLW 40H RETLW 3FH RETLW 3FH RETLW 3FH RETLW 3FH

32

RETLW 3FH RETLW 6DH RETLW 3FH RETLW 3FH RETLW 3FH RETLW 6DH RETLW 3FH RETLW 3FH RETLW 3FH RETLW 3FH RETLW 3FH END

33

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 91gzw.com 版权所有 湘ICP备2023023988号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务