⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 浮点数程序.asm

📁 浮点数
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;===========================================================================
;                        Monitor of MCS-51 System
;
;                            By: XIAOLIN
;                      03/25/2007..
;================================== Log ====================================
;
;========================= Functions & Capacities ==========================
;
;=============================== Constant ==================================
SysStack   Equ    70H           ;System Stack:08H..1fh,24 Total

;
;---------------------------------------------------------------------------
;Const
;---------------------------------------------------------------------------
;================================ Hardware =================================
;=============================== Bit Segment ===============================
L0         BIT    00H
L1         BIT    01H
LOW_OV     BIT    02H
HIGH_OV    BIT    03H
LUP        BIT    04H
;=============================== Byte Segment ==============================
A0_BUF     EQU    50H;..52H    ;A0的首地址
A1_BUF     EQU    60H;..62H    ;A1的首地址
F_TEMP_BUF EQU    63H;..65H
F_RH_BUF   EQU    66H;..68H
;==========================================================
E_RH_BUF   EQU    30H ;..31H湿度平均数的缓冲区,
E_Temp_BUF EQU    32H ;..33H温度平均数的缓冲区,
DHT_Get_BUF EQU   34H ;..36H采集到的数据缓冲区
RH_Get_BUF EQU    37H ;..38H
T_Get_BUF  EQU    39H;...3AH
RH_Get_BUF_Tp EQU 3BH ;..3CH
T_Get_BUF_Tp  EQU 3DH;...3EH
GET_NewDATA_BUF EQU  31H ;新数据的缓冲区
n          EQU    4;N=16=K+L=(2 的n次方 )
K          EQU    10 ;旧平均数的权=K
L          EQU    6  ; 新数据的权=L
Bad_Data_Flag BIT 28H.0;输入的数据超过最大的误差范围标志
Have_Get_RH_F BIT 28H.1;已经取得湿度标志
Have_Get_T_F  BIT 28H.2;已经取得温度标志
A_SAVE    DATA    29H
;=============================== Program Code ==============================
           Org    0000H         ;
           LJmp   Main
;--------------------------------- Ints ------------------------------------

;-------------------------------- Subroutines ------------------------------
InitSystem:
           Ret
;---------------------------------------------------------------------------
InitDis:
           Ret
;---------------------------------------------------------------------------
InitKey:
           Ret
;------------------------------子程序---------------------------------------
;-------------------------------------------------------------------
;NAME: F_CHANGE
;FUN:  实现浮点数规则化
;CALL: NONE
;REG USE : C, A,R5,R6,R7 ,L0
;CHANGE:   L0 A C
;
;INPUT:   R6R7--------F_CHANGE 普通有符号数转换为浮点数
;         L0 R5 R6R7-- L_STD   左规格
;OUTPUT:  L0 R5 R6R7
;FOR EXAMPLE: IF (R6R7)=0001,then CALL F_CHANGE ,and  L0 R5 R6R7
;                                                     0  81 8000H
;             IF L0 R5  R6R7 ,THEN CALL L_STD ,  AND  L0 R5 R6R7
;                1  85H 1000H                         1  82 8000H
;--------------------------------------------------------
F_CHANGE:  MOV    A,R6            ;  判断 R6R7 是否为 0?
           ORL    A,R7            ;
           JNZ    F_CHANGE_0      ;  如果R6R7 不为0,则跳转
           MOV    R5,#0           ;  R6 R7全部为0 则R5为0
           SJMP   F_CHANGE_END      ;  结束
F_CHANGE_0:MOV    R5,#90H
           MOV    A,R6            ;   R6 TO A
           MOV    C,ACC.7         ;  将R6最高位给 L0
           MOV    L0,C            ;
           JNC    L_STD           ;  如果不为0,说明是正数
           CLR    C               ;  否则 求出原码
           MOV    A,R7            ;  数据取反+1
           CPL    A               ;
           ADD    A,#1
           MOV    R7,A            ;A TO R7
           MOV    A,R6            ;R6 TO A
           CPL    A
           ADDC   A,#0
           MOV    R6,A            ;  A TO R6
L_STD:     JB     ACC.7,F_CHANGE_3;左规格化
           DEC    R5
           MOV    A,R7
           CLR    C
           RLC    A
           MOV    R7,A
           MOV    A,R6
           RLC    A
           MOV    R6,A
           JNB     ACC.7,L_STD     ; 判断 R6最高位是否为1,是,则跳转
F_CHANGE_3:
           CLR     C
F_CHANGE_END:
           RET      ;结束
;---------------------------------------------------------------------
;NAME:   R_STD
;FUNC:   实现右规格化
;IN PUT: L0  R5  R6R7
;OUT PUT:L0  R5  R6R7
;---------------------------------------------------------------------
R_STD:    MOV    A,R6
          RRC    A
          MOV    R6,A
          MOV    A,R7
          RRC    A
          MOV    R7,A
          MOV    A,R6
          INC    R5
          JNB    ACC.7,R_STD
          RET
;---------------------------------------------------------------------
; NEMA: Reve_F_CHANGE  反规格化
;IN:  R5R6R7
;OUT:   R6R7
;CHANGE: L0
; FOR EXAMPLE:  R5  R6  R7       R6   R7
;               81  80  00       FF   FF   -1
;               81  00  00       00   01   +1
;---------------------------------------------------------------------
Reve_F_CHANGE:
           MOV    A,R5
           JNZ     Reve_F_CHANGE_1
           CLR    L0
           MOV    R6,#0
           MOV    R7,#0
           SJMP   Reve_F_CHANGE_END
Reve_F_CHANGE_1:
           MOV    A,R6
           MOV    C,ACC.7
           ;MOV    L0,C
           SETB   ACC.7
           MOV    R6,A
Reve_F_CHANGE_3:
           CJNE   R5,#90H,Reve_F_CHANGE_0
           JNB    L0,Reve_F_CHANGE_END
           CLR    C
           MOV    A,R7
           CPL    A
           ADD    A,#1
           MOV    R7,A
           MOV    A,R6
           CPL    A
           ADDC   A,#0
           MOV    R6,A
Reve_F_CHANGE_END:
           MOV    A,R3
           SUBB   A,#80H
           JC     Reve_F_CHANGE_END0
           MOV    A,R7
           ADD    A,#1
           MOV    R7,A
           JNC    Reve_F_CHANGE_END0
           INC    R6
Reve_F_CHANGE_END0:
           CLR    L0
           CLR    C
           RET
;Reve_F_CHANGE_END
Reve_F_CHANGE_0:
           INC    R5
           CLR    C
           MOV    A,R6
           RRC    A
           MOV    R6,A
           MOV    A,R7
           RRC    A
           MOV    R7,A
           ;+++++++++
           MOV    A,R3
           RRC    A
           MOV    R3,A
           ;MOV    A,R4
           ;RRC    A
           ;MOV    R4,A
           ;MOV    A,R2
           ;RRC    A
           ;MOV    R2,A
           ;++++++++++++
           SJMP   Reve_F_CHANGE_3
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++
;取得频率值
;=======================================================
Get_GPRS_F:MOV    A,R2
           RLC    A
           MOV    R2,A
           MOV    A,R4
           RLC    A
           MOV    R4,A
           MOV    A,R3
           RLC    A
           MOV    R3,A
           MOV    A,R7
           RLC    A
           MOV    R7,A
           MOV    A,R6
           RLC    A
           MOV    R6,A
           RET

;-------------------------------------------------------
;NAME: M0_TO_A0
;FUNC:
;CALL: NONE
;REG USE:  R0,R5,6,7   ;A
;CHANGE:   L0,  @R0
;For example   @r0  @r0+1  #r0+2     R5   R6   R7   L0
;               84H  0A0H   00H      84H  0A0H 00H  1   -10
;               84H   20H   00H      84H  0A0H 00H  0   +10
;               00H   **    **       00H   00H 00H  0   0
;--------------------------------------------------------
A0_TO_FT:  ;将数据传送给温度浮点数
           MOV    R0,#F_TEMP_BUF
           LJMP   A0_TO_M0T
;=========================================
A0_TO_FRH:  ;将数据传送给湿度浮点数
           MOV    R0,#F_RH_BUF
           LJMP   A0_TO_M0T
;=========================================
FRH_TO_A0: MOV    R0,#F_RH_BUF
           LJMP   M0_TO_A0_RH
;=========================================
FT_TO_A0:  MOV    R0,#F_TEMP_BUF
           LJMP   M0_TO_A0_RH
;=========================================
M0_TO_A0:
           MOV    R0,#A0_BUF ;取首地址给 R0
M0_TO_A0_RH:MOV    A,@R0      ;将首地址的数据给 A
           JZ     M0_TO_A0_0 ;先判断是不是为0,如果为0,则整个数据为0
           MOV    R5,A       ;不是为0,将数据-阶码 给R5
;---------------------------------
           INC    R0         ;R0 的地址 加1
           MOV    A,@R0      ;将(R0+1) TO R6
           MOV    C,ACC.7    ;LET R6 的 MSB TO L0
           MOV    L0,C
           SETB   ACC.7       ;R6的最高位置1
           MOV    R6,A
;---------------------------------
           INC    R0          ;R0+1
           MOV    A,@R0
           MOV    R7,A        ;(R0+1) TO R7
           JMP    M0_TO_A0_1  ;EXIT
;---------------------------------
M0_TO_A0_0:MOV    R5,#0       ;IF (R0)=0,THEN ALL REG=0,AND L0=0
           MOV    R6,#0
           MOV    R7,#0
           CLR    L0
M0_TO_A0_1:
           DEC    R0
           DEC    R0
           RET
;---------------------------------------------------------------
; NAME:A0_TO_M0
; IN:  R5, R6R7,L0
;      82  8000 1   82 , 8000 ,0
; OUT: @R0,+1,+2
;      82  8000     82   0000
;---------------------------------------------------------------
A0_TO_M0:  MOV    R0,#A0_BUF
A0_TO_M0T: MOV    A,R5
           JZ     A0_TO_M0_ZERO;IF R5=0,THEN @R0+1=0,AND @R0+2=0
           MOV    @R0,A
;---------------------------------
           INC    R0
           MOV    A,R6
           MOV    C,L0
           MOV    ACC.7,C
           MOV    @R0,A
;---------------------------------
           INC    R0
           MOV    A,R7
           MOV    @R0,A
           SJMP   A0_TO_M0_OUT
;---------------------------------
A0_TO_M0_ZERO:
           Mov    @r0,A
           Inc    r0
           Mov    @r0,A
           Inc    r0
           Mov    @r0,A
A0_TO_M0_OUT:
           DEC    R0
           DEC    R0
           RET
;-----------------------------------------------------------------
;NEMA:   A0_TO_M1
;IN PUT: L0  R5,R6,R7
;OUT PUT: @R1,+1,+2
; REG USE: A
;-------------------------------------------------------------------
A0_TO_M1:  MOV    R1,#A1_BUF
A0_TO_M11:
           MOV    A,R5
           JZ     A0_TO_M1_00
           MOV    @R1,A
;----------------------------------
           INC    R1
           MOV    A,R6
           MOV    C,L0
           MOV    ACC.7,C
           MOV    @R1,A
;----------------------------------
           INC    R1
           MOV    A,R7
           MOV    @R1,A
           SJMP   A0_TO_M1_OUT
A0_TO_M1_00:
           MOV    @R1,A
           INC    R1
           MOV    @R1,A
           INC    R1
           MOV    @R1,A
A0_TO_M1_OUT:
           DEC    R1
           DEC    R1
           RET
;---------------------------------------------------------------------
;NAME: A0_TO_A1
;FUNC: (R5R6R7)=>>(R2R3R4)
;REG: A
;----------------------------------------------------------------------
A0_TO_A1:
           MOV    A,R5
           JNZ    A0_TO_A1_1
           MOV    R6,#0
           MOV    R7,#0
           MOV    R2,#0
           MOV    R3,#0
           MOV    R4,#0
           SJMP   A0_TO_A1_END
A0_TO_A1_1:MOV    R2,A
           MOV    A,R6
           MOV    R3,A
           MOV    A,R7
           MOV    R4,A
           MOV    C,L0
           MOV    L1,C
A0_TO_A1_END:
           RET
;-------------------------------------------------------
;NAME:    A1_TO_A0
;FUNC:    L0=L1
;         R5=R2
;         R6=R3
;         R7=R4
;--------------------------------------------------------
A1_TO_A0:  MOV    A,R2
           JZ     R2_EQU_00H
           MOV    C,L1
           MOV    L0,C
           MOV    R5,A
           MOV    A,R3
           MOV    R6,A
           MOV    A,R4
           MOV    R7,A
           SJMP   A1_TO_A0_END
R2_EQU_00H:MOV    R5,A
           MOV    R7,#0
           MOV    R6,#0
           CLR    L0
A1_TO_A0_END:
           RET


;=====================================================================
A0_TO_M00: MOV    R0,#A0_BUF
           MOV    A,R5
           JZ     A0_TO_M00_OUT
           MOV    @R0,A
           INC    R0
           MOV    A,R6
           MOV    @R0,A
           INC    R0
           MOV    A,R7
           MOV    @R0,A
           DEC    R1
           DEC    R1
A0_TO_M00_OUT:
           RET
;---------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -