?? 基于p89v51rb2的頻率周期測試.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 + -