您的当前位置:首页数字电压表

数字电压表

2021-09-18 来源:六九路网


基于单片机的数字电压表设计

班 级: 专 业: 设 计 者: 学 号: 指导老师: 实习日期:

东华理工大学

2012年6月24日

基于51单片机的数字电压表设计

目 录

一 引 言........................................................1 二 硬件电路设计...................................................2

2.1 AT89C51单片机..............................................3 2.2 复位电路和时钟电路..........................................5 2.3 A/D转换模块................................................6 2.4 LED显示系统设计............................................9 三 硬件设计思想和原理图..........................................11 3.1 系统总体设计框图.........................................11

3.2 单片机系统................................................11 3.3 AD转换电路...............................................12 3.4 信号调理模块..............................................13 四 软件设计与流程...............................................14

4.1 程序流图..................................................14 4.2 功能介绍..................................................15 五 软件仿真及测试数据............................................16

5.1 仿真结果.................................................16 六 实验心得......................................................18 七 参考文献......................................................18 附 录..........................................................19

1

基于51单片机的数字电压表设计

一 引 言

电子电压表主要用于测量各种高、低频信号电压,它是电子测量中使用最

广泛的仪器之一。根据测量结果的显示方式及测量原理不同,电压测量仪器可分为两大类:模拟式电压表(AVM)和数字式电压表(DVM)。模拟式电压表是指针式的,多用磁电式电流表作为指示器,并在表盘上刻以电压刻度。数字式电压表首先将模拟量经模数(A/D)转换器变成数字量,然后用电子计数器计数,并以十进制数字显示被测电压值。

众所周知,模拟电压表精度较高,曾经有很广阔的市场,现在依然有不少工程师依然在使用模拟电压表。的确模拟电压表在显示测量值方面精度校准,然而却也存在问题。模拟电压表采用用指针式,里面是磁电或电磁式结构,所以其响应速度较慢。

最近的几十年来,随着半导体技术、集成电路(IC)和微处理器技术的发展,数字电路和数字化测量技术也有了巨大的进步,从而促使了数字电压表的快速发展,并不断出现新的类型。数字电压表从1952年问世以来,经历了不断改进的过程,从最早采用继电器、电子管和形式发展到了现在的全固态化、集成化(IC化),另一方面,精度也从0.01%-0.005%。

目前,数字电压表的内部核心部件是A/D转换器,转换的精度很大程度上影响着数字电压表的准确度,因而,以后数字电压表的发展就着眼在高精度和低成本这两个方面。

然而在高速发展的当今社会,高速信号处理的需求越来越多,由于模拟电压表响应速度较慢已经不适用与高速信号领域,取而代之的将是数字电压表。但数字电压表由于存在采样误差,精度不是很高。不过目前可以通过技术手段来缩小误差。使其精度达到与模拟电压表一样精确甚至更高。可见将来数字电压表必将取代模拟电压表。现在有越来越多的数字测量仪器的出现但原理皆与数字电压表殊途同归,因此研究数字电压表有着很大现实意义。

2

基于51单片机的数字电压表设计

二 硬件电路设计

2.1 AT89C51单片机

2.1.1 AT89C51性能

AT89C51是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含有4KB的可反复擦写的只读程序存储器和128字节的随机存储器。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容,由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,它为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

AT89C51功能性能:与MCS-51成品指令系统完全兼容;4KB可编程闪速存储器;寿命:1000次写/擦循环;数据保留时间:10年;全静态工作:0-24MHz;三级程序存储器锁定;128*8B内部RAM;32个可编程I/O口线;2个16位定时/计数器;5个中断源;可编程串行UART通道;片内震荡器和掉电模式[6]。

2.1.2 AT89C51各引脚功能

AT89C51提供以下标准功能:4KB的Flash闪速存储器,128B内部RAM,32个I/O口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内震荡器及时钟电路,同时,AT89C51可降至0Hz静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作,掉电方式保存RAM中的内容,但震荡器停止工作并禁止其他所有工作直到下一个硬件复位。AT89C51采用PDIP

[7]

封装形式,引脚配置如图5所示。

图5 AT89C51的引脚图

AT89C51芯片的各引脚功能为:

P0口:这组引脚共有8条,P0.0为最低位。这8个引脚有两种不同的功能,分别适用于不同的情况,第一种情况是89C51不带外存储器,P0口可以为通用

3

基于51单片机的数字电压表设计

I/O口使用,P0.0-P0.7用于传送CPU的输入/输出数据,这时输出数据可以得到锁存,不需要外接专用锁存器,输入数据可以得到缓冲,增加了数据输入的可靠性;第二种情况是89C51带片外存储器,P0.0-P0.7在CPU访问片外存储器时先传送片外存储器的低8位地址,然后传送CPU对片外存储器的读/写数据。P0口为开漏输出,在作为通用I/O使用时,需要在外部用电阻上拉。

P1口:这8个引脚和P0口的8个引脚类似,P1.7为最高位,P1.0为最低位,当P1口作为通用I/O口使用时,P1.0-P1.7的功能和P0口的第一功能相同,也用于传送用户的输入和输出数据。

P2口:这组引脚的第一功能与上述两组引脚的第一功能相同即它可以作为通用I/O口使用,它的第一功能和P0口引脚的第二功能相配合,用于输出片外存储器的高8位地址,共同选中片外存储器单元,但并不是像P0口那样传送存储器的读/写数据。

P3口:这组引脚的第一功能和其余三个端口的第一功能相同,第二功能为控制功能,每个引脚并不完全相同,如下表2所示:

表2 P3口各位的第二功能 P3口各位 P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7 第二功能 RXT(串行口输入) TXD(串行口输出) /INT0(外部中断0输入) /INT1(外部中断1输入) T0(定时器/计数器0的外部输入) T1(定时器/计数器1的外部输入) /WR(片外数据存储器写允许) /RD(片外数据存储器读允许) Vcc为+5V电源线,Vss接地。 ALE:地址锁存允许线,配合P0口的第二功能使用,在访问外部存储器时,89C51的CPU在P0.0-P0.7引脚线去传送随后而来的片外存储器读/写数据。在不访问片外存储器时,89C51自动在ALE线上输出频率为1/6震荡器频率的脉冲序列。该脉冲序列可以作为外部时钟源或定时脉冲使用。

/EA:片外存储器访问选择线,可以控制89C51使用片内ROM或使用片外ROM, 若/EA=1,则允许使用片内ROM, 若/EA=0,则只使用片外ROM。

/PSEN:片外ROM的选通线,在访问片外ROM时,89C51自动在/PSEN线上产生一个负脉冲,作为片外ROM芯片的读选通信号。

RST:复位线,可以使89C51处于复位(即初始化)工作状态。通常89C51复位有自动上电复位和人工按键复位两种。

XTAL1和XTAL2:片内震荡电路输入线,这两个端子用来外接石英晶体和微调电容,即用来连接89C51片内OSC(震荡器)的定时反馈回路。

4

基于51单片机的数字电压表设计

2.2 复位电路和时钟电路

2.2.1 复位电路设计

单片机在启动运行时都需要复位,使CPU和系统中的其他部件都处于一个确定的初始状态,并从这个状态开始工作。MCS-51单片机有一个复位引脚RST,采用施密特触发输入。当震荡器起振后,只要该引脚上出现2个机器周期以上的高电平即可确保时器件复位[1]。复位完成后,如果RST端继续保持高电平,MCS-51就一直处于复位状态,只要RST恢复低电平后,单片机才能进入其他工作状态。单片机的复位方式有上电自动复位和手动复位两种,图6是51系列单片机统常用的上电复位和手动复位组合电路,只要Vcc上升时间不超过1ms,它们都能很好的工作[1]。

图6 复位电路

2.2.2 时钟电路设计

单片机中CPU每执行一条指令,都必须在统一的时钟脉冲的控制下严格按时间节拍进行,而这个时钟脉冲是单片机控制中的时序电路发出的。CPU执行一条指令的各个微操作所对应时间顺序称为单片机的时序。MCS-51单片机芯片内部有一个高增益反相放大器,用于构成震荡器,XTAL1为该放大器的输入端,XTAL2为该放大器输出端,但形成时钟电路还需附加其他电路[1]。

本设计系统采用内部时钟方式,利用单片机内部的高增益反相放大器,外部电路简,只需要一个晶振和 2个电容即可,如图7所示。

图7 时钟电路

电路中的器件选择可以通过计算和实验确定,也可以参考一些典型电路的参数,电路中,电容器C1和C2对震荡频率有微调作用,通常的取值范围是30±10pF,在这个系统中选择了33pF;石英晶振选择范围最高可选24MHz,它决定了单片机电路产生的时钟信号震荡频率,在本系统中选择的是12MHz,因

5

基于51单片机的数字电压表设计

而时钟信号的震荡频率为12MHz。

2.3 A/D转换模块

现实世界的物理量都是模拟量,能把模拟量转化成数字量的器件称为模/数转换器(A/D转换器),A/D转换器是单片机数据采集系统的关键接口电路,按照各种A/D芯片的转化原理可分为逐次逼近型,双重积分型等等。双积分式A/D转换器具有抗干扰能力强、转换精度高、价格便宜等优点。与双积分相比,逐次逼近式A/D转换的转换速度更快,而且精度更高,比如ADC0809、ADC0808等,它们通常具有8路模拟选通开关及地址译码、锁存电路等,它们可以与单片机系统连接,将数字量送到单片机进行分析和显示。一个n位的逐次逼近型A/D转换器只需要比较n次,转换时间只取决于位数和时钟周期,逐次逼近型A/D转换器转换速度快,因而在实际中广泛使用[1]。

2.3.1 逐次逼近型A/D转换器原理

逐次逼近型A/D转换器是由一个比较器、A/D转换器、存储器及控制电路组成。它利用内部的寄存器从高位到低位一次开始逐位试探比较。 转换过程如下:

开始时,寄存器各位清零,转换时,先将最高位置1,把数据送入A/D转换器转换,转换结果与输入的模拟量比较,如果转换的模拟量比输入的模拟量小,则1保留,如果转换的模拟量比输入的模拟量大,则1不保留,然后从第二位依次重复上述过程直至最低位,最后寄存器中的内容就是输入模拟量对应的二进制数字量[5]。其原理框图如图2所示:

输入数字量 顺序脉冲发生器 逐次逼近寄存器 电压 比较器 输入电压 ADC

图2 逐次逼近式A/D转换器原理图

2.3.2 ADC0808 主要特性

ADC0808是CMOS单片型逐次逼近式A/D转换器,带有使能控制端,与微机直接接口,片内带有锁存功能的8路模拟多路开关,可以对8路0-5V输入模拟电压信号分时进行转换,由于ADC0808设计时考虑到若干种模/数变换技术的长处,所以该芯片非常适应于过程控制,微控制器输入通道的接口电路,智能仪器和机床控制等领域[5]。

ADC0808主要特性:8路8位A/D转换器,即分辨率8位;具有锁存控制的8路模拟开关;易与各种微控制器接口;可锁存三态输出,输出与TTL兼容;转换

6

基于51单片机的数字电压表设计

时间:128μs;转换精度:0.2%;单个+5V电源供电;模拟输入电压范围0- +5V,无需外部零点和满度调整;低功耗,约15mW[6]。

2.3.3 ADC0808的外部引脚特征

ADC0808芯片有28条引脚,采用双列直插式封装,其引脚图如图3所示。

图3 ADC0808引脚图

下面说明各个引脚功能: IN0-IN7(8条):8路模拟量输入线,用于输入和控制被转换的模拟电压。 地址输入控制(4条):

ALE:地址锁存允许输入线,高电平有效,当ALE为高电平时,为地址输入线,用于选择IN0-IN7上那一条模拟电压送给比较器进行A/D转换。

ADDA,ADDB,ADDC:3位地址输入线,用于选择8路模拟输入中的一路,其对应关系如表1所示:

表1 ADC0808通道选择表 地址码 对应的输入通道 C B A 0 0 0 IN0 0 0 1 IN1 0 1 0 IN2 0 1 1 IN3 1 0 0 IN4 1 0 1 IN5 1 1 0 IN6 1 1 1 IN7 START:START为“启动脉冲”输入法,该线上正脉冲由CPU送来,宽度应大于100ns,上升沿清零SAR,下降沿启动ADC工作。

EOC: EOC为转换结束输出线,该线上高电平表示A/D转换已结束,数字量

7

基于51单片机的数字电压表设计

已锁入三态输出锁存器。

D1-D8:数字量输出端,D1为高位。

OE:OE为输出允许端,高电平能使D1-D8引脚上输出转换后的数字量。 REF+、REF-:参考电压输入量,给电阻阶梯网络供给标准电压。

Vcc、GND: Vcc为主电源输入端,GND为接地端,一般REF+与Vcc连接在一起,REF-与GND连接在一起. CLK:时钟输入端。

2.3.4 ADC0808的内部结构及工作流程

ADC0808由8路模拟通道选择开关,地址锁存与译码器,比较器,8位开关树型A/D转换器,逐次逼近型寄存器,定时和控制电路和三态输出锁存器等组成,其内部结构如图4所示。

图4 ADC0808的内部结构

其中:

(1)8路模拟通道选择开关实现从8路输入模拟量中选择一路送给后面的比较器进行比较。

(2)地址锁存与译码器用于当ALE信号有效时,锁存从ADDA、ADDB、ADDC 3根地址线上送来的3位地址,译码后产生通道选择信号,从8路模拟通道中选择当前模拟通道。

(3)比较器,8位开关树型A/D转换器,逐次逼近型寄存器,定时和控制电路组成8位A/D转换器,当START信号有效时,就开始对当前通道的模拟信号进行转换,转换完成后,把转换得到的数字量送到8位三态锁存器,同时通过引脚送出转换结束信号。

(4)三态输出锁存器保存当前模拟通道转换得到的数字量,当OE信号有效时,把转换的结果送出。 ADC0808的工作流程为:

(1)输入3位地址,并使ALE=1,将地址存入地址锁存器中,经地址译码器从8路模拟通道中选通1路模拟量送给比较器。

8

基于51单片机的数字电压表设计

(2)送START一高脉冲,START的上升沿使逐次寄存器复位,下降沿启动A/D转换,并使EOC信号为低电平。

(3)当转换结束时,转换的结果送入到输出三态锁存器中,并使EOC信号回到高电平,通知CPU已转换结束。 (4)当CPU执行一读数据指令时,使OE为高电平,则从输出端D0-D7读出数据。

2.4 LED显示系统设计

2.4.1 LED基本结构

LED是发光二极管显示器的缩写。LED由于结构简单、价格便宜、与单片机接口方便等优点而得到广泛应用。LED显示器是由若干个发光二极管组成显示字段的显示器件[6]。在单片机中使用最多的是七段数码显示器。LED七段数码显示器由8个发光二极管组成显示字段,其中7个长条形的发光二极管排列成“日”字形,另一个圆点形的发光二极管在显示器的右下角作为显示小数点用,其通过不同的组合可用来显示各种数字。LED引脚排列如下图8所示:

图8 LED引脚排列

2、4.2共阳共阴LED数码管引脚图管脚接口

常见的数码管由七个条状和一个点状发光二极管管芯制成,叫七段数码管如下图所示,根据其结构的不同,可分为共阳极数码管和共阴极数码管两种。根据管脚资料,您可以判断使用的是何总接口类型.

9

基于51单片机的数字电压表设计

LED数码管中各段发光二极管的伏安特性和普通二极管类似,只是正向压降较大,正向电阻也较大。在一定范围内,其正向电流与发光亮度成正比。由于常规的数码管起辉电流只有1~2 mA,最大极限电流也只有10~30 mA,所以它的输入端在5 V电源或高于TTL高电平(3.5 V)的电路信号相接时,一定要串加限流电阻,以免损坏器件。

2.4.3 LED译码方式

译码方式是指由显示字符转换得到对应的字段码的方式,对于LED数码管显示器,通常的译码方式有硬件译码和软件译码方式两种。

硬件译码是指利用专门的硬件电路来实现显示字符码的转换。

软件译码就是编写软件译码程序,通过译码程序来得到要显示的字符的字段码,译码程序通常为查表程序[3]。

本设计系统中为了简化硬件线路设计,LED译码采用软件编程来实现。由于本设计采用的是共阴极LED,其对应的字符和字段码如下表3.3所示。

表3.3 共阴极字段码表

显示字符 共阴极字段码 0 3FH 1 2 3 4 5 6 7 8 9 06H 5BH 4FH 66H 6DH 7DH 07H 7FH 6FH 2.4.4 LED显示器与单片机接口设计

由于单片机的并行口不能直接驱动LED显示器,所以,在一般情况下,必须采用专用的驱动电路芯片,使之产生足够大的电流,显示器才能正常工作[7]。如果驱动电路能力差,即负载能力不够时,显示器亮度就低,而且驱动电路长期在超负荷下运行容易损坏,因此,LED显示器的驱动电路设计是一个非常重要的问题。

为了简化数字式直流电压表的电路设计,在LED驱动电路的设计上,可以利用单片机P1口来实现,即将LED的A-G段显示引脚和DP小数点显示引脚并联到P1口,通过P2口来选择数码管,使得LED能按照正常的亮度显示出数字

10

基于51单片机的数字电压表设计

三 硬件设计思想和原理图

3.1 系统总体设计框图

本系统采样Atmel89C52单片机作为控制核心,以ADC0809为数据采样系统,实现被测电压的数据采样;使用系列比较器检测输入电压的范围,用共阴极数码管显示结果。 输

入电压 极性检测 电压检测 51单片机 显示电路 AD转换 图3.1

3.2 单片机系统

单片机最小系统包括复位电路,晶振电路,电源电路,仿真时需搭建复位电路和晶振电路。

晶振电路:

图3.2

单片机最小系统如下所示,其中P1口用于驱动数码管,P0口用于接收ADC0809转换的数据。P2口用于控制ADC0809。

11

基于51单片机的数字电压表设计

单片机最小系统: 图3.3

3.3 AD转换电路

利用ADC0809作为AD数据采样器件, ADC0809是CMOS单片型逐次逼近式

A/D转换器它由8路模拟开关、地址锁存与译码器、比较器、8位开关树型D/A转换器、逐次逼近。ADC0809的工作过程是:首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。此地址经译码选通8路模拟输入之一到比较器。START上升沿将逐次逼近寄存器复位。下降沿启动 A/D转换,之后EOC输出信号变低,指示转换正在进行。直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。当OE输入高电平 时,输出三态门打开,转换结果的数字量输出到数据总线上。 ADC0809各个管教功能:

IN0~IN7:8路模拟量输入端。 2-1~2-8:8位数字量输出端。

ADDA、ADDB、ADDC:3位地址输入线,用于选通8路模拟输入中的一路

12

基于51单片机的数字电压表设计

ALE:地址锁存允许信号,输入,高电平有效。 START: A/D转换启动信号,输入,高电平有效。

EOC: A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。

OE:数据输出允许信号,输入,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。 CLK:时钟脉冲输入端。要求时钟频率不高于640KHZ。 REF(+)、REF(-):基准电压。

Vcc:电源,单一+5V。 GND:地。 ADC0809与单片机的连接。

C1U130pFCRYSTAL19U2P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD3938373635343332212223242526272810111213141516172627281234567910111216IN0IN1IN2IN3IN4IN5IN6IN7STARTEOCOUTPUT ENABLECLOCKVCCVREF(+)VREF(-)ADC0809ADD AADD BADD CALE2 -1MSB2 -22 -32 -42 -52 -62 -72 -8LSBGND2524232221201918815141713X118XTAL1C230pFXTAL29RSTR11kC3+5v10uF293031PSENALEEA12345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C51+5v 图3.4

3.4 信号调理模块

该部分主要实现的功能是自动量程切换和电压变换,模块主要由电压极性

检测电路、电压范围粗测电路、电压变换电路三部分组成。

电压极性检测电路

13

基于51单片机的数字电压表设计

电压极性检测电路采用过零比较器检测负电压的方式实现的,运算放大器LM324的反向端接地,同向端通过100K电阻接输入信号。

图3.5 电压范围粗测电路

为了粗略地得到被测量的电压范围我们采用多组比较器的方式,通过阶梯式比较的方法确定输入电压的范围。

图3.6

量程切换电路

电路由衰减电阻、切换继电器和运算放大器组成,对应的是衰减1/2、1/3、1/4和无零漂放大50倍,切换电路如图所示。电压变换到0-5V标准信号后,再由A/D转换进行采样,最后由单片机算法还原。

14

基于51单片机的数字电压表设计

第四章 软件设计与流程

4.1 程序流图

软件部分采用模块化程序设计的方法,由单片机控制主程序、A/D转换子

程序、电压检测及继电器控制程序、液晶显示组成。系统软件设计是在KeilC编译环境下进行的,由于C语言程序可移植性好,所以提高了编程的效率。 软件程序流程图:

图4.1 4.2 功能介绍

P0首先接收数据,据此控制PC6,PC7实现电压转换,保证正电压输出。

PB0,PB1,PB2,PB3,PA6的输入值通过PA1,PA2,PA3,PA4,PA5控制继电器1,2,3,4,5实现电压增减并输入A/D转换器MAX187进行测量。最后输入PB4,PB6,PB7并由P1输入数码管显示。

15

基于51单片机的数字电压表设计

第五章 软件仿真及测试数据

5.1 仿真结果

将写好的程序下载到仿真软件中的51单片机中,点击运行,观察数码管显示数值与图中输入电压进行比较。理解其误差有多大。输入的电压从0-5V变化时,数字电压表能够测量出并用数码管显示出来,但是测量误差会比较大,程序讲过多次修改还是不理想。

总体电路图:

16

基于51单片机的数字电压表设计

图5.1

17

基于51单片机的数字电压表设计

六 实验心得

此次综合训练是由三人小组一起努力共同完成的。其中,***负责软件部分编写,***负责硬件部分设计,***负责资料的收集和实验报告的编写,三人分工合作,最终完成任务。

通过此次综合训练,我们都学到了好多东西,加深了对单片机等知识的了解,学到了很多关于A/D、D/A的知识,提高了应用思考和和设计的能力。以前对一些只是的学习只是停留在理论上,通过这次综合训练让我感受到了理论和实践的差距。在分析设计课题,查阅资料,设计和仿真时尽管遇到很多问题,但是在老师和同学们的帮助下,当然还有在我们小组的共同努力下,都得到了较好的解决,最终完成了任务。不仅锻炼了分析解决问题的能力,更重要的是加强了对电子应用学习的兴趣。

在此次综合训练的过程中也让我们体会到了自身的不足,在以后的学习中要加强动手能力的锻炼。结果固然是要,但是更重要的过程,感谢老师在这次综合训练过程中对我们的耐心指导和帮助。

七 参考文献

[1] 童诗白、华成英编《模拟电子技术基础》第四版 高等教育出版社 [2] 谭浩强 编《C语言程序设计(第二版)》 清华大学出版社

[3] 朱兆优、陈坚等 编《单片机技术原理与应用》 电子工业出版社

18

基于51单片机的数字电压表设计

附 录

主程序:

#include Unsigned char

dispbitcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; code

unsigned char dispbuf[4]; unsigned int i; unsigned int j;

unsigned char getdata; unsigned int temp; unsigned int temp1; unsigned char count; unsigned char d; sbit ST=P3^0; sbit OE=P3^1; sbit EOC=P3^2; sbit CLK=P3^3; sbit P20=P2^0; sbit P21=P2^1; sbit P22=P2^2; sbit P23=P2^3; sbit P17=P1^7; void TimeInitial();

void Delay(unsigned int i);

void TimeInitial() { TMOD=0x10;

TH1=(65536-200)/256; TL1=(65536-200)%256; EA=1; ET1=1; TR1=1; }

void Delay(unsigned int i) {

unsigned int j; for(;i>0;i--) {

for(j=0;j<125;j++) {;} } }

19

基于51单片机的数字电压表设计

void Display() {

P1=dispbitcode[dispbuf[3]]; P20=0; P21=1; P22=1; P23=1; Delay(10); P1=0x00;

P1=dispbitcode[dispbuf[2]]; P17=1; P20=1; P21=0; P22=1; P23=1; Delay(10); P1=0x00;

P1=dispbitcode[dispbuf[1]]; P20=1; P21=1; P22=0; P23=1; Delay(10); P1=0x00;

P1=dispbitcode[dispbuf[0]]; P20=1; P21=1; P22=1; P23=0; Delay(10); P1=0x00; }

void main() {

TimeInitial(); while(1) {

ST=0; OE=0; ST=1; ST=0;

while(EOC==0);//查询转换结束 OE=1;

20

基于51单片机的数字电压表设计

getdata=P0; OE=0;

temp=getdata*1.0/255*500; dispbuf[0]=temp%10; dispbuf[1]=temp/10%10; dispbuf[2]=temp/100%10; dispbuf[3]=temp/1000; Display(); } }

void t1(void) interrupt 3 using 0 {

TH1=(65536-200)/256; TL1=(65536-200)%256; CLK=~CLK; }

21

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