一种实用的单片机多字节除法程序

发布者:TranquilJourney最新更新时间:2015-07-22 来源: 51hei关键字:单片机  多字节  除法程序 手机看文章 扫描二维码
随时随地手机看文章
      在单片机的实际应用中,除法运算是以比较常见的运算。

     以MCS-51单片机为例,虽然提供了除法指令,但只能进行单字节的运算。如果要进行多字节的除法运算,就得自己设计算法。目前,许多资料上都介绍了四字节除以二字节的算法,但它们主要有以下几点不足:
1. 只能求出商,不能求出余数;
2. 在被除数高二字节大于除数时,不能进行运算;
3. 商只有两个字节。 例如,被除数是0FFFFFFFFH,除数是0004H时,商数应该是3FFFFFFFH,余数是0003H。
但是,用以前的算法是无法进行运算的。 在实际运用中,参与运算的数是任意的,有时需要求出余数,有时商数要求有四个字节,因此,以前的算法在实际应用中受到了很大的限制。 为了满足实际运用中的需要,有一套新的四字节除以二字节的算法,克服了上述算法中的缺点,可以适合广泛的实际需要。下面以MCS-51汇编语言为例进行说明。 该算法增加了两字节的余数单元,并把被除数单元用来存放商数。运算时,首先判断除数是否为零,若为零时,则设溢出标志为1,然后退出。若除数不为零,则采用移位相减法进行运算。
首先,把进位位和余数单元清零。再将进位位、余数单元和被除数单元按顺序首尾相连,逐位进行向左循环移位,共移位32次。每移位一次,余数单元都和除数作一次减法运算,若够减,余数单元内容更新为两者之差,并且将被除数最末一位置为1;若不够减,则余数单元内容保持不变,且将被除数最末一位置为0。判断是否够减的方法是:在作减法之前,先保存进位位,再看作完减法后的进位位。仅在作减法之前进位位为0,并且作减法之后进位位为1时判为不够减,其余情况均视为够减。这样,等到全部运算结束时,商数为四个字节,存放在被除数单元中;余数为两个字节,存放在余数单元中。
例如,被除数是0FFFFFFFFH,除数是0004H时,运行新的算法,商数是3FFFFFFFH,存放在被除数单元中,余数是0003H,存放在余数单元中。 这个算法自然、流畅,运算结果商数为四个字节,余数为两个字节,尤其是在求除以某数的N次方时,只需连续调用N次该算法子程序就可以了,省去了繁琐的数据转存语句。该算法还可以依实际需要扩充为位数更高的多字节除数算法,也可以移植到其它的单片机平台上。

        本算法已在AT89C51单片机上调试通过。下面给出算法的程序代码清单。 

divdll data  20h ;定义被除数单元
divdlh data 21h
divdhl data 22h
dlvdhh data 23h
divl data 24h ;定义除数单元
divh data 25h
templ data 26h ;定义余数单元
temph data 27h
divd: push acc
push b
mov a,divdh ;判除数是否为零
orl a,divl
jnz divd0
setb ov ;除数为零,置溢出标志
pop b
pop acc
ret
divd0: mov templ,#00h ;除数不为零,进行运算
mov temph,#00h
mov b,#20h ;置循环次数
divd1:clr c ;进位位、余数单元和
mov a,divdll ;被除数单元全体逐个
rlc a ;向左循环移位
mov divdll,a
mov a,divdlh
rlc a
mov divdlh,a
mov a,divdhl
rlc a
mov divdhl,a
mov a,divdhh
rlc a
mov divdhh,a
mov a,templ
rlc a
mov templ,a
xch a,temph
rlc a
xch a,temph
mov f0,c ;保存进位位
clr c
subb a,divl ;用余数减去除数
mov r7,a
mov a,temph
subb a,divh 
jc    divd2 
mov templ,r7 ;够减,刷新余数单元
mov temph,a
inc divdll ;商上1
divd2: djnz b,divd1
clr ov
pop b
pop acc
ret
end

对于上述算法,其思想是正确的。但在DICE-51单片机仿真系统具体操作中还存在部分问题。下面我以DICE系列的DICE-51单片机仿真系统软件为例,给出四除三字节的算法的程序代码清单已在DICE-51单片机仿真系统软件调试通过。首先,因为DICE-51单片机仿真系统软件在做除法运算时,若产生借位,不能置位,所以要用CJNE比较指令进行置位运算。[page]

;定义被除数单元
DIVDLL    EQU    40H
DIVDLH    EQU    41H
DIVDHL    EQU    42H
DIVDHH    EQU    43H
;定义除数单元
DIVDL     EQU    44H
DIVDM     EQU    45H
DIVDH     EQU    46H
;定义余数单元
TEMPL     EQU    50H
TEMPM     EQU    51H
TEMPH     EQU    52H
;定义辅助单元
FZ1       EQU    47H
FZ2       EQU    48H

DIV0:  MOV   A,DIVDH             ;以下四行判断除数是否为零
          ORL   A,DIVDM
          ORL   A,DIVDL
          JNZ   DIV1                      ;如果(A)不等于0,则跳转;否则顺序执行
          SETB  OV                       ;除数为零,置溢出标志位OV为1,程序结束
          SJMP  LOOP1
DIV1: MOV   TEMPL,#00H         ;余数单元清零
          MOV   TEMPM,#00H
          MOV   TEMPH,#00H 
          MOV   B,#20H                   ;置循环次数32次
DIV2: CLR   C                              ;进位位清零
          MOV   A,DIVDLL                ;以下三行被除数最低字节左移一位(带进位)
          RLC   A
          MOV   DIVDLL,A
          MOV   A,DIVDLH                ;以下三行被除数低16位高字节左移一位(带进位)
          RLC   A
          MOV   DIVDLH,A
          MOV   A,DIVDHL                 ;以下三行被除数高16位低字节左移一位(带进位)
          RLC   A
          MOV   DIVDHL,A
          MOV   A,DIVDHH                 ;以下三行被除数最高字节左移一位(带进位)
          RLC   A
          MOV   DIVDHH,A
          MOV   A,TEMPL                  ;以下三行余数低字节左移一位(带进位)                    
          RLC   A
          MOV   TEMPL,A
          MOV   A,TEMPM                 ;以下三行余数中间字节左移一位(带进位)
          RLC   A
          MOV   TEMPM,A
          MOV   A,TEMPH                  ;以下三行余数高字节左移一位(带进位)
          RLC   A
          MOV   TEMPH,A
          MOV   A,TEMPL                  ;把余数最低字节送到累加器A中
          CLR   C                               
          SUBB  A,DIVDL                   ;用余数减去除数
          MOV   R7,A                         ;低字节相减结果送R7保存
          MOV   A,TEMPL
          CJNE  A,DIVDL,LP              ;通过比较运算实现因软件设计原因相减不能借位

                                                      ;而产生的借位
LP1:   MOV   A,DIVDM                         
          ADDC  A,#00H
          MOV   FZ1,A                       ;计算除数中间字节与低字节相减产生的进位位之和

                                                      ;将结果送FZ1保存
          MOV   A,TEMPM
          CJNE  A,FZ1,LP2               ;通过比较运算实现因软件设计原因相减不能借位

                                                     ;而产生的借位
LP2:      PUSH  PSW                     ;对程序状态字PSW压栈保护
          MOV   F0,C                          ;将C的值送给F0保存
          CLR   C
          MOV   A,TEMPM
          SUBB  A,FZ1   
          MOV   R6,A                          ;中间字节带进位相减结果送R6保存
          MOV   C,F0
          POP   PSW                          ;程序状态字PSW弹栈,恢复现场
          MOV   A,DIVDH
          ADDC  A,#00H
          MOV   FZ2,A                        ;计算除数高字节与中间字节相减产生的进位位之和

                                                       ;将结果送FZ2保存
          MOV   A,TEMPH
          CJNE  A,FZ2,LP3                 ;通过比较运算实现因软件设计原因相减不能借位

                                                       ;而产生的借位
LP3:      PUSH  PSW                     ;对程序状态字PSW压栈保护
          MOV   F0,C
          CLR   C
          MOV   A,TEMPH
          SUBB  A,FZ2                       ;高字节带进位相减结果送R5保存
          MOV   R5,A
          MOV   C,F0
          POP   PSW                          ;程序状态字PSW弹栈,恢复现场
          JC    DIV3                             ;不够减,则跳转到DIV3
DIV4:    MOV   TEMPL,R7             ;够减,刷新余数单元                       
          MOV   TEMPM,R6
          MOV   TEMPH,R5
          MOV   R0,#DIVDLL               ;够减,将被除数最低位置1
          MOV   A,@R0
          INC   A
          XCH   A,@R0
DIV3:  DJNZ  B,DIV2      ;判断B是否为零,若为零,循环结束;否则,跳转继续循环
             CLR   F0
LOOP1:NOP
             RET
关键字:单片机  多字节  除法程序 引用地址:一种实用的单片机多字节除法程序

上一篇:自制51单片机超大数码管时钟
下一篇:基于51单片机的智能小车(遥控模块寻迹避障)

推荐阅读最新更新时间:2024-03-16 14:25

单片机系统的三相桥式全控整流电路
多单片机直流电源控制系统的变流主电路是三相桥式全控 整流电路 ,整流变压器一次侧控制保护器件有继电器、控制开关、熔断器、电源指示灯等,一次侧接380 V 交流电源。变压器二次侧作为三相桥式全控整流电路供电电源,主电路中有六个晶闸管。
[单片机]
<font color='red'>多</font><font color='red'>单片机</font>系统的三相桥式全控整流电路
如何设计一个以AVR单片机为核心的安全工器具监控系统
众所周知,安全是电力企业一个永恒的主题,而的好坏,将直接影响着电力企业在生产过程中的人身和设备安全。笔者提出了一种基于的安全工器具的设计方案,主要是对安全工器具的离就位状态信息、有效使用期限和安全工器具柜内的温湿度状况等进行监控,可以根据实现安全工器具柜内温湿度的自动调节,能够自动记录安全工器具的相关信息。本文首先阐述了系统的总体结构,然后详细论述了系统的硬件设计和软件设计。 1 安全工器具监控系统的总体结构 1.1 系统结构 本文所设计的安全工器具监控系统主要分为下位机数据采集和上位机数据管理两个部分,两者之间通过网络进行通信。 系统首先通过数据采集板对安全工器具柜的相关量进行采集,然后将采集得到的数据进行相应处理后经串口服
[单片机]
如何设计一个以AVR<font color='red'>单片机</font>为核心的安全工器具监控系统
十年坚持自主可控,爱普特成RISC-V MCU头号玩家
有这么一家国产MCU公司,自从2012年成立,就没有采用当时已然流行的Arm Cortex-M内核,而是始终坚持纯国产化MCU路线。 日前,在中国RISC-V产业联盟、芯原微电子和上海集成电路产业集群发展促进机构共同主办的首届滴水湖中国RISC-V产业论坛上,深圳市爱普特微电子有限公司董事兼副总经理袁永生介绍了公司在非Arm MCU上的发展历程,并揭晓了公司全新推出的64位大小核的RISC-V MCU——APT32F706。 爱普特微电子有限公司董事兼副总经理袁永生 坚持独立自主的硕果 袁永生表示,公司自2012年成立以来,就和平头哥的前身中天微合作,所以公司并不是从Arm转向RISC-V,而是一直坚持全国产自主的
[单片机]
十年坚持自主可控,爱普特成RISC-V <font color='red'>MCU</font>头号玩家
求一种STM32单片机玩转TFTLCD彩屏设计方案
一、功能简介 本项目使用Proteus8.12仿真STM32单片机控制器,使用ST7735R彩屏模块等。 主要功能如下: (1)汉字字符显示; (2)2D图形显示; (3)图片显示; 二、软件设计 //显示界面1--汉字字符显示 void _show_demo1(void) { FRONT_COLOR=WHITE; LCD_ShowString(10,10,tftlcd_data.width,tftlcd_data.height,12, Hai XiaoYi ); FRONT_COLOR=RED; LCD_ShowString(10,30,tftlcd_data.width,tftlcd_data.height,16, Hai
[单片机]
求一种STM32<font color='red'>单片机</font>玩转TFTLCD彩屏设计方案
51单片机IO口模拟串口通讯的设计
#include sbit BT_SND =P1^0; sbit BT_REC =P1^1; IO 口模拟232通讯程序 使用两种方式的C程序 占用定时器0 #define MODE_QUICK #define F_TM F0 #define TIMER0_ENABLE TL0=TH0; TR0=1; #define TIMER0_DISABLE TR0=0; sbit ACC0= ACC^0; sbit ACC1= ACC^1; sbit ACC2= ACC^2; sbit ACC3= ACC^3; sbit ACC4= ACC^4; sbit ACC5= ACC^5; sbit ACC6= ACC^6; sbit AC
[单片机]
基于AT89S51单片机的动态数码显示设计
1. 实验任务 如图所示,AT89S51单片机 P0端口接动态数码管的字形码笔段,P2端口接动态数码管的数位选择端,P1.7接一个开关,当开关接高电平时,显示“12345”字样;当开关接低电平时,显示“HELLO”字样。 2. 电路原理图 3. 系统板上硬件连线 (1. 把“单片机系统”区域中的P0.0/AD0-P0.7/AD7用8芯排线连接到“动态数码显示”区域中的a-h端口上; (2. 把“单片机系统”区域中的P2.0/A8-P2.7/A15用8芯排线连接到“动态数码显示”区域中的S1-S8端口上; (3. 把“单片机系统”区域中的P1.7端口用导线连接到“独立式键盘”区域中的SP1端口上; 4. 程序设计内容
[单片机]
基于AT89S51<font color='red'>单片机</font>的动态数码显示设计
51单片机不适合做数据采集吗
想做一个简易数据采集卡。包含一个TLC1543(10位串行AD转换),一个51单片机以及其他一些小零件。关键是使用串行通信发送给计算机。由于我没有基础,是通过做这个设计来学习单片机的,所以对结果的预料不足。在我花费了很长时间做,到现在接近尾声时发现,要走自定协议的话51串行通信的速度跟不上!! 以下是我做过的两个通信测试实验: (1)不使用协议 我正确地把AD转换器与单片机相连,采集一个电压(例如3.2V)。我的程序大概如下: while(1) { TLC1543(); //进行AD转换 sent(); //把转换结果发送给计算机 } TLC1543是10位转换器,所以要用2个字节来保存。但我只发送高8
[单片机]
为提高单片机开发系统稳定性和可扩展性的C8051F 单片机实验系统设计
为进一步简化电路结构, 提出一种C8051F 单片机实验系统设计方案,该方案采用FPGA 实现单片机各种外设接口。FPGA 作为一种可编程逻辑器件凭借其优越的可扩展性能受到设计者的青睐,逐渐成为分立元件的替代者。通过对FPGA 编程,实现任何数字元件的逻辑功能,设计者可以通过原理图输入或硬件描述语言, 方便地设计一个数字系统,这使得单片机外围电路的设计简单、灵活、可靠。 本系统是为单片机实践教学而开发的,因此要求单片机的功能齐全,满足教学中各种实验的要求。一般的实验板的功能有:模拟数字信号转换实验、通信接口实验、存储器实验、各种显示实验,人机交互实验等等。除此之外,还要考虑由于是非商业性质的开发, 对一些功能的精度要求不是很高
[单片机]
为提高<font color='red'>单片机</font>开发系统稳定性和可扩展性的C8051F <font color='red'>单片机</font>实验系统设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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