bodu.com

电子/电气工程师博客

正文 更多文章

MCS51单片机模仿竖式除法程序

MCS51单片机模仿竖式除法程序

                   王铁虎   王佰营

       在一次单片机应用设计时,需要十进制十位数除法运算,按照常见资料介绍的方法编的程序在运算量最大时,CPUAT89C4051,晶振为11.0592MHz最快运算时间为5分钟。简直无法接受,为此我们模仿手工列竖式作除法运算的方法,编好程序运行,显示器仅仅轻微闪一下就OK!具体程序如下:

;-------------------------------------------------------------------------------

;             function:  data_div   ;除法子程序

;             input   :  temp10_19(商暂存器)     

;                       :  temp00_09(中间数暂存器)=100000000/2*机器周期*中断常数

;                    :  f_temp0-9(设置数暂存器)

;             output  :  temp10_19(商暂存器)

;               usage   :  a,r0,r1,r2,r4,r5,c

;------------------------------------------------------------------------------

                      ;function:     count1           ;计算某数的有效值位数

                      ;input   :     r0----某数的所有字节

                      ;output  :     r1----有效值位数

                        ;usage   :     a,r0,r1,r2

                        ;------------------------------------------------------

                   ;function:     No_BCD_dec: ;非压缩BCD码相减(差值保存)    

                      ;input   :     f_temp0-9(减数暂存器)

                      ;         :     temp00_09(被减数暂存器)

                      ;out_put :     temp19(商某位暂存器)

                     ;usage   :     a,r0,r1,r2,r3,c

                        ;-------------------------------------------------------

                      ;function:     move_byte      ;缓冲区数据左右移子程序

                      ;input   :     temp20------移动起始字节暂存单元

                      ;       :     bmove-------左右移标志

                      ;output  :     参与移动的所有单元

                        ;usage   :     a,r0,r1,r2,r3,c

;------------------------------------------------------------------------------

data_div:         ;除法程序

                     ;----------------------

                     ;商清0

                     mov r2,       #0ah

                     mov r1,       #temp10

       dd_loop0:       mov @r1,       #00h

                     inc   r1

                     djnz r2,       dd_loop0

                     ;----------------------

                     ;计算被除数.除数位数

                     mov r0,       #temp00

                     lcall  count1

                     mov bits1,       r1             ;被除数位数送bits1保存

                     mov a,       bits1

                     cjne a,       #00h,      dd_not0   ;被除数是否为0

                     ret

       dd_not0:       mov r0,       #f_temp0

                     lcall  count1

                     mov bits2,       r1             ;除数位数送bits2保存

                     mov a,       bits2

                     cjne a,       #00h,      dd_not1   ;除数是否为0

                     ret

                     ;----------------------

        dd_not1:  ;被除数.除数位数比较

                     clr   c

                     mov a,       bits1

                     subb       a,       bits2

                     jc       dd_end

                     mov bits3,       a                 ;被除数.除数之差送bits3保存

                     ;----------------------------

                     mov a,       bits3

                     cjne a,       #00h,dd_next0    

                     lcall       no_BCD_dec                ;位数相等时,直接相减

                     ret

                     ;----------------------------

       dd_next0:       mov r4,       bits3             ;位数不相等时,除数左环移bits3个字节

       dd_loop1:       mov       temp20,       #f_temp9

                     setb bmove

                     lcall       move_byte

                     djnz r4,       dd_loop1         ;使有效数字位对齐

                     lcall       no_BCD_dec

                     ;----------------------

                     mov r5,       bits3

       dd_loop2:       mov       temp20,       #temp19

                     setb bmove

                     lcall       move_byte                ;商左环移一个字节

                    

                     mov       temp20,       #f_temp0

                     clr   bmove

                     lcall       move_byte                ;除数右环移一个字节

                    

                     lcall       no_BCD_dec

                     djnz r5,       dd_loop2          ;bits30否?

dd_end:                 ret

;---------------------------------------------------------------------------------

;             function:     move_byte             ;缓冲区数据左右移子程序

;             input   :     temp20------移动起始字节暂存单元

;                    :     bmove-------左右移标志

;             output  :     参与移动的所有单元

;               usage   :     a,r0,r1,r2,r3,c

;---------------------------------------------------------------------------------

move_byte:            ;缓冲区数据左右移子程序

                     mov r3,       #08h

                     mov r0,       temp20

                     mov b,       temp20

       mb_loop0:       clr   c

                     mov r2,       #0ah

       mb_loop1:       mov a,     @r0

                     jb       bmove,       left            ;bmove=1,左环移  

                     rrc       a                    ;bmove=0,右环移

                     mov @r0,       a

                     inc   r0

                     sjmp       mb_next0

           left:       rlc   a

                     mov @r0,       a                   

                     dec  r0

       mb_next0:       djnz r2,       mb_loop1

                     jnc       mb_next1

                     mov r1,   b

                     mov a,       @r1

                     setb acc.7

                     mov @r1,   a

        mb_next1:       mov r0,   b

                     djnz r3,         mb_loop0

                     ret

;-------------------------------------------------------------------------------

;             function:     count1           ;计算某数的有效值位数

;             input   :     r0----某数的所有字节

;             output  :     r1----有效值位数

;               usage   :     a,r0,r1,r2

;-------------------------------------------------------------------------------

count1:                  ;计算某数的有效值位数

                     mov r1,       #0ah       ;位数初值

                     mov r2,       #0ah       ;循环次数

       c_loop1:       mov a,       @r0

                     jnz     c_1_end

                     dec  r1

                     inc   r0

                     djnz r2,       c_loop1  

c_1_end:        ret

 

;-----------------------------------------------------------------------------

;             function:       No_BCD_dec:   ;非压缩BCD码相减(差值保存)    

;             input   :       f_temp0-9(减数暂存器)

;                           temp00_09(被减数暂存器)

;             out_put :       temp19(商某位暂存器)

;             usage   :       a,r0,r1,r2,r3,c  

;------------------------------------------------------------------------------

no_BCD_dec:         ;非压缩BCD码减法(差值保存)

                     mov r3,       #00h

       nBd_loop2:       mov r2,       #0ah

                     mov r1,       #temp09

                     mov r0,       #f_temp9

                     clr   c

       nBd_loop1:       mov a,       @r1

                        subb       a,       @r0

                     jnc       nBd_next1

                     add  a,       #0ah

       nBd_next1:       mov @r1,       a

                     dec  r1

                     dec  r0

                     djnz r2,       nBd_loop1

                     jc       nBd_resume

                     inc   r3

                     sjmp       nBd_loop2

                     ;--------------------------

nBd_resume:          ;恢复被减数

                     ;--------------------------

                     mov r2,       #0ah

                     mov r1,       #temp09

                     mov r0,       #f_temp9

                     clr   c

       nBd_loop3:       mov a,       @r1

                     addc       a,       @r0

                     cjne a,       #0ah,  nBd_not

       nBd_big:       subb       a,       #0ah

                     mov @r1,       a

                     setb c

                     sjmp       nBd_next2

       nBd_not:       jnc       nBd_big

                     mov @r1,       a

                     clr   c

       nBd_next2:       dec  r1

                     dec  r0

                     djnz r2,       nBd_loop3

                     mov       temp19,   r3

                     ret

 

分享到:

上一篇:浅谈C语言变量

下一篇:天下论衡

评论 (0条) 发表评论

抢沙发,第一个发表评论
验证码