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

📄 基于p89v51rb2的频率周期测试.asm

📁 基于 P89V51RD2D 的脉宽测试!
💻 ASM
字号:
;****************************************************************
;工程名称:基于P89V51RD2的脉宽测试
;创建时间:08-08-2
;修改时间:08-08-27
;修改内容:动态采集基值,判别是否上车
;修改者  :陶学文

;**************寄存器单元定义************************************
temp          EQU 2FH  ;

PCA_OldValueL EQU 30H  ; PCA
PCA_OldValueH EQU 31H
PCA_NEWValueL EQU 32H
PCA_NEWValueH EQU 33H
CYC_Timers    EQU 34H  ; 周期采样次数存储单元
INT_COUNT     EQU 35H  ; 中断0,进入次数
Big           EQU 36h  ; 实时采样频率与基值之差>3次数
Small         EQU 37H  ; 实时采样频率与基值之差<3次数
TimeL         EQU 38H
TimeH         EQU 39H  ; 进入中断次数,作为计时用

Margin_ValueL EQU 3AH  ;无车时的频率值—有车时的频率值 结果存放低位
Margin_ValueH EQU 3BH  ;

BFAL          EQU 3CH  ;A线圈基值频率低位
BFAH          EQU 3DH

RTFAL         EQU 3EH  ;A线圈 实时采样频率低位
RTFAH         EQU 3FH  ;

FirstAL       EQU 40H
FirstAH       EQU 41H

RTBFA_T       EQU 42H  ;A线圈 实时基值频率采样次数

;*****************************************************************

;***************标志位定义****************************************
fPCA          BIT 00H               ;第一次PCA进入中断标志
PCAOK         BIT 01H               ;PCA采样完毕标志
bCome         BIT 02H               ;车来标志
Have_CAR      BIT 03H               ;线圈有车
BigBF         BIT 04H               ;=1,线圈实时采集频率大于基值频率
HaveBf        BIT 05H               ;A线圈有基准频率


;***********************参数列表***********************************
dCYC_Timers    DATA    70H      ;采样周期数预设值
dBF_Limen      DATA    03H      ;基值采样门槛值
dBF_Timers     DATA    30H   	;基值采样次数
dCome_Limen    DATA    04H	;上车门槛值
dOK_Timers     DATA    03H	;来车确认次数

leave_value    DATA    01H      ;离开值

DTL1           DATA    60H      ;定时器1初装值
DTH1           DATA    0F0H

;***********************IO口线定义***********************************
BUZZER         BIT  P1.2
LED            BIT  P3.2
;**********************特殊寄存器定义*****************************

   AUXR   EQU 08EH
   AUXR1  EQU 0A2H
   ;SADDR  EQU 0A9H
   ;IPH    EQU 0B7H
   ;SADEN  EQU 0B9H
   CCON   EQU 0D8H
   CMOD   EQU 0D9H

   CCAPM0 EQU 0DAH
   CCAPM1 EQU 0DBH
   CCAPM2 EQU 0DCH
   CCAPM3 EQU 0DDH
   CCAPM4 EQU 0DEH
   CL     EQU 0E9H
   CCAP0L EQU 0EAH
   CCAP1L EQU 0EBH
   CCAP2L EQU 0ECH
   CCAP3L EQU 0EDH
   CCAP4L EQU 0EEH
   CH     EQU 0F9H

    CCAP0H EQU 0FAH
    CCAP1H EQU 0FBH
    CCAP2H EQU 0FCH
    CCAP3H EQU 0FDH
    CCAP4H EQU 0FEH

    IEN0   EQU 0A8H
    IEN1   EQU 0E8H
    IP0    EQU 0B8H
    IP0H   EQU 0B7H
    IP1    EQU 0F8H
    IP1H   EQU 0F7H

    FCF    EQU 0B1H
    FFS    EQU 0B2H
    FAL    EQU 0B3H
    FAH    EQU 0B4H
    FDAT   EQU 0B5H
    FST    EQU 0B6H
    SPCTL  EQU 0D5H
    SPCFG  EQU 0AAH
    SPDAT  EQU 086H
    WDTC   EQU 0C0H
    WDTD   EQU 085H



;  IEN0  */
   ;EA   BIT IE.7;
   EC   BIT IE.6;
   ;ET2  BIT IE.5;
   ;ES   BIT IE.4;
   ;ET1  BIT IE.3;
   ;EX1  BIT IE.2;
   ;ET0  BIT IE.1;
   ;EX0  BIT IE.0;

;  IP0   */
   PPC  BIT IP.6;
   ;PT2  BIT IP.5;
   ;PS   BIT IP.4;
   ;PT1  BIT IP.3;
   ;PX1  BIT IP.2;
   ;PT0  BIT IP.1;
   ;PX0  BIT IP.0;

;  CCON
   CF    BIT CCON.7 ;
   CR    BIT CCON.6 ;
   CCF4  BIT CCON.4;
   CCF3  BIT CCON.3;
   CCF2  BIT CCON.2;
   CCF1  BIT CCON.1;
   CCF0  BIT CCON.0;

;---------------------------------------------------------------------------

;;;;;;-------------------------- 复位,中断程序入口 --------

		ORG  0000H
RESET:	LJMP  START_OK		; 跳至主程序 MAIN

		ORG  0003H
	RETI ;LJMP  INT0	; 外部中断0

		ORG  000BH
	LJMP  T0_Collect                 ;限时接收采集板数据

		ORG  0013H
	RETI ;LJMP  INT1   	; 外部中断1

                ORG  001BH
        RETI;LJMP  T1_Server	                ; 限时和服务器连接

		ORG  0023H
	RETI;LJMP  ES_INT           		; 串口中断程序

		ORG  002BH
	RETI            		; 时基中断程序

        	ORG  0033H
	LJMP  PCA_INT            		; PCA 中断程序

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;         初始化部分					;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  	   ORG 0050H
START_OK:
        MOV   SP,#60H

        CLR   Buzzer
        CLR   LED

        MOV   20H,#0
        ;LCALL DELAY
        ;LCALL DELAY
        ;LCALL DELAY
        ;LCALL DELAY
        ;LCALL DELAY
        ;LCALL DELAY
        ;LCALL DELAY
        ;LCALL DELAY


RAM0:   CLR   A
        MOV   R7,#0F8H		; 内部RAM08H~0FFH
        MOV   R0,#08H		; 清零
RAM1:   MOV   @R0,A
        INC   R0
        DJNZ  R7,RAM1

;---------定时器 串口初始化
	MOV   TMOD,#00010001B   ;
        MOV   TL1,#DTL1         ; 70ms定时
        MOV   TH1,#DTH1

        MOV   TL0,#DTL1         ; 70ms定时
        MOV   TH0,#DTH1

        CLR   PT1               ; T0高级中断;
        CLR   ET1	        ; 开T1中断

        CLR   PT0               ; T1高级中断;
        SETB  ET0	        ; 开T1中断

        MOV   SCON,#50H         ; 串行口工作于方式1
        SETB  ES		; 串口允许中断

        MOV   PCON,#00H
        MOV   T2CON,#30H        ; T2用于接受和发送的波特率发生器
        MOV   RCAP2L,#0F3H      ; 波特率=115200 11.0592
        MOV   RCAP2H,#0FFH
        MOV   TL2,#0F3H
        MOV   TH2,#0FFH
        MOV   T2MOD,#00H        ;                           _

        SETB  TR0
        CLR   TR1
        SETB  TR2
	SETB  EA

;-----------------PCA初始化
       	MOV   CCAPM0,#30H   ;		// 下降沿捕获
	MOV   CMOD,#02H     ;		//PCA计数脉冲fsoc/2
	SETB  EC           ;		//PCA中断使能
	SETB  CR           ;		//PCA运行控制

        CLR    ES

Init_LP1:
        JNB    PCAOK,$
        CLR    PCAOK
        INC    temp
        LCALL  JISUAN
        LCALL  BF_Collection    ;强行采样255次
        CPL    BUZZER
        MOV    A,temp
        CJNE   A,#0FFH,Init_LP2
Init_LP2:
        JC     Init_LP1


        SETB   Buzzer
        SETB   LED

;****************************************
MAIN:
        JNB   PCAOK,MAINLOOP
        CLR   PCAOK
        CLR   FPCA
        LCALL JiSuan
        ;LCALL SCAN_LOOP
        LCALL Send_Debug


MAINLOOP:
        SJMP  MAIN

;****************************************************************
;有车时差值发送程序
Send_Value:
        CLR   TI
        MOV   SBUF,Margin_ValueH
        JNB   TI,$

        CLR   TI
        MOV   A,B
        MOV   SBUF,Margin_ValueL
        JNB   TI,$
        RET

;****************************************************************
;有车时差值发送程序
Send_Debug:

        CLR   TI
        MOV   SBUF,RTFAH
        JNB   TI,$
        CLR   TI

       ; MOV   A,B
        MOV   SBUF,RTFAL
        JNB   TI,$
        CLR   TI
        RET


;****************************************************************
;有车时差值发送程序
Send_OverFlage:
        CLR   TI
        MOV   SBUF,BFAH
        JNB   TI,$

        CLR   TI
        MOV   SBUF,BFAL
        JNB   TI,$

        CLR   TI
        MOV   SBUF,#55H
        JNB   TI,$
        CLR   TI

       ; MOV   A,B
        MOV   SBUF,#0AAH
        JNB   TI,$
        CLR   TI
        RET
;****************************************************************
; 计算处理
JiSuan:
        CLR  C
        MOV  A,PCA_NEWValueL
        SUBB A,PCA_OldValueL
        MOV  RTFAL,A

        MOV  A,PCA_NEWValueH
        SUBB A,PCA_OldValueH            ;计算脉宽
        MOV  RTFAH,A
        RET
        JNC  PCA_LP3

        MOV  A,PCA_OldValueL
        CPL  A
        ADD  A,#01H
        MOV  PCA_OldValueL,A

        MOV  A,PCA_OldValueH
        CPL  A
        ADDC A,#00H
        MOV  PCA_OldValueH,A

        MOV  A,PCA_OldValueL
        ADD  A,PCA_NEWValueL
        MOV  RTFAL,A


        MOV  A,PCA_OldValueH
        ADDC A,PCA_NEWValueH
        MOV  RTFAH,A


PCA_LP3:

        RET
;****************************************************************
;线圈扫描程序

SCAN_LOOP:
        JNB   HaveBf,F_DisposeA2 ;没有基值频率,直接采集基值

        CLR   C
        MOV   A,BFAL
        SUBB  A,RTFAL
        MOV   Margin_ValueL,A

        MOV   A,BFAH
        SUBB  A,RTFAH
        MOV   Margin_ValueH,A
        JC    FA_SMALL          ;转到小于部分处理

        CLR   C
        MOV   A,Margin_ValueL
        SUBB  A,#dCome_Limen
        MOV   A,Margin_ValueH
        SUBB  A,#00H
        JC    FA_SMALL          ;转到小于部分处理


        MOV   SMALL,#00H
        JB    bCome,F_DisposeA1   ;有车时间是否超限

        INC   Big
        CLR   C
        MOV   A,Big              ;来车确认处理
        SUBB  A,#dOK_TimeRs
        JC    FDA_EXIT             ;没达到确认次数,退出

;===========A 线圈来车处理

        CLR   LED              ;指示灯
        CLR   Buzzer
        SETB  bCome
        SETB  Have_CAR               ;A 线圈有车'
        CLR   A
        MOV   RTBFA_T,A
        MOV   TIMEL,A             ;正常来车处理
        MOV   TIMEH,A

        LCALL Send_Value
        SJMP  FDA_EXIT

F_DisposeA1:
        LCALL Send_Value
        ;LCALL HaveA_Limit         ;车存在时间限时处理
        SJMP  FDA_EXIT

F_DisposeA2:
        LCALL BF_Collection              ;采集基值
        SJMP  FDA_EXIT
FA_SMALL:
        MOV   BIG,#00H
        INC   SMALL

        JNB   bCome,F_DisposeA2  ;当前没有车,直接采集基值

        MOV   A,#08H
        CJNE  A,SMALL,FDA_SLP1
FDA_SLP1:
        JNC   FDA_EXIT
        CLR   bCome
        LCALL Send_OverFlage
        SETB  LED
        SETB  Buzzer             ;逆行离开处理
FDA_EXIT:
         RET

;;;*****实时基值频率采集***************
BF_Collection:
        MOV   A,RTBFA_T
        JNZ   RTA_LP1
        MOV   FIRSTAL,RTFAL
        MOV   FIRSTAH,RTFAH
        INC   RTBFA_T
        SJMP  RTA_EXIT
RTA_LP1:
        CLR   C
        MOV   A,FIRSTAL         ;准基准值和实时值相减
        SUBB  A,RTFAL
        MOV   B,A
        MOV   A,FIRSTAH
        SUBB  A,RTFAH

        JNC   RTA_LP2

        MOV   A,B
        CPL   A
        ADD   A,#01H
        MOV   B,A
RTA_LP2:
        CLR   C
        MOV   A,B
        SUBB  A,#dBF_Limen
        JC    RTA_LP3
        MOV   RTBFA_T,#00H
        SJMP  RTA_EXIT
RTA_LP3:
        INC   RTBFA_T
        MOV   A,RTBFA_T
        CJNE  A,#dBF_Timers,RTA_EXIT
        SETB  HaveBf
        MOV   BFAL,FIRSTAL
        MOV   BFAH,FIRSTAH
        MOV   RTBFA_T,#00H
RTA_EXIT:
        RET


;********************定时中断0**************
T0_Collect:

        MOV   TL0,#DTL1         ; 2ms定时
        MOV   TH0,#DTH1

        INC   INT_Count

        CLR   C
        MOV   A,INT_Count
        SUBB  A,#02H
        JC    T0_RET

        ;MOV   CCAPM0,#11H
        ORL   CCAPM0,#01H       ;允许模块0中断
        MOV   INT_Count,#00H
        MOV   CCON,#40H         ;屏蔽所有模块 PCA溢出中断标志位

T0_RET:    RETI


;********************PCA_INT***************
PCA_INT:
        JNB   CCF0,PCA_RET
        JB    fPCA,PCA_LP1

        SETB  fPCA
        MOV   PCA_OldValueH,CCAP0H
        MOV   PCA_OldValueL,CCAP0L
        SJMP  PCA_RET

PCA_LP1:
        INC   CYC_Timers
        MOV   A,CYC_Timers
        CJNE  A,#dCYC_Timers,PCA_LP2
PCA_LP2:
        JC    PCA_RET
        MOV   CYC_Timers,#00H
        ANL   CCAPM0,#0FEH

        MOV   PCA_NEWValueH,CCAP0H
        MOV   PCA_NEWValueL,CCAP0L


        SETB  PCAOK
PCA_RET:
        MOV   CCON,#40H         ;屏蔽其他中断标志位
           RETI

;;;;;=================== DELAY==================
;;;;;	功能: 延时1ms
;;;;;	资源:R7
;;;;;	入口:
;;;;;	出口:
DELAY:  MOV  R7,#100
DEY_01: NOP
        NOP
        NOP
        DJNZ R7,DEY_01
        RET

⌨️ 快捷键说明

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