微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 用AT89C51实现模数转换

用AT89C51实现模数转换

时间:02-21 来源:互联网 点击:

本期教程通过一个简单的电压测量电路,讲解AT89C2051片内比较器的使用及模数转换主程序的设计,说明利用RC充电规律实现模数转换,取得被测电压近似值的原理。

一、电路构成与功能

由图1可知,本电路主要由AT89C2051(IC1)、R10、C4等组成,被测电压从P1.1输入,电路通过对C4充电电压与被测电压的比较得到电压值,然后将被测电压值转换为相应的显示代码,送LED1、LED2中显示出来。

二、AT89C2051简介

AT89C2051与AT89C51相比,除去掉了P0口和P2口,并在P1口的P1.0、P1.1与P3口的P3.6之间嵌入了一个精确的模拟比较器外,其他硬件资源完全相同。AT89C2051具有以下一些标准特性:2K字节的闪速存储器,128字节RAM,15条I/O线,2个16位定时/计数器,5个两级中断源结构,一个全双工串行口,一个精确的模拟比较器,片内振荡器和时钟电路。此外,AT89C2051设有静态逻辑,可以在低到零频率的条件下工作,支持两种软件可选的省电模式:在闲置模式下,CPU停止工作,但RAM、定时器/计数器、串口和中断系统仍在工作;在掉电模式下,保存RAM中的内容并且冻结振荡器,禁止所有其他片内控制单元功能,直到下一个硬件复位为止。

AT89C2051只有20个引脚。引脚排列及片内比较器连接示意图见图2。由图可知,P1.0与比较器的同相输入端相接,

P1.1与比较器的反相输入端相接,比较器的输出端在片内与P3.6相接,而P3.6并无片外引脚。因此,AT89C2051的P1口有完整的8条I/O口线的片外引脚,而P3口只有7条I/O线的片外引脚,使其可供片外使用的I/O线为15条。AT89C2051性能同AT89C51一样卓越而结构又十分简单,从而为很多嵌入式控制系统提供了灵活而又廉价的方案,因此,在各种智能化、自动化仪器、仪表及家电中得到广泛应用。

三、数模转换原理

图3为数模转换电路的简化图。由图可知,比较器IC1的同相输入端P1.0与P1.4之间接有电阻R10,而被测电压是通过P1.1输入至比较器IC1的反相端,这样,当被测电压Ui从P1.1输入并开始测量时,先使P1.4置低电位,C4就会对地放电,使P1.0的电位为零,由于此时P1.1的电位高于P1.0的电位(Ui>0),因此,IC1的输出端P3.6为低电位。进入测量程序,先使P1.4跳高电位,VCC就会通过R9、R10向C4充电,P1.0的电位就会随时间按指数规律上升。当P1.0的电位上升至与P1.1的电位相同或略高一点时,IC1的输出端P3.6就会由低电位跳变为高电位,由此,我们可用程序控制CPU在C4充电的同时,不间断检测P3.6的电位,当P3.6电位发生高跳时,我们就认为P1.0的电压与P1.1的电压相等。由于C4的充电电压是可以通过充电时间的长短来准确计算的,所以,计算出C4的充电压,也就间接地测出了被测电压Ui的值。VCC通过R10(R9和P1.4上拉电阻的影响忽略)向C4充电,C4两端的电压是随时间按指数规律上升的,可根据UC=VCC(1-e-t/RC)求出任一时刻的充电电压值。为了便于理解,我们只在图4所示的充电曲线中选取一小段,将其取直,然后按直线变化规律对模数转换原理加以阐述。由图4可以看出,C4充电曲线的起始部分0~500mV这一段是较陡的,且接近直线,为了使程序设计简单,我们就把OA段看做是直线。这样,当C4自零电位开始充电到充电电压达500mV的这段时间里,充电时间与其两端的电压是成正比的,我们适当地对R10和C4取值,使C4的充电电压每20μs上升10mV,再编制与之相匹配的程序,自C4开始充电起,每隔20μs就检测一次P3.6的电位,并将检测的次数在寄存器中累计下来,直到P3.6的电位发生跳变才停止累计。这样,寄存器中的累计数便与C4两端的充电电压有了对应关系。如果第5次检测时,P3.6的电位由低跳高,说明被测电压是50mV。这样,我们测到P3.6电位跳高后,就停止检测,将寄存器中的数值乘以10mV,就得到了被测电压Ui的电压值,这就实现了模量与数量的转换。

四、显示原理

在图1中,LED1与LED2的a、b、c、d、e、f、g端分别与IC1P3口的P3.0至P3.7相接(P3.6除外),GND端分别与IC1的P1.2和P1.3相接。显示时,将段选码送P3口,将位选码送P1口,测量值就会在LED1和LED2中显示出来。有关原理及变换过程,前几讲中已有详述。

五、程序设计思想

系统上电后进行初始化,熄灭数码管LED1和LED2,然后进入测量子程序:执行CLR P1.4,使P1.4呈低电位,C4便通过R10对地放电,调用40ms显示子程序后,C4电荷放尽,P1.0的电位为零,执行MOV R0,#00H,将检测次数累计寄存器R0清零,然后执行SETB P1.4, 使P1.4呈高电位,VCC通过R10对C4充电,经数次空操作,执行INC R0指令,将R0中的内容加1,再执行JNB

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top