用软件实现DAA的方法

发布者:学思者最新更新时间:2018-03-06 来源: eefocus关键字:软件实现  DAA 手机看文章 扫描二维码
随时随地手机看文章

    AVR单片机问世以来,获得广泛关注。它是一种采用精简指令集、以时钟周期为机器周期的高速单片机。它采用快速寄存器文件(共有32个寄存器 R0~R31,其中R16~R31具有较强通用功能)、快速单周期指令。另外在存储器技术(Flash存储器、EEPROM)、低功耗、系统可靠性、定时 /计数器功能多样化等方面也都具特色。但由于采用精简指令集,它没有一般8位机的DAA指令。因BCD码加减法运算及定点数制转换都要用到DAA功能,故给使用汇编语言研发带来不便。本文重点介绍用软件实现DAA的方法。


    计算机采用的十进制操作数一般都为压缩型8421 BCD码,每个BCD码表示1位十进制数。每2位BCD码共存于同一字节单元中,故BCD运算涉及状态寄存器SREG的进位C(第0位)和半进位H(第5 位)。它们分别为高、低位BCD的进(借)位。在进行BCD码加减运算时,计算机是按二进制数对待的,因此会产生与十进制运算规则不相符合的情况:一是当产生进(借)位(C=1或H=1)时,该进(借)位等于16(对所涉及的1位BCD码而言),而在十进制运算中应等于10;二是可能产生非法BCD码(值大于9)。软件DAA即为纠正以上错误而设的。

    1 软件DAA的实现方法

    1.1 实现加法DAA功能子程序ADAA和ADAA1的设计方法

    经实践考查,BCD码加法运算,可产生以下3种情况:

    ① 不须调整,特点是既不产生进位,也不产生非法BCD码。如$22+$11=$33。

    ② 产生非法BCD码,必须加6调整。特点是BCD码相加后不产生进位,但加6调整后产生进位。如
$36+$37=$6D(产生非法BCD),加6调整后变为$73(产生半进位H)。$68+$87=$EF,加$66调整后变为$155(产生进位C和半进位H)等。

    ③ 产生进位,必须加6调整。特点是BCD码相加只产生进位,不会同时产生非法BCD码;而加6调整后既不会再产生进位/半进位(而是清除了原来的进位/半进位),也不会产生非法BCD码。例:
$99+$88=$121,进位C和半进H位都置位,故加$66来调整:$21+$66=$87,并要恢复进位C。

    综合以上3种情况,得出下面加法DAA之实现方法:首先保存BCD码相加后的状态寄存器SREG(保存其中的进位C和半进位H,称为Co和Ho)。再将 BCD码之和加上$66,产生出新的进位Cn及半进位Hn。若Co、Cn中有1个置位(只能有1个!),说明高位BCD满足调整条件并调整完毕,否则为不够调整条件,应减$60恢复;若Ho、Hn中有1个(只能有1个!)置位,说明低位BCD满足调整条件并调整完毕,否则为不够调整条件,应减6恢复。程序中是将新、旧进位和半进位对应"或"起来,只对"或"结果进行判断。注意,软件DAA功能既要保证本字节压缩BCD码相加值的正确性,又要保证对高位 BCD产生进位的正确性,故要将Co∨Cn的结果返还给SREG,以使下一步能正确实现高位BCD带进位加。

    ADAA为BCD码相加调整子程序,使用寄存器R20作为工作单元(使用R22、R11、R10等3个寄存器作为辅助工作单元),所有调整工作都在此单元内进行。

    ADAA1为数制转换程序中实现BCD码左移调整的子程序,为加法DAA之特例:它在R20工作单元内实施BCD码带进位位自加并完成对和的调整。

    1.2 实现减法DAA功能子程序SDAA的设计方法

    由实践可知,减法DAA要比加法来得简单:只须对产生借位的BCD码进行调整。BCD码减法运算,只有以下2种情况:

    ① 不产生借位,不须调整,如 $22-$11=$11。

    ② 产生借位,此时不论有否非法BCD码产生,一律对产生借位的BCD码加$A调整。但AVR单片机没有加字节型立即数指令,改为减6调整,要注意加原和减补对进位的影响是相反的。为保证多字节压缩BCD码运算的正确性,若调整后清除了借位C,必须将其恢复。例如$22-$54=$CE,因C、H皆置位,用减去$66来调整$CE-$66=$68,调整后清除了借位C,故子程序中还要加SEC 指令来恢复借位C。

    注:MCS-51单片机减法DAA子程序很容易按此移植(半进位为AC)。

    1.3 实现右移DAA功能子程序RDAA的设计方法

    见"3 定点数制转换子程序"中对BCD码右移调整的说明。

    2 定点运算子程序

    (1)多字节压缩BCD码加法子程序ADBCD

    加法在寄存器内直接完成,以R20为DAA工作单元。BCD码相加后,将和送到R20,调用ADAA子程序,实现对和的调整(返回主程序后再回送调整结果)。

    (2)多字节压缩BCD码减法子程序SUBCD

    减法在寄存器内直接完成,以R20为DAA工作单元。BCD码相减后,将差送至R20,调用SDAA子程序,实现对差的调整(返回主程序后再回送调整结果)。

    (3)乘法子程序MUL16

    操作:(R13,R12)×(R15,R14)→ R17,R16,R15,R14

    采用字乘字无符号数运算。采取逐次右移部分积和乘数,当乘数移出位等于1时将被乘数加入部分积的方法完成计算。可视为16位整数×16位整数→32位整数,也可视为16位整数×16位小数→16位整数,或视为16位小数×16位小数→32位小数。可加上舍入处理。

    (4)除法子程序DIV16

    操作:(R17,R16,R15,R14)÷(R13,R2)→R15,R14

    采用双字除以字无符号数运算。采取逐次左移被除数与除数相减、试商、记商的方法完成计算。可视为双字型整数÷字型整数→字型整数,也可视为小数÷小数→ 小数。要求 (R17,R16)<(R13,R12)。可加上舍入处理,但要注意可能产生舍入溢出(例如$7FFFC000÷$8000=$FFFF.8,舍入取整即产生溢出)。


    (5)开平方子程序SQR

    操作:(R17,R16,R15,R14)→R14,R13,R12

    可视为双字型整数X(≤4294967295)开平方,因有舍入处理,方根最大可达$10000(如X=$FFFF0000开平方即属此),故用3字节存储平方根。也可视为定点小数开平方,将X自最高位起每2位进行分割,采用摸拟手算的方法(X每左移2位试出1位根)开平方。


    3 定点数制转换子程序

    该组子程序由定点整数二翻十、定点整数十翻二、定点小数二翻十和定点小数十翻二等4个子程序组成,分别称为CONV1、CONV2、CONV3和CONV4。由于AVRAT90系列单片机只有字节乘字节指令,计算功能不强,故采用移位调整法实现多字节数据的数制转换。其中,整数二翻十子程序CONV1和小数十翻二子程序CONV4采取左移调整的方法,而整数十翻二子程序CONV2和小数二翻十子程序CONV3采用右移调整的方法。不论左移还是右移,调整总是对十进制数进行,其目的是使十进制数的移位规则符合于二进制数移位规则:左移1位值增倍,右移1位值折半。当某位BCD中的最高位(8)左移移入高位BCD中时,按二进制数看待应为16,而按十进制数相邻位看待只能为10,故要做加6调整。另外,左移过程中若出现非法BCD码时也要对其调整。BCD码左移只不过是BCD码相加的特例,故调用 BCD码相加调整子程序ADAA1就可完全解决左移调整问题。当右移BCD码时,若某位BCD中的1移入低位BCD最高位,按二进制数看待,1折半应为 0.5,而低位BCD中最高位值为0.8,故要做减3(即0.3)调整。因8421BCD码其各位之权(某位上的1所代表的实际数值)分别为8、4、2和 1,若只在本码位内部移动,则符合左移1位值增倍、右移1位值折半的规则,故不须调整。

    本组定点运算及数制转换子程序为适应大多数应用场合而设,具体使用时可加以修改。如整数二翻十时,二进制数不超过$FFFF,为提高运行速度,可将二进制数改为二字节,十进制数改为3字节,并将移位循环次数(R21)改为16。如数据精度不够,可把乘法子程序改为3字节乘3字节等等。

    ADAA1为左移BCD码并对其进行调整的子程序。

    RDAA为对右移后的BCD码进行测试、实施减3调整的子程序,以R20为工作单元。

    注:开平方子程序SQR说明中,请将对开平方数R17、R16、R15、R14加上完整根号。

    参考文献

    1 宋建国,等. AVR单片机原理及其应用. 北京:北京航空航天大学出版社, 2000
2 张克彦. MCS-51/196单片机浮点程序和实用程序(2.2.7 2.4.1 3.1.2 3.1.3等小节). 北京:北京航空航天大学出版社, 2001 


关键字:软件实现  DAA 引用地址:用软件实现DAA的方法

上一篇:AVR看门狗使用范例即Reset程序详解
下一篇:典型的ATmega128的软件USART的接口程序

推荐阅读最新更新时间:2024-03-16 15:56

在HCS08系列MCU上用软件实现仪表步进电机的驱动
  步进电机由于具有角位移和输入脉冲数成正比并且没有累积误差的特点,而被广泛地用作汽车仪表的显示部件。在多数情况下,人们会使用专用的驱动芯片来驱动步进电机,主控制器只需要给出方向控制信号和控制转动步数的脉冲就行了。另外,也有集成了步进电机驱动电路的MCU(微控制器),如Freescale的MC9S12HY系列,其使用方法也比较简单。然而,在很多较低端的汽车仪表,如微型车、农用车、三轮货车和摩托车的仪表上,人们为了降低成本,希望能够不用专用驱动芯片或相对较贵的带驱动电路的MCU,而是用普通的MCU直接去驱动步进电机。本文介绍了在Freescale的HCS08系列MCU上,如何用软件来实现对VID29系列步进电机的直接驱动。本文所附带
[单片机]
在HCS08系列MCU上用<font color='red'>软件</font><font color='red'>实现</font>仪表步进电机的驱动
AltaSens利用微捷码IC实现软件标准化
     美国加州圣荷塞— 微捷码(Magma)设计自动化有限公司日前宣布,AltaSens公司确定采用微捷码IC实现工具作为纳米集成电路(IC)设计平台。AltaSens公司在过去3年里使用微捷码软件的芯片设计获得100%成功。最近其后端设计师通过使用微捷码软件,一个人就能够在仅仅一周时间内完成低功耗500万门极电路从最后RTL到GDSII的复杂设计。   “AltaSens影像产品被广泛应用于从广播到医疗到监控摄像机等有高性能和低成本影像解决方案需求的各种领域中,”AltaSens公司资深物理设计工程师Glen Donelson表示:“微捷码IC实现软件的先进功能以及该公司应用工程师所提供的世界级支持服务有助于我们创造屡屡获
[安防电子]
Proteus软件调试实现的数字式指针温度计
本文主要叙述利用Proteus软件实现的数字式指针温度计的一种调试方法,采用MCS51单片机作为指针温度计的数字信号处理器,其中,温度采集传感器选用Dallas公司的Ds1820单总线式数字温度传感器,该温度计的温度值通过四个数码管显示,同时还可以通过刻盘指针指示。 硬件设计 硬件设计包括温度采集模块、单片系统及温度显示模块等模块,其中,刻度盘上指针的控制是设计中的一个重点。在设计数字电路的角位移控制时,一般选用步进电机或伺服电机,选用步进电机时,其步进角固定,同时,对于角位移的控制,会产生控制角度的动作位置不够精确的问题;选用伺服电机也就是舵机时,其控制原理是通过MCS51单片机产生脉宽调制(PWM)信号的占空比来改变舵机摇
[应用]
基于Windows CE的SIP软件电话的设计与实现
1 引言 VOIP的迅速普及,出现了越来越多的VOIP的固定电话终端。随着VOIP的进一步发展,为了满足移动用户VOIP通信的需要,无线VOIP通讯将是未来的发展趋势。 现在手持PDA用户越来越多,都具有无线上网功能,如果能开发一个在PDA上运行的VOIP软件电话,就可以满足这些PDA用户的无线VOIP通信的需求,具有非常重要的实际意义。由于嵌入式Windows CE(WinCE)是PDA最流行的操作系统,而目前大多数VOIP终端都采用SIP协议,因此,本文提出了一种Windows CE平台下基于SIP协议的VOIP解决方案。该方案以嵌入式Windows CE为平台,eMbedded C++ 4.0为开发工具,中间件采用开
[嵌入式]
AEye展示其4Sight™智能传感平台 可推动实现软件定义车辆
据外媒报道,自适应高性能激光雷达解决方案供应商AEye在美国底特律国际汽车传感器展览会AutoSens Detroit 2022展示了其4Sight™智能传感平台的革命性设计。该平台使汽车OEM能够将同一个激光雷达传感器嵌入多个集成位置,并使用AEye专有传感软件优化车辆特定封装和集成的性能。凭借AEye的自适应激光雷达,汽车制造商可在不影响性能的情况下获得更多设计灵活性,从而进一步推进对软件定义汽车的追求。 图片来源:AEye 4Sight平台可利用单一平台,并通过软件进行配置,以及显示在多个安装位置,因此汽车制造商可获得完整的车辆设计和美学灵活性。与不适应OEM性能和集成要求的以硬件为中心的激光雷达系统相比,4S
[汽车电子]
AEye展示其4Sight™智能传感平台 可推动<font color='red'>实现</font><font color='red'>软件</font>定义车辆
RF软件定义仪器突破传统机箱限制 实现高性能射频测试
随着测量速度、弹性与精确度的逐渐提升,工程师必须脱离机箱的框架,继续寻找RF测试的创新解决方案。而软件定义的模块化仪器所提供的新工具,正满足越来越多无线标准的测试。 通常情况下,工程师在测试新的无线标准时,往往会选择使用规格最接近的机箱。对于拥有多种测试需求的自动化测试系统来说,上述方法常导致不同的测量需求就需不同的机箱。当测试需求一致且不变时,机箱测试的方法当然游刃有余,但若要测试符合多种无线标准的复杂射频(RF)设备时,此方法就显得麻烦、昂贵且缓不济急。相比之下,软件定义的测试方法适用于RF的认证、检验与产品测试。当然,传统的RF机箱在设计平台中仍持续扮演重要角色。 无线设备演进快 测试机箱望尘莫及 现今工程师必须脱离RF测
[测试测量]
RF<font color='red'>软件</font>定义仪器突破传统机箱限制 <font color='red'>实现</font>高性能射频测试
利用纯软件实现单片机远程通信的设计
  GMS972051是韩国LG公司生产的MW内部带2K E2PROM的与MCS-51兼容的单片机。GMS97C2051省去了MCS-51的P0和P3口,但是多了一个内部硬件比较器。由于单片机的通信信号为TTL电平,如果不采取其它的措施,其在通信速率为9600bps时通信距离不超过5米。一般为了延长单片机的通信距离,采用RS-232/RS-485转换器、RS-232/RS-422转换器或光隔远程收发器。   要用纯软件方法实现GMS97C2051单片机之间的远程通信,首先必须将单片机的TTL电平的软件方法转换为差分电平,其次要用普通I/O口线来构成软件串行口,并且在软件上进行正确的配合。   TTL电平转换成差分电平的纯软件方法
[单片机]
利用纯<font color='red'>软件</font><font color='red'>实现</font>单片机远程通信的设计
通过单片机软件实现精确延时
  在很多情况下,定时器/计数器经常被用作其他用途或者无法实现时,只能用软件方法延时,比如,延时超过定时器定时范围的最大值。下面我们来分析一下通过软件实现的延时。      1.较短时间的精确延时      在汇编语言里,我们可以用NOP(空操作指令)来实现,一条NOP指令占用一个机器周期,比如我们用12MHz晶振,执行一条NOP指令,它就可以延时lμs,精确度可以达到1μ。使用也比较方便,我们可以在需要延时的程序中直接加上NOP指令即可实现延时。      同样,我们可以在C51中通过使用带一NOP-()语句的函数实现,_NOP-()就相当于汇编中的NOP指令,我们可以定义一系列不同的延时函数,比如Delayl0μs   D
[单片机]
通过单片机<font color='red'>软件</font><font color='red'>实现</font>精确延时
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved