• <rp id="wfxtb"><acronym id="wfxtb"></acronym></rp><em id="wfxtb"></em><dd id="wfxtb"><big id="wfxtb"><video id="wfxtb"></video></big></dd>
  • <rp id="wfxtb"></rp>

    <mark id="wfxtb"><center id="wfxtb"></center></mark>

      <rp id="wfxtb"><span id="wfxtb"><u id="wfxtb"></u></span></rp>

      <rp id="wfxtb"><object id="wfxtb"></object></rp>

      注意:訪問本站需要Cookie和JavaScript支持!請設置您的瀏覽器! 打開購物車 查看留言付款方式聯系我們
      初中電子 單片機教材一 單片機教材二
      搜索上次看見的商品或文章:
      商品名、介紹 文章名、內容
      首頁 電子入門 學單片機 免費資源 下載中心 商品列表 象棋在線 在線繪圖 加盟五一 加入收藏 設為首頁
      本站推薦:
      吐血推薦!!!(附源程序)MSC
      文章長度[6573] 加入時間[2006/7/1] 更新時間[2025/2/12 2:12:16] 級別[3] [評論] [收藏]



      ;程序說明:浮點數變為壓縮BCD碼,保存在以數組中
      ;     第1字節的位7:0正,1負.位6:0(位5--0代表小數點前的位數),1(位5--0代表小數點后0的位數)
      ;     2--4字節為壓縮BCD碼,有效位為7位,3個半字節,最后半個字節請使用者自行放棄
      ;     程序占用資源PSW,A,B,DPTR,R0--R7,SP深度6,RAM 5個放數據
      ;     keil 兼容,調用KEIL 的FPMUL子程序。
      ;程序作者:*************陳遠征**************
      ;目  的:追求更快的執行速度,與最小的程序代碼
      ;發布時間:2003--05--08
      ;編寫背景:精通匯編,研究C51半個月。身感C51方便中的不便
      ;     研究了幾種匯編及KEIL的浮點算法,特做此程序.
      ;聲  明:轉載時請保留以上的信息

      C程序:
      extern float ftod(float i);

      unsigned char cyz[5];

      main(){
         float i=1234.567;
         ftod(i);
      while(1);
         }

      匯編程序:

      PUBLIC  _FTOD     ;程序段
      FTODP  SEGMENT CODE  ;入口地址
      RSEG   FTODP     ;程序段

      EXTRN   CODE (?C?FPMUL)
      EXTRN  DATA (CYZ)
      _FTOD:       ;參數傳遞在R4--R7中,浮點數IEEE標準seeeeeee emmmmmmm mmmmmmmm mmmmmmmm
      FTOD:
           MOV   A,R4    ;保存數符
           RLC   A       
           CLR   A       
           RRC   A       
           MOV   CYZ,A
           MOV   A,R4    ;取絕對值
           CLR   ACC.7
           MOV   R4,A
           ORL   A,R5
         JNZ   FCMP_1E10
           MOV   CYZ,#0   ;數值為0
           MOV   CYZ+1,#0
           MOV   CYZ+2,#0
           MOV   CYZ+3,#0
           MOV   CYZ+4,#0
         RET
      FCMP_1E10: 
           MOV   DPTR,#YUANZHENG_DE10
           LCALL  FR0DPTR        ;數值裝入R0--R3
           LCALL  FCMP
           JNC   FCMP_1E0       ;數值小于等于1e10,跳
           MOV   DPTR,#YUANZHENG_DE_10 ;數值大于1e10,X=X*(1e-10)
           LCALL  FR0DPTR        ;數值1e-10裝入R0--R3
           LCALL  ?C?FPMUL       ;keil的浮點數乘法
           MOV   A,CYZ
           CLR   ACC.6
           ADD   A,#10
           MOV   CYZ,A
           JMP   FCMP_1E10
      FCMP_1E0:
           MOV   DPTR,#YUANZHENG_DE0
           LCALL  FR0DPTR        ;數值裝入R0--R3
           LCALL  FCMP
           JZ   FCMP_1E0_10      ;數值等于1e0,跳
           JC   FCMP_1E0_10      ;數值大于1e0,跳
           MOV   DPTR,#YUANZHENG_DE10 ;數值小于1e0,X=X*(1e10)
           LCALL  FR0DPTR        ;數值1e10裝入R0--R3
           LCALL  ?C?FPMUL       ;keil的浮點數乘法
           MOV   A,CYZ
           SETB  ACC.6
           ADD   A,#10
           MOV   CYZ,A
           JMP   FCMP_1E10
      FCMP_1E0_10:              ;查表,找到一個比待轉換浮點數大的整數冪.
           MOV   DPTR,#YUANZHENG_DE0
      FCMP_FIND:         
           LCALL  FR0DPTR
           LCALL  FCMP
           JNZ   FCMP_UNEQU
           MOV   CYZ+1,#10H      ;正好是表格中的數,尾數為0.10000000
           MOV   CYZ+2,#00H
           MOV   CYZ+3,#00H
           MOV   CYZ+4,#00H
         LCALL  CYZDEAL_JIE
           RET  
      FCMP_UNEQU:
           JC   FCMP_NEXT      ;待轉換浮點數大,跳轉
           MOV   CYZ+1,DPH      ;a,b,c  a=b-(c-b)
           MOV   CYZ+2,DPL
           MOV   DPTR,#YUANZHENG_DE0
           CLR   C
           MOV   A,CYZ+2
           SUBB  A,DPL
           MOV   CYZ+2,A
           MOV   A,CYZ+1
           SUBB  A,DPH
           MOV   CYZ+1,A
           CLR   C
           MOV   A,DPL
           SUBB  A,CYZ+2
           MOV   DPL,A
           MOV   A,DPH
           SUBB  A,CYZ+1
           MOV   DPH,A
           INC   DPTR
           INC   DPTR
           INC   DPTR
           INC   DPTR
           LCALL  FR0DPTR        ;數值1e?裝入R0--R3
           LCALL  ?C?FPMUL       ;keil的浮點數乘法
           JMP   YUANZHENG_FBCD    ;得到一個二進制浮點數的純小數。
      FCMP_NEXT:
           MOV   A,CYZ         ;冪值調整
           JB   ACC.6,FCMP_NEXT1
           INC   CYZ
           JMP   FCMP_FIND
      FCMP_NEXT1:
           DEC   CYZ
           JMP   FCMP_FIND

      YUANZHENG_FBCD:
           MOV   A,R5    ;恢復階碼
           RLC   A
           MOV   A,R4
           RLC   A
           CLR   C
           SUBB  A,#126
           MOV   R4,A
           MOV   A,R5    ;恢復尾數
           SETB  ACC.7
           MOV   R5,A
      CYZFTB0:
           MOV   A,R4    ;取階碼
           JZ   CYZFTB1  ;為零嗎?
         CLR  C
         LCALL  RR1     ;右規。
         SJMP  CYZFTB0
      CYZFTB1:
           ACALL  HB2   ;轉換尾數的十分位和百分位
           MOV   CYZ+1,A
           ACALL  HB2   ;轉換尾數的千分位和萬分位
           MOV   CYZ+2,A
           ACALL  HB2   ;轉換尾數的十萬分位和百萬分位
           MOV   CYZ+3,A
           ACALL  HB2   ;轉換尾數的千萬分位和億分位
           MOV   CYZ+4,A

         MOV  A,R5   ;四舍五入。
         RLC  A
         MOV   A,#05H  ;此處后半字節(BCD碼的第8位)的值不保證
         ADDC  A,CYZ+4
         DA  A
         MOV  CYZ+4,A
         CLR  A
         ADDC  A,CYZ+3
         DA  A
         MOV  CYZ+3,A
         CLR  A
         ADDC  A,CYZ+2
         DA  A
         MOV  CYZ+2,A
         CLR  A
         ADDC  A,CYZ+1
         DA  A
         MOV  CYZ+1,A
         JNC  CYZFTB2
         MOV  CYZ+1,#10H
         LCALL  CYZDEAL_JIE    ;十進制浮點數的階碼。
      CYZFTB2: 
           RET
      CYZDEAL_JIE:
           MOV   A,CYZ       ;冪值調整
           JNB   ACC.6,CYZDEAL_JIE1
           DEC   CYZ
           RET
      CYZDEAL_JIE1:
           INC   CYZ
           RET

      RR1:   MOV  A,R5    ;第一操作數右規一次
         RRC  A    ;尾數縮小一半
         MOV  R5,A
         MOV  A,R6
         RRC  A
         MOV  R6,A
         MOV  A,R7
         RRC  A
         MOV  R7,A
         INC  R4     ;階碼加一
         CLR  OV     ;清溢出標志
         CJNE  R4,#80H,RR1E ;階碼上溢否?
         MOV  R4,#7FH     ;階碼溢出
         SETB  OV
      RR1E:   RET

      HB2: 
           MOV  A,R7  ;尾數擴大100倍。
         MOV  B,#100
         MUL  AB
         MOV  R7,A
         MOV  A,B
         XCH  A,R6
         MOV  B,#100
         MUL  AB
         ADD  A,R6
         MOV  R6,A
         MOV  A,B
         XCH  A,R5
         MOV  B,#100
         MUL  AB
         ADD  A,R5
         MOV  R5,A
         JNC  HB21
         INC  B
      HB21:   MOV  A,B  ;將整數部分轉換成BCD碼。
         MOV  B,#10
         DIV  AB
         SWAP  A
         ORL  A,B
         RET
      FR0DPTR:
           CLR   A
           MOVC  A,@A+DPTR
           MOV   R0,A
           INC   DPTR
           CLR   A
           MOVC  A,@A+DPTR
           MOV   R1,A
           INC   DPTR
           CLR   A
           MOVC  A,@A+DPTR
           MOV   R2,A
           INC   DPTR
           CLR   A
           MOVC  A,@A+DPTR
           MOV   R3,A
           INC   DPTR
           RET
      FCMP:          ;比較兩個正的浮點數
           CLR   C
           MOV   A,R0
           SUBB  A,R4
           JNZ   FCMP1
           MOV   A,R1
           SUBB  A,R5
           JNZ   FCMP1
           MOV   A,R2
           SUBB  A,R6
           JNZ   FCMP1
           MOV   A,R3
           SUBB  A,R7
      FCMP1:
           RET

      YUANZHENG_DE_10:
           DB 02EH,0DBH,0E6H,0FFH ;1E-10
           DB 030H,089H,070H,05FH ;1E-9
           DB 032H,02BH,0CCH,077H ;1E-8
           DB 033H,0D6H,0BFH,095H ;1E-7
           DB 035H,086H,037H,0BDH ;1E-6
           DB 037H,027H,0C5H,0ACH ;1E-5
           DB 038H,0D1H,0B7H,017H ;1E-4
           DB 03AH,083H,012H,06FH ;1E-3
           DB 03CH,023H,0D7H,00AH ;1E-2
           DB 03DH,0CCH,0CCH,0CDH ;1E-1
      YUANZHENG_DE0:
           DB 03FH,080H,000H,000H ;1E0
           DB 041H,020H,000H,000H ;1E1
           DB 042H,0C8H,000H,000H ;1E2
           DB 044H,07AH,000H,000H ;1E3
           DB 046H,01CH,040H,000H ;1E4
           DB 047H,0C3H,050H,000H ;1E5
           DB 049H,074H,024H,000H ;1E6
           DB 04BH,018H,096H,080H ;1E7
           DB 04CH,0BEH,0BCH,020H ;1E8
           DB 04EH,06EH,06BH,028H ;1E9
      YUANZHENG_DE10:
           DB 050H,015H,002H,0F9H ;1E10


          END



      1、 本站不保證以上觀點正確,就算是本站原創作品,本站也不保證內容正確。
      2、如果您擁有本文版權,并且不想在本站轉載,請書面通知本站立即刪除并且向您公開道歉! 以上可能是本站收集或者轉載的文章,本站可能沒有文章中的元件或產品,如果您需要類似的商品請 點這里查看商品列表!
      本站協議。 版權信息。 關于我們。 本站地圖。 營業執照。 發票說明。 付款方式。 聯系方式
      深圳市寶安區西鄉五壹電子商行——粵ICP備16073394號-1;地址:深圳西鄉河西四坊183號;郵編:518102
      E-mail:51dz$163.com($改為@);Tel:(0755)27947428
      工作時間:9:30-12:00和13:30-17:30和18:30-20:30,無人接聽時可以再打手機13537585389
      91嫩草黄片动漫版