📄 基于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 + -