================================================================
;问题:测量的波形周期大于1ms
;采用外部晶振,2M divm=0; ccu频率四分频
;所以计数1为4us 一个周期计数差最少为250(0xfa),而实际试验时发现计数差会比245(0xf5)小
;-----------------------------------------------------------------
DIVM EQU 95H
TPCR2H EQU 0CBH
TPCR2L EQU 0CAH
P0M1 EQU 84H
P0M2 EQU 85H
P1M1 EQU 91H
P1M2 EQU 92H
P2M1 EQU 0A4H
P2M2 EQU 0A5H
IEN1 EQU 0E8H
IEN2 EQU 0D5H
TH2 EQU 0CDH
TL2 EQU 0CCH ;CCU定时器计数器
OCRAH EQU 0EFH ;比较寄存器
OCRAL EQU 0EEH
ICRAH EQU 0ABH ;捕捉寄存器
ICRAL EQU 0AAH
TIFR2 EQU 0E9H ;CCU中断标志寄存器
TICR2 EQU 0C9H ;CCU中断控制寄存器
TCR20 EQU 0C8H
TCR21 EQU 0F9H ;
CCCRA EQU 0EAH ;
FInterFirst EQU 2 ;中断第一次
;=============================================================================
ORG 0000H
LJMP Start
ORG 0003
RETI
ORG 002BH ;掉电检测 BOF
RETI
ORG 003BH ;KBI中断 KBF
RETI
ORG 005BH ;CCU中断 比较/捕获
LJMP Lab0927
;--------------------------------------------------
;程序区
ORG 0070H
Start:
MOV SP,#0D0H
CALL RegIntial
CLR 2BH.FInterFirst
SETB P2.0 ;关闭LED
SETB IEN1.4 ;使能ECCU
SETB EA
ORL TICR2,#01H
ORL TICR2,#08H
Stopsub:
JMP StopSub
;========================================================================
RegIntial:
CLR EA
MOV DIVM,#00H ;Fcclk=2M 2~4机器周期(指令周期) 1M~0.5M moto:约0.25M
;pclk=fcclk=1M
MOV TPCR2H,#00
MOV TPCR2L,#03H ;ccuclk=0.25M
MOV P1M1,#29H
MOV P1M2,#0DEH ;P1.0为输入,P1.5输入,其它为推挽输出
MOV P1,#04H
MOV P0M1,#3EH ;P0.1 p0.2 p0.3 p0.4 p0.5输入
MOV P0M2,#00H
MOV P0,#0FFH
MOV P2M1,#80H ;P2.0 p2.4 p2.5 输出,p2.7输入,其它也设为输出
MOV P2M2,#07FH ;p2.2 p2.3 双向口
MOV P2,#0FFH
MOV TICR2,#00H
MOV TCR20,#01H
MOV CCCRA,#01H
SETB IEN1.4 ;使能ECCU
SETB EA
RET
;====================================================================
;中断子程序
;16 BIT timer
Lab0927:
PUSH ACC
PUSH PSW
MOV A,TIFR2
JNB ACC.0,aaaINT
ANL TIFR2,#0FEH
CPL P2.0 ;通过看这个脚的波形,知道捕获中断什么时候进来了
MOV A,ICRAL
MOV 57H,A
MOV A,ICRAH
MOV 58H,A
JNB 2BH.FInterFirst,cccINT
MOV A,57H
CLR C
SUBB A,59H
MOV 59H,A
MOV A,58H
SUBB A,5AH
MOV 5AH,A ;计算出间隔值
MOV A,59H
CLR C
SUBB A,#0F5H
MOV 59H,A
MOV A,5AH
SUBB A,#00H ;间隔值与立即数0xf5比较
MOV 5AH,A
JC aa55
jmp cccINT
aa55:
call ErrorSub ;不应该到此
cccINT:
SETB 2BH.FInterFirst
MOV A,57H
MOV 59H,A
MOV A,58H
MOV 5AH,A
;ccu ocra中断
aaaINT:
MOV A,TIFR2
JNB ACC.3,INTE
ANL TIFR2,#0F7H
INTE:
POP PSW
POP ACC
RETI
;=========================================================
;死循环,中断停止使能
ErrorSub:
setb p1.1
clr ea
clr p2.0 ;灯一直亮
jmp ErrorSub
;==================================================================
END
;================================================================== |