本期教程通过一个简单的电压测量电路,讲解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 ; 返回进行下次测量
上一篇:单片机串行口的使用与“蓝牙”电测系统
下一篇:用AT89C51实现自设定时间控制
- 热门资源推荐
- 热门放大器推荐
设计资源 培训 开发板 精华推荐
- Allegro MicroSystems 在 2024 年德国慕尼黑电子展上推出先进的磁性和电感式位置感测解决方案
- 左手车钥匙,右手活体检测雷达,UWB上车势在必行!
- 狂飙十年,国产CIS挤上牌桌
- 神盾短刀电池+雷神EM-i超级电混,吉利新能源甩出了两张“王炸”
- 浅谈功能安全之故障(fault),错误(error),失效(failure)
- 智能汽车2.0周期,这几大核心产业链迎来重大机会!
- 美日研发新型电池,宁德时代面临挑战?中国新能源电池产业如何应对?
- Rambus推出业界首款HBM 4控制器IP:背后有哪些技术细节?
- 村田推出高精度汽车用6轴惯性传感器
- 福特获得预充电报警专利 有助于节约成本和应对紧急情况