新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 用AT89C51实现模数转换

用AT89C51实现模数转换

作者:时间:2011-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 P3.6,000FH,判断充电电压与被测电压是否相等。如果P3.6电位为低,说明C4的充电电压较被测电压低,程序跳转至000F处,经空操作充电延时后再对P3.6的电位进行检测;如果P3.6的电位为高,说明P1.0的电压与P1.1的电压相等,执行SJMP 0006H,程序立刻返回0006处,使C4放电,并进入显示子程序,对测量数据进行处理,将处理后的数据送数码管显示,然后进行下一次测量。从程序清单中的000FH至0018H空间可以看出,6次空操作及INC R0为单机器周期指令,执行时间皆为2μs,而JNB P3.6,000FH为双机器周期指令,执行时间为4μs,这样,便使每次对P3.6的检测时间间隔为18μs。按图1电路中R10及C4的取值运行上述程序,能使每检测一次P3.6的电位,C4充电电压的上升约10mV。然后进入显示子程序,将R0中的数据经变换后送LED中显示出来,我们就可读出被测电压Ui的值了。模数转换主程序安放在0000H至001AH空间内,数据显示子程序要在001BH处开始安放。显示子程序的主要功能是将数据经译码后得到显示代码,其原理不再赘述。如果对模数转换有较高的精度要求,就要事先根据UC=VCC(1-e-t/RC)计算出多个时刻的对应值,这样,组成充电时间与充电电压值的对应数据表,然后编一段程序,将充电时间,也就是寄存器R0中的数据取出来,经查表比较,取得较精确的充电电压数值,本文旨在说明一下模数转换的基本原理,对此不作详述。

六、主程序清单

地址 机器码 指令 解释

0000 75B000 MOV P3,#00H ; 初始化

0003 7590EF MOV P1, #EFH ; 关显示

0006 C294 CLR P1.4 ; 放电

0008 12001B LCALL 001B ; 调40ms显示子程序

000B 7800 MOV R0,#00H ; 清累计寄存器

000D D294 SETB P1.4 ; 开始充电

000F 00 NOP ; 空操作延时

0010 00 NOP ;

0011 00 NOP ;

0012 00 NOP ;

0013 00 NOP ;

0014 00 NOP ;

0015 08 INC R0 ; 累计检测次数

0016 30B6F6 JNB P3.6,000FH; 低于Ui,再充电比较

0019 80EB SJMP 0006H ; 返回进行下次测量

 

比较器相关文章:比较器工作原理




评论


相关推荐

技术专区

关闭