📄 djs2.asm
字号:
list p=16f630
include "P16F630.inc"
;----------------------------------------------------
;端口定义
;--------------------------------------------
RA EQU 05 ;
O_PW EQU 0 ;电源控制
O_FD EQU 1 ;防盗输出
O_LB EQU 2 ;喇叭输出
I_DM EQU 4 ;电门锁输入
I_DJ EQU 5 ;电机转动检测端
RC EQU 7
;---------------------------------------------
;寄存器定义
;---------------------------------------------
B_W EQU 20 ;备份W
B_STATUS EQU 21 ;备份STATUS
FLAG1 EQU 22 ;标志位
F_DM EQU 0 ;电门锁状态,有电=1,无电=0
F_DJ EQU 1 ;电机转动状态,转动=1,静止=0
F_YB EQU 2 ;预报警,
F_BJ EQU 3 ;报警状态,报警=1,不报警=0
F_LBJ EQU 4 ;在报警状态时,喇叭叫=1,喇叭间歇=0
F_F EQU 5 ;错误状态
F_YJ EQU 6
F_DMG EQU 7
; REG1 EQU 23
; REG2 EQU 24
; REG3 EQU 25
R_YJL EQU 26
R_YJH EQU 27
R_BJCT EQU 28
; REG4 EQU 29
R_SOUND EQU 30H ;声音频率变化计数器,从1.8~3.55KHZ
R_COUNT EQU 31H ;同一频率的重复次数保存地址
R_REPEAT EQU 32H
TEMP EQU 33H ;暂存寄存器
REGCKDJ EQU 34H
REGDY1 EQU 35H
REGDY2 EQU 36H
REGDY3 EQU 37H
REGCKDM1 EQU 38H
REGCKDM2 EQU 39H
REGBJ EQU 3AH
REGSOUND EQU 3BH
REGSD2 EQU 3CH
REGSD3 EQU 3DH
;-------------------------------------------------
;立即数定义
;-------------------------------------------------
S_BJCT EQU 2 ;警笛声次数
S_YJL EQU 0FFH ;预警时间
S_YJH EQU 0ffh
S_LOOP EQU 30 ;93-47=46
S_MAX EQU 93 ;最低频率1.8K 93*3=280US*2
S_MIN EQU 47 ;最高频率3.55K 47*3=140*2
S_REPEAT EQU 3 ;同一频率重复次数
S_LOOP1 EQU 46 ;93-47=46
S_MAX1 EQU 93 ;最低频率1.8K 93*3=280US*2
S_MIN1 EQU 47 ;最高频率3.55K 47*3=140*2
S_REPEAT1 EQU 0C ;同一频率重复次数
RAIF EQU 0
CMCON EQU 19
;----------------------------------------------------------
; 程序
;----------------------------------------------------------
ORG 0
GOTO MAIN ;
ORG 4
GOTO MAIN
ORG 8
;---------------------------------------------
MAIN BCF STATUS,RP0 ;初始化
MOVLW 55
MOVWF RC
MOVLW 7
MOVWF CMCON
;B7 B6 B5 B4 B3 B2 B1 B0
MOVLW 38H ;0 0 1 1 1 0 0 0
MOVWF RA ;NC NC I_DJ I_DM NC O_LB O_FD O_PW
BSF STATUS,RP0
MOVLW 38H ;00111000
MOVWF TRISA
MOVLW 0
MOVWF TRISC
MOVLW 87H ;10000111,TMR0用分频器,1:256,T0溢出周期=256*256US
MOVWF OPTION_REG
BCF STATUS,RP0
MOVLW 0
MOVWF INTCON ;中断控制字,关中断
CLRF FLAG1
CALL CK_DM
BTFSC FLAG1,F_DM
GOTO M_0 ;开机有电,鸣两声
GOTO M_1 ;开机无电,鸣一声
;-----------------------------
MMAIN CALL CK_DM
CLRWDT
BTFSS FLAG1,F_DM ;电门锁有电,
GOTO MM_0 ;电门锁没电,
BTFSC FLAG1,F_DMG ;电门锁原来没电,
GOTO MM_00 ;电门锁原来就有电
M_0 BSF FLAG1,F_DMG ;上电,鸣两声
CALL SOUND
MOVLW 10H
MOVWF REGDY3
CALL D_10MS
CALL SOUND
MM_00 BCF RA,O_PW
BSF RA,O_FD
BCF RA,O_LB
GOTO MMAIN
MM_0 BTFSS FLAG1,F_DMG ;电门锁原来有电,现在没电
GOTO MM_1 ;电门锁原来没电,现在也没电,防盗状态,去检测电机
M_1 BCF FLAG1,F_DMG ;关电,检测到电机停后鸣一声,进入防盗状态
M_10 CALL CK_DJT
BTFSC FLAG1,F_DJ
GOTO M_10 ;电机未停
CALL SOUND ;电机已停
BCF RA,O_PW ;?????
BSF RA,O_FD
BCF RA,O_LB
MOVLW 30H ;0.5S ;???
MOVWF REGDY3 ;???
CALL D_10MS ;???
GOTO MMAIN
MM_1 CALL CK_DJ ;防盗状态,检测电机是否转动
BTFSC FLAG1,F_DJ
GOTO MM_2 ;电机转动
BCF RA,O_PW ;电机不转动,保持防盗状态
BCF RA,O_LB
BSF RA,O_FD
GOTO MMAIN
MM_2 BCF RA,O_FD ;
BSF RA,O_PW ;==============
MOVLW S_BJCT
MOVWF R_BJCT
MM_20 CALL BJY ;BJ
CALL CK_DM
BTFSC FLAG1,F_DM
GOTO MM_21
DECFSZ R_BJCT
GOTO MM_20
MM_21 BCF RA,O_PW ;报警结束OR报警过程中电门上电,立即解除防盗状态
MOVLW 32H ;0.5S
MOVWF REGDY3
CALL D_10MS
BCF RA,O_LB
BSF RA,O_FD
GOTO MMAIN ;主程序结束
;-----------------------------------------------------
BJY MOVLW 15 ;报警组合音
MOVWF REGBJ
Y1 CALL SDJY ;急警音
CALL CK_DM
BTFSC FLAG1,F_DM
GOTO BJYR
DECFSZ REGBJ
GOTO Y1
MOVLW 4
MOVWF REGBJ
Y2 CALL SDJY1 ;慢警音
CALL CK_DM
BTFSC FLAG1,F_DM
GOTO BJYR
DECFSZ REGBJ
GOTO Y2
MOVLW 2
MOVWF REGBJ
Y3 CALL SD1 ;长声
CALL CK_DM
BTFSC FLAG1,F_DM
GOTO BJYR
MOVLW 10
MOVWF REGDY3
CALL D_10MS
DECFSZ REGBJ
GOTO Y3
RETURN
BJYR BCF RA,O_LB
RETURN
;---------------------------------------------------------
SD1 MOVLW 8 ;长声
MOVWF REGSD3
SD1_0 MOVLW 30
MOVWF REGSD2
SD1_1 BSF RA,O_LB
MOVLW 0
CALL SOUNDDELAY ;W*3US
MOVLW 60
CALL SOUNDDELAY ;W*3US
BCF RA,O_LB
MOVLW 0
CALL SOUNDDELAY
MOVLW 60
CALL SOUNDDELAY ;W*3US
DECFSZ REGSD2
GOTO SD1_1
DECFSZ REGSD3
GOTO SD1_0
RETURN
;----------------------------------------------------
SOUND MOVLW 60H ;蜂鸣器固定频率响1.736k,短声
MOVWF REGSOUND
SOUND1 BSF RA,O_LB
MOVLW 60H
CALL SOUNDDELAY ;W*3US
BCF RA,O_LB
MOVLW 60H
CALL SOUNDDELAY
DECFSZ REGSOUND
GOTO SOUND1
RETURN
;----------------------------------------------------
CK_DM CLRWDT
BCF FLAG1,F_DM
MOVLW 0FH
MOVWF REGCKDM1
DM1 BTFSS RA,I_DM
RETURN
DECFSZ REGCKDM1
GOTO DM1
MOVLW 5
MOVWF REGDY3
CALL D_10MS
CLRWDT
MOVLW 0FH
MOVWF REGCKDM1
DM2 BTFSS RA,I_DM
RETURN
DECFSZ REGCKDM1
GOTO DM2
BSF FLAG1,F_DM
RETURN
;------------------------------------------------
CK_DJ BCF FLAG1,F_DJ
MOVLW 0FH ;?????
MOVWF REGCKDJ
DJ1 BTFSS RA,I_DJ
RETURN
DECFSZ REGCKDJ
GOTO DJ1
MOVLW 1
MOVWF REGDY3
CALL D_10MS
CLRWDT
MOVLW 0FH ;?????
MOVWF REGCKDJ
DJ2 BTFSS RA,I_DJ
RETURN
DECFSZ REGCKDJ
GOTO DJ2
MOVLW 10H ;0.16s
MOVWF REGDY3
CALL D_10MS
BSF FLAG1,F_DJ
RETURN
;------------------------------------------------
CK_DJT BSF FLAG1,F_DJ
MOVLW 0FFH ;?????
MOVWF REGCKDJ
DJT1 BTFSC RA,I_DJ
RETURN
DECFSZ REGCKDJ
GOTO DJT1
MOVLW 5
MOVWF REGDY3
CALL D_10MS
CLRWDT
MOVLW 0FH ;?????
MOVWF REGCKDJ
DJT2 BTFSC RA,I_DJ
RETURN
DECFSZ REGCKDJ
GOTO DJT2
MOVLW 0C0H ;1.9s
MOVWF REGDY3
CALL D_10MS
MOVLW 0C0H ;1.9s
MOVWF REGDY3
CALL D_10MS
BCF FLAG1,F_DJ
RETURN
;---------------------------------------------
D_10MS CLRWDT
MOVLW 0DH
MOVWF REGDY1 ;
CLRF REGDY2
D10_1 DECFSZ REGDY2
GOTO D10_1
DECFSZ REGDY1
GOTO D10_1
DECFSZ REGDY3
GOTO D_10MS
RETURN
;--------------------------------------------------
SDJY1 MOVLW S_LOOP1 ;长警音
MOVWF R_COUNT ;46=93-47 最低频率的计数减去最高频率的计数等于频率变化的次数
JY1_L_P
MOVLW S_REPEAT1 ;同一频率重复次数送FRE_REPEAT
MOVWF R_REPEAT
MOVFW R_COUNT
ADDLW S_MIN1 ;计数值加最小值
MOVWF TEMP
JY1_RP1
MOVFW TEMP
BSF RA,O_LB
CALL SOUNDDELAY ;廷时W*3US
BCF RA,O_LB
MOVFW TEMP
CALL SOUNDDELAY
DECFSZ R_REPEAT,1 ;每四次减频率计数一次
GOTO JY1_RP1
DECFSZ R_COUNT,1
GOTO JY1_L_P
MOVLW S_LOOP1
MOVWF R_COUNT
JY1_P_L
MOVLW S_REPEAT1 ;同一频率重复次数送FRE_REPEAT
MOVWF R_REPEAT
MOVFW R_COUNT
SUBLW S_MAX1 ;最大值减计数值
MOVWF TEMP
JY1_RP2
MOVFW TEMP
BSF RA,O_LB
CALL SOUNDDELAY ;廷时W*3US
BCF RA,O_LB
MOVFW TEMP
CALL SOUNDDELAY
DECFSZ R_REPEAT,1 ;四次减频率计数一次
GOTO JY1_RP2
DECFSZ R_COUNT,1
GOTO JY1_P_L
JY1_END
RETLW 0
;----------------------------------------------------
SDJY MOVLW S_LOOP ;急警音
MOVWF R_COUNT ;46=93-47 最低频率的计数减去最高频率的计数等于频率变化的次数
SOUND_LH_LP
MOVLW S_REPEAT ;同一频率重复次数送FRE_REPEAT
MOVWF R_REPEAT
MOVFW R_COUNT
ADDLW S_MIN ;计数值加最小值
MOVWF TEMP
REPEAT0_LP
MOVFW TEMP
BSF RA,O_LB
CALL SOUNDDELAY ;廷时W*3US
BCF RA,O_LB
MOVFW TEMP
CALL SOUNDDELAY
DECFSZ R_REPEAT,1 ;每四次减频率计数一次
GOTO REPEAT0_LP
DECFSZ R_COUNT,1
GOTO SOUND_LH_LP
MOVLW S_LOOP
MOVWF R_COUNT
SOUND_HL_LP
MOVLW S_REPEAT ;同一频率重复次数送FRE_REPEAT
MOVWF R_REPEAT
MOVFW R_COUNT
SUBLW S_MAX ;最大值减计数值
MOVWF TEMP
REPEAT1_LP
MOVFW TEMP
BSF RA,O_LB
CALL SOUNDDELAY ;廷时W*3US
BCF RA,O_LB
MOVFW TEMP
CALL SOUNDDELAY
DECFSZ R_REPEAT,1 ;四次减频率计数一次
GOTO REPEAT1_LP
DECFSZ R_COUNT,1
GOTO SOUND_HL_LP
SOUND_END
RETLW 0
;------------------------------
SOUNDDELAY
CLRWDT
MOVWF R_SOUND ;廷时W*3US+2US
SOUNDDELAYUS_1
DECFSZ R_SOUND,1
GOTO SOUNDDELAYUS_1
RETLW 0
;------------------------
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -