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

合集下载

单片机移位实现的乘除法

单片机移位实现的乘除法

单片机移位实现的乘除法一、乘法运算:乘法运算是指两个数相乘的操作。

在单片机中,可以通过移位运算和累加运算来实现乘法运算。

1.乘法基本原理:乘法运算的基本原理是将一个数转换为二进制表示,然后按位相乘再相加。

单片机中的乘法移位算法是指通过移位运算来实现乘法的操作。

2.移位运算:在计算机中,移位运算可以分为左移和右移两种操作。

左移是将数的二进制表示向左移动指定位数,右边空出的位用0补齐。

右移是将数的二进制表示向右移动指定位数,左边空出的位用0或1补齐,取决于原始数的符号位。

3.移位实现乘法的步骤:以下是使用移位实现乘法运算的步骤:-将第一个数转换为二进制表示。

-将第二个数转换为二进制表示,然后从低位开始逐位遍历。

-如果当前位为1,则将第一个数左移对应的位数,然后累加到结果中。

-继续遍历第二个数的下一位,重复上述操作。

-最后得到的结果就是两个数相乘的结果。

4.乘法示例程序:下面是一个使用移位实现乘法的示例程序:```c#include <stdio.h>int multiply(int num1, int num2)int result = 0;while (num2 != 0)if (num2 & 1)result += num1;}num1 <<= 1;num2 >>= 1;}return result;int maiint num1 = 5;int num2 = 6;int result = multiply(num1, num2);printf("Result: %d\n", result);return 0;```该程序中,multiply函数使用了移位运算和累加运算来实现两个数的乘法。

通过调用multiply函数,可以得到5和6相乘的结果,并输出到屏幕上。

二、除法运算:除法运算是指一个数除以另一个数的操作。

在单片机中,可以通过移位运算和减法运算来实现除法运算。

多字节二进制除法

多字节二进制除法

多字节二进制除法被除数为3 个字节,在0x20、0x21、0x22 单元中,0x22.7 为最高位,0x20.0 为最低位。

除数为2 个字节,在0x30、0x31 中。

算法:EM78 单片机没有除法指令,而且本例中除法为多字节除法,可采用如下算法。

将被除数扩充一个字节0X23,0X23 清0。

被除数左移1 位,0X23、0X22 中数据减去0X31、0X30 中数据,够减则减且0X20.0 置1,减出结果存入0X23、0X22;不够减则0X23、0X22 保持不变,0X20.0 清0。

然后被除数再左移1 位,重复上述过程。

共循环16 次,最后0X23、0X22 中得相减余数,0X21、0X20 中得商。

注意,若被除数左移后C 标志为1,则不比较0X23、0X22 与0X31、0X30 数据大小关系而直接相减。

main:MOV a,@0x55 ;被除数赋值MOV 0x20,aMOV 0x21,aMOV 0x22,aMOV a,@0x0 ;被除数扩充1 字节并清0MOV 0x23,aMOV a,@0x12 ;除数赋值MOV 0x30,aMOV 0x31,aMOV a,@0x10 ;循环次数为16MOV 0x32,aagain: call rt_sub ;调移位除法子程djz 0x32 ;16 次循环完成则结束jmp again ;未完成则继续self: jmp selfrt_sub:bc 0x03,0 ;c 标志清0rlc 0x20 ;被除数左移1 位rlc 0x21jmp rt3 ;c标志为1 则直接相减MOV a,0x23 ;c 标志为0 则先比较大小MOV 0x25,aMOV a,0x22MOV 0x24,aMOV a,0x31 ;先比较高位sub 0x25,ajbc 0x03,2jmp rt1 ;高位相等跳rt1 比较低位jmp rt2 ;高位不等跳rt2rt1: MOV a,0x30 ;比较低位sub 0x24,ajbc 0x03,2jmp rt3 ;低位也相等则跳rt3,相减,上1 rt2: jbs 0x03,0ret ;减数大则返回,减数小则相减,上1 rt3: bs 0x20,0 ;上1call sub_2b ;调2 字节减法子程retsub_2b:MOV a,0x31 ;高字节相减sub 0x23,aret ;低字节相等,无借位,返回jbc 0x03,0ret ;无借位,返回dec 0x23 ;低字节相减有借位,高字节结果减1reteop二多字节二进制加法0X20,0X21 中的二进制无符号数与0X22,0X23 中的二进制无符号数相加,结果放在0X24,0X25,0X26 中,低地址中放低字节数据。

SONIX单片机除法程序

SONIX单片机除法程序

SONIX单片机除法程序单片机移位除法原理描述:扩充一个字节,并清0作“余数”,列“余数”到“被除数”高位,把“被除数”及“高位余数”左移1位(带“C”标),此时C标为1则直接用“余数”减“除数”(结果返回余数)C标为0则比较“余数”和“除数”的大小“余数”小,则“商”带C左移1位,循环计数减1进入下一次循环移位。

“余数”大于等于“除数”则,“余数”减“除数”(结果返回余数)再商带C左移1位,循环计数减1进入下一次循环移位。

循环计数为0时,结束运算。

;Name ivisionSub by 540;Function :除法子程序DIVIDEND/ DIVISOR = QUOTIENT ..... REMAIN;QUOTIENT,商;DIVIDEND,被除数;DIVISOR,除数;REMAIN,余数;***********************************************DivisionSub: CLR REMAIN ;清余数CLR QUOTIENT_L;商清零CLR QUOTIENT_HMOV A,#16 ;设置为8位除法MOV SUB_TIMES,A ;LOOP_DIVI: RLCM DIVIDEND_L ;被除数左移RLCM DIVIDEND_H ;RLCM REMAIN ;B0BTS0 FC ;JMP DEC_SUB ;C为1则直接减MOV A,REMAIN ;SUB A,DIVISOR ;除数B0BTS0 FC ;B0MOV REMAIN,A ;JMP LOOP ;DEC_SUB: B0MOV A,REMAIN ;SUB A,DIVISOR ;B0MOV REMAIN,A ;B0BSET FC ;恢复C标为1LOOP: RLCM QUOTIENT_L ;RLCM QUOTIENT_H ;DECMS SUB_TIMES ;JMP LOOP_DIVI ;RET ;子程序名称:双字节除以单字节除法;被除数:R1,R2; 除数:R3; 商:R1,R2; 余数:R0; 另外占用:R;DIV: CLR R0B0MOV R,#10HLOP_SUB: BCLR FCRLCM R2RLCM R1RLCM R0BTS0 FCJMP SAMEMOV A,R0SUB A,R3BTS1 FCJMP N_SAME SAME: MOV A,R0SUB A,R3MOV R0,ABSET R2.0N_SAME: DECMS RJMP LOP_SUBRET。

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

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

一种实用的单片机多字节除法程序一种实用的单片机多字节除法程序在单片机的实际应用中,除法运算是以比较常见的运算。

以MCS-51 单片机为例,虽然提供了除法指令,但只能进行单字节的运算。

如果要进行多字节的除法运算,就得自己设计算法。

目前,许多资料上都介绍了四字节除以二字节的算法,但它们主要有以下几点不足:1.只能求出商,不能求出余数;2.在被除数高二字节大于除数时,不能进行运算;3.商只有两个字节。

例如,被除数是0FFFFFFFFH,除数是0004H 时,商数应该是3FFFFFFFH,余数是0003H。

但是,用以前的算法是无法进行运算的。

在实际运用中,参与运算的数是任意的,有时需要求出余数,有时商数要求有四个字节,因此,以前的算法在实际应用中受到了很大的限制。

为了满足实际运用中的需要,有一套新的四字节除以二字节的算法,克服了上述算法中的缺点,可以适合广泛的实际需要。

下面以MCS-51 汇编语言为例进行说明。

该算法增加了两字节的余数单元,并把被除数单元用来存放商数。

运算时,首先判断除数是否为零,若为零时,则设溢出标志为1,然后退出。

若除数不为零,则采用移位相减法进行运算。

首先,把进位位和余数单元清零。

再将进位位、余数单元和被除数单元按顺序首尾相连,逐位进行向左循环移位,共移位32 次。

每移位一次,余数单元都和除数作一次减法运算,若够减,余数单元内容更新为两者之差,并且将被除数最末一位置为1;若不够减,则余数单元内容保持不变,且将被除数最末一位置为0。

判断是否够减的方法是:在作减法之前,先保存进位位,再看作完减法后的进位位。

仅在作减法之前进位位为0,并且作减法之后进位位为1 时判为不够减,其余情况均视为够减。

这样,等到全部运算结束时,商数为四个字节,存放在被除数单元中;余数为两个字节,存放在余数单元中。

例如,被除数是0FFFFFFFFH,除数是0004H 时,运行新的算。

单片机多字节加减乘除法程序

单片机多字节加减乘除法程序

单片机多字节加减乘除法程序文章长度[6790]加入时间[2007-8-14]更新时间[2012-6-12 18:04:14]级别[0][评论][收藏]一种实用的单片机多字节除法算法一种实用的单片机多字节除法算法在单片机的实际应用中,除法运算是比较常见的一种运算。

以MCS-51单片机为例,虽然它提供了除法指令,但只能进行单字节除以单字节的运算,如果要进行多字节的除法运算,就得自己设计算法。

目前,许多资料上都介绍了四字节除以二字节的算法,但它们主要有以下几点不足:1.只能求出商,不能求出余数;2.在被除数高二位大于除数时,不能进行运算;3.商只有两个字节。

例如,被除数是0FFFFFFFFH,除数是0004H时,商数应该是3FFFFFFFH,余数是0003H。

但是,用以前的算法是无法进行运算的。

在实际运用中,参与运算的数是任意的,有时需要求出余数,有时商数要求有四个字节,因此,以前的算法在实际应用中受到了很大的限制。

为了满足实际运用中的需要,我设计了一套新的四字节除以二字节的算法,克服了上述算法中的缺点,可以适合广泛的实际需要。

下面以MCS-51汇编语言为例进行说明。

该算法增加了两字节的余数单元,并把被除数单元用来存放商数。

运算时,首先判断除数是否为零,若为零时,则设溢出标志为1,然后退出。

若除数不为零,则采用移位相减法进行运算。

首先,把进位位和余数单元清零。

再将进位位、余数单元和被除数单元按顺序首尾相连,逐位进行向左循环移位(如图示),共移位32次。

每移位一次,余数单元都 C (H L)(HH HL LH LL) 进位位余数单元被除数单元和除数作一次减法运算,若够减,余数单元内容更新为两者之差,并且将被除数最末一位置为1;若不够减,则余数单元内容保持不变,且将被除数最末一位置为0。

判断是否够减的方法是:在作减法之前,先保存进位位,再看作完减法后的进位位。

仅在作减法之前进位位为0,并且作减法之后进位位为1时判为不够减,其余情况均视为够减。

单片机多字节乘除法

单片机多字节乘除法

二,用减法做除法: 用减法做除法:
例2 如何用减法做除法计算十六进制89/2=44,余1。 如何用减法做除法计算十六进制89/2=44,余1 用一个空RAM0,RAM0位与除数最多用位数相同, 用一个空RAM0,RAM0位与除数最多用位数相同, 如除数2最多用4位,如除数是88最多用8 如除数2最多用4位,如除数是88最多用8位。 有下式: RAM1=1000 1001,RAM0=0000。和为一体为 1001,RAM0=0000。和为一体为 RAM= RAM=1000 1001 0000, RAM0最后保存的数为余数, RAM0最后保存的数为余数, 8位除以8位,多字节以此类推。 位除以8
直观如下:89( 直观如下:89(1000 1001)/2。结果为44,余1。 1001)/2。结果为44,余 RAM1 RAM0,RAM0为保存余数用。 RAM0,RAM0为保存余数用。 1000 1001 0000 1,0001 0010 0001 2,0010 0100 0010 0010 0101 0000 RAM0>=2,RAM0-2,RAM1+1。 RAM0>=2,RAM0RAM1+1。 3,0100 1010 0000 4,1001 0100 0000 5,0010 1000 0001 6,0101 0000 0010 0101 0001 0000 RAM0>=2,RAM0-2,RAM1+1。 RAM0>=2,RAM0RAM1+1。 7,1010 0010 0000 8,0100 0100 0001
步骤如下:
1,左移一位到C,结果 C=1,RAM= 0110 0000 1,左移一位到C 1,RAM= 2,C=1,则RAM0+2,RAM=0110 0010 2,C=1,则RAM0+2,RAM= 3,左移一位到C,结果 C=0,RAM=1100 0100 3,左移一位到C 0,RAM= 4,C=0,则RAM不加。 4,C=0,则RAM不加。 5,左移一位到C,结果 C=1,RAM= 1000 1000 5,左移一位到C 1,RAM= 6,C=1,则RAM0+2,RAM=1000 1010 6,C=1,则RAM0+2,RAM= 7,左移一位到C,结果 C=1,RAM= 0001 0100 7,左移一位到C 1,RAM= 8,C=1,则RAM0+2,RAM=0001 0110 8,C=1,则RAM0+2,RAM=

单片机除法指令

单片机除法指令

单片机是一种微型计算机,它集成了处理器核心、内存和可编程输入输出端口在一个芯片上。

在单片机编程中,除法指令是用于执行两个数相除的算术操作。

不同的单片机架构可能有不同的除法指令集,但大多数都提供了基本的整数除法功能。

以下是一些常见的单片机架构及其对应的除法指令:1.8051单片机: 8051单片机使用8位微控制器,其指令集中包含了除法指令。

例如,DIV AB指令用于将累加器A中的值除以寄存器B中的值,商存放回累加器A,余数存放在累加器B。

2.PIC单片机:在PIC单片机(如PIC16系列)中,除法操作通常通过库函数来实现,而不是直接的硬件指令。

例如,可以使用div函数来执行除法操作。

3.ARM单片机: ARM架构的单片机(如基于Cortex-M系列)提供了更为复杂的除法指令。

例如,SDiv指令用于有符号整数除法,而UDiv 用于无符号整数除法。

这些指令可以处理32位或64位的操作数。

4.AVR单片机: AVR单片机(如Atmega系列)使用ATmega指令集,其中包括DIV指令,用于无符号整数除法。

这个指令将寄存器r0和r1的内容除以r24和r25的内容,结果存放回r0和r1。

5.MSP430单片机: MSP430单片机使用的是MSP430指令集,其中包括16位和32位的除法指令。

例如,div.w #num指令用于将工作寄存器W的内容除以立即数num,结果存放回工作寄存器W。

在使用除法指令时,需要注意以下几点:•数据大小:确保操作数的大小与指令匹配。

例如,如果指令是为8位操作数设计的,那么确保你的数据不会溢出8位的范围。

•除数为零:在执行除法操作前,检查除数是否为零,以避免运行时错误。

•符号:如果你的单片机支持有符号除法,确保正确处理正负号。

•精度:根据需要选择合适的数据类型和精度。

在某些情况下,可能需要使用浮点除法。

单片机的除法指令是编程中的基本操作之一,它们使得单片机能够进行各种数学计算和数据处理任务。

单片机除法

单片机除法

不再麻烦的单片机除法
单片机除法是嵌入式系统设计中经常使用的数学运算,但它的处
理相对比其他数学运算有些麻烦。

今天,我们分享一种简单易用且高
效的单片机除法方法,让您的单片机除法不再麻烦!
首先让我们了解一下单片机的特性。

单片机除法一般都需要使用
到硬件除法器,这种除法器会占用单片机的大量资源,包括内存和时
间等。

因此,我们需要寻找一种更加简单高效的方式来进行除法运算。

接下来,让我们来介绍一种基于二分法的简单除法运算。

这种除
法运算方法将除数和被除数都转换成整形数,然后进行二分运算,最
后获得正确的结果。

具体实现方法如下:
1.将被除数和除数转换成整形数
2.对取绝对值后的被除数和除数进行二分运算
3.判断商的符号
4.返回商的整型值
使用这种方法,不仅能够实现快速高效的单片机除法,而且还能
节约单片机资源,提高系统响应速度。

此外,这种方法还可以应用于
一些其他的数值计算中。

综上所述,除法是单片机设计中不可避免的数学运算之一。

但是,通过本文所介绍的简单易用的单片机除法方法,您可以避免一些不必
要的麻烦并大大提高代码的运行效率。

希望这种方法对您在嵌入式系统设计中的工作有所启发。

用51单片机实现多字节除法

用51单片机实现多字节除法
;函数名称:Div2Byte
;功能描述:无符号数双字节除法
;传入参数:R0R1被除数 R2R3除数
;返回数据:R4R5商 R6R7余数
;其他说明:比如双字节数R0R1,R0高字节 R1低字节
;=================================================
; DIVISION FOR THREE-BYTE DATA
; DIVIDEND FROM 77H&78H&79H
; DIVISOR FROM 7AH&7BH&7CH
; QUOTIENT TO 77H&78H&79H
;****************************************
Div2Byte:
mov R4,#0
mov R5,#0 ;商赋初值零
mov A,R0
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
MOV 77H,#0FH
MOV 78H,#42H
MOV 79H,#40H
MOV 7AH,#00H
MOV 7BH,#03H
MOV 7CH,#0E8H
LCALL DIV_MB
SJMP MAIN
;=================================================
TDEC: CLR C
MOV A,5CH
SUBB A,5FH
MOV 5CH,A
MOV A,5BH
SUBB A,5EH
MOV 5BH,A
MOV A,5AH

stc8a8 16位除16位除法函数。

stc8a8 16位除16位除法函数。

STC8A8 16位除法函数是一种用于STC8A8单片机的高效16位除法函数。

该函数提供了一种快速而准确的方式来进行16位数的除法运算,适用于各种应用场景,例如工业控制、通信设备、仪器仪表等领域。

本文将对STC8A8 16位除法函数进行详细的介绍和分析,包括其原理、使用方法以及性能评估等方面。

1. 原理STC8A8 16位除法函数是基于STC8A8单片机的硬件结构和指令集进行优化设计的。

该函数利用单片机的乘法、移位和加减运算指令,采用类似于“长除法”的算法来实现16位数的除法运算。

在进行除法运算时,首先将被除数和除数存放在相应的寄存器中,然后通过循环逐步计算商和余数,直至得到最终的结果。

在每一步计算中,都利用了单片机的乘法和移位指令来加速运算过程,从而提高了整个除法运算的效率。

2. 使用方法STC8A8 16位除法函数的使用方法非常简单,只需要在代码中引用相应的函数即可进行16位除法运算。

用户只需要传入被除数和除数两个参数,函数就会返回商和余数两个结果,非常方便快捷。

在C语言中,可以通过以下方式调用STC8A8 16位除法函数:```cresult = stc8a8_divide(dividend, divisor, rem本人nder);```其中,dividend为被除数,divisor为除数,result为商,rem本人nder为余数。

3. 性能评估STC8A8 16位除法函数在性能方面表现出色。

经过严格的测试和评估,该函数在16位除法运算中具有高效、准确、稳定的特点。

无论是在大规模数据处理还是实时控制系统中,都能够满足高速、低功耗的要求。

与传统的软件实现相比,STC8A8 16位除法函数能够充分利用单片机的硬件资源,大大提高了运算速度和效率。

在实际应用中,可以有效降低系统的响应时间,提升系统的整体性能。

4. 应用场景STC8A8 16位除法函数适用于各种STC8A8单片机应用场景,包括但不限于工业控制、通信设备、仪器仪表、汽车电子、家用电器等领域。

8位单片机 32位除法

8位单片机 32位除法

8位单片机 32位除法8位单片机是一种常见的嵌入式微控制器,它具有8位的数据总线,可以处理8位宽的二进制数据。

而32位除法是一种数学运算,用于将一个32位的整数除以另一个整数。

今天,我们将探讨如何在8位单片机上进行32位除法,并谈谈相关的应用和意义。

首先,理解什么是8位单片机很重要。

它是一种微型计算机芯片,能够集成处理器核心、内存和外设接口等功能于一个芯片上。

8位单片机在嵌入式系统中得到广泛应用,例如家电、汽车等领域。

它的低成本、低功耗和易于处理简单任务的特点使得它成为许多小型电子设备的理想选择。

而32位除法则是一种复杂的运算,用于将一个32位的整数除以另一个整数,并给出商和余数。

32位除法可以解决一些实际问题,例如计算机网络中的IP地址划分,图形处理中的像素计算等。

这种除法运算需要更强大的处理能力和更大的数据宽度,因此往往在高性能计算机和处理器中使用。

然而,在一些特殊应用场景中,我们需要在8位单片机上实现32位除法,这就需要我们深入研究并合理设计算法。

在处理32位除法时,需要注意的是,8位单片机的数据宽度有限,无法直接进行32位运算。

因此,我们需要采用一些特定的算法来完成这个任务。

其中一个常见的算法是采用二进制长除法。

这种算法将32位整数划分为若干个8位部分,并逐位进行除法运算,最终给出商和余数。

实现32位除法需要考虑到多个方面的问题,例如数据存储、算法设计和性能优化。

在数据存储方面,我们需要明确如何将32位整数分解为8位部分,以及如何存储和操作这些部分。

在算法设计方面,我们需要选择合适的除法算法,并合理利用8位单片机的有限资源,以提高运算效率。

在性能优化方面,我们可以通过优化算法、减少不必要的计算和合理规划程序结构等手段来提高程序的执行速度和资源利用率。

掌握在8位单片机上实现32位除法的技术在嵌入式系统开发中具有重要的意义。

它可以帮助我们深入理解单片机的底层原理和运算机制,并为我们提供更多的自主开发和创新空间。

51单片机高精度除法程序及使用

51单片机高精度除法程序及使用

51单片机高精度除法程序及使用科技人员在开发51 单片机应用系统过程中,往往遇到多字节除法及倒数问题。

但目前一些资料中所介绍的有关程序,复杂且功能单一、精度低。

本人在研制((GZ93 多功能程控测试仪》过程中,自行设计的4 字节除4 字节程序具有功能多、精度高、简短、运行速度快等特点,可用于求4 字节倒数,求商的整数(结果为4 字节),求商的小数部分(结果为4 字节),调用两次即可求8 字节商。

一、使用方法1.求商的整数(1)16 进制被除数送51 内部RAM 中20(低位)至23(高位)单元,除数送50(低位)至53(高位)单元,扩充单元24 至27 清零。

’(2)调子程序DIV。

(3)20(低位)至23(商位)单元为所求商,24 至27 单元为余数。

2.求八字节商(1)先求商的整数部分方法同上,然后将20 至23 单元的整数商送其它单元保存。

(2)求商的小数部分20 至23 单元清零;其余单元内容不变;调DIV 子程序;小数商在23 至20 单元中,小数点位于23 单元前。

3.求倒数(1)20 至23 单元及25 至27 单元清零,01H 送24 单元,除数送50(低位)至53(高位)单元。

(2)调子程序DIV。

(3)倒数在23 至20 单元,小数点位于23 单元前。

二、程序清单ORG 0500HDIV: CLR 7EH MOV R0,#50H MOV R7,#03HDV0: MOV A,@R0 INC R0 ORL A,@R0 JNZ DV1 DJNZ R7,DV0 SETB 7EH SJMP DV8DV1: MOV R6,#20H CLRCDV2: MOV R0,#20H MOV R7,#08HDV3: MOV A,@R0 RLC A MOV @R0,A INC R0 DJNZ R7,DV3 MOV 0F0H,C CLR C MOV R0,#24H MOV R1,#50H MOV R7,#04HDV4: MOV A,@R0 SUB A,@R1 MOV @R0,A INC R0 INC Rl DJNZ R7,DV4 JNB 0F0H,DV5 CLR C SJMP DV6DV5: JNC DV6 MOV A,24H ADD A,50H MOV 24H,A MOV A,25H ADDC A,51H MOV 25H,A MOV A,26H ADDC A,52H MOV 26H,A MOV A,27H ADDC A,53H MOV 27H,ADV6: CPL C DJNZ R6,DV2 MOV R0,#20H MOV。

基于单片机汇编语言的通用多字节无符号数除法的改进

基于单片机汇编语言的通用多字节无符号数除法的改进

科研训练论文题目:基于单片机汇编语言的通用多字节无符号数除法的改进姓名: __ _ ______专业: __ _机械电子工程班级: ___ 机电 ____学号: ____ ___院(系): _ 机电学院指导教师: ___完成日期: _____成绩: __________目录摘要 (1)1 目前常用的单片机多字节除法运算方法及其局限性 (1)2 除数为小于被除数的任意长度除法的单片机算法原理 (5)3 程序流程图、汇编语言的实现及测试结果 (6)3。

1 程序流程图及汇编语言的实现 (7)3。

2 测试结果 (12)4 结论 (12)摘要:论述一种在8051系列单片机上实现的高可靠多字节除法运算的改进型算法,该算法通过改进传统的“移位- 相减”算法,克服了常用的多字节无符号除法的局限性,可以针对任意长度的除数且不会发生商溢出。

经实验得到计算结果准确无误,该算法具有算法简单、适应性强、高度可靠等优点,具有很强的实用性。

单片微型计算机的应用越来越广泛,它不仅应用在各种控制上,有时也用来做数据处理运算。

现在应用广泛的51系列单片机具有强大的运算能力,可以直接选用算术运算指令完成单字节(8位)数据运算。

同时,它的进位(借位)标志为无符号整数算术运算提供了方便。

目前有关数据处理运算的资料比较多,然而笔者在参考关于多字节无符号数据整数除法的资料时发现,目前资料所介绍的有关程序应用范围非常小,应用时受除数长度限制比较大。

而在实际应用中,除法运算非常重要,甚至有时候要求必须快速地进行除法运算,这就要求写的除法程序力求高效、快速。

本文巧妙地利用“移位- 相减”法,以51系列单片机为例,设计了除数不受字节长度限制的单片机除法运算算法。

该算法还可以根据实际需要扩充为位数更高的多字节除数算法,也可以移植到其它的单片机平台上。

1 目前常用的单片机多字节除法运算方法及其局限性目前,单片机多字节除法运算要求被除数为除数的双倍字长,否则除法运算就不能执行。

pic单片机32位除法

pic单片机32位除法

pic单片机32位除法pic单片机是一种常用的32位单片机,其具有高性能和强大的计算能力。

在pic单片机中,除法是一项常见的运算操作。

本文将探讨pic单片机32位除法的原理和实现方式。

我们需要了解32位除法的基本原理。

除法是一种数学运算,用于将一个数(被除数)除以另一个数(除数),得到商和余数。

在32位除法中,被除数和除数都是32位的二进制数。

在pic单片机中,除法操作可以通过软件算法或硬件模块来实现。

软件算法是通过编写程序来进行除法运算,而硬件模块则是通过专门的电路来实现除法运算。

对于软件算法来说,一种常见的方法是使用循环来逐位进行除法运算。

具体步骤如下:1. 将被除数和除数加载到寄存器中。

2. 将商寄存器清零。

3. 从高位开始,逐位进行除法运算,直到最低位。

4. 每次运算中,将被除数左移一位,并与除数进行比较。

5. 如果被除数大于或等于除数,则将商寄存器的对应位设置为1,并将被除数减去除数。

6. 如果被除数小于除数,则将商寄存器的对应位设置为0。

7. 重复步骤4至6,直到所有位都计算完毕。

8. 最后得到的商就是除法的结果。

这种软件算法的实现简单,但运算速度相对较慢。

如果需要进行大量的除法运算,可能会影响系统的性能。

因此,在一些对性能要求较高的应用中,可以使用硬件模块来实现32位除法运算。

pic单片机中的硬件模块通常是由专门的除法器实现的。

这种除法器可以通过硬件电路来进行除法运算,具有快速、高效的特点。

在进行除法运算时,只需要将被除数和除数输入到除法器中,然后通过特定的指令来触发除法运算。

除法器会自动完成除法运算,并将结果存储在指定的寄存器中。

pic单片机的32位除法器通常具有高精度和高速度的特点,可以满足各种应用的需求。

除法器的性能主要取决于硬件电路的设计和实现方式。

一些高端的pic单片机还可以支持并行计算和流水线技术,进一步提高除法运算的效率。

总结起来,pic单片机32位除法是一项常见的运算操作,可以通过软件算法或硬件模块来实现。

单片机 三字节除法子程序

单片机 三字节除法子程序
;==============================================ree-byte
data;=================================================TDEC:
CLRCMOVA,5CHSUBBA,5FHMOV5CH,AMOVA,5BHSUBBA,5EHMOV
DIVISIONFORTHREE-BYTEDATA;DIVIDENDFROM77H&78H&79H;
DIVISORFROM7AH&7BH&7CH;QUOTIENTTO
77H&78H&79H;ARITHMETICALCOMPLIMENTTO7DH&7EH&7FH;
2008_05_08BY
SZCKIC;=================================================DIV_
进制,当然二进制也有一个优点那就是:
假设A,B是两个同样位数的二进制数据(首位不为0),且A>B,则A肯定
小于2倍的B,所以对于每次移位只用比较一次。
tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!
AMOV7DH,AMOV5AH,7DHMOV5BH,7EHMOV5CH,7FHMOV
5DH,7AHMOV5EH,7BHMOV5FH,7CHLCALLTDECJNCUPDATEDJNZ
R7,NEXTBITTMPRETUPDATE:INC79HMOV7FH,5CHMOV7EH,5BHMOV
7DH,5AHDJNZ R7,NEXTBITTMPRETNEXTBITTMP:LJMP NEXTBIT
MB:MOV7DH,#00HMOV7EH,#00HMOV7FH,#00HMOV

第四章 MCS-51单片机的应用程序设计

第四章   MCS-51单片机的应用程序设计

二进制数转换成BCD码 (二翻十 二翻十). 例4-7 二进制数转换成 码 二翻十 假定一个待转换的16位二进制数 位二进制数0E1FH存 假定一个待转换的 位二进制数 存 放在(R3R2)中,现在要将它转换成 现在要将它转换成BCD码 ,并存 放在 中 现在要将它转换成 码 并存 放到数据区44H~40H中,如下所示 P71 如下所示: 放到数据区 中 如下所示 由于16位二进制数最大为 位二进制数最大为FFFFH,转换结 由于 位二进制数最大为 转换结 果为65535,共5位,所以需要 个结果单元 所以需要5个结果单元 果为 共 位 所以需要 个结果单元.
104=2710H 102=0064H
l03=03E8H 10=000AH =
第四章
入口
MCS-51单片机的应用程序设计
入口 否 过程 否 入口
P1
条件满足? 是
P2 过程A P3 出口 (a) 顺序结构 出口 (b) 分支结构 过程B
条件满足? 是
出口 (c)
一、 多字节数加法 1.多字节无符号数加法
运算程序
(43H)(42H)(41H)(40H) CY CY CY +) (53H)(52H)(51H)(50H) (43H)(42H)(41H)(40H)
下述程序提供的是另一种算法,其执行速度较快。 下述程序提供的是另一种算法,其执行速度较快。 程序以R 作为入口和出口 作为入口和出口. 程序以 2作为入口和出口 HEXASC2: M()V A.R2 : . ANL A,#0FH ;0AH ADD A,#90H ;9AH DA A ;(A)=00H,C=1 ADDC A,#40H ;41H DA A ;C=0 MOV R2,A ;(R2)=41H RET

51单片机加减乘除程序

51单片机加减乘除程序

#include<stc12c5a60s2.h> //STC51单片机头文件#define uchar unsigned char#define uint unsigned intuint key;uchar code numbercode[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d, 0x7d,0x07,0x7f,0x6f}; //用于设置(共阴极)数码管的段选信号,从0~9共10个数值void delay(uint x) //延时{uchar t;while(x--) for(t=0;t<250;t++);}void display(uchar key) //数码管显示{P2=0x06; //在第7个数码管上显示个位P0=numbercode[key]|0x80;delay(10);}void display1(uchar key) //数码管显示{P2=0x00; //在第1个数码管上显示aP0=numbercode[key];delay(10);}void display2(uchar key) //数码管显示{P2=0x05; //在第6个数码管上显示十位P0=numbercode[key];delay(10);}void display3(uchar key) //数码管显示{P2=0x02; //在第3个数码管上显示bP0=numbercode[key];delay(10);}void display4(uchar key) //数码管显示{P2=0x07; //在第8个数码管上显示小数P0=numbercode[key];delay(10);}void main(){uchar key,temp,a,b;int k,k2,k1,k3,k4;while(1){P1=0xfe;temp=P1;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P1;temp=temp&0xf0;if(temp!=0xf0){temp=P1;switch(temp){case 0xbe:key=0;a=1+a;if(a>9)a=0;break;case 0x7e:key=1;b=1+b;if(b>9)b=0;break;default:break;}delay(1000);}}P1=0xfd ;temp=P1;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P1;temp=temp&0xf0;if(temp!=0xf0){temp=P1;if(temp==0xed){key=4;k=a+b; delay(1000);if(k>=10){ k2=k/10;k1=k%10;k3=0;}if((k>=0)&&(k<10)){k2=0; k1=k;k3=0;}}if(temp==0xdd){key=5;k=a-b;delay(1000);if((k>=0)&&(k<10)){ k2=0; k1=k;k3=0;}if(k<0){P2=0x04;P0=0x40;delay(100);k2=0;k1=-k;k3=0;}}if(temp==0xbd){key=6;k=a*b; delay(1000);if(k>=10){ k2=k/10;k1=k%10;k3=0;}if((k>=0)&&(k<10)){ k2=0; k1=k;k3=0;}}if(temp==0x7d){key=7;k=a/b;k4=a%b; delay(1000);if(k<1){k1=0;k2=0;k3=(a*10)/b;}if((k>=0)&&(k<10)){k1=k;k2=0;if(k4!=0){k3=(a*10)/b;}if(k4==0){k3=0;}}}}display(k1); //个位display2(k2); //十位display1(a); //数1display3(b); //数2display4(k3);}}}。

PIC中档单片机的无符号长整型数除以无符号字符型的除法程序

PIC中档单片机的无符号长整型数除以无符号字符型的除法程序
void lcdiv(void)//l-长整型,c-字符型,div-除法
{
volatile unsigned char i;//循环次数,如果不加volatile关键字则会被编译器优化掉,造成后边的变量寻址找不到,导致编译失败
lc_div.sj.tmp=0;//变量初始化,主要是防止上一次计算的数据影响本次计算
因为本人不懂英文,所以变量名很乱,请谅解。
源代码如下:
#include<pic.h>
union
{
struct
{
unsigned char sl; //1字节,商的低8位
unsigned long bcs;//4字节,被除数
unsigned int tmp; //2字节,临时变量
unsigned char cs; //1字节,除数
goto lcdiv2
btfss _lc_div+6,0 ;//有借位,那就看TMP的高位是否有借的,有说明TMP比CS大。如果只是做16进制到10进制的转换,这个可以优化掉
goto lcdiv0 ;//跳回去接着进行下一轮
lcdiv2:
movwf _lc_div+5,f//把之前比较的结果送到TMP的低8位
i=33;//共循环32次,12F683有DECFSZ指令,所以赋值33
#asm//使用汇编以提高效率
lcdiv0:
decfsz lcdiv@i,f//这句相当于while(--i)
goto lcdiv1
return
lcdiv1:
bcf 0x3,0//清空C寄存器
rlf _lc_div,f//把共用体的前7字节左移1位,目的是把被除数的最高位移到TMP中,顺便把商也左移
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一种实用的单片机多字节除法程序
在单片机的实际应用中,除法运算是以比较常见的运算。

以MCS-51 单片机为例,虽然提供了除法指令,但只能进行单字节的运算。

如果要进行多字节的除法运算,就得自己设计算法。

目前,许多资料上都介绍了四字节除以二字节的算法,但它们主要有以下几点不足:1.只能求出商,不能求出余数;2.在被除数高二字节大于除数时,不能进行运算;3.商只有两个字节。

例如,被除数是0FFFFFFFFH,除数是0004H 时,商数应该是3FFFFFFFH,余数是0003H。

但是,用以前的算法是无法进行运算的。

在实际运用中,参与运算的数是任意的,有时需要求出余数,有时商数要求有四个字节,因此,以前的算法在实际应用中受到了很大的限制。

为了满足实际运用中的需要,有一套新的四字节除以二字节的算法,克服了上述算法中的缺点,可以适合广泛的实际需要。

下面以MCS-51 汇编语言为例进行说明。

该算法增加了两字节的余数单元,并把被除数单元用来存放商数。

运算时,首先判断除数是否为零,若为零时,则设溢出标志为1,然后退出。

若除数不为零,则
采用移位相减法进行运算。

首先,把进位位和余数单元清零。

再将进位位、余数单元和被除数单元按顺序首尾相连,逐位进行向左循环移位,共移位32 次。

每移位一次,余数单元都和除数作一次减法运算,若够减,余数单元内容更新为两者之差,并且将被除数最末一位置为1;若不够减,则余数单元内容保持
不变,且将被除数最末一位置为0。

判断是否够减的方法是:在作减法之前,
先保存进位位,再看作完减法后的进位位。

仅在作减法之前进位位为0,并且
作减法之后进位位为1 时判为不够减,其余情况均视为够减。

这样,等到全部运算结束时,商数为四个字节,存放在被除数单元中;余数为两个字节,存放在余数单元中。

例如,被除数是0FFFFFFFFH,除数是0004H 时,运行新的算。

相关文档
最新文档