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

📄 ad674.asm

📁 通过单片机80C196单片机读取AD转换AD754值的子程序
💻 ASM
字号:
;************************************************
;ad674.asm
;程序模快功能介绍:读取AD转换的电压值
;返回参数:电压值:AD674_DATA
;************************************************

;--------------在导通测试时读取导通值------------
read_ad674_cond:
        LD AX,#05000H
        DJNZW AX,$

        ;ORB PORT1_DA,#02H
        ;LDB PORT1,PORT1_DA             ;对R/C 置1
        ;NOP
        ;NOP
        ;NOP
        ;NOP
        ;NOP

        ;LD AX,#5000H
        ;DJNZW AX,$

        ;LDB MXL,#10
        ;LD AX,#0000H

;read_ad674_cond1:
        ;ANDB PORT1_DA,#0FDH            ;对R/C 置0,即开始转换
        ;LDB PORT1,PORT1_DA
        ;NOP
        ;NOP
;read_ad674_cond2:
        ;LDB FXL,PORT2
        ;JBS FXL,7,read_ad674_cond2     ;检查忙信号
        ;ORB PORT1_DA,#02H
        ;LDB PORT1,PORT1_DA             ;对R/C 置1
        ;NOP
        ;NOP
        ;NOP
        ;NOP
        ;NOP
        ;NOP
        ;LDB CXL,AD_DATALO_ADD[0]
        ;LDB CXH,AD_DATAHI_ADD[0]
        ;ANDB CXH,#0FH
        ;ADD AX,CX
        ;DJNZ MXL,read_ad674_cond1
        ;
        ;LD BX,#0
        ;LD CX,#10
        ;DIVU AX,CX                     ;AX为10次测试的平均值
        ;
        ;LD BX,#0
        ;LD CX,#244                     ;0.00244 V
        ;MULU AX,CX
        ;
        ;LD CX,#100                     ;因为在测试导通时,只要精确到1mV 即0.01 OHM
        ;DIVU AX,CX                     ;将小数点向前移三位
        CALL read_ad674
        LD AD674_DATA,AX
        RET
;---------------------------绝缘测试测量----------------------------
;输入参数:REG_64H为测试规格,REG_5AH测试电压
;输出参数:REG_6AH为测量出来的不良值,REG_67H为00时表示测试通过
;计算时的最小值为10K,0.010000M
read_ad674_ins:
        DI
        ORB PORT1_DA,#02H
        LDB PORT1,PORT1_DA             ;对R/C 置1
        NOP
        NOP
        LDB REG_67H,#00H               ;对测试结果寄存器初始化

        LDB AXL,#11000000B             ;切换测试电压信号
        STB AXL,CHUNNEL_ADD[0]
        NOP
        NOP
        LD AX,#01FFH
        DJNZW AX,$
        NOP
        NOP
        CALL read_ad674                ;测量测试电压
        LD BX,#00H
        LD CX,#3034                    ;缩小倍数
        MULU AX,CX
        LD CX,#1000                    ;精确到0.01V
        DIVU AX,CX
        LD CX,#100
        MULU AX,CX
        LD REG_5AH,AX                  ;REG_5AH存放的为所测试电压的值
        LD REG_5AH_H,BX

        LDB AXL,#11000111B             ;切换到放大了200倍绝缘电压信号
        STB AXL,CHUNNEL_ADD[0]
        NOP
        NOP
        LD AX,#01FFH
        DJNZW AX,$
        NOP
        NOP
        CALL read_ad674                ;测量测试信号电压
        CMP AX,#9991
        JE read_ad674_ins1
        CMP AX,#671;#792
        JNH ins200_au1

        SUB AX,#670;#361;#561
        LD USUMB1,#2000                ;Au=200.0
        JMP read_ad674_ins3
ins200_au1:
        LD USUMB1,#2000                ;Au=200.0
        LD AX,#9
        JMP read_ad674_ins3

read_ad674_ins1:
        LDB AXL,#11000110B             ;切换到放大了20倍绝缘电压信号
        STB AXL,CHUNNEL_ADD[0]
        NOP
        NOP
        LD AX,#01FFH
        DJNZW AX,$
        NOP
        NOP
        CALL read_ad674                ;测量测试信号电压
        CMP AX,#9991
        JE read_ad674_ins2
        CMP AX,#63
        JNH ins20_au
        SUB AX,#63
ins20_au:
        LD USUMB1,#200                 ;Au=20.O
        JMP read_ad674_ins3

read_ad674_ins2:
        LDB AXL,#11000100B             ;切换到放大了2倍绝缘电压信号
        STB AXL,CHUNNEL_ADD[0]
        NOP
        NOP
        LD AX,#01FFH
        DJNZW AX,$
        NOP
        NOP
        CALL read_ad674                ;测量测试信号电压
        LD USUMB1,#20                 ;Au=2.0

read_ad674_ins3:

        CMP AX,#00H                    ;若测试到的电压为0V则绝缘阻值大于500M
        JE read_ad674_ins_pass
        LD IAX,AX
        ;------------------------------计算绝缘阻值 OHM=(Vt/Vc)*Au-2
        LD AX,REG_5AH
        LD BX,REG_5AH_H
        LD CX,ZERO
        LD DX,ZERO


        LD EX,IAX
        LD FX,ZERO

        CALL UDIV

        LD CX,AX
        LD DX,USUMB1
        MULU AX,CX,DX                  ;(Vt/Vc)*Au
        LD CX,ZERO
        LD DX,ZERO
        LD EX,#10
        LD FX,ZERO

        CALL UDIV

        CMP BX,#0
        JNE read_ad674_ins_pass
        ;------------------------------PASS
read_ad674_ins18:
        CMP AX,#2
        JNH read_ad674_ins_ng1
        LD BX,#2
        SUB AX,BX
read_ad674_ins17:
        LD BX,#0
        LD CX,#10
        DIVU AX,CX

        CMP AX,REG_64H
        JE read_ad674_ins_pass
        CMP AX,REG_64H
        JH read_ad674_ins_pass
        ;------------------------------ERROR
        CMP AX,#0
        JE read_ad674_ins_ng1
        CMP AX,#9
        JNH read_ad674_ins_ng1
        LD REG_6AH,AX
        LDB REG_67H,#01H
        EI
        RET

read_ad674_ins_pass:
        LD REG_6AH,#0
        EI
        RET

read_ad674_ins_ng1:
        LD REG_6AH,#0FFFFH             ;但高位字节为0FFH时表示绝缘阻值小于1M
        LDB REG_67H,#01H
        EI
        RET
;--------------------------------------读取AD值 1mV
;返回参数:AX 单位:1mV
read_ad674:
        LD MXL,#100h;#900;1000;#500
        LD USUMB1,#0000H
        LD USUMB2,#0000H

read_ad674_1:
        ANDB PORT1_DA,#0FDH            ;对R/C 置0,即开始转换
        LDB PORT1,PORT1_DA

read_ad674_2:
        LDB FXL,PORT2
        JBS FXL,7,read_ad674_2         ;检查忙信号
        ORB PORT1_DA,#02H
        LDB PORT1,PORT1_DA             ;对R/C 置1
        NOP
        NOP
        LDB IAXL,AD_DATALO_ADD[0]
        LDB IAXH,AD_DATAHI_ADD[0]

        ANDB IAXH,#0FH

        ADD	USUMB1,IAX
	ADDC	USUMB2,ZERO

        LD AX,#10h;#35;#75
        DJNZW AX,$

        DJNZW MXL,read_ad674_1

        LD AX,USUMB1
        LD BX,USUMB2
        LD EX,#100h;#900;1000;#500
        DIVU AX,EX

        LD BX,#0
        LD CX,#244
        MULU AX,CX

        LD CX,#100
        DIVU AX,CX                     ;将小数点向前移三位

        RET
;--------------------------------------读取AD值 10mV
;返回参数:CX 单位:10mV
read_10ad674:
        LD MXL,#800
        LD USUMB1,#0000H
        LD USUMB2,#0000H

read_10ad674_1:
        ANDB PORT1_DA,#0FDH            ;对R/C 置0,即开始转换
        LDB PORT1,PORT1_DA

read_10ad674_2:
        LDB FXL,PORT2
        JBS FXL,7,read_10ad674_2         ;检查忙信号
        ORB PORT1_DA,#02H
        LDB PORT1,PORT1_DA             ;对R/C 置1
        NOP
        NOP
        LDB IAXL,AD_DATALO_ADD[0]
        LDB IAXH,AD_DATAHI_ADD[0]
        ANDB IAXH,#0FH
        ADD	USUMB1,IAX
	ADDC	USUMB2,ZERO
        ADDC    USUMB3,ZERO

        LD AX,#32;#75
        DJNZW AX,$

        DJNZW MXL,read_10ad674_1

        LD AX,USUMB1
        LD BX,USUMB2
        LD CX,ZERO
        LD DX,ZERO
        LD EX,#800
        LD FX,ZERO

        CALL UDIV

        LD BX,#0
        LD CX,#244
        MULU AX,CX

        LD CX,#1000
        DIVU AX,CX                     ;将小数点向前移三位

        RET
;--------------------------------------
;单端读取 返回参数:AXL
ad674_single:
        PUSH GX

        ;CALL read_ad674

        LDB MXL,#5H
        LD GX,#0020H

ad674_single1:
        ANDB PORT1_DA,#0FDH            ;对R/C 置0,即开始转换
        LDB PORT1,PORT1_DA

ad674_single2:
        LDB FXL,PORT2
        JBS FXL,7,ad674_single2        ;检查忙信号
        ORB PORT1_DA,#02H
        LDB PORT1,PORT1_DA             ;对R/C 置1
        NOP
        NOP
        LDB FXL,AD_DATALO_ADD[0]
        LDB FXH,AD_DATAHI_ADD[0]
        ANDB FXH,#0FH
        STB FXL,[GX]+
        STB FXH,[GX]+
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        DJNZ MXL,ad674_single1
        CALL taxisdata

        LDB CXL,#2
        DIVUB AX,CXL                     ;将小数点向前移三位

        ;CMPB AXL,#127
        ;JH ad674_single3
        ;LDB BXL,#02
        ;MULUB AX,BXL
        ;POP GX
        ;RET
ad674_single3:
        CMPB AXL,#0FEH
        JH ad674_single31
        POP GX
        RET

ad674_single31:
        LDB AXL,#0FEH
        POP GX
        RET

;----------------------------------------------------
        ;END

⌨️ 快捷键说明

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