?? pwm_pulse.asm
字號:
/********************CCU_Capture.asm***************************
;程序功能:對一方波的每一次電平跳變進行捕獲,并用捕獲值計算方波
的脈沖寬度,占空比,周期或其他。
;************************************************************/
$NOMOD51
$INCLUDE(REG932.INC)
ICRAH_DAT1 DATA 41H ;第一次捕獲值高字節
ICRAL_DAT1 DATA 42H ;第一次捕獲值低字節
ICRAH_DAT2 DATA 43H ;第二次捕獲值高字節
ICRAL_DAT2 DATA 44H ;第二次捕獲值低字節
ICRAH_DAT3 DATA 45H ;第三次捕獲值高字節
ICRAL_DAT3 DATA 46H ;第三次捕獲值低字節
CAP_FLAG1 BIT 10H ;第一次捕獲標志位
CAP_FLAG2 BIT 11H ;第二次捕獲標志位
KEY BIT P0.0
ORG 0000H
AJMP MAIN
ORG 005BH
AJMP CCU_ISR
;---------------------------------------
;功能:主函數
;---------------------------------------
ORG 0080H
MAIN:
MOV P2M1,#40H ;端口設置
MOV P2M2,#40H
MOV ICRAL_DAT1,#00H
MOV ICRAH_DAT1,#00H
MOV ICRAL_DAT2,#00H
MOV ICRAH_DAT2,#00H
MOV ICRAL_DAT3,#00H
MOV ICRAH_DAT3,#00H
MAIN_LOOP:
JB KEY,$ ;等待按鍵
JNB KEY,$ ;等待按鍵松開
ACALL INI_CCU ;初始化CCU并設置中斷
ACALL DISP ;將捕獲的值輸出顯示
SJMP MAIN_LOOP
RET
;--------------------------------------
;功能:CCU初始化
;--------------------------------------
INI_CCU:
MOV TOR2H,#00H ;設置CCU重裝高字節
MOV TOR2L,#00H ;設置CCU重裝低字節
MOV TPCR2H,#00H ;設置CCU預分頻控制器
MOV TPCR2L,#5
MOV CCCRA,#10H ;設置捕獲比較A通道工作方式,為上升沿捕獲
MOV TICR2,#81H ;設置CCU中斷使能控制器
SETB ECCU ;開CCU中斷
SETB EA ;開所有中斷
MOV TCR20,#00000001B ;設置CCU工作方式,遞增記數
RET
;--------------------------------------
;功能:CCU中斷服務程序
;--------------------------------------
CCU_ISR:
CLR EA
MOV A,TISE2
ANL A,#07H
CJNE A,#07H,CAP ;判斷是否是CCU定時器中斷
ANL TIFR2,#7FH ;是則清TIFR2(中斷標志位)為0
MOV A,TISE2
CAP: CJNE A,#06H,INTS_CEXT ;判斷是否為輸入捕獲事件A的中斷,不是則退出
JB CAP_FLAG1,CAP2 ;判斷是第二次中斷么,是則跳
;------------------
CAP1:
PUSH ACC
MOV A,ICRAL
MOV ICRAL_DAT1,A
MOV A,ICRAH
MOV ICRAH_DAT1,A
SETB CAP_FLAG1 ;第一次捕獲中斷完成
MOV CCCRA,#00H ;設置捕獲比較A通道工作方式,為下降沿捕獲
POP ACC
AJMP INTS_CEXT
;------------------
CAP2:
PUSH ACC
JB CAP_FLAG2,CAP3 ;判斷是第三次中斷么?是則跳到CAP3。
MOV A,ICRAL ;保存第二次捕獲的值
MOV ICRAL_DAT2,A
MOV A,ICRAH
MOV ICRAH_DAT2,A
SETB CAP_FLAG2 ;第二次捕獲中斷完成
MOV CCCRA,#10H ;設置捕獲比較A通道工作方式,為上升沿捕獲
POP ACC
AJMP INTS_CEXT
;-------------------
CAP3:
MOV TCR20,#00H ;停止CCU定時器計數
PUSH ACC
MOV A,ICRAL ;保存第三次捕獲的值
MOV ICRAL_DAT3,A
MOV A,ICRAH
MOV ICRAH_DAT3,A
CLR CAP_FLAG1 ;清除捕獲完成位
CLR CAP_FLAG2
POP ACC
; AJMP INTS_CEXT
;--------------------
INTS_CEXT:
MOV TIFR2,#00H ;捕獲中斷標志位清0
SETB EA
RETI
;-------------------------------------
;功能:請在這里添加您的數據處理程序
;-------------------------------------
DISP:
;...... 這里請添加你自己的語句,例 高電平脈寬=(ICRAH_DAT2,ICRAL_DAT2)-(ICRAH_DAT1,ICRAL_DAT1)
;...... 對得到的數據進行處理,獲取所需的值
;...... 并顯示或者傳送給上位機
RET
;-------------------------------------
END
;****************************************************************
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -