基于51单片机的连续采样消抖子程序

ORG 0000H
MOV SP, #7FH

main:
MOV SPsum, #100
MOV SPLvDE, #8
LCALL Sampling
MOV P1, SPcorrectStatus

SJMP main


;------------------------------------------------------ 子程序文档
; Sampling (采样总数, 消抖等级)  /  return  -  正确的状态
; 执行周期 = 89+(2[采样总数+1])+(4[采样总数-1])+A+B

; A --- 预期在计数中占多数的状态
; 1,0 = 7*(采样总数-1)
; 0,1 = 10*(采样总数-1)
; 0,0 = 13*(采样总数-1)
; 1,1 = 16*(采样总数-1)

; B --- 预期超过阈值的状态
; 1,0 = 62
; 0,1 = 114
; 0,0 = 170
; 1,1 = 226
;------------------------------------------------------ 内部变量声明
SPsum DATA 30H ; 采样总数 ---- input
SPLvDE DATA 31H ; 消抖等级 ---- input
SPcorrectStatus DATA 32H ; 正确的状态 --- return

;------------------------------------------------------ Sampling-子程序
Sampling: ; (单段连续采样+消抖等级设定) [缩写SP]
;------------------------------------------------------ 现场保护 PUSH
SPpush:
    PUSH ACC
    PUSH PSW

    PUSH 20H
    PUSH 21H

    PUSH 00H
    PUSH 01H
    PUSH 02H
    PUSH 03H
    PUSH 04H
    PUSH 05H
    PUSH 06H
;------------------------------------------------------ 内部工作寄存器设定
; input
; 20H -- 采样总数
; 21H -- 消抖等级

SPsetRn:
    MOV A  , #00H ; 清零
    MOV PSW, #00H
    
    MOV 20H, SPsum ; 传入
    MOV 21H, SPLvDE

    INC 20H ; 修正
;------------------------------------------------------ 子程序开始 [从中断到此处需34MC]
    SPuseRnT0:
    MOV R0, 20H
    SPwhileT1:
        DJNZ R0, SPsamplingT2 ; 采样次数--
        LJMP SPuseRnT7

        SPsamplingT2: ; 采集状态
            MOV C, P3.2
            MOV ACC.0, C
            MOV C, P3.3
            MOV ACC.1, C

            SPifT3:
                CJNE A, #00000010B, SPifT4
                INC R1
                LJMP SPwhileT1

            SPifT4:
                CJNE A, #00000001B, SPifT5
                INC R2
                LJMP SPwhileT1

            SPifT5:
                CJNE A, #00000000B, SPifT6
                INC R3
                LJMP SPwhileT1

            SPifT6:
                CJNE A, #00000011B, SPwhileT1
                INC R4
                LJMP SPwhileT1



    SPuseRnT7:
    MOV R0, 20H
    MOV R5, 21H
    SPthresholdT8: ; 阈值
        MOV A, R0
        MOV B, #10
        DIV AB
        MOV B, R5
        MUL AB
        MOV R6, A


    
    SPcompareT9:
        MOV DEvalueB, R6

        SPifT10: ; 返回 10
            MOV DEvalueA, R1
            LCALL decide

            MOV R0, DEdecideResult
            CJNE R0, #2, SPifT11
            MOV R5, #00000010B

            LJMP SPreturn

        
        SPifT11: ; 返回 01
            MOV DEvalueA, R2
            LCALL decide

            MOV R0, DEdecideResult
            CJNE R0, #2, SPifT12
            MOV R5, #00000001B

            LJMP SPreturn


        SPifT12: ; 返回 00
            MOV DEvalueA, R3
            LCALL decide

            MOV R0, DEdecideResult
            CJNE R0, #2, SPifT13
            MOV R5, #00000000B

            LJMP SPreturn


        SPifT13: ; 返回 11
            MOV DEvalueA, R4
            LCALL decide

            MOV R0, DEdecideResult
            CJNE R0, #2, SPreturn
            MOV R5, #00000011B

            LJMP SPreturn
;------------------------------------------------------ return
SPreturn:
    MOV SPcorrectStatus, R5
;------------------------------------------------------ 现场保护 POP
SPpop:
    POP 06H
    POP 05H
    POP 04H
    POP 03H
    POP 02H
    POP 01H
    POP 00H

    POP 21H
    POP 20H

    POP PSW
    POP ACC
;------------------------------------------------------ RET
SamplingRET:
    RET





















;------------------------------------------------------ 子程序文档
; decide (比较数 A,比较数 B)  /  return  - 判断返回值(大于=2/等于=1/小于=0)
; 返回 大于or等于 [52MC]
; 返回 小于 [50MC]
;------------------------------------------------------ 内部变量声明
DEvalueA DATA 33H ; 判断数 A ---- input
DEvalueB DATA 34H ; 判断数 B ---- input
DEdecideResult DATA 35H ; 判断返回值 ---- return

;------------------------------------------------------ 大小于比较-子程序
decide: ; (大小于比较) [缩写DE]
;------------------------------------------------------ 现场保护 PUSH
DEpush:
    PUSH ACC
    PUSH PSW

    PUSH 20H
    PUSH 21H

    PUSH 00H
    PUSH 01H
;------------------------------------------------------ 内部工作寄存器设定
; input
; R2 -- 判断数 A
; R3 -- 判断数 B

DERnSET:
    MOV A  , #00H ; 清零
    MOV PSW, #00H

    MOV 20H, DEvalueA ; 传入
    MOV 21H, DEvalueB
;------------------------------------------------------ 子程序 开始 
    DEuseRnT0:
    MOV R0, 20H
    MOV R1, 21H
    DEifT1:
        MOV A, R0
        SUBB A, R1
        JC DEsmallT2
        JNC DEifT3
        
        DEsmallT2: ; 判定 A < B
            MOV R0, #0
            LJMP DEreturn
    
        DEifT3:
            JZ DEequalT4
            JNZ DEbigT5
                
            DEequalT4: ; A = B
                MOV R0, #1
                LJMP DEreturn
    
            DEbigT5: ; A > B
                MOV R0, #2
                LJMP DEreturn
;------------------------------------------------------ return
DEreturn:
    MOV DEdecideResult, R0
;------------------------------------------------------ 现场保护 POP
DEPOP:
    POP 01H
    POP 00H

    POP 21H
    POP 20H
    
    POP PSW
    POP ACC
;------------------------------------------------------ RET
decideRET:
    RET

END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值