📄 浮点数程序.asm
字号:
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 + -