资讯详情

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

摘要

近年来,数字电压表逐渐进入人们的视野,主要采用数字测量技术。与传统的指针仪器相比,其功能进一步改进,精度大大提高。数字电压表主要采用单片机和模具/数转换模块,不仅提高了测量速度,而且具有较强的抗干扰性、使用方便、可扩展性强、测量准确等优点。

本文主要采用AT89C51单片机和ADC由0808芯片制成的简的简单数字电压表~5V和5~10V测量模拟直流电压,测量结果为液晶LCD1602上显示。硬件电路的设计主要由三个模块组成:A/D转换模块、数据处理模块和输出显示模块。由单片机处理数据AT89C51来完成,主要是把ADC0808传输的值经过一定数据处理,然后送到显示模块显示,同时控制显示芯片1602的工作。程序设计包括模块初始化操作、电压档位选择和LCD1602液晶显示程序等。

系统硬件设计总体方案

1.1 设计要求

以MCS-51单片机是制作简单数字电压表的关键部件。可选择直流电压输入,可测量0-5V和5-10V直流电压之间。当电压值超过5时V选择通道2(5-10V电压采集通道)。

使用LCD1602完成电压液晶显示。

使用较少的部件,尽量减少功耗,同时准确、快速地完成测量。

由于电压表允许过载,因此所测电压允许适当超过量程。

1.2 设计方案

总体设计电路由以下部分组成:AT89C51单片机、A/D转换电路,液晶LCD显示电路、时钟电路、复位电路、测量电压输入电路、量程选择和报警电路。总体硬件设计框图如图1-1所示:

296b24d61cfbcb744b5aa0765bece43e.png

图1-1 硬件电路设计框图

1.3 2.

硬件电路设计系统

2.1 A/D转换模块

日常生活中的物理量是模拟量,为了方便地分析每个量,需要将模拟量转换为数字量的装置。如今,越来越多的设备需要转换模数,将复杂的模拟信号转换为已理解的数字信号,因此A/D转换器也得到了更深入的研究。按照不同的A/D转换芯片的转换原理可分为逐步接近行、双点类型等。双积分A/D转换器抗干扰能力强,转换精度高,价格低廉。但与双积分相比,逐渐接近A/D转换速度更快,精度更高。它们可以连接到单片机系统,并将数字送到单片机进行分析和显示。n位一次接近转换器只需要比较n次,大大节省了时间,一次接近转换速度快,在实践中得到了广泛的应用。

由于ADC0808芯片逐渐接近A/D因此,本设计采用模/数转换,可实现8路模拟信号的选择采集,转换时间为100us。使用12MHz晶体振动,因此它可以提供满足设计需足设计的需要。

对于n位的A/D转换器的分辨率为满量输入电压和2n之比。ADC0808的满量程为5V。其分辨率为0.02V。

ADC0808内部结构主要有8路模拟通道选择开关、地址存与译码器和8位A/D其引脚及连接电路如图2-1所示:

图2-1 ADC0808引脚图

如图2-1所示,其中IN0~IN7为模拟量输入通道,输入电压范围为0~5V。设计分为两个通道输入IN0(0-5V)和IN1(5-10V),并采用开关K1、K2来选择。A、B、C单片机是模拟量输入通道的选择端P通过软件编程连接并产生控制信号。ALE、START为地址锁定允许信号并转换启动信号。它们都有单片机P三口产生控制信号。转换器的CLK单片机的中断程序主要是完成输入数据的扫描。EOC是ADC0808信号端口转换结束时,只能等到EOC在数据转换结束之前,变成高电平。要实现这一过程,需要使用程序设计来完成。OE只输出允许信号OE只有在低电平时,才能输出转换获得的数据。程序中先让OE为0,然后为1,将数据发送到单片机P2口。VREF( )、VREF(-)是芯片的电源接口。

2.2 电压输入电路

ADC0808基准电压为 5V,因此,当需要测量的电压值超过5时V衰减电路由开关选择,衰减后输入转换收集器。输入电路如图2-4所示:

图2-4 输入电路图

当要测试的电压为0时~5V时,选择IN0输入,在模拟中使用滑动变阻器分压的原理产生0-5V代表实际电压的电压。而当超过5V选择左边的电路,因为实际的电压变化允许适当的过量范围,所以在图中R5和R6的电阻值分别为6k、3k,因此,由于电压衰减为原电压值的1/3,RV55分压的原理可以得到5~10V模拟实际要测试的电压值。同时,最高测量电压允许适当超过10V。这样,本电压表有两个量程,即0~5V和5V~10V。选侧开关需要变换量程时K1、K2相互切换。由于本设计采用手动调节电压档位的方式,在测量电压时应首先估计测量电压,并首先测量较大的范围。如果值太小,则调整档位。否则,过量程损坏仪器不容易。输入直流电压时,由于出现尖峰,需要过滤输入电压和电容C4、C5在次的作用是滤波

2.3 接口电路

对于本设计,主接口电路包括时钟电路、复位电路、电压范围选择和报警电路。

2.4.1时钟电路

单片机89C51芯片中有一个内部时钟,其中18个引脚是输入端,19个引脚是输出端引脚连接12个MHz晶体振动,同时连接两个瓷片电容,提供片内相移的条件,时钟电路如图2-5所示:

图2-5 时钟电路图

从图2-4可以看出,晶体的振荡频率通常取12MHz,对于11.0592MHz一般用于单片机串行通信。此时,单片机的时钟周期为:

(2-1)

图电容C1和C2.它们与晶体振动的主要作用是结合单片机内部振荡电路实现相位180°移相,使晶体振动能够振动。同时,电路所需的电容储电量不高,均为30pF。过高或过低都会影响振荡。

2.4.2 复位电路

AT89C51单片机的RST复位引脚,复位信号高电平有效,其有效时间应延续2个以上的机器周期,以确保系统复位,复位操作完成后,RST当端始终保持高电平时,单片机始终处于复位状态RST单片机只有在恢复低电平后才能进入其他操作。单片机复位电路有几种,本设计主要采用手动复位电路,可人工操作,简单方便。如图2-6所示:

图2-6 复位电路

从上图2-6可以看出,只有RST复位操作只有在两个周期以上的高电平后才能完成。电容C3两端在单片机启动时持续充电为5V,由于按钮没有按下,电阻R1两端电压为0,此时RST当按下按钮时,低电平系统正常工作R2所在的支路与C3形成电容的电路C在很短的时间内,电压值从5开始释放之前充电的电量V变为1.0V,甚至更小,同时,RST又收到高电平,此时系统自动复位。

2.4.3量程选择和报警电路

由于采用双通道输入的方式,本设计可选择0不同的量程~5V和5~10V。选择开关进行此操作K1、K但如果K1、K同时关闭,报警提示灯亮起。电路如图2-7所示:

图2-7 量程选择和报警电路图

2.4 LCD1602显示电路设计

本设计采用LCD1602作为显示器,与以前一样LED与数字管显示相比,其显示模块具有体积小、功耗低、显示内容丰富等优点,不需要额外的驱动电路。同时,它可以满足不同的输入和位移要求,界面简单可靠。LCD如图2-8所示,1602模块的引脚及连接电路:

图2-8 LCD1602引脚

其中D0~D7数据接收端口和单片机P0口相连。E当它从0变为1时,端为使能端,LCD读写操作只能在1602进行,它与单片机P3.5连接并输出控制信号。RS、RW它们是单片机的读写控制端,分别是1602P3.6、P3.这样使用7对应LCD单片机程序可以控制显示。VDD、VSS液晶屏的电源端口,VEE端电压信号的大小可以改变液晶屏的亮度。由于P当0口作为输出口时,它没有高电平,所以模拟电路需要增加拉电阻RP1,这样P0口处于高电平状态。

3.系统程序设计

如图3-1所示:

图3-1 系统主程序流程图

本设计程序设计主要分为几个模块:初始化程序设计A/D采样程序设计、测量参数数据处理程序设计、量程选择和报警程序设计LCD1602显示程序设计。每个模块的程序设计序设计。

3.1 初始化程序

所谓初始化,将用于单片机内部各部件或扩展芯片设置初始工作状态,主要负责设置定时器模式、初始设置、开启中断、开启定时器等。液晶1602也应初始化,包括清除显示屏、显示开启/关闭控制、功能设置、进入模式设置等。一些初始化程序如下:

w_comd(0x0c);  //开显示屏,关光标;

w_comd(0x06);                                          //字符进入模式:屏幕不动,字符后移;

ET0=1;                                                                      //开定时中断;

3.2    A/D转换程序

模/数转换流程图如图3-2所示。

图3-2 A/D转换流程图

由图可知,A/D转换程序首先定义启动信号、输出允许信号、输入地址锁存信号、A/D转换结束信号及CLK时钟信号的变量。然后利用AT89C51中定时器T0的工作方式2产生CLK信号,供A/D转换器使用,START信号的上升沿启动A/D转换,等待转换结束,即EOC从0变为1,同时OE是输出使能信号端,其信号从高到低电平,输出转换数据并将其进行数值转换分别求出百、十、个位,再送入LCD进行数据显示。

3.3    LCD1602显示程序3.3.1 LCD1602初始化

液晶LCD初始化主要就是在液晶显示器的每一个寄存器的初始设置,也就是向LCD中的各个寄存器写入要设定的数据。该设计的初始化过程为先上电,然后进行判忙操作,最后再进行各个功能的设置,其中包括显示状态的设置(行、位的起始位置)、输入方式的设置。初始化过程如图3-5所示:

图3-5 LCD初始化流程图

该设计主要使用了LCD1602的读忙操作、写数据操作、写命令操作和写字符操作。其中每个操作都需要使能端RW、RS的控制信号,当RS、RW均为0的情况下,可以进行读、写操作,而读忙只有RS=0、RW=1时,才能进行此操作。LCD1602如果要显示字符,首先要写入显示字符的首地址,此次使用的是从第一行第四个字符04地址开始显示,但是液晶写数据操作时地址最高位D7必须为高电平,因此写入数据的时候应该是00000100(04H)+10000000(80H)=10000100(84H)。

4.1    显示结果及误差分析4.2.1 显示结果当输入电压为4.55V时,显示结果如图4-1 所示,实际电压为4.54V。

图4-1 输入电压为4.55V时,LCD显示结果

当输入电压为9.97V时,显示结果如图4.2所示,实际电压为9.96V。

4.2.2 误差分析

通过对输入不同的电压进行测试,得到了仿真数据。可得出两者的对比测试表,如下表4-1所示:

表4-1 简易电压表与“标准”电压表对比测试表标准电压/V电压表测量值/V绝对误差/V

1.50

3.50

4.50

5.00

7.45

8.71

9.971.50

3.49

4.49

5.00

7.44

8.70

9.960.00

0.01

0.01

0.00

0.01

0.01

0.01

从表4-1中的几组数据的分析,测试电压误差以0.01V的幅度变化。这主要是硬件本身的误差导致。由于单片机AT89C51、ADC0808数据传输端口为8,当输入电压为5.00V时,输出端口的数据为11111111(FFH),所以ADC0808的最高分辩率为0.0196V(5/255)。这就决定了电压表的最高分辩率只能到0.0196,因此测试电压通常以0.01的幅度变化。

该数字电压表所测得的电压值和标准的电压相比,大概有0-0.01V的偏差。由于硬件方面的原因,此误差只能通过硬件上的完善才能得以校正。因为该电压表设计时用的是5V的供电电源作为基准电压,所以电压可能出现误差。如果要测量大于5V的电压时,应当使用分压电路,程序中对计算结果进行调整就可以了。

通过多次的仿真和调整,此次设计的电压表的绝对误差为0~0.01V,因此本次毕业设计符合最初设计要求。

附录一 系统硬件设计总图

单片机源程序如下:

#include#define uchar unsigned char

#define  uint unsigned int

sbit OE=P3^2;                                                                                    //AD数据输出控制端口

sbit EOC=P3^3;                                                                      //数据转换结束由0变1

sbit START=P3^4;                                                                      //AD转换启动  ALE接口

sbit CLK=P3^1;

sbit  rw=P3^6;                                                                      //1602读写选择

sbit  rs=P3^5;                                                                                    //1602寄存器选择端

sbit  en=P3^7;                                                                      // //1602读写使能端

sbit a=P1^0;                                                                                    //a,b,c为转换器通道选择地址

sbit b=P1^1;

sbit c=P1^2;

sbit d=P1^5;                                                                                                  //报警信号端

sbit K1=P1^6;                                                                                                  //量程选择开关

sbit K2=P1^7;

uchar dis[4]={0,0,0,0};                                                                      //缓存数据处理结果

void delay(uchar i)                                                                      //延时程序

{ uchar n;

while(i--)

{

for(n=0;n<250;n++)

;

}

}

bit lcd_busy_check()                                                        //1602状态检测是否忙碌

{ bit  result;

[1] [2] [3]

标签: 式数字变送器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台