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

📄 op_test.asm

📁 用C51单片机挂液晶显示器和键盘的一个自动测量功放参数的系统源代码。
💻 ASM
📖 第 1 页 / 共 2 页
字号:
    MOV A,'A'
    LCALL SEND_D
    RET
;******************************************************************************************
;******************************************************************************************
T_KCMR:		MOV	A,#01H			;清除显示
		LCALL	SEND_I
                MOV DPTR,#TAB6
                LCALL MV0
      ;MOV A,SIGN   ;T0计时是否到
      ;ANL A,#00000010B
      ;JZ T_KCMR1
      ;CLR ACC.1
      ;MOV SIGN,A   ;清标志位
      SETB  P3.0      ;操作I/O口,控制继电器
      SETB  P3.1
      CLR  P3.2
      SETB   P3.3
      SETB  P3.4
      CLR   P3.5
      SETB   P3.6
      LCALL DELAY2
      LCALL ADC
      MOV A,VIO1
      MOV R1,#VS1
      LCALL VIO_DEAR        ;处理输入失调电压AD采样值,存在[高]24H~[低]20H中(分离BCD码)
      MOV R0,#FD1            ;出口      分离BCD码转浮点BCD
      MOV R1,#VS1            ;入口
      LCALL TOBCD            ;
      MOV R0,#FD1
      LCALL LG               ;出口为@R0往后三字节
      NOP
      NOP
      ACALL BCDTO            ;@R1=FD2分离BCD码首地址(3位)
      MOV R1,#FD1
      MOV A,#88H             ;显示数据
      LCALL SEND_I
      MOV A,@R1
      LCALL SEND_D
      INC R1
      MOV A,@R1
      LCALL SEND_D
      INC R1
      MOV A,@R1
      LCALL SEND_D
      MOV A,#44H
      LCALL SEND_D
      MOV A,#42H
      MOV DPTR,#TAB6
      ACALL MV0
T_KCMR1:LCALL WORK
        AJMP T_KCMR
        RET
;**************************************************************************************
MV3:MOV	A,#8EH                          ;显示==============DB
    LCALL SEND_I
    MOV A,'n'
    LCALL SEND_D
    MOV	A,#8FH
    LCALL SEND_I
    MOV A,'A'
    LCALL SEND_D
    RET
;*************************************************************************************
;**************************************************************************************
MV0:		MOV	COUNT,#10H      ;显示测量项目的字符
		MOV	A,#80H
		LCALL	SEND_I
MV01:		CLR	A
		MOVC	A,@A+DPTR
		LCALL	SEND_D
		INC	DPTR
		DJNZ	COUNT,MV01
                RET
;******************************************************************************************
;******************************************************************************************
ADC:MOV R0,#05H
ADCLOOP:CLR START        ;启动AD0809
   SETB START
   CLR START
   MOV R6,#0AH
DLAY:NOP
     NOP
     NOP
     DJNZ R6,DLAY
     MOVX A,@DPTR
     MOV VIO1,A
     DJNZ R0,ADCLOOP
     RET
;**************************************************************************************
WORK: JB KEY,WORK1     ;是否有键入
      MOV SEND_BUF,#00010101B    ;-----------读键盘数据
      CALL SEND
      CALL RECEIVE
      SETB CS
      MOV SEND_BUF,#80H          ;-------------下载数据且按方式0译码,显示位1
      CALL SEND
      SETB CS
      CALL LONG_DELAY
      jnb key,$
      MOV A,REC_BUF
      CJNE A,#0FH,WORK     ;是取消键吗?
      LJMP LOOP
WORK1:RET
;******************************************************************************************
;*****************************************连续执行子程序***********************************
GOON:





    LJMP LOOP
;**************************************************************************************************
;*******************************************************************调用前先赋给@R1首地址********
VIO_DEAR:               ;处理输入失调电压AD采样值,存在[高]24H~[低]20H中(分离BCD码)
          mov R0,#BUFF  ;24H为整数部分
          MOV R7,#00H   ;取采样值,并转化为双字节
          MOV R6,VIO1
          MOV R5,#05H
          MOV R4,#00H              ;赋参数(纯小数0.0195)
          LCALL  MULT               ;调用双字节乘法子程序
          DEC R0
          MOV A,@R0
          MOV @R1,A                ;存个位数
                     DEC R0
                     MOV A,@R0                ;取有效小数
                     MOV R2,A
                     DEC R0
                     MOV A,@R0
                     MOV R3,A
                     ACALL  HBD2              ;入口条件:待转换的双字节十六进制小数在R2、R3中。
                     MOV A,R2                 ;出口信息:转换后的双字节BCD码小数仍在R2、R3中
                     ANL A,#0F0H              ;影响资源:PSW、A、B、R2、R3、R4、R5 堆栈需求: 6字节
                     SWAP A
                     DEC R1
                     MOV @R1,A               ;存小数点后1位
                     DEC R1
                     MOV A,R2
                     ANL A,#0FH
                     MOV @R1,A               ;存小数点后2位
                     MOV A,R3
                     ANL A,#0F0H
                     SWAP A
                     DEC R1
                     MOV @R1,A              ;存小数点后3位
                     DEC R1
                     MOV A,R3
                     ANL A,#0FH
                     MOV @R1,A               ;存小数点后4位
                     RET
;*******************************************************************************************
;****************************************************************************;显示汉字和字符
LGS1:		MOV	COUNT,#40H
		MOV	A,#80H
		LCALL	SEND_I
LGS11:		CLR	A
		MOVC	A,@A+DPTR
		LCALL	SEND_D
		INC	DPTR
		DJNZ	COUNT,LGS11
		RET
;*************************************************************************************************
;*************************************************************************************************
;PTT0:PUSH A
;     MOV A,SIGN
;     SETB ACC.1
;     MOV SIGN,A
;     POP A
;     RETI

;**************************调用前先赋给R0出口(低地址),R1入口(高地址)地址的首地址**********************
;*************入口为@R1[高位地址],四位分离BCD,出口为@R0,三个字节浮点BCD******************************
TOBCD:NOP
      MOV A,@R1
      SWAP A
      MOV R2,A
      DEC R1
      MOV A,@R1
      ORL A,R2
      PUSH A
      SUBB A,#10
      JC YI
ER:MOV @R0,#01H            ;送阶数
   AJMP EY
YI:MOV @R0,#00H
EY:POP A                   ;送尾数高8位
   INC R0
   MOV @R0,A
   INC R0                  ;送尾数低8位
   DEC R1
   MOV A,@R1
   SWAP A
   MOV R2,A
   DEC R1
   MOV A,@R1
   ORL A,R2
   MOV @R0,A
   RET
;*****************************************************************************
;************@R0为浮点BCD码首地址(三位),@R1为分离BCD码首地址(3位)********
BCDTO:MOV A,@R0
      CJNE A,#3,BCDTO1
      AJMP BCDTO2
BCDTO1:MOV @R1,#00H
      INC R0
      MOV A,@R0
      ANL A,#0F0H
      SWAP A
      mov @R1,A
      INC R1
      MOV A,@R0
      ANL A,#0FH
      mov @R1,A
      RET
BCDTO2:INC R0
      MOV A,@R0
      ANL A,#0F0H
      SWAP A
      mov @R1,A               ;存百位,低地址
      INC R1
      MOV A,@R0
      ANL A,#0FH
      mov @R1,A               ;存十位,
      INC R0
      INC R1
      MOV A,@R0
      ANL A,#0F0H
      SWAP A
      mov @R1,A               ;存个位,高地址
      RET
;****************************************************************************************
;****************************************************************************************
DSUM:   MOV A,R4   ;[双字节加法子程序]:(R5R4)+(R3R2)-->(R7R6)
        ADD A,R2
        MOV R6,A
        MOV A,R5
        ADDC A,R3
        MOV R7,A
        RET
;****************************************************************************************
;****************************************************************************************
            CPL1:  MOV A,R2    ;[双字节求补子程序]:(R3R2)求补
                   CPL A
                   ADD A,#01H
                   MOV R2,A
                   MOV A,R3
                   CPL A
                   ADDC A,#00H
                   MOV R3,A
                   RET
;****************************************************************************************
;****************************************************************************************
            MULT1:   MOV A,R7    ;[双字节有符号数乘法]:被乘数(R7R6),乘数(R5R4)
                     RLC A
                     MOV 5CH,C   ;被乘数符号C1-->5CH位
                     JNC POS1    ;为正数则转
                     MOV A,R6    ;为负数则求补
                     CPL A
                     ADD A,#01H
                     MOV R6,A
                     MOV A,R7
                     CPL A
                     ADDC A,#00H
                     MOV R7,A
            POS1:  MOV A,R5    ;取乘数
                   RLC A      ;乘数符号C2-->5DH位
                   MOV 5DH,C
                   JNC POS2    ;为整数则转
                   MOV A,R4
                   CPL A
                   ADD A,#01H
                   MOV R4,A
                   MOV A,R5
                   CPL A
                   ADDC A,#00H
                   MOV R5,A
            POS2:  ACALL MULT      ;调双字节无符号数乘法子程序
                   MOV C,5CH
                   ANL C,5DH
                   JC TPL               ;负负相乘则转
                   MOV C,5CH
                   ORL C,5DH
                   JNC TPL     ;正正相乘则转
                   DEC R0
                   MOV A,@R0
                   CPL A
                   ADD A,#01H
                   MOV @R0,A
                   INC R0
                   MOV A,@R0
                   CPL A
                   ADDC A,#00H
                   MOV @R0,A
            TPL:   RET
;****************************************************************************************
;****************************************************************************************
            MULT:  MOV A,R6   ;[无符号双字节数乘法子程序]
                   MOV B,R4    ;取低位相乘
                   MUL AB
                   MOV @R0,A
                   MOV R3,B
                   MOV A,R4
                   MOV B,R7
                   MUL AB
                   ADD A,R3
                   MOV R3,A
                   MOV A,B
                   ADDC A,#00H
                   MOV R2,A
                   MOV A,R6
                   MOV B,R5
                   MUL AB
                   ADD A,R3
                   INC R0
                   MOV @R0,A
                   CLR 5BH
                   MOV A,R2
                   ADDC A,B
                   MOV R2,A
                   JNC LAST
                   SETB 5BH    ;置进位标志
            LAST:  MOV A,R7
                   MOV B,R5
                   MUL AB
                   ADD A,R2
                   INC R0
                   MOV @R0,A   ;存积的第二字节
                   MOV A,B
                   ADDC A,#00H
                   MOV C,5BH
                   ADDC A,#00H
                   INC R0
                   MOV @R0,A
                   RET
;****************************************************************************************
;****************************************************************************************
;****************************************************************************************
;****************************************************************************************
      HBD2: MOV R4,#4 ;四位十进制码
      HBD3: MOV A,R3  ;原小数扩大十倍
      MOV B,#10
      MUL AB
      MOV R3,A
      MOV R5,B
      MOV A,R2
      MOV B,#10
      MUL AB
      ADD A,R5
      MOV R2,A
      CLR A
      ADDC A,B
      PUSH ACC ;保存溢出的一位十进制码
      DJNZ R4,HBD3 ;算完四位十进制码
      POP ACC ;取出万分位
      MOV R3,A
      POP ACC ;取出千分位
      SWAP A
      ORL A,R3 ;拼装成低字节BCD码小数
      MOV R3,A
      POP ACC ;取出百分位
      MOV R2,A
      POP ACC ;取出十分位
      SWAP A
      ORL A,R2 ;拼装成高字节BCD码小数
      MOV R2,A
      RET
;************************************************************************************
;入口地址@R0,其中@R0放该数在小数点前的位数,@R0+1和@R0+2中放四位BCD码

⌨️ 快捷键说明

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