51单片机的ADC0808数字电压表设计
时间:2023-10-27 22:07:02
摘要
近年来,数字电压表逐渐进入人们的视野,主要采用数字测量技术。与传统的指针仪器相比,其功能进一步改进,精度大大提高。数字电压表主要采用单片机和模具/数转换模块,不仅提高了测量速度,而且具有较强的抗干扰性、使用方便、可扩展性强、测量准确等优点。
本文主要采用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所示:
图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]