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

📄 浮点数程序.asm

📁 浮点数
💻 ASM
📖 第 1 页 / 共 3 页
字号:
           MOV    DPH,A
           MOV    A,R7
           MOVC   A,@A+DPTR
           RET
;----------------------------------------------------------
GET_THI_Table:
;         0   1   2   2   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20
DB        0H, 1H, 1H, 2H, 3H, 3H, 4H, 4H, 5H, 6H ,6H, 7H, 8H, 8H, 9H, 9H, 10H,11H,11H,12H,88H; 0
DB        13H,13H,14H,14H,15H,16H,16H,17H,17H,18H,19H,19H,20H,20H,21H,22H,22H,23H,23H,24H,88H; 1
DB        24H,25H,26H,26H,27H,27H,28H,28H,29H,30H,30H,31H,31H,32H,32H,33H,34H,34H,35H,35H,88H; 2
DB        36H,36H,37H,37H,38H,39H,39H,40H,40H,41H,41H,42H,42H,43H,43H,44H,44H,45H,46H,46H,88H; 3
DB        47H,47H,48H,48H,49H,49H,50H,50H,51H,51H,52H,52H,53H,53H,54H,54H,55H,55H,56H,56H,88H; 4
DB        0H, 1H, 1H, 2H, 3H, 3H, 4H, 4H, 5H, 6H ,6H, 7H, 8H, 8H, 9H, 9H, 10H,11H,11H,12H,88H; 5
DB        13H,13H,14H,14H,15H,16H,16H,17H,17H,18H,19H,19H,20H,20H,21H,22H,22H,23H,23H,24H,88H; 6
DB        24H,25H,26H,26H,27H,27H,28H,28H,29H,30H,30H,31H,31H,32H,32H,33H,34H,34H,35H,35H,88H; 7
DB        36H,36H,37H,37H,38H,39H,39H,40H,40H,41H,41H,42H,42H,43H,43H,44H,44H,45H,46H,46H,88H; 8
DB        47H,47H,48H,48H,49H,49H,50H,50H,51H,51H,52H,52H,53H,53H,54H,54H,55H,55H,56H,56H,88H; 9
;----------------------------------------------------------------------------------------

DB        0H, 1H, 1H, 2H, 3H, 3H, 4H, 4H, 5H, 6H ,6H, 7H, 8H, 8H, 9H, 9H, 10H,11H,11H,12H,88H; 10
DB        13H,13H,14H,14H,15H,16H,16H,17H,17H,18H,19H,19H,20H,20H,21H,22H,22H,23H,23H,24H,88H; 11
DB        24H,25H,26H,26H,27H,27H,28H,28H,29H,30H,30H,31H,31H,32H,32H,33H,34H,34H,35H,35H,88H; 12
DB        36H,36H,37H,37H,38H,39H,39H,40H,40H,41H,41H,42H,42H,43H,43H,44H,44H,45H,46H,46H,88H;
DB        47H,47H,48H,48H,49H,49H,50H,50H,51H,51H,52H,52H,53H,53H,54H,54H,55H,55H,56H,56H,88H;
DB        0H, 1H, 1H, 2H, 3H, 3H, 4H, 4H, 5H, 6H ,6H, 7H, 8H, 8H, 9H, 9H, 10H,11H,11H,12H,88H;
DB        13H,13H,14H,14H,15H,16H,16H,17H,17H,18H,19H,19H,20H,20H,21H,22H,22H,23H,23H,24H,88H;
DB        24H,25H,26H,26H,27H,27H,28H,28H,29H,30H,30H,31H,31H,32H,32H,33H,34H,34H,35H,35H,88H;
DB        36H,36H,37H,37H,38H,39H,39H,40H,40H,41H,41H,42H,42H,43H,43H,44H,44H,45H,46H,46H,88H; 18
DB        47H,47H,48H,48H,49H,49H,50H,50H,51H,51H,52H,52H,53H,53H,54H,54H,86H,55H,56H,56H,88H; 19
;----------------------------------------------------------------------------------------
DB        0H, 1H, 1H, 2H, 3H, 3H, 4H, 4H, 5H, 6H ,6H, 7H, 8H, 8H, 9H, 9H, 10H,11H,11H,12H,88H; 20
DB        13H,13H,14H,14H,15H,16H,16H,17H,17H,18H,19H,19H,20H,20H,21H,22H,22H,23H,23H,24H,88H; 21
DB        24H,25H,26H,26H,27H,27H,28H,28H,29H,30H,30H,31H,31H,32H,32H,33H,34H,34H,35H,35H,88H;
DB        36H,36H,37H,37H,38H,39H,39H,40H,40H,41H,41H,42H,42H,43H,43H,44H,44H,45H,46H,46H,88H;
DB        47H,47H,48H,48H,49H,49H,50H,50H,51H,51H,52H,52H,53H,53H,54H,54H,55H,55H,56H,56H,88H;
DB        0H, 1H, 1H, 2H, 3H, 3H, 4H, 4H, 5H, 6H ,6H, 7H, 8H, 8H, 9H, 9H, 10H,11H,11H,12H,88H;
DB        13H,13H,14H,14H,15H,16H,16H,17H,17H,18H,19H,19H,20H,20H,21H,22H,22H,23H,23H,24H,88H;
DB        24H,25H,26H,26H,27H,27H,28H,28H,29H,30H,30H,31H,31H,32H,32H,33H,34H,34H,35H,35H,88H;
DB        36H,36H,37H,37H,38H,39H,39H,40H,40H,41H,41H,42H,42H,43H,43H,44H,44H,45H,46H,46H,88H;
DB        47H,47H,48H,48H,49H,49H,50H,50H,51H,51H,52H,52H,53H,53H,54H,54H,55H,55H,56H,56H,88H; 29
DB        47H,47H,48H,48H,49H,49H,50H,50H,51H,51H,52H,52H,53H,53H,54H,54H,55H,55H,56H,56H,88H; 30
;----------------------------------------------------------------------------------------
;--------------------------------------------------------------------
;NAME:F_FA0_MUL_100
;FUNC:  浮点数乘以100   100== 87 C8 00 0
;CALL:  F_MUL_A0A1
;--------------------------------------------------------------------
F_FM0_MUL_100:
           CALL   M0_TO_A0  ;FA0:=FM0
F_FA0_MUL_100:
           MOV    R2,#87H
           MOV    R3,#0C8H
           MOV    R4,#0      ;FA1:=100
           CLR    L1
           CALL   F_MUL_A0A1  ;FA0:=FA0*100
           RET
;---------------------------------------------------------------------
;-----------------------------------------------------------
;
;INPUT:R6R7
;OUTPUT:R3R4R5
;USE REG: A B R1 R2 R3 R4 R5 R6 R7
;-----------------------------------------------------------
HEX_TO_BCDF:MOV    R5,#2
           MOV    R1,#0
           MOV    R2,#0
           MOV    R3,#0
           MOV    R4,#0
HEX2BCD:   MOV    A,R6
           JZ     HEXTOBCD_1BETY;先判断是否是一字节
           ANL    A,#11111100B  ;先取R6的高6位
           RR     A
           RR     A             ;右移2次
           PUSH   ACC ;先储存起来,取R6的高6位
           XCH    A,R6          ;
           ANL    A,#00000011B
           XCH    A,R6 ;取R6的低2位
           MOV    B,#10 ; R6的高6位就是千位和万位
           DIV    AB
           ADD    A,R1  ;万位储存在R1
           MOV    R1,A
           MOV    A,B
           ADD    A,R2  ;千位储存在R2          11101001 00001110
           MOV    R2,A;DO 1000*HIGH R6 6
           POP    ACC   ;A将备份的高6位取出来
           MOV    B,#24 ;R6*24
           MUL    AB
           ADD    A,R7  ;(A*24)+(R6R7)
           MOV    R7,A
           MOV    A,B
           ADDC   A,R6
           MOV    R6,A
           DJNZ   R5,HEX2BCD
           JZ     HEXTOBCD_1BETY ;if r6=0 ,then one bety
;--------------------------------------
HEX2BCD1:  MOV    A,R6
           RL     A;DO (200+56)*R6
           ADD    A,R3
           MOV    R3,A
           MOV    A,R6
           MOV    R6,#0
           MOV    B,#56
           MUL    AB
           ADD    A,R7
           MOV    R7,A
           MOV    A,B
           ADDC   A,R6
           MOV    R6,A
           ;DJNZ   R5,HEX2BCD1
           JNZ    HEX2BCD1
HEXTOBCD_1BETY:;一字节转换为BCD
           MOV    A,R7
           MOV    B,#100
           DIV    AB
           MOV    R5,B
           ADD    A,R3
           MOV    R3,A
            ;0000000
           MOV    B,#10
           DIV    AB
           ADD    A,R2
           MOV    R2,A
           MOV    R3,B
           ;0000000000
HEX2BCD3:  MOV    A,R5
           MOV    B,#10
           DIV    AB
           MOV    R4,A
           MOV    R5,B
           SWAP   A
           ORL    A,R5
           MOV    R5,A
           MOV    A,R2
           SWAP   A
           ORL    A,R3
           MOV    R4,A
           MOV    A,R1
           MOV    R3,A
           RET
;----------------------------------------------------------
;-----------------------------------
;将温度显示
;-----------------------------------
RH_2_DIS:  LCALL   Compute_RH
           AJMP    RHT_2_DIS
Temp_2_Dis:LCALL   Compute_TEMP;
RHT_2_DIS: LCALL   F_FA0_MUL_100;
           LCALL   Reve_F_CHANGE
           LCALL   HEX_TO_BCDF
           ;LCALL   RHT_2_DIS
           RET
;==========================================================================
;----------------------------------------------------------
; 程序说明:求平均数=E  旧平均数=e ; 新数据=D;旧平均数的权=K; 新数据的权=L
; 公式:
;      E=(e*K+D*L)/(K+L)   ;设 N=K+L
;       = e*K/N + D*L/N
;      (K+L)要满足2的n次方,也就是n=lg(K+L)/lg(2)
;      初始化部分完成的内容是:所有的存储器用第一次采集到的数据添满
;      E_init();
;      存储器的首地址是:E_buf
;      数据输入存储器地址:GET_DATA_BUF
; CALL: One_bety_mul()
;
;----------------------------------------------------------
;----------------------------------------------------------
;两字节数据
;----------------------------------------------------------
E_Init_TEMP:
           MOV    E_TEMP_BUF,T_Get_BUF
           MOV    T_Get_BUF_Tp,T_Get_BUF
           MOV    E_TEMP_BUF+1,T_Get_BUF+1
           MOV    T_Get_BUF_Tp+1,T_Get_BUF+1
           RET
E_Init_RH: MOV    E_RH_BUF,RH_Get_BUF
           MOV    RH_Get_BUF_Tp,RH_Get_BUF
           MOV    E_RH_BUF+1,RH_Get_BUF+1
           MOV    RH_Get_BUF_Tp+1,RH_Get_BUF+1
           RET
;----------------------------------------------------------
;One_bety_mul
;计算公式:A=(R6R7)*(R3R4)/16 ;R3=0   R6R7R3R4
;USE_REG: A,B,R7,C
;CALL: none
;入口:A B
;输出:A,R5
;Time: 17uS
;---------------------------------------------------------
One_bety_mul:
           MOV    R3,#0
           LCALL  TWO_BYTE_MUL
           MOV    A,R4
           SWAP   A
           ANL    A,#00001111B
           MOV    R4,A
           MOV    A,R3
           SWAP   A
           MOV    R3,A
           ANL    A,#11110000B
           ORL    A,R4
           MOV    R4,A
           MOV    A,R3
           ANL    A,#00001111B
           MOV    R3,A
           MOV    A,R7
           SWAP   A
           ORL    A,R3
           MOV    R3,A
           RET
;----------------------------------------------------------
;入口:    1:GET_E    :旧平均数在 E_buf ,新数据在 GET_NewDATA_BUF
;          2:Get_TH_E :旧平均数在 R5 ,新数据在 R6
;Use Reg:  R5,R6,A,B,C
;CALL:     One_bety_mul
;出口:    A,R5
;Time:     90uS
;----------------------------------------------------------
;求 湿度的输入平均数
;----------------------------------------------------------
GET_RH_E:  MOV    R6,E_RH_BUF
           MOV    R7,E_RH_BUF+1
           MOV    R4,#K
;Get_TH_E:;取得平均数
           LCALL  One_bety_mul;A=e*K/(K+L)
           MOV    E_RH_BUF,R3
           MOV    E_RH_BUF+1,R4
           ;MOV    R5,A
           ;----------
           MOV    R6,RH_Get_BUF
           MOV    R7,RH_Get_BUF+1
           MOV    R4,#L
           ACALL  One_bety_mul ;A=D*L/(K+L)
           ;----------
           MOV    A,R4   ;A=(e*K+D*L)/(K+L)   ;设 N=K+L
           ADD    A,E_RH_BUF+1
           MOV    E_RH_BUF+1,A
           MOV    A,R3
           ADDC   A,E_RH_BUF
           MOV    E_RH_BUF,A
           RET
;==========================================================
;求温度的输入平均数
;----------------------------------------------------------
GET_TEMP_E:MOV    R6,E_TEMP_BUF
           MOV    R7,E_TEMP_BUF+1
           MOV    R4,#K
;Get_TH_E:;取得平均数
           LCALL  One_bety_mul;A=e*K/(K+L)
           ;MOV    A_SAVE,R2
           MOV    E_TEMP_BUF,R3
           MOV    E_TEMP_BUF+1,R4
           ;MOV    R5,A
           ;----------
           MOV    R6,T_Get_BUF
           MOV    R7,T_Get_BUF+1
           MOV    R4,#L
           ACALL  One_bety_mul ;A=D*L/(K+L)
           ;----------
           MOV    A,R4   ;A=(e*K+D*L)/(K+L)   ;设 N=K+L
           ADD    A,E_TEMP_BUF+1
           MOV    E_TEMP_BUF+1,A
           MOV    A,R3
           ADDC   A,E_TEMP_BUF
           MOV    E_TEMP_BUF,A
           RET
;-----------------------------------------------------------

;==========================================================
;程序说明:1: 先滤除尖波干扰的数据
;          2: 再利用加权平均数
;原理:输入的新数据 与平均数的差值 不能超过误差允许的范围
;入口:R6R7 :旧数据
;      R4R5:新数据
;      R3: 最大误差范围
;出口:Bad_Data_Flag    A=R6R7=|R4R5-R6R7|
;Use Reg: A,
;Call: NONE
;Time:
;----------------------------------------------------------
Get_Real_Data0:
           MOV    R3,#50
Get_Real_Data:
           CLR    Bad_Data_Flag ;先清错误标志,=1,说明数据是错误的
           MOV    A,R5          ;先求 A=|R6-R5|
           CLR    C
           SUBB   A,R7
           MOV    R7,A
           MOV    A,R4
           SUBB   A,R6
           MOV    R6,A
           JnC    Get_Real_Data1;新数据大于平均数 就跳转
           MOV    A,R7
           CPL    A
           ADD    A,#1
Get_Real_Data1:
           CLR    C
           SUBB   A,R3;,$+3
           JC     Get_Real_DataQ;C=1,|R5-R6|<R4,DATA Right
           ;SETB   Bad_Data_Flag
Get_Real_DataQ:
           RET
;----------------------------------------------------------
;数据滤波和求平均数
;输入:R6 :新数据
;      R5:平均数
;      R4: 最大误差范围
;输出:R5 ,A
;Call: Get_Real_Data0,Get_TH_E
;Time: 69us
;---------------------------------------------------------
Get_Real_T_D:
           MOV    R6,T_Get_BUF_Tp
           MOV    R7,T_Get_BUF_Tp+1
           MOV    R4,T_Get_BUF
           MOV    R5,T_Get_BUF+1
           LCALL  Get_Real_Data0  ;先滤除尖波干扰的数据
           JB     Bad_Data_Flag,Get_Real_T_Q ;Bad_Data_Flag=1,说明输入数据是错误的
           MOV    T_Get_BUF_Tp,T_Get_BUF
           MOV    T_Get_BUF_Tp+1,T_Get_BUF+1
           LCALL  GET_TEMP_E
Get_Real_T_Q:
           RET
;==========================================================
;---------------------------------------------------------
Get_Real_RH_D:
           MOV    R6,RH_Get_BUF_Tp
           MOV    R7,RH_Get_BUF_Tp+1
           MOV    R4,RH_Get_BUF
           MOV    R5,RH_Get_BUF+1
           LCALL  Get_Real_Data0  ;先滤除尖波干扰的数据
           JB     Bad_Data_Flag,Get_Real_RH_Q ;Bad_Data_Flag=1,说明输入数据是错误的
           MOV    RH_Get_BUF_Tp,RH_Get_BUF
           MOV    RH_Get_BUF_Tp+1,RH_Get_BUF+1
           LCALL  GET_RH_E
Get_Real_RH_Q:
           RET
;==========================================================
;================================================
CLR_RAM:   ;清理内存
            POP DPH
            POP DPL
            MOV R0,#0FFH
CLRGO:      MOV @R0,#00H
            DJNZ R0,CLRGO
            MOV @R0,#00H
            CLR A
            JMP @A+DPTR
;=================================== Main ==================================
Main:      ;Mov    Sp,#SysStack
           LCALL  CLR_RAM
           MOV    RH_Get_BUF,#HIGH(2453)
           MOV    RH_Get_BUF+1,#LOW(2453)
           LCALL  E_Init_RH

           MOV    RH_Get_BUF,#HIGH(2453)
           MOV    RH_Get_BUF+1,#LOW(2453)
           LCALL  Get_Real_RH_D
           LCALL  RH_2_DIS
;==========================================
           MOV    T_Get_BUF,#HIGH(6550)
           MOV    T_Get_BUF+1,#LOW(6550)
           LCALL  E_Init_TEMP
TEST_TEMP:
           MOV    T_Get_BUF,#HIGH(6550)
           MOV    T_Get_BUF+1,#LOW(6550)
           LCALL  Get_Real_T_D
           LCALL  Compute_TEMP
           LCALL   F_FA0_MUL_100;
           LCALL   Reve_F_CHANGE
           LCALL   HEX_TO_BCDF
           ;LJMP    TEST_TEMP
           ;================================
           LCALL  Compute_THI
           LCALL   Reve_F_CHANGE
           LCALL  Get_Real_Data0
           MOV    R4,#9
           LCALL  One_bety_mul
           LCALL  Compute_RH
           LCALL  Compute_RHT
           LCALL  Compute_TEMP
           NOP
MainLoop:

           AJmp   MainLoop
;===========================================================================
          ; Org    6000H         ;For 89C51:4KB
           End


⌨️ 快捷键说明

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