资源描述
基于STCCAS单片机数字电压表的设计【实用文档】doc
文档可直接使用可编辑,欢迎下载
数字电压表的设计
第1章 引言
在电量的测量中,电压、电流和频率是最基本的三个被测量,其中电压量的测量最为经常.而且随着电子技术的发展,更是经常需要测量高精度的电压,所以数字电压表就成为一种必不可少的测量仪器.数字电压表简称DVM,它是采用数字化测量技术,把连续的模拟量转换成不连续、离散的数字形式并加以显示的仪表。由于数字式仪器具有读数准确方便、精度高、误差小、测量速度快等特而得到广泛应用.
传统的指针式刻度电压表功能单一,精度低,容易引起视差和视觉疲劳,因而不能满足数字化时代的需要.采用单片机的数字电压表,将连续的模拟量如直流电压转换成不连续的离散的数字形式并加以显示,从而精度高、抗干扰能力强,可扩展性强、集成方便,还可与PC实时通信。数字电压表是诸多数字化仪表的核心与基础.以数字电压表为核心,可以扩展成各种通用数字仪表、专用数字仪表及各种非电量的数字化仪表。目前,由各种单片机和A/D转换器构成的数字电压表作全面深入的了解是很有必要的。
目前,数字电压表的内部核心部件是A/D转换器,转换的精度很大程度上影响着数字电压表的准确度,因而,以后数字电压表的发展就着眼在高精度和低成本这两个方面。
本文是以简易数字直流电压表的设计为研究内容,本系统主要包括三大模块:转换模块、数据处理模块及显示模块.
第2章 系统总体方案设计选择与说明
2.1 设计要求
1、增强型MCS—51系列单片机STC12C5A60S2为核心器件,组成一个简单的直流数字电压表.
2、采用1路模拟量输入,能够测量0—10V之间的直流电压值.
3、电压显示采用LCD1602显示.
4、尽量使用较少的元器件。
2.2 设计思路
1、根据设计要求,选择STC12C5A60S2单片机为核心控制器件。
2、A/D转换采用STC12C5A60S2内部自带A/D实现。
3、电压显示采用LCD1602显示。
2.3 设计方案
硬件电路设计由7个部分组成:STC12C5A60S2单片机系统,数码管显示系统、时钟电路、复位电路档位调节电路以及测量电压输入电路.硬件电路设计框图如图1所示。
时钟电路
测量电压输入
入
LCD1602显示
STC12C5A60S2
P1
P0
P2
P2
P0
复位电路
图2.1 数字电压表系统硬件设计框图
第3章 硬件电路设计
3.1 STC12C5A60S2单片机
图3。1STC12C5A60S2单片机引脚图及实物图
3。2 STC12C5A60S2系列单片机主要性能
1)高速:1个时钟/机器周期,增强型8051内核,速度比普通8051快6~12倍。
2)宽电压:5。5~3。3V,2.2~3.6V(STC12LE5A60S2系列)。
3)增加第二复位功能脚/P4.6(高可靠复位,可调整复位门槛电压,频率<12MHz时,无需此功能)。
4)增加外部掉电检测电路/P4。6,可在掉电时,及时将数据保存进EEPROM,正常工作时无需操作EEPROM。
5)低功耗设计:空闲模式(可由任意一个中断唤醒)。
6)低功耗设计:掉电模式(可由外部中断唤醒),可支持下降沿/上升沿和远程唤醒。
7)支持掉电唤醒的管脚:INT0/P3。2,INT1/P3.3,T0/P3.4,T1/P3.5,RxD/P3.0,
CCP0/P1。3(或P4.2),CCP1/P1。4(或P4。3),EX_LVD/P4。6.
8)工作频率:0~35MHz,相当于普通8051:0~420MHz。
9)时钟:外部晶体或内部RC振荡器可选,在ISP下载编程用户程序时设置。
10)8/16/20/32/40/48/52/56/60/62K字节片内Flash程序存储器,擦写次数10万次以上。
11)1280字节片内RAM数据存储器。
12)芯片内EEPROM功能,擦写次数10万次以上。
13)ISP / IAP,在系统可编程/在应用可编程,无需编程器/仿真器。
14)8通道,10位高速ADC,速度可达25万次/秒,2路PWM还可当2路D/A使用。
15)2通道捕获/比较单元(PWM/PCA/CCP),也可用来再实现2个定时器或2个外部中断(支持上升沿/下降沿中断).
16)4个16位定时器,兼容普通8051的定时器T0/T1,2路PCA实现2个定时器。
17) 可编程时钟输出功能,T0在P3。4输出时钟,T1在P3.5输出时钟,BRT在P1。0输出时钟.
18) 硬件看门狗(WDT)。
19)高速SPI串行通信端口。
20)全双工异步串行口(UART),兼容普通8051的串口。
21)通用I/O口(36/40/44个),复位后为:准双向口/弱上拉(普通8051传统I/O口).可设置成四种模式:准双向口/弱上拉,推挽/强上拉,仅为输入/高阻,开漏.每个I/O口驱动能力均可达到20mA,但整个芯片最大不得超过120mA.
3.3 STC12C5A60S2系列单片机的A/D转换器的结构
STC12C5A60S2系列单片机的A/D转换口在P1口(P1。7-P1。0),有8路10位高速A/D转换器,速度可达到250KHz(25万次/秒)。8路电压输入型A/D,可做温度检测、电源电压检测、按键扫描、频谱检测等。上电复位后P1口为弱上拉型I/O口,用户可以通过软件设置将8路中的任何一路设置为A/D转换,不需作为A/D使用的I/O口可以继续作为I/O口使用。
STC12C5A60S2系列单片机ADC的结构如下图所示
图3。2 STC12C5A60S2系列单片机ADC的结构
图3。3 当AUXR.1/ADRJ=0时,A/D转换结果寄存器格式
图3.4 当AUXR.1/ADRJ=1时,A/D转换结果寄存器格式
STC12C5A60S2系列单片机ADC由多路选择开关、比较器、逐次比较寄存器、10位ADC转换寄结果存器(ADC_RES和ADC_RESL)以及ADC_CONTR构成。
STC12C5A60S2系列单片机的ADC是逐次比较型ADC,逐次比较型ADC由一个比较D/A转换器构成,通过逐次比较逻辑,从最高位(MSB)开始,顺序地对每一输入电压与内置D/A转换器输出比较,经过多次比较,使转换所得的数字量逐次比逼近输入模拟量对应值.逐次比较型A/D转换器具有速度高,功耗低等特点。
从上图可以看出,通过模拟多路开关,将通过ADC0-ADC7的模拟量输入送给比较器。用数/模转换器(DAC)转换的模拟量与本次输入的模拟量通过比较器进行比较,将比较结果保存到逐次比较器,并通过逐次比较寄存器输出转换结果。A/D转换结束后,最终的转换结果保存到ADC转换结果寄存器ADC_RES和ADC_RESL,同时,置位ADC控制寄存器ADC_CONTR中的A/D转换结束标志位ADC_FLAG,以供程序查询或发出中断申请。模拟通道的选择控制由ADC控制寄存器ADC_CONTR中的CHS2~CHS0确定。ADC的转换速度由ADC控制寄存器中的SPEED1和SPEED0确定.在使用ADC之前,应先给ADC上电,也就是置位ADC控制寄存器中的ADC_POWER位。
当ADRJ=0时,如果取10位结果,则按下面公式计算:
10-bitA/D Conversion Result:(ADC_RES[7:0],ADC_RESL[1:0])=1023*Vin/Vcc
当ADRJ=0时,如果取8位结果,则按下面公式计算:
8—bitA/D Conversion Result:(ADC_RES[7:0])=255*Vin/Vcc
当ADRJ=1时,如果取10位结果,则按下面公式计算:
10-bitA/D Conversion Result:( ADC_RESL[1:0] ,ADC_RES[7:0])=1023*Vin/Vcc
当ADRJ=1时,如果取8位结果,则按下面公式计算:
8-bitA/D Conversion Result:( ADC_RESL[1:0] ,ADC_RES[7:2])=255*Vin/Vcc
式中,Vin为模拟输入电压,Vcc为单片机实际工作电压,用单片机工作电压作为模拟参考电压。
3。4 与A/D 转换相关的寄存器及说明
与STC12C5A60S2系列单片机A/D转换相关的寄存器
表3.1 A/D转换相关的寄存器
1。P1口模拟功能控制寄存器P1ASF
STC12C5A60S2系列单片机的A/D转换通道与P1(P1。7-P1。0)复用,上电复位后P1为弱上拉型I/O口,用户可以通过将8路中的如何一路设置为A/D转换,不需作为A/D使用的P1口可继续作为I/O口使用(建议只作为输入).需作为A/D使用的口需要先将P1ASF特殊功能寄存器中的相应位置为“1”,将相应的口设置为模拟功能。P1ASF寄存器的格式如下:
P1ASF:P1口模拟功能控制寄存器(只读)
表3.2 P1ASF寄存器
当P1口中的相应位作为A/D使用时,要将P1ASF中的相应位置“1”
表3。3 P1ASF寄存器设置
2.ADC控制寄存器ADC_CONTR
ADC_CONTR寄存器的格式如下:
ADC_CONRTR:ADC控制寄存器
表3。4 ADC控制寄存器
对ADC_CONTR寄存器进行操作,建议直接用MOV赋值语句,不要用“与"和“或”语句.
ADC_POWER:ADC电源控制位。
0:关闭A/D转换电源;
1:打开A/D转换电源;
建议进入控模式前,将ADC电源关闭,即ADC_POWER=0.启动A/D转换前一定要确认A/D电源已打开,A/D转换结束后关闭A/D电源可决定功耗,也可以不关闭。初次打开内部A/D转换模拟电源,需适当延时,等内部模拟电源稳定后,再启动A/D转换.
建议启动A/D转换后,在A/D转换结束之前,不要改变任何I/O口的状态,有利于高精度A/D转换,若能将定时器/串行口/中断系统关闭更好。
SPEED1,SPEED0:模数转换速度控制位
表3。5 模数转换速度控制位设置
STC12C5A60S2系列单片机的A/D转换模块所使用的时钟时内部(或外部石英晶体)所产生的系统时钟,不使用时钟分频寄存器CLK_DIV对系统分频后所产生的供给CPU工作的时钟.(好处:这样可以让ADC用较高频率工作,提高A/D的转换速度.让CPU工作工作在较低频率,降低系统功耗)。
ADC_FLAG:模数转换结束标志位,当A/D转换完成后,ADC_FLAG=1,要由软件清零。
不管是A/D转换完成后由该位申请中断,还是由软件查询该标志A/D转换是否结束,当A/D转换完成后, ADC_FLAG = 1,一定要软件清零。
ADC_START:模数转换器(ADC)转换启动控制位,设置为“1”时,开始转换,转换结束后ADC_START = 1;
CHS2/CHS1/CHS0: 模拟输入通道选择
表3.6模拟输入通道选择
设置ADC_CONTR控制寄存器后,要加4个空操作延时后才能正确度到ADC_CONTR寄存器的值.原因是设置ADC_CONTR控制寄存器的语句执行后,要经过4个CPU时钟的延时,其值才能够保证被设置进ADC_CONTR控制寄存器.
MOV ADC_CONTR,#DATA
NOP
NOP
NOP
NOP
MOV A,ADC_CONRT
3、A/D转换结果寄存器ADC_RES、ADC_RESL
特殊功能寄存器ADC_RES和ADC_RESL寄存器用于存放A/D转换结果,其格式如下:
表3.7 用于存放A/D转换结果寄存器ADC_RES、ADC_RESLAUXR1寄存器的ADRJ位是A/D转换结果寄存器的数据格式调整控制位。
表3.8 当ADRJ = 0 时,10位A/D转换结果的高8位存放在ADC_RES中,低2位存放在ADC_RESL的低2 位中。
表3。9 当ADRJ = 1 时,10位A/D转换结果的高2位存放在ADC_RES的低2 位中,低8位存放在ADC_RESL中。
4、与A/D中断有关的寄存器
IE:中断允许寄存器
表3。10 中断允许寄存器
EA: CPU的中断开放标志,EA = 1,CPU开放中断,EA = 0,CPU屏蔽所有的中断请求。
EADC:A/D转换中断允许位。
EADC = 1,允许A/D中断;
EADC = 0,屏蔽A/D中断.
IPH:中断优先级控制寄存器高(不可位寻址)
表3.11 中断优先级控制寄存器高
IP: 中断优先级控制寄存器低(可以位寻址)
表3.12中断优先级控制寄存器低
PADCH,PADC:ADC转换优先级控制位。
5、ADC初始化程序
/*-———--—----—-—--—————-—-—-—-
初始化ADC
—--——------—------—-—-—-----*/
void InitADC(void)
{
P1ASF = 0x58; //设置P1口为AD口 0100 0111 0101 1000
ADC_RES = 0; //清除结果寄存器
ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
Delay(50); //ADC上电并延时
}
6、ADC读子函数
/*——--————————-——----——-—-—---
发送ADC结果到PC
-------———-——-—------—---—--*/
void ShowResult(BYTE ch)
{
float value;
change_long_data_to_array(disadch,2,ch);
value=GetADCResult(ch);
value=value/255*4.8;
change_data_to_array(disadcval,5,1,value);
}
/*-----------———-—---——-—--—--
读取ADC结果
--————----————-———-----—-—-—*/
BYTE GetADCResult(BYTE ch)
{
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
_nop_(); //等待4个NOP
_nop_();
_nop_();
_nop_();
_nop_(); //等待4个NOP
_nop_();
_nop_();
_nop_();
_nop_(); //等待4个NOP
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG));//等待ADC转换完成
ADC_CONTR &= ~ADC_FLAG; //Close ADC
return ADC_RES; //返回ADC结果
}
3.5系统电路设计、说明
3.5.1 系统电路总原理图
图3.5 系统原理图
3.5.2晶振电路简介
时钟信号的振荡器提供正常工作稳定的供应链接管理.晶振也被称为晶振谐振器,是一种机电设备,是需要精密磨削的石英晶体镀上电极焊上导线制成。这种晶体有一个很关键的特性--—-压电效应,给它导电,产生机械振荡,反之,给它机械力,便会产生电[7]。它的形状,材质,切割方向影响到振荡的频率。根据石英晶体等效为一个谐振回路,它的机电效应是机—电-机—电.。的不断转换,由电感和电容组成的谐振回路是电场—磁场的不断转换。
AT89S52的反相放大器,振荡器,时钟信号可以由单片机产生周期性功能是机械指令驱动芯片实现。这个放大器与石英晶体或陶瓷谐振器一起可构成一个自激振荡器,外接石英晶体或陶瓷谐振器以及电容C8和C10组成并联谐振电路, 接在放大器的反馈回路中。一个外部电容C8和C10的值虽然没有严格的要求, 但会影响许多电容振荡器的频率稳定度、振荡器、起振圈内部振荡的接法的快速及时性和温度稳定性。
AT89S52芯片里面有一个反相高增益放大器,它两头跟石英晶体及两个常用30pF电容相连接,组成稳定的自激振荡器微调震荡频率。震荡电路如图5所示.
图3.6晶振电路
3.5.3复位电路
系统CPU和其辅助部件是在一个精确的状态开始运行, 单片机成功复位。不论是电源故障或刚接上电源,要使用单片机就要先复位。施密特触发器通过AT89S52单片机RST引脚接收复位信号。当系统振荡稳定没发生异常情况下,假如RST出现一个持续24个振荡周期的高电平, 则系统复位.本设计系统是自动电源复位.
本系统中采用上电电路复位,即在单片机运行期间人工的复位,方便又简单。工作按钮接通电源,单片机便可复位,即手动复位完成。系统上电运行后,如果要复位,则动手复位即可,手动复位电路如图6所示.
图3。7 复位电路
3.5。4显示电路
LCD1602显示32个字符内容,分为2行显示.当前面向市场上字符液晶显示模块几近都是一样在HD44780液晶芯片的控制原理上完成的.
图3.8 LCD1602显示电路
第4章 系统软件设计
4.1 程序设计框图
ADC初始化
延时400ms
读取被测电
压并计算
LCD1602显示
1602显示
开始
图4。1程序设计框图
#include 〈STC12C5A60s2。h>
#include <stdio。h>
#include "1602.h"
#include "adc.h"
#include "delay。h”
#include ”intrins.h”
#define Ratio 2.0//用来确定电阻比值,电阻总阻值除以承载电压的那个电阻
/*————-—----—-—---——-—-—------—-—-—--—----—------—
主函数
-——--——----——---———--——-—-—--—---——-—--—----————*/
void main(void)
{
float Vo=0.0;
unsigned int temp_data=0;
unsigned char temp[16];
LCD_Init();
LCD_Clear();
LCD_Write_String(6,0,"test");
while (1)
{
temp_data=GetADCResult(0);//使用ADC得到电压值
Vo=(float)temp_data*Ratio*Vcc/255.0/100.0;//将得到的电压值进行处理
sprintf(temp,"U=%。2f V ”,Vo);
LCD_Write_String(0,1,temp);
DelayMs(200);
}
}
内 容 摘 要
电压表是测量仪器中不可缺少的设备,目前广泛应用的是采用专用集成电路实现的数字电压表。本系统以8051单片机为核心,以逐次逼近式A/D转换器ADC0809、LED显示器为主体,设计了一款简易的数字电压表,能够测量0~5V的直流电压,最小分辨率为0.02V。
该设计大体分为以下几个部分,同时,各部分选择使用的主要元器件确定如下:
1、单片机部分。使用常见的8051单片机,同时根据需要设计单片机电路。
2、测量部分。该部分是实验的重点,要求将外部采集的模拟信号转换成数字信号,通过单片机的处理显示在显示器上,该部分决定了数字电压表的精度等主要技术指标。根据需要本设计采用逐次逼近型A∕D转换器ADC0809进行模数转换。
3、键盘显示部分。利用4×6矩阵键盘的一个按键控制量程的转换,3或4位LED显示。其中一位为整数部分,其余位小数部分。
索引关键词:8051 模数转换 LED显示 矩阵键盘
目 录
一 概 述 …………………………………………………………………4
二 方案设计与论证 ……………………………………………………………4
三 单元电路设计与参数计算 …………………………………………………4
3.1. A∕D转换器0809 ……………………………………………………5
3.1. LED数码显示 ………………………………………………………7
四 总原理图及参考程序 ………………………………………………………9
五 结论 …………………………………………………………………………10
六 心得体会 ……………………………………………………………………14
七 参考文献 ……………………………………………………………………15
一、概述
数字电压表的基本工作原理是利用A/D转换电路将待测的模拟信号转换成数字信号,通过相应换算后将测试结果以数字形式显示出来的一种电压表。较之于一般的模拟电压表,数字电压表具有精度高、测量准确、读数直观、使用方便等优点。
电压表的数字化测量,关键在于如何把随时连续变化的模拟量转化成数字量,完成这种转换的电路叫模数转换器(A/D)。数字电压表的核心部件就是A/D转换器,由于各种不同的A/D转换原理构成了各种不同类型的DVM。一般说来,A/D转换的方式可分为两类:积分式和逐次逼近式。
积分式A/D转换器是先用积分器将输入的模拟电压转换成时间或频率,再将其数字化。根据转化的中间量不同,它又分为U-T(电压-时间)式和U-F(电压-频率)式两种。
逐次逼近式A/D转换器分为比较式和斜坡电压式,根据不同的工作原理,比较式又分为逐次比较式及零平衡式等。斜坡电压式又分为线性斜坡式和阶梯斜坡式两种。
在高精度数字电压表中,常采用由积分式和比较式相结合起来的复合式A/D转换器。本设计以8051单片机为核心,以逐次比较型A/D转换器ADC0809、LED显示器为主体,构造了一款简易的数字电压表,能够测量1路0~5V直流电压,最小分辨率0.02V。
二、方案设计与论证
该设计是基于8051的数字电压表,大体分为以下几个部分,同时,各部分选择使用的主要元器件确定如下:
(1)单片机部分 使用常见的8051单片机,同时根据需要设计单片机电路。
(2)测量部分 该部分是实验的重点,要求将外部采集的模拟信号转换成数字信号,通过单片机的处理显示在显示器上,该部分决定了数字电压表的精度等主要技术指标。根据需要本设计采用逐次逼近式A/D转换器0809进行模数转换。
(3)键盘显示部分 利用4×6矩阵键盘的一个按键控制量程的转换,3或4位LED显示。其中一位为整数部分,其余位小数部分。
三、单元电路设计与参数计算
3.1 ADC0809
(1) 主要特性
1)8路8位A/D转换器,即分辨率8位。
2)具有转换起停控制端。
3)转换时间约为128μs
4)单个+5V电源供电
5)模拟输入电压范围0~+5V,不需零点和满刻度校准。
6)工作温度范围为-40~+85摄氏度
7)低功耗,约15mW。
(2)内部结构
图1 ADC0809内部结构框图
ADC0809是CMOS单片型逐次逼近式A/D转换器,内部结构如图1所示,它由8路模拟开关、地址锁存与译码器、比较器、8位开关树型D/A转换器、逐次逼近寄存器、三态输出锁存器等其它一些电路组成。因此,ADC0809可处理8路模拟量输入,且有三态输出能力,既可与各种微处理器相连,也可单独工作。输入输出与TTL兼容。
(3) 外部特性(引脚功能)
ADC0809芯片有28条引脚,采用双列直插式封装,如上图所示。下面说明各引脚功能。
IN0~IN7:8路模拟量输入端。
D0~D7:8位数字量输出端。
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的工作过程是:首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。此地址经译码选通8路模拟输入之一到比较器。START上升沿将逐次逼近寄存器复位。下降沿启动 A/D转换,之后EOC输出信号变低,指示转换正在进行。直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。当OE输入高电平时,输出三态门打开,转换结果的数字量输出到数据总线上。
3.2 LED数码显示
(1)LED显示器
LED是由若干个发光二极管组成的。当发光二极管导通时,相应的一个点或一个笔划发亮。控制不同组合的二极管导通,就能显示出各种字符。这种笔划式的七段显示器,能显示的字符数量少,但控制简单、使用方便。
发光二极管的阳极连在一起的称为共阳极显示器,阴极连在一起的称为共阴极显示器
(2)LED结构及显示原理
通常的七段LED显示块中有八个发光二极管,故也有人叫做八段显示块。其中七个发光二极管构成七笔字形“8”。一个发光二极管构成小数点。七段显示块与单片机接口非常容易。只要将一个8位并行输出口与显示块的发光二极管引脚相连即可。8位并行输出口输出不同的字节数据即可获得不同的数字或字符。通常将控制发光二极管的8位字节数据称为段选码或段数据。
一些字形的段选码如下表:
(3)LED的结构及其工作原理
点亮显示器有静态和动态两种方法。
1)静态显示:当显示某一个字符时,相应的发光二极管恒定地导通或截止。例如七段显示器的a、b、c、d、e、f导通,g、dp截止,显示0。
静态显示的特点是:
每一位都需要一个8位输出口控制,用于显示位数较少(仅一、二位)的场合。
较小的电流能得到较高的亮度,可以由8255的输出口直接驱动。
图示为三位显示器的接口逻辑。
2)动态显示:一位一位地轮流点亮各位显示器(扫描)。对于每一位显示器来说,每隔一段时间点亮一次。显示器的亮度既与导通电流有关,也和点亮时间与间隔时间的比例有关。
若显示器的位数不大于8位,则控制显示器公共极电位只需一个8位并行口(称为扫描口或位选口)。控制各位显示器所显示的字形也需一个共用的8位口(称为段数据口),用于显示位数稍多的场合,需编写扫描程序。
四、总原理图及参考程序
1、总原理图
2、程序流程图及参考程序
(1)程序流程图
N
Y
START
选择ADC0809的转换轨道
设置定时器,提供时钟信号
启动A/D转换器
输出转换结果
数值转换
显示
转换是否结束?
(2)参考程序
OUTBIT EQU 09002H
OUTSEG EQU 09004H
IN EQU 09001H
LEDBUF EQU 60H
LJMP MAIN
LEDMAP:
DB 3FH, 06H, 5BH, 4FH, 66H, 6DB, 7DB, 07H
DB 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H
DELAY:
MOV R7,#0
DELAYLOOP:
DJNZ R7,DELAYLOOP
DJNZ R6,DELAYLOOP
RET
DISPLAYLED:
MOV R0,#LEDBUF
MOV R1,#4
MOV R2,#000000001B
LOOP:
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,LOOP
TESRKEY:
MOV DPTR, #OUTBIT
MOV A,#0
MOV A,#0
MOVX @DPTR,A
MOV DPTR,#IN
MOVX A,@DPTR
CPL A
ANL A,#0FH
RET
KEYTABLE:
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, 07H
GETKEY:
MOV DPTR,#OUTBIT
MOV P2,DPH
MOV R0,#IN
MOV R1,#00100000B
MOV R2,#6
KLOOP:
MOV A,R1
CPL A
MOVX @DPTR,A
MOVX A,@R0
CPL A
ANL A,#0FH
JNZ GOON1
GOON1:
MOV R1,A
MOV A,R2
DEC A
RL A
RL A
MOV R2,A
MOV A,R1
MOV R1,#2
LOOPC:
RRC A
JC EXIT
INC R2
DJNZ R1,LOOPC
EXIT:
MOV A,R2
MOV DPTR,#KEYTABLE
MOVC A,@A+DPTR
MOV R2,A
WAITRELEASE:
MOV DPTR,#OUTBIT
CLR A
MOVX @DPTR,A
MOV R6,#10
CALL DELAY
CALL TESTKEY
JNZ WAITRELEASE
MOV A,R2
RET
MAIN:
MOV DPTR,#8000H
MOVX @DPTR,A
HERE:
JNB P3.3,HERE
MOVX A,@DPTR
MOV P1,A
MOV R5,A
CALL DISPLAYLED
CALL TESTKEY
JZ L5
CALL GETKEY
MOV 40H,A
L5:
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 MLOOP
LOOP1:MOV 61H,#00
MOV 60H,#00
AJMP MLOOP
MLOOP:
MOV R0, #LEDBUF
FILLBUF:
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 WEI2
WEI1:
CJNE R0,#62H,XS01
MOV A,50H
ADD A,#80H
SJMP XS1
XS01:
MOV A,50H
XS1:
MOV @R0,A
INC R0
CJNE R0,#LEDBUF+3, FILLBUF
LJMP START
WEI2:
CJNE R0,#63H,X
展开阅读全文