1、基于STCCAS单片机数字电压表的设计【实用文档】doc文档可直接使用可编辑,欢迎下载数字电压表的设计第1章 引言在电量的测量中,电压、电流和频率是最基本的三个被测量,其中电压量的测量最为经常.而且随着电子技术的发展,更是经常需要测量高精度的电压,所以数字电压表就成为一种必不可少的测量仪器.数字电压表简称DVM,它是采用数字化测量技术,把连续的模拟量转换成不连续、离散的数字形式并加以显示的仪表。由于数字式仪器具有读数准确方便、精度高、误差小、测量速度快等特而得到广泛应用. 传统的指针式刻度电压表功能单一,精度低,容易引起视差和视觉疲劳,因而不能满足数字化时代的需要.采用单片机的数字电压表,将连
2、续的模拟量如直流电压转换成不连续的离散的数字形式并加以显示,从而精度高、抗干扰能力强,可扩展性强、集成方便,还可与PC实时通信。数字电压表是诸多数字化仪表的核心与基础.以数字电压表为核心,可以扩展成各种通用数字仪表、专用数字仪表及各种非电量的数字化仪表。目前,由各种单片机和AD转换器构成的数字电压表作全面深入的了解是很有必要的。目前,数字电压表的内部核心部件是AD转换器,转换的精度很大程度上影响着数字电压表的准确度,因而,以后数字电压表的发展就着眼在高精度和低成本这两个方面。本文是以简易数字直流电压表的设计为研究内容,本系统主要包括三大模块:转换模块、数据处理模块及显示模块.第2章 系统总体方
3、案设计选择与说明.1 设计要求1、增强型MC1系列单片机STC125A60S2为核心器件,组成一个简单的直流数字电压表.2、采用1路模拟量输入,能够测量010V之间的直流电压值.、电压显示采用LCD1602显示.4、尽量使用较少的元器件。2. 设计思路1、根据设计要求,选择STC12C5A6S2单片机为核心控制器件。2、/转换采用12C5A602内部自带/D实现。3、电压显示采用LC160显示。23 设计方案硬件电路设计由7个部分组成:STC12C602单片机系统,数码管显示系统、时钟电路、复位电路档位调节电路以及测量电压输入电路.硬件电路设计框图如图1所示。时钟电路 测量电压输入入LCD16
4、02显示STC12C5A60S2 P1 P0 P2 P2 P0复位电路 图21 数字电压表系统硬件设计框图第3章 硬件电路设计.1 STC12C5A02单片机图3。1TC1C60S2单片机引脚图及实物图3。2 SC12CA602系列单片机主要性能1)高速:1个时钟/机器周期,增强型805内核,速度比普通805快612倍。2)宽电压:5。53。3V,223.6V(S12LE5A60S2系列)。3)增加第二复位功能脚/P4(高可靠复位,可调整复位门槛电压,频率12MHz时,无需此功能)。)增加外部掉电检测电路P。,可在掉电时,及时将数据保存进EPOM,正常工作时无需操作EPOM。)低功耗设计:空闲
5、模式(可由任意一个中断唤醒)。6)低功耗设计:掉电模式(可由外部中断唤醒),可支持下降沿/上升沿和远程唤醒。7)支持掉电唤醒的管脚:IN0/P3。2,INT13.,T0P34,/3.5,Rx/P30,CCP/P1。3(或4.2),CC1/1。4(或P4。),E_LVD/P4。.8)工作频率:035MH,相当于普通051:42z。9)时钟:外部晶体或内部R振荡器可选,在下载编程用户程序时设置。10)8/620/32/8/2/0/6K字节片内sh程序存储器,擦写次数10万次以上。1)1280字节片内AM数据存储器。12)芯片内EEPROM功能,擦写次数10万次以上。3)ISP / IAP,在系统可
6、编程/在应用可编程,无需编程器/仿真器。1)8通道,0位高速ADC,速度可达5万次/秒,2路WM还可当2路D/使用。15)2通道捕获/比较单元(PWMPCA/C),也可用来再实现个定时器或2个外部中断(支持上升沿/下降沿中断).16)4个16位定时器,兼容普通8051的定时器T0/T1,2路PA实现2个定时器。17) 可编程时钟输出功能,T0在P3。4输出时钟,T1在35输出时钟,BRT在P1。输出时钟.18) 硬件看门狗(WDT)。19)高速PI串行通信端口。20)全双工异步串行口(UART),兼容普通80的串口。1)通用/O口(3/40/4个),复位后为:准双向口弱上拉(普通805传统IO
7、口).可设置成四种模式:准双向口/弱上拉,推挽/强上拉,仅为输入/高阻,开漏.每个I/O口驱动能力均可达到0A,但整个芯片最大不得超过12A.3TC1560S2系列单片机的A/D转换器的结构ST12C62系列单片机的A/D转换口在P口(P1。7P1。0),有8路1位高速A/转换器,速度可达到25Hz(25万次/秒)。路电压输入型/D,可做温度检测、电源电压检测、按键扫描、频谱检测等。上电复位后P1口为弱上拉型I/口,用户可以通过软件设置将路中的任何一路设置为AD转换,不需作为A/D使用的I/口可以继续作为I/O口使用。SC2C560S2系列单片机ADC的结构如下图所示图。2STC12C5A0S
8、系列单片机ADC的结构图3。3 当AXR./DRJ=0时,A/D转换结果寄存器格式图. 当UXR1/AD=时,/D转换结果寄存器格式TCC5A60S2系列单片机AC由多路选择开关、比较器、逐次比较寄存器、10位ADC转换寄结果存器(ADCRE和A_RESL)以及AD_CONTR构成。TC12CA602系列单片机的ADC是逐次比较型DC,逐次比较型AC由一个比较D/A转换器构成,通过逐次比较逻辑,从最高位(MB)开始,顺序地对每一输入电压与内置/A转换器输出比较,经过多次比较,使转换所得的数字量逐次比逼近输入模拟量对应值.逐次比较型A/D转换器具有速度高,功耗低等特点。从上图可以看出,通过模拟多
9、路开关,将通过D0ADC的模拟量输入送给比较器。用数/模转换器(DAC)转换的模拟量与本次输入的模拟量通过比较器进行比较,将比较结果保存到逐次比较器,并通过逐次比较寄存器输出转换结果。A/转换结束后,最终的转换结果保存到ADC转换结果寄存器DC_RS和AC_RESL,同时,置位D控制寄存器C_ONTR中的A/D转换结束标志位DC_FAG,以供程序查询或发出中断申请。模拟通道的选择控制由AC控制寄存器DCCONTR中的H20确定。ADC的转换速度由AD控制寄存器中的PEE1和SPED0确定.在使用AC之前,应先给DC上电,也就是置位ADC控制寄存器中的ADC_PR位。当J=时,如果取10位结果,
10、则按下面公式计算:10-itA/D Coero Result:(ADC_ES7:0,ADC_RESL:0)=1023*n/Vcc当AJ=0时,如果取位结果,则按下面公式计算:8tCnvrson Rslt:(DCR7:0)55Vin/c当A=1时,如果取10位结果,则按下面公式计算:10-btA/D CnverinRsut:( ADCESL:0 ,AC_RE7:0)102Vic当ADJ=1时,如果取8位结果,则按下面公式计算:8-bitA/D Converson sult:( DC_RSL1:0 ,ADCS7:2)=255VnVcc式中,Vin为模拟输入电压,Vc为单片机实际工作电压,用单片机工
11、作电压作为模拟参考电压。3。4 与A/D 转换相关的寄存器及说明与SCC6S2系列单片机/D转换相关的寄存器表3.1A/转换相关的寄存器。1口模拟功能控制寄存器P1ASSCC5A6S2系列单片机的A/D转换通道与P(1。7-1。)复用,上电复位后P1为弱上拉型I/口,用户可以通过将路中的如何一路设置为/D转换,不需作为A/D使用的P1口可继续作为I/口使用(建议只作为输入).需作为A使用的口需要先将P1AF特殊功能寄存器中的相应位置为“1”,将相应的口设置为模拟功能。1AS寄存器的格式如下:P1ASF:P1口模拟功能控制寄存器(只读)表2 PASF寄存器当1口中的相应位作为/D使用时,要将1A
12、S中的相应位置“1”表3。3 PAS寄存器设置2ADC控制寄存器ADC_CONTADCONR寄存器的格式如下:ADCCNRTR:ADC控制寄存器表3。4 ADC控制寄存器对ADCR寄存器进行操作,建议直接用OV赋值语句,不要用“与和“或”语句.ADC_POWE:ADC电源控制位。0:关闭A/转换电源;1:打开AD转换电源;建议进入控模式前,将ADC电源关闭,即ADC_OER=.启动A/D转换前一定要确认A/D电源已打开,A转换结束后关闭AD电源可决定功耗,也可以不关闭。初次打开内部A/D转换模拟电源,需适当延时,等内部模拟电源稳定后,再启动/D转换.建议启动/D转换后,在A/D转换结束之前,不
13、要改变任何IO口的状态,有利于高精度AD转换,若能将定时器/串行口中断系统关闭更好。SPEE1,SPEED0:模数转换速度控制位表。5模数转换速度控制位设置STC25AS2系列单片机的A/D转换模块所使用的时钟时内部(或外部石英晶体)所产生的系统时钟,不使用时钟分频寄存器CKIV对系统分频后所产生的供给PU工作的时钟.(好处:这样可以让ADC用较高频率工作,提高/D的转换速度.让CPU工作工作在较低频率,降低系统功耗)。D_FLA:模数转换结束标志位,当A/D转换完成后,D_A1,要由软件清零。不管是A/转换完成后由该位申请中断,还是由软件查询该标志A/转换是否结束,当A/D转换完成后, AD
14、C_FL =1,一定要软件清零。ADCSART:模数转换器(C)转换启动控制位,设置为“1”时,开始转换,转换结束后ADCSTART= ;CHS2/CHS/CHS0: 模拟输入通道选择表6模拟输入通道选择设置ADC_CONTR控制寄存器后,要加4个空操作延时后才能正确度到AD_CNTR寄存器的值.原因是设置AC_CONTR控制寄存器的语句执行后,要经过个CPU时钟的延时,其值才能够保证被设置进D_CONT控制寄存器.VADC_CONT,#DTNONOPNONOPMO A,DC_COR3、D转换结果寄存器AC_RES、ADC_SL特殊功能寄存器AD_RS和ADC_ESL寄存器用于存放A/D转换结
15、果,其格式如下:表37 用于存放A转换结果寄存器ADC_RES、A_SAUR1寄存器的ADR位是A/D转换结果寄存器的数据格式调整控制位。表.8 当AJ = 时,10位A转换结果的高8位存放在ADC_RS中,低2位存放在ADCESL的低 位中。表3。9 当ADRJ = 1时,0位A/D转换结果的高2位存放在ADC_ES的低2位中,低8位存放在DC_RSL中。4、与A/D中断有关的寄存器IE:中断允许寄存器表3。1 中断允许寄存器A: CPU的中断开放标志,EA 1,CU开放中断,EA = 0,C屏蔽所有的中断请求。ADC:A/D转换中断允许位。ADC = 1,允许A/中断;EADC 0,屏蔽/
16、中断.IPH:中断优先级控制寄存器高(不可位寻址)表.11 中断优先级控制寄存器高P: 中断优先级控制寄存器低(可以位寻址)表3.1中断优先级控制寄存器低PDC,PADC:AC转换优先级控制位。、AD初始化程序/*-初始化AC-/v ItDC(vid) AF 0x58; /设置P口为A口 0100 0111010100 DC_RES= 0; /清除结果寄存器 D_ONT =A_PWER ADCSPEDLL; ly(50); /AD上电并延时、ADC读子函数-发送ADC结果到PC-*/vid ShowResult(BTE ch) ft value; chg_long_data_o_aray(di
17、sah,2,h); vaue=tADCResult(ch); valu=vaue/2554; chag_dat_to_aray(disadcval,5,,vlue);*-读取ADC结果-*/ GCReult(BE ch) ADC_CONR = PWR DC_SPD ch AC_STR; _nop(); /等待4个NOP _op(); _nop_(); _nop_();_no_(); /等待4个OP _nop_(); _o_(); _np_();_nop_(); /等待4个O _nop_(); nop(); _op_(); while (!(ACON ADC_LG));/等待AC转换完成 AD_
18、ONTR & ADCFAG; /Cse ADC etun ADC_ES; /返回DC结果3.系统电路设计、说明35.1 系统电路总原理图图3.5 系统原理图3.52晶振电路简介时钟信号的振荡器提供正常工作稳定的供应链接管理.晶振也被称为晶振谐振器,是一种机电设备,是需要精密磨削的石英晶体镀上电极焊上导线制成。这种晶体有一个很关键的特性-压电效应,给它导电,产生机械振荡,反之,给它机械力,便会产生电7。它的形状,材质,切割方向影响到振荡的频率。根据石英晶体等效为一个谐振回路,它的机电效应是机电-机电。的不断转换,由电感和电容组成的谐振回路是电场磁场的不断转换。T895的反相放大器,振荡器,时钟信
19、号可以由单片机产生周期性功能是机械指令驱动芯片实现。这个放大器与石英晶体或陶瓷谐振器一起可构成一个自激振荡器,外接石英晶体或陶瓷谐振器以及电容C和C10组成并联谐振电路, 接在放大器的反馈回路中。一个外部电容C和10的值虽然没有严格的要求, 但会影响许多电容振荡器的频率稳定度、振荡器、起振圈内部振荡的接法的快速及时性和温度稳定性。A89S52芯片里面有一个反相高增益放大器,它两头跟石英晶体及两个常用3pF电容相连接,组成稳定的自激振荡器微调震荡频率。震荡电路如图5所示.图3晶振电路3.53复位电路系统CPU和其辅助部件是在一个精确的状态开始运行, 单片机成功复位。不论是电源故障或刚接上电源,要
20、使用单片机就要先复位。施密特触发器通过T89S2单片机RST引脚接收复位信号。当系统振荡稳定没发生异常情况下,假如RT出现一个持续24个振荡周期的高电平, 则系统复位.本设计系统是自动电源复位.本系统中采用上电电路复位,即在单片机运行期间人工的复位,方便又简单。工作按钮接通电源,单片机便可复位,即手动复位完成。系统上电运行后,如果要复位,则动手复位即可,手动复位电路如图6所示.图3。7 复位电路3。4显示电路LC162显示32个字符内容,分为2行显示.当前面向市场上字符液晶显示模块几近都是一样在HD4470液晶芯片的控制原理上完成的.图3.8 10显示电路第章系统软件设计4. 程序设计框图AD
21、C初始化延时400ms读取被测电压并计算LCD1602显示1602显示开始图。1程序设计框图#ncude TCC5A0。h#incldestdio。hinclue 1602.hinclude ach#nclde eay。h” #include ”intrinsh”dfine Ratio20/用来确定电阻比值,电阻总阻值除以承载电压的那个电阻/- 主函数-*voimin(vid)floa V=0;ugeintem_data=0;nign cart16;LD_In(); LC_Cear(); CWrieString(,0,tst);while() tempda=GetADCRlt(0);/使用AD
22、C得到电压值o(float)tep_dat*Ratiocc/55.0/1000;/将得到的电压值进行处理srintf(em,=。2f V ”,Vo);CD_Writetrng(0,tep);DelayM(20);内 容 摘 要电压表是测量仪器中不可缺少的设备,目前广泛应用的是采用专用集成电路实现的数字电压表。本系统以8051单片机为核心,以逐次逼近式A/D转换器ADC0809、LED显示器为主体,设计了一款简易的数字电压表,能够测量05V的直流电压,最小分辨率为0.02V。该设计大体分为以下几个部分,同时,各部分选择使用的主要元器件确定如下:1、单片机部分。使用常见的8051单片机,同时根据需
23、要设计单片机电路。2、测量部分。该部分是实验的重点,要求将外部采集的模拟信号转换成数字信号,通过单片机的处理显示在显示器上,该部分决定了数字电压表的精度等主要技术指标。根据需要本设计采用逐次逼近型AD转换器ADC0809进行模数转换。3、键盘显示部分。利用46矩阵键盘的一个按键控制量程的转换,3或4位LED显示。其中一位为整数部分,其余位小数部分。索引关键词:8051 模数转换 LED显示 矩阵键盘 目 录一 概 述 4二 方案设计与论证 4三 单元电路设计与参数计算 4 3.1. AD转换器0809 5 3.1. LED数码显示 7 四 总原理图及参考程序 9五 结论 10六 心得体会 14
24、七 参考文献 15 一、概述 数字电压表的基本工作原理是利用A/D转换电路将待测的模拟信号转换成数字信号,通过相应换算后将测试结果以数字形式显示出来的一种电压表。较之于一般的模拟电压表,数字电压表具有精度高、测量准确、读数直观、使用方便等优点。电压表的数字化测量,关键在于如何把随时连续变化的模拟量转化成数字量,完成这种转换的电路叫模数转换器(A/D)。数字电压表的核心部件就是A/D转换器,由于各种不同的A/D转换原理构成了各种不同类型的DVM。一般说来,A/D转换的方式可分为两类:积分式和逐次逼近式。积分式A/D转换器是先用积分器将输入的模拟电压转换成时间或频率,再将其数字化。根据转化的中间量
25、不同,它又分为U-T(电压-时间)式和U-F(电压-频率)式两种。逐次逼近式A/D转换器分为比较式和斜坡电压式,根据不同的工作原理,比较式又分为逐次比较式及零平衡式等。斜坡电压式又分为线性斜坡式和阶梯斜坡式两种。在高精度数字电压表中,常采用由积分式和比较式相结合起来的复合式A/D转换器。本设计以8051单片机为核心,以逐次比较型A/D转换器ADC0809、LED显示器为主体,构造了一款简易的数字电压表,能够测量1路05V直流电压,最小分辨率0.02V。二、方案设计与论证该设计是基于8051的数字电压表,大体分为以下几个部分,同时,各部分选择使用的主要元器件确定如下:(1)单片机部分 使用常见的
26、8051单片机,同时根据需要设计单片机电路。(2)测量部分 该部分是实验的重点,要求将外部采集的模拟信号转换成数字信号,通过单片机的处理显示在显示器上,该部分决定了数字电压表的精度等主要技术指标。根据需要本设计采用逐次逼近式A/D转换器0809进行模数转换。 (3)键盘显示部分 利用46矩阵键盘的一个按键控制量程的转换,3或4位LED显示。其中一位为整数部分,其余位小数部分。三、单元电路设计与参数计算3.1 ADC0809(1) 主要特性1)8路8位A/D转换器,即分辨率8位。 2)具有转换起停控制端。 3)转换时间约为128s4)单个5V电源供电 5)模拟输入电压范围05V,不需零点和满刻度
27、校准。 6)工作温度范围为-4085摄氏度 7)低功耗,约15mW。 (2)内部结构图1 ADC0809内部结构框图 ADC0809是CMOS单片型逐次逼近式A/D转换器,内部结构如图1所示,它由8路模拟开关、地址锁存与译码器、比较器、8位开关树型D/A转换器、逐次逼近寄存器、三态输出锁存器等其它一些电路组成。因此,ADC0809可处理8路模拟量输入,且有三态输出能力,既可与各种微处理器相连,也可单独工作。输入输出与TTL兼容。(3) 外部特性(引脚功能) ADC0809芯片有28条引脚,采用双列直插式封装,如上图所示。下面说明各引脚功能。 IN0IN7:8路模拟量输入端。D0D7:8位数字量
28、输出端。START: A/D转换启动信号,输入,高电平有效。ALE:地址锁存允许信号,输入,高电平有效。OE:数据输出允许信号,输入,高电平有效。当A/D转换结束时,此端输 入一个高电平,才能打开输出三态门,输出数字量。 CLK:时钟脉冲输入端。要求时钟频率不高于640KHZ。 ADDA、ADDB、ADDC:3位地址输入线,用于选通8路模拟输入中的一路。如表1所示。 EOC: A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电 平(转换期间一直为低电平)。 VREF(+)、VREF(-):基准电压。 VCC:电源,接5V。 GND:地。 表1 地址与通道对应关系 ADC0809的工
29、作过程是:首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。此地址经译码选通8路模拟输入之一到比较器。START上升沿将逐次逼近寄存器复位。下降沿启动 A/D转换,之后EOC输出信号变低,指示转换正在进行。直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。当OE输入高电平时,输出三态门打开,转换结果的数字量输出到数据总线上。3.2 LED数码显示(1)LED显示器LED是由若干个发光二极管组成的。当发光二极管导通时,相应的一个点或一个笔划发亮。控制不同组合的二极管导通,就能显示出各种字符。这种笔划式的七段显示器,能显示的字符数量少,
30、但控制简单、使用方便。发光二极管的阳极连在一起的称为共阳极显示器,阴极连在一起的称为共阴极显示器(2)LED结构及显示原理通常的七段LED显示块中有八个发光二极管,故也有人叫做八段显示块。其中七个发光二极管构成七笔字形“8”。一个发光二极管构成小数点。七段显示块与单片机接口非常容易。只要将一个8位并行输出口与显示块的发光二极管引脚相连即可。8位并行输出口输出不同的字节数据即可获得不同的数字或字符。通常将控制发光二极管的8位字节数据称为段选码或段数据。一些字形的段选码如下表:(3)LED的结构及其工作原理点亮显示器有静态和动态两种方法。 1)静态显示:当显示某一个字符时,相应的发光二极管恒定地导
31、通或截止。例如七段显示器的a、b、c、d、e、f导通,g、dp截止,显示0。静态显示的特点是:每一位都需要一个8位输出口控制,用于显示位数较少(仅一、二位)的场合。较小的电流能得到较高的亮度,可以由8255的输出口直接驱动。图示为三位显示器的接口逻辑。2)动态显示:一位一位地轮流点亮各位显示器(扫描)。对于每一位显示器来说,每隔一段时间点亮一次。显示器的亮度既与导通电流有关,也和点亮时间与间隔时间的比例有关。 若显示器的位数不大于8位,则控制显示器公共极电位只需一个8位并行口(称为扫描口或位选口)。控制各位显示器所显示的字形也需一个共用的8位口(称为段数据口),用于显示位数稍多的场合,需编写扫
32、描程序。 四、总原理图及参考程序1、总原理图2、程序流程图及参考程序(1)程序流程图NYSTART选择ADC0809的转换轨道设置定时器,提供时钟信号启动A/D转换器输出转换结果数值转换显示转换是否结束?(2)参考程序OUTBIT EQU 09002HOUTSEG EQU 09004H IN EQU 09001HLEDBUF EQU 60H LJMP MAINLEDMAP: DB 3FH, 06H, 5BH, 4FH, 66H, 6DB, 7DB, 07H DB 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71HDELAY: MOV R7,#0DELAYLOOP: D
33、JNZ R7,DELAYLOOP DJNZ R6,DELAYLOOP RETDISPLAYLED: MOV R0,#LEDBUF MOV R1,#4 MOV R2,#000000001BLOOP: MOV A,R0 MOV DPTR,#OUTSEG MOVX DPTR,A MOV DPTR,#OUTBIT MOV A,R2 MOVX DPTR,A MOV R6,#01 CALL DELAY MOV A,R2 R1 A MOV R2,A INC R0 DJNZ R1,LOOPTESRKEY: MOV DPTR, #OUTBIT MOV A,#0 MOV A,#0 MOVX DPTR,A MOV
34、DPTR,#IN MOVX A,DPTR CPL A ANL A,#0FH RETKEYTABLE: DB 16H, 15H, 14H, 0FFH DB 13H, 12H, 11H, 10H DB 0dH, 0cH, 0bH, 0aH DB 0eH, 03H, 06H, 09H DB 0FH, 02H, 05H, 08H DB 00H, 01H, 04H, 07HGETKEY: MOV DPTR,#OUTBIT MOV P2,DPH MOV R0,#IN MOV R1,#00100000B MOV R2,#6KLOOP: MOV A,R1 CPL A MOVX DPTR,A MOVX A,R0
35、 CPL A ANL A,#0FH JNZ GOON1GOON1: MOV R1,A MOV A,R2 DEC A RL A RL A MOV R2,A MOV A,R1 MOV R1,#2LOOPC: RRC A JC EXIT INC R2 DJNZ R1,LOOPCEXIT: MOV A,R2 MOV DPTR,#KEYTABLE MOVC A,A+DPTR MOV R2,AWAITRELEASE: MOV DPTR,#OUTBIT CLR A MOVX DPTR,A MOV R6,#10 CALL DELAY CALL TESTKEY JNZ WAITRELEASE MOV A,R2
36、RETMAIN: MOV DPTR,#8000H MOVX DPTR,AHERE: JNB P3.3,HERE MOVX A,DPTR MOV P1,A MOV R5,A CALL DISPLAYLED CALL TESTKEY JZ L5 CALL GETKEY MOV 40H,AL5: MOV 63H,#00H MOV A,R5 MOV B,#51 MOV AB MOV 62H,A MOV A,B JZ LOOP1 RL A SUBB A,#2 MOV B,#10 DIV AB MOV 61H,A MOV 60H,B AJMP MLOOPLOOP1:MOV 61H,#00 MOV 60H,
37、#00 AJMP MLOOPMLOOP: MOV R0, #LEDBUFFILLBUF: MOV A,R0 MOV DPTR,#LEDMAP MOVC A,A+DPTR MOV 50H,A CLR C MOV A,40H ADD A,41H ANL A,#01H MOV 41H,A RRC A MOV 40H,#00H JC WEI2WEI1: CJNE R0,#62H,XS01 MOV A,50H ADD A,#80H SJMP XS1XS01: MOV A,50HXS1: MOV R0,A INC R0 CJNE R0,#LEDBUF+3, FILLBUF LJMP STARTWEI2: CJNE R0,#63H,X