高精度数字电压表原理图及源程序
- 格式:doc
- 大小:70.50 KB
- 文档页数:9
信息与电气工程学院《单片机课程设计报告》题目:专业:班级:姓名:学号:指导教师:2信息与电气工程学院课程设计任务书20 —20 学年第学期专业:班级:学号:姓名:课程设计名称:设计题目:完成期限:自年月日至年月日共周设计依据、要求及主要内容(可另加附页):指导教师(签字):批准日期:年月日目录一、课程设计的目的 (4)二、实验要求 (4)三、设计方案的描述 (4)四、硬件原理图 (5)五、基本原理和元器件说明 (5)1. ADC原理和内部结构 (5)2. TL431的功能与应用 (6)3. 74HC595简介 (7)六、程序流程图 (7)七、源程序清单 (8)八、心得体会 (12)九、参考文献 (12)一、课程设计的目的通过《单片机原理与应用》这门课的课程设计,学生应能对STC15系列单片机有一个全面的认识,掌握以STC15系列单片机为核心的电子电路的设计方法和应用技术。
(1) 1.进一步掌握ADC转换的原理和编程方法。
(2) 2.进一步掌握TL431基准电压的原理及使用方法。
(3) 3.进一步掌握中断处理程序的编程方法。
二、实验要求用STC15F2K60S2单片机和ADC0809构成数字电压表,测量0-5v的电压,将所测电压用4位数码管动态显示出来。
三、设计方案的描述1.读ADC测量外部电压,使用外部TL431基准计算电压,计算公式为g = (u16)((u32)j *2.5 / Bandgap),Bandgap为基准电压数字量,j为相应按键模拟量逐次比较后对应的数字量,g为测得的相应按键电压。
2.用STC的MCU的IO方式控制74HC595驱动8位数码管。
3.用户可以修改宏来选择时钟频率。
使用Timer0的16位自动重装来产生1ms节拍,程序运行于这个节拍下, 用户修改MCU主时钟频率时,自动定时于1ms。
4.右边4位数码管显示测量的电压值,左边4位数码管显示的是基准电压值。
5.外部电压从板上测温电阻两端输入, 输入电压0~VDD, 不要超过VDD或低于0V。
8路数字电压表测量由A/D转换、数据处理及显示控制等组成,测量0~5V范围内的8路输入电压值,由4位共阳LED数码管轮流显示,最大分辨率0.01V,误差±0.02V。
使用AT89C52单片机,ADC0809A/D转换集成蕊片,单片机P1口、P3.0~P3.3口作4位LED数码显示控制。
P3.5端口按钮作单路/循环显示转换,P3.6为单路显示时作通道选择。
ADC0809具有8路模拟信号输入端口,地址线23~25脚为模拟信号输入选择端口,22脚为地址锁存控制,当输入高电平时对地址信号进行锁存,6脚为开始A/D模数转换,7脚为A/D转换结束标志,结束时输出高电平,A/D转换后的数据由9脚输出到单片机P2.5脚。
C源程序:/***********************************************************************************/// 8路电压表C源程序// Keil c51 v7.08/***********************************************************************************//*使用AT89C52单片机,11.0592MHz晶振,P0口读入A/D值,P2口作A/D控制,用共阳LED数码管,P1口输出段码,P3口扫描,最高位指示通道(0~7)*/#include <reg52.h> //51系列单片机定义文件#include <intrins.h> //调_nop_(),延时函数用#define ad_con P2 //A/D控制口#define addata P0 //A/D数据计入读入口#define Disdata P1 //显示数据段码输出口#define uchar unsigned char //无符号字符(8位)#define uint unsigned int //无符号整数(16位)sbit ALE=P2^3; //锁存地址控制位sbit STARA=P2^4; //启动一次转换位sbit OE=P2^5; //0890输出数据控制位sbit EOC=P3^7; //转换结束标志位sbit DISX=Disdata^7; //LED 小数点位////unsigned char code dis_7[11]={0xc0,0xf9,0xa4,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};/*共阳7段LED段码表"0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮"*/unsigned char code scan_con[4]={0xfe,0xfd,0xfb,0xf7};//4位列扫控制字unsigned char data ad_data[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//定义8个数据内存单元unsigned int data dis[5]={0x00,0x00,0x00,0x00,0x00};//定义4个显示数据单元和一个数据存储单元/////********1ms延时子函数*********/delay1ms(unsigned int t){uint i,j;for(i=0;i<t;i++);for(j=0,j<120,j++);}/////**********显示扫描子函数**********/scan(){unsigned char k,n;int h;dis[3]=0x00; //通道初值为0for(n=0;n<8;n++);//每次显示8个数据(就是此处出错){dis[2]=ad_data[n]/51; //测得值转换为3个BCD码,最大值为5.00V dis[4]=ad_data[n]%51; //余数暂存dis[4]=dis[4]*10; //计算小数第一位dis[1]=dis[4]/51;dis[4]=dis[4]%51;dis[4]=dis[4]*10; //计算小数第二位dis[0]=dis[4]/51;for(h=0;h<500;h++) //每个通道值显示控制时间(约1S){for(k=0;k<4;k++) //4位LED扫描控制{Disdata=dis_7[dis[k]];if(k==2){DISX=0;}P3=scan_con[k];delay1ms(1);P3=0xff;}}dis[3]++; //通道值加1}}/////**********0809AD转换子函数**********/test(){unsigned char m;unsigned char s=0x00;ad_con=s;for(m=0,m<8;m++);{ALE=1;_nop_();_nop_();ALE=0; //转换通道地址锁存START=1;_nop_();_nop_();START=0; //开始转换命令_nop_();_nop_();_nop_();_nop_(); //延时4uswhile(ECO==0); //等待转换结束OE=1;ad_data[m]=addata;OE=0;s++;ad_con=s;//取A/D值,地址加1 }ad_con=0x00; //控制复位}/////**********主函数**********/main(){P0=0xff; //初始端口P2=0x00;P1=0xff;P3=0xff;while(1){scan(); //依次显示8个通道1次test(); //测量转换一次}}/////**********结束**********//。
采用单片机技术的高精度电压表用高精度、高稳定性的元器件和放大电路设计成的高精度区间式电压表,其优点、详细工作原理和应用实例详见本刊2003年第12期《高精度区间式电压表》一文。
这里介绍一种高精度电压表。
运用区间式电压表的基本原理,用单片机制作成高精度电压表,它可自动变换测量范围、计算测量值和显示测量结果。
实现对被测电压大范围、全量程的高精度测量。
图1是分挡区间式电压表的原理图。
分挡式区间电压表是把全量程根据需要分成数个区间段,例如,把2~10V的量程分成2~3V、3~4V……9~10V八个区间,波段开关的八个挡对应各区间,通过分别调定每一个区间的调零电位器W1、增益调整电位器W2实现各区间段的覆盖。
分挡式区间式电压表实现了全量程测量,应用更加方便,可以实现一表多用,例如在计量时对多个电压点的测量、对已知电压的高精度测量等。
缺点是需要手动换挡,对未知电压的测量不太方便。
高精度电压表原理1.工作原理在图1分挡式区间电压表的基础上,采用单片机自动控制,通过自动换挡、自动测量、自动修正误差、计算和输出测量结果,成为一种实用的全量程、高精度电压表,见图2所示。
图中,增加了带有A/D模数转换电路的单片机IC4,将测量的模拟量用单片机进行处理;调零电位器W1和增益调整电位器W2换成可程控的线性数字电位器,其阻值的大小由单片机进行调整,实现自动换挡,测量结果用LCD数字显示。
2.制作过程中区间的标定和划分标定是用标准电压对起始值和终止值进行调整,区间划分是把全量程划分成若干个部分。
假如全量程为0~100V,进入标定子程序完成标定,得到一对W1 、W2 阻值的控制数据;电压表的全量程假设每10V一个区间,划分为0~10V、10~20V、……90~100V十个区间,假如测量是线性的,程序就可以计算出十对W1 、W2 阻值的控制数据,连同标定时的一对控制数据,全部存储在数据存储器E2PROM中以备调用。
3.测量过程测量过程是自动进行的。
接口技术学生姓名:学号:学院:专业: 电子科学与技术题目: 数字电压表设计指导教师:数字电压表设计摘要:本课题实验主要采用AT89S51芯片和ADC0809芯片来完成一个简易的数字电压表,能够对输入的0~5 V的模拟直流电压进行测量,并通过一个4位一体的7段LED数码管进行显示,测量误差约为0.02 V。
该电压表的测量电路主要由三个模块组成:A/D转换模块、数据处理模块及显示控制模块。
A/D转换主要由芯片ADC0809来完成,它负责把采集到的模拟量转换为相应的数字量再传送到数据处理模块。
数据处理则由芯片AT89S51来完成,其负责把ADC0809传送来的数字量经一定的数据处理,产生相应的显示码送到显示模块进行显示;另外它还控制着ADC0809芯片的工作。
显示模块主要由7段数码管及相应的驱动芯片(74HC245)组成,显示测量到的电压值。
实现方案:本实验采用AT89S51单片机芯片配合ADC0809模/数转换芯片构成一个简易的数字电压表,原理电路如图1-1所示。
系统框图如图1-2所示。
图1-1 电路原理图图1-2 系统框图硬件选择方案:一.实验所需元器件:1. AT89S51芯片 1块2. ADC0809芯片 1块3. 74HC245芯片 2块4. 4位一体数码 1个5. 6MHz晶振1个6. 33pF电容2个7. 0.1uF滤波电容2个8. 10uF电解电容 1个9. 按键开关 1个10.发光二极管 1个11.4.7KΩ精密电位器1个12.510Ω电阻 12个13.8.2KΩ电阻1个14.10KΩ电阻1个15.导线若干二.主要元器件的介绍1.模数转换芯片ADC0809:ADC0809是典型的8位8通道逐次逼近式A/D转换器,其实物如图1-3所示。
它可以和微型计算机直接接口。
ADC0809转换器的系列芯片是ADC0808,可以相互替换。
1) ADC0809内部逻辑结构图1-4 ADC0809的内部逻辑结构及引脚图ADC0809的内部逻辑结构如图1-4所示。
信息与电气工程学院《单片机课程设计报告》题目:专业:班级:姓名:学号:指导教师:2信息与电气工程学院课程设计任务书20 —20 学年第学期专业:班级:学号:姓名:课程设计名称:设计题目:完成期限:自年月日至年月日共周设计依据、要求及主要内容(可另加附页):指导教师(签字):批准日期:年月日目录一、课程设计的目的 (4)二、实验要求 (4)三、设计方案的描述 (4)四、硬件原理图 (5)五、基本原理和元器件说明 (5)1. ADC原理和内部结构 (5)2. TL431的功能与应用 (6)3. 74HC595简介 (7)六、程序流程图 (7)七、源程序清单 (8)八、心得体会 (12)九、参考文献 (12)一、课程设计的目的通过《单片机原理与应用》这门课的课程设计,学生应能对STC15系列单片机有一个全面的认识,掌握以STC15系列单片机为核心的电子电路的设计方法和应用技术。
(1) 1.进一步掌握ADC转换的原理和编程方法。
(2) 2.进一步掌握TL431基准电压的原理及使用方法。
(3) 3.进一步掌握中断处理程序的编程方法。
二、实验要求用STC15F2K60S2单片机和ADC0809构成数字电压表,测量0-5v的电压,将所测电压用4位数码管动态显示出来。
三、设计方案的描述1.读ADC测量外部电压,使用外部TL431基准计算电压,计算公式为g = (u16)((u32)j *2.5 / Bandgap),Bandgap为基准电压数字量,j为相应按键模拟量逐次比较后对应的数字量,g为测得的相应按键电压。
2.用STC的MCU的IO方式控制74HC595驱动8位数码管。
3.用户可以修改宏来选择时钟频率。
使用Timer0的16位自动重装来产生1ms节拍,程序运行于这个节拍下, 用户修改MCU主时钟频率时,自动定时于1ms。
4.右边4位数码管显示测量的电压值,左边4位数码管显示的是基准电压值。
5.外部电压从板上测温电阻两端输入, 输入电压0~VDD, 不要超过VDD或低于0V。
基于FPGA数字电压表设计目录1系统设计 (3)1.1 控制模块方案的比较 (3)1.2 A/D转换方案的比较 (4)1.3 显示方案的比较 (4)1.4 总体方案设计 (5)1.5 系统的基本原理 (5)2 单元电路设计 (6)2.1 A/D转换部分 (6)2.1.1 ADC0809工作原理 (6)2.1.2 ADC0809工作时序 (7)2.1.3 档位控制电路 (8)2.2 FPGA功能模块的设计 (8)2.2.1 码制变换模块 (8)2.2.2 显示控制及驱动模块 (9)3 软件设计 (9)3.1 开发软件及编程语言简介 (9)3.2 程序流程图 (9)4 系统测试 (10)4.1 测试仪器清单 (10)4.2 测试及误差计算 (10)参考文献 (11)附录1 程序清单 (11)1 系统设计1.1控制模块方案的比较方案一:采用3位半数字电压表。
采用此方案电路结构简单,易于实现且易于维护。
它的核心器件是一个双积分式A/D转换,双积分式DVM属于V—T变换式,其基本原理是在一个测量周期内,首先将被测电压UX加到积分器的输入端,在确定的时间内进行积分,也称定时积分;然后切断UX,在积分器的输入端加与UX极性相反的电压UR,由于UR一定,所以称为定值积分,但积分方向相反,直到积分输出达到起始电平为止,从而将UX转换成时间间隔进行测量。
只要用计数器累计时间间隔内的脉冲数,即为UX之值。
其原理方框图如图1.1.1所示。
图1.1.1 3位半电压表原理图方案二:采用单片机为控制核心。
目前单片机技术比较成熟,功能也比较强大,配合一定的外围电路可实现数字电压表,原理图如图1.1.2所示。
输入信号经AD转换器转换后送到单片机进行数据处理,系统根据不同电压信号计算出不同的数值,并将其显示出来。
采用这种方案优点是呆以依赖地成熟的单片机技术、运算功能较强、软件编程灵活、自由度大、设计成本也较低,能较准确地测量输入电压。
课程设计报告题目:数字电压表设计与仿真学生姓名:吴鹏学生学号: 1114010250 系别:电气院专业:自动化届别: 2011指导教师:张水锋电气信息工程学院2013年摘要:在现代检测技术中,常用高精度数字电压表进行检测,将检测到的数据送入微型计算机系统,完成计算、存储、控制等功能。
本文中数字电压表的控制系统采用AT89C51单片机,A/D转换器采用ADC0809为主要硬件,实现数字电压表的硬件电路与软件设计。
该系统的数字电压表电路简单,所用的元件较少,成本低,调节工作可实现自动化,还可以方便地进行8路A/D转换的测量,远程测量结果传送等功能。
数字电压表可以测量0~5V的电压值,并在四位LED数码管上轮流显示,并且应用Proteus的ISIS软件进行单片机系统设计与仿真.关键词:单片机;数字电压表;A/D转换ADC0809;Proteus1 绪论随着电子科学技术的发展,电子测量成为广大电子工作者必须掌握的手段,对测量的精度和功能的要求也越来越高,而电压的测量甚为突出,因为电压的测量最为普遍。
同时随着微电子技术的迅速发展和超大规模集成电路的出现,特别是单片机的出现,正在引起测量控制仪表领域的新的技术革命[1]。
由于使用的是高效单片机作为核心的测量系统,以及灵敏度和精度较高的A/D转换器,使本直流电压表具有精度高、灵敏度强、性能可靠、电路简单、成本低的特点,加上经过优化的程序,使其有很高的智能化水平[2]。
数字电压表相对于指针表而言读数直观准确,电压表的数字化是将连续的模拟量转换成不连续的离散的数字形式并加以显示。
这有别于传统的以指针与刻度盘进行读数的方法,避免了读数的视差和视觉疲劳[3]。
2 系统方案设计利用MCS-51系列单片机设计简易数字电压表测量0~5v的8路输入电压值,并在四位LED 数码管上轮流显示或单路选择显示。
测量误差约为±0.02V。
系统设计方框图如图1所示。
单片机AT89C51时钟电路复位电路数据采集显示电路模拟信号图1系统设计方框图3 硬件电路设计3.1时钟电路XTAL1是片内振荡器的反相放大器输入端,XTAL2则是输出端,使用外部振荡器时,外部振荡信号应直接加到XTAL1,而XTAL2悬空。
数字万用表电路图大全(模数转换电路显示驱动电路)数字万用表电路图(一)数字万用表是在一个只有基本量程的直流数字电压表的基础上扩展而成的,这个电压表相当于数字万用表的“表头”。
其原理见图1。
在图1中,除显示器外,其余功能可全都集成在一个芯片上,具有这些功能的芯片叫A/D转换器,较常见的有ICL7106、ICL7107等多种型号,它们部属于双积分式A/D转换器。
双积分A/D转换器内部电路虽然很复杂,但根据图1的电路可以说明其原理。
它在一个测量周期内的工作过程如下:测试开始,计数器清零,积分电容C=C放电,然后控制逻辑使K2、K3断开,K1接通,积分器对被测电压Vx进行正向积分,正向积分也叫采样,采样期间积分输出V01线性增加,经过零比较器得到过零方波,通过控制逻辑打开门G,计数器开始对时钟脉冲计数,当计数到最高位为1时,溢出脉冲通过控制逻辑使K1、K3断开,K2接通,采样结束,计数器复零。
设采样过程时间为T1,则积分输出V01=VxT1/RC……(1),K2接通基准电压VR后,积分器开始第二次积分(反向积分),V01开始线性下降,计数器也重新计数。
当V01降至零时,比较器输出的负方波结束,控制逻辑使K2断开,K3接通,积分停止。
同时关闭门G,计数停止,一个测量周期结束。
设反向积分过程时间为T2,则积分输出为V01-VrT2/RC=0……(2)。
由式(1)、(2),可得Vx=VrT2/T1……(3)。
转换波形见图2。
数字万用表电路图大全(模数转换电路/显示驱动电路)设时钟脉冲周期为T0,则T1=N1T0,T2=N2T0,N1、N2分别是正、反向积分期间计数的时钟脉冲个数,所以VX=VRN2/N1…(4)。
对干31/2位A/D转换器,采样期间计数到1000个脉冲时计数器有溢出,故N1=1000是个定值,如再规定VR=100.0mV,则有VX=0.1N2……(5)。
(5)式说明,适当选择N1及VR的值,可使VX与N2的有效数字相同,只是小数点位置不同。
1.绪论数字电压表(Digital Voltmeter)简称DVM,作为智能仪表的一种,它是采用数字化测量技术,把连续的模拟量(直流输入电压)转换成不连续、离散的数字形式并加以显示的仪表。
传统的指针式电压表功能单一、精度低,不能满足数字化时代的需求,采用单片机的数字电压表,由精度高、抗干扰能力强,可扩展性强、集成方便,还可与PC进行实时通信。
目前,由各种单片A/D 转换器构成的数字电压表,已被广泛用于电子及电工测量、工业自动化仪表、自动测试系统等智能化测量领域,示出强大的生命力。
举例:图1 CAKJ系列数字电流-电压-功率-因数-频率表如图1是一个CAKJ系列数字电流-电压-功率-因数-频率表1)适用范围该系列产品是一种高精度的安装式仪表,它可广泛用于电力系统和自动化控制系统中对单相三相电量参数(交直流电流-电压-功率-因数-频率)的测量和显示。
采用大规模集成电路,具有转换精度高、响应速度快、性能稳定等特点,可直接替代指针式仪表。
2)通用技术参数* 精度等级:数显0.2、0.5级光柱1.5级* 数显范围:四位半显示0-1 9 9 9 9* 光柱指示:0-120%* 标称输入:电流1A、5A;电压100V、220V、380V 、450V* 过量程:持续:1.2倍,瞬时:电流10倍/5秒,电压2倍/1秒本次设计是以单片机AT89S51芯片为核心,设计了一个简易的电压检测电路,它由5V直流电源供电。
在硬件方面,通过一个可变电阻调节输入电压的变化来反映所检测到的电压变化。
此变化的电压通过ADC0809的一个通道(IN0)送入并进行A/D转换,将转换后的数字量在单片机AT89S51中进行处理,再转换成相应的实际电压值,最后通过四位LED数码管显示,精确到十分位,LED 采用的是动态扫描显示,使用74HC02P芯片进行驱动。
软件方面采用汇编语言编程。
使得整个系统完成一个简易的数字电压表的功能。
2.电压表设计目的及要求2.1 设计目的通过简易数字电压表的设计过程,结合在校所学课程,掌握目前电子仪表的一般设计过程,锻炼动手能力和分析、解决问题的能力,积累经验,培养自己以后能在工作中按部就班、一丝不苟以及对所学知识的综合应用能力。
目录摘要 (1)Abstract: (1)1 引言 (2)2 设计总体方案 (2)2.1设计要求 (2)2.2 设计方案 (2)3 硬件电路设计 (3)3.1 A/D转换模块 (3)3.2 单片机系统 (4)3.2.1 AT89C51性能和功能 (4)3.3 复位电路和时钟电路 (5)3.3.1 复位电路设计 (5)3.3.2 时钟电路设计 (6)3.4 LED显示系统设计 (6)3.4.1 LED显示器的选择 (6)3.4.2 LED显示器与单片机接口设计 (7)3.5 总体电路设计 (7)4 程序设计 (9)4.1 程序设计总方案 (9)4.2 系统子程序设计 (9)4.2.1 初始化程序 (9)4.2.2 A/D转换子程序 (9)4.2.3 显示子程序 (10)5 仿真 (10)5.1 软件调试 (10)5.2 显示结果及误差分析 (11)5.2.1 显示结果 (11)5.2.2 误差分析 (13)结论 (14)参考文献 (14)附录一程序代码 (16)附录二仪器设备清单 (18)致谢...................................................................................................................... 错误!未定义书签。
基于单片机的简易数字电压表的设计摘要:本文介绍了一种基于单片机的简易数字电压表的设计。
该设计主要由三个模块组成:A/D转换模块,数据处理模块及显示模块。
A/D转换主要由芯片ADC0808来完成,它负责把采集到的模拟量转换为相应的数字量在传送到数据处理模块。
数据处理则由芯片AT89C51来完成,其负责把ADC0808传送来的数字量经过一定的数据处理,产生相应的显示码送到显示模块进行显示;此外,它还控制着ADC0808芯片工作。
该系统的数字电压表电路简单,所用的元件较少,成本低,且测量精度和可靠性较高。
XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C51D03Q02D14Q15D27Q26D38Q39D413Q412D514Q515D617Q616D718Q719OE1LE11U274LS37312/82CS3A04CE6R/C5REFOUT8REFIN1020VIN1410VIN13AGND9STS28DB1127DB1026DB925DB824DB723DB622DB521DB420DB319DB218DB117DB016VAS7VEE11BIPOFF12U3AD1674GND-15V+15V+10V-10V55%RV41k
50%RV2100
50%RV1
100
U5OP1P
RV4(3)234567891RP110k
VCC
VCC1
23
U4:A
74LS00D714D613D512D411D310D29D18D07E6RW5RS4VSS1VDD2VEE3
LCD1LM016L
GND
?
LCD_CMD_WR EQU 00E0H LCD_DATA_WR EQU 00E1H LCD_BUSY_RD EQU 00E2H LCD_DATA_RD EQU 00E3H ;******************************** AD_12CMD_WR EQU 00E0H ;初始化为12位转换器 AD_8CMD_WR EQU 00E8H ;初始化为8位转换器 AD_8HB_RD EQU 00E4H ;高8Bit输出 AD_4LB_RD EQU 00ECH ;低4Bit输出 ;********************************* ORG 0000H LJMP MAIN ORG 0030H ;========================================= MAIN: MOV SP,#60H CLR RS0 CLR RS1 ACALL INIT ;LCD初始化 ;======================================= ;参数设置 ;======================================= AD574: MOV DPTR,#AD_12CMD_WR MOVX @DPTR,A ;启动转换 SETB P3.0 LOOP: NOP JB P3.0,LOOP MOV DPTR,#AD_8HB_RD MOVX A,@DPTR MOV R2,A MOV DPTR,#AD_4LB_RD MOVX A,@DPTR MOV R3,A ;======================================== ;数据处理(参数)传递 ;R2R3=(ABC0) ;处理后R2R3=(0ABC) ;======================================== MOV A,R2 SWAP A ;高低交换 MOV R5,A ANL A,#0F0H ; MOV R4,A MOV A,R3 SWAP A ORL A,R4 MOV R3,A MOV A,R5 ANL A,#0FH MOV R2,A ;======================================== ;入口参数:被减数在R2R3中,减数在R6R7中 ;出口参数:差值在R2R3中 ;======================================== MOV R6,#08H MOV R7,#00H CLR C ;============= MOV A,R2 SUBB A,R6 JNC SUBI ;无借位,直接运算 SETB 02H MOV A,R2 CPL A ;取反 ANL A,#0FH MOV R2,A MOV A,R3 CPL A MOV R3,A ;=========================== ;计算 ;========================== SUBI: CLR C MOV A,R3 SUBB A,R7 MOV R3,A MOV A,R2 SUBB A,R6 MOV R2,A ;========================================== ;乘以10计算 ;=========================================== MOV R1,#00H MOV A,R3 LCALL MUL10 MOV 49H,A MOV A,R2 LCALL MUL10 MOV 48H,A ;======================================== ;============================================ ;除法运算 ;============================================ ;============================ ;整数部分 ;============================ MOV R0,#30H LCALL DIVD0 MOV A,40H MOV @R0,A INC R0 MOV A,#2EH MOV @R0,A INC R0 ;========================== ;小数部分 ;========================== MOV 45H,#05H ALUDEF: MOV A,42H LCALL MUL10 MOV 47H,A MOV A,41H LCALL MUL10 MOV 46H,A ;========================== ;确定小数 ;========================== LCALL DIVD1 MOV A,40H MOV @R0,A INC R0 DJNZ 45H,ALUDEF MOV A,#05H CLR C SUBB A,40H JC DV53 SJMP DV54 DV53: INC 40H DEC R0 MOV A,40H MOV @R0,A LOPJ: CJNE @R0,#0AH,DV54 MOV @R0,#00H DEC R0 INC @R0 INC R0 ;==================== SJMP LOPJ DV54: CLR OV INC R0 MOV @R0,#56H ;RET ;=========================== ;显示 ;=========================== MOV A,#01H ACALL C51 MOV A,#81H ACALL C51 MOV DPTR,#TAB1 LCHIN: CLR A MOVC A,@A+DPTR INC DPTR LCALL C51DDR JNZ LCHIN MOV A,#0C3H ACALL C51 JNB 02H,LOP_ MOV A,#2DH LCALL C51DDR LOP_: MOV R0,#30H MOV A,@R0 LCALL CHASCII INC R0 LCALL C51DDR MOV A,@R0 INC R0 LCALL C51DDR MOV R1,#06H LOPXS: MOV A,@R0 LCALL CHASCII LCALL C51DDR INC R0 DJNZ R1,LOPXS MOV R2,#5 DELL1ms:LCALL DEL DJNZ R2,DELL1ms MOV A,#01H ACALL C51 MOV A,#0C3H ACALL C51 CLR 02H ;======================== LJMP AD574 ;============================ ;计算子程序 ;============================= DIVD0: CLR 00H PUSH PSW SETB RS0 CLR RS1 MOV R4,48H MOV R5,49H ACALL DIVD POP PSW RET DIVD1: SETB 00H PUSH PSW SETB RS0 CLR RS1 MOV R4,46H MOV R5,47H DIVD: MOV R2,#00H MOV R3,#00H