📄 复件 sn8p2501a.asm
字号:
chip SN8P2501b
//{{SONIX_CODE_OPTION
.Code_Option LVD LVD_L ; 2.0V Reset
.Code_Option Reset_Pin P11
.Code_Option Watch_Dog Disable
.Code_Option High_Clk IHRC_16M ; Internal 16M RC Oscillator
.Code_Option Fcpu #2 ; Fcpu = Fosc/4
.Code_Option Security Enable
.Code_Option Noise_Filter Enable
//}}SONIX_CODE_OPTION
.DATA
ACC_TEMP DS 1
PFLAG_TEMP DS 1
COUNT0 DS 1
COUNT1 DS 1
count2 ds 1
Voice DS 1
.CODE
org 00h
jmp start
ORG 08H
JMP ZD
org 10h
;音阶数据(输出方波频率数据)
DATAS:
dw 0x11be ;5 ;6.09K
dw 0x11be ;6 ;5.95K
dw 0x11be ;7 ;5.81K
dw 0x11be ;8 ;5.68K
dw 0x11be ;9 ;5.55K
dw 0x11ca ;5 ;6.09K
dw 0x11ca ;6 ;5.95K
dw 0x11ca ;7 ;5.81K
dw 0x11ca ;8 ;5.68K
dw 0x11ca ;9 ;5.55K
;DATAS: dw 0x11ad ;0 ;6.94k
; dw 0x11b1 ;1 ;6.75K
; dw 0x11b5 ;2 ;6.57K
; dw 0x11b9 ;3 ;6.41K
; dw 0x11c2 ;4 ;6.25K
; dw 0x11c4 ;5 ;6.09K
; dw 0x11c7 ;6 ;5.95K
; dw 0x11ca ;7 ;5.81K
; dw 0x11cd ;8 ;5.68K
; dw 0x11d0 ;9 ;5.55K
ZD: B0XCH A,ACC_TEMP ;中断保护
B0MOV A,PFLAG
B0MOV PFLAG_TEMP,A
B0BTS1 FT0IRQ
JMP RETU
B0BCLR FT0IRQ
MOV A,#0F1H
B0MOV T0C,A
B0BTS1 P2.5
JMP $+3
B0BCLR P2.5
JMP $+2
B0BSET P2.5
RETU: B0MOV A,PFLAG_TEMP
B0MOV PFLAG,A
B0XCH A,ACC_TEMP
RETI
start:
MOV A,#07fh
B0MOV STKP,A
B0MOV PFLAG,#00H
;***************I/O设置********************
CLR P0
clr p1
clr p5
CLR P2
b0bset p1.0
mov a,#00000001b
b0mov p1m,a
mov a,#00h
b0mov p0m,a
mov a,#0ffh
b0mov p5m,a
b0mov p2m,a
MOV A,#01H ;使能P0.0端口的上拉电阻
B0MOV P0UR,A
;********************************************
CLR Y
CLR Z
;****开启P1口唤醒功能**P0口始终具有唤醒功能******
MOV A,#0FFH
B0MOV P1W,A
;************16.3S唤醒一次************************
B0BCLR FT0IEN ;禁止T0中断
B0BCLR FT0ENB ;停止记数
B0BCLR FT0IRQ ;清中断标志
MOV A,#00010000B
B0MOV T0M,A ;选择内部时钟 1:256
;**************************************************
;***********TC0设置作为BUZZER输出时钟**************
B0BCLR FTC0IEN
B0BCLR FTC0ENB
B0BCLR FTC0IRQ
MOV A,#01010000B ;8分频
B0MOV TC0M,A
;**************************************************
;**************************************************
B0BSET FCLKMD ;进入低速模式
B0BSET FSTPHX ;关闭高速时钟 省电
;**************************************************
;*******上电延时100MS******************************
B0BCLR P1.0
CALL DELAY_LED
CALL DELAY_LED
CALL DELAY_LED
B0BSET P1.0
;***************************************************
;******************************************************************
;//////////////////////////////////////////////////////////////////
;***********检测2次正常后进入“绿色省电模式”**********************
OPEN: MOV A,#50
B0MOV COUNT0,A
LOOP_OPEN: @RST_WDT
B0BTS1 P0.0 ;是否TEST按键按下?
JMP KEY_CL
B0BTS0 P1.1 ;是否断线\大力报警(P1.1=1异常 P1.1=0正常)
JMP DX_BJ
; B0BTS0 P1.2 ;是否感应报警(P1.2=1异常 P1.2=0正常)
; JMP GY_BJ
B0BTS1 P1.3 ;是否低压报警(P1.2=1正常 P1.2=0异常)
JMP DY_BJ
DECMS COUNT0
JMP LOOP_OPEN
;*******************************************************************
;*******************************************************************
CLR T0C ;T0初始直设定 T0 16.3S唤醒一次
B0BCLR FT0IRQ ;清中断标志
B0BSET FT0ENB ;开始记数
B0BCLR FCPUM0
B0BSET FCPUM1 ;进入“绿色模式” (T0 16.3S唤醒一次,P1 P0唤醒)
;--------------------------------------------------
;-------------绿色模式-----------------------------
;--------------------------------------------------
B0BCLR FT0ENB ;停止记数
B0BTS1 FT0IRQ ;判断是否为T0唤醒 若是点亮绿色LED100MS
JMP OPEN ;否则为P1 P0唤醒
B0BCLR P1.0 ;点亮RED色LED100MS
CALL DELAY_LED
CALL DELAY_LED
CALL DELAY_LED
B0BSET P1.0
JMP OPEN
;********************************************************************************
;////////////////////////////////////////////////////////////////////////////////
;*******************************************************************************
;***************测试报警处理****************************************************
KEY_CL: MOV A,#50
B0MOV COUNT1,A
KEY_CL_1: @RST_WDT
B0BTS0 P0.0 ;是否TEST按键按下?
JMP OPEN
DECMS COUNT1
JMP KEY_CL_1
B0BCLR FSTPHX ;开启高速时钟
CALL DELAY_100MS ;延时
B0BCLR FCLKMD ;进入普通模式
CALL PWM_START ;启动升压电路
TEST_BJ: CALL PLAY_Voice_L_H
CALL PLAY_Voice_H_L
B0BTS0 P0.0 ;按键是否放开?
JMP TEST_RET
JMP TEST_BJ
TEST_RET: MOV A,#255
B0MOV COUNT1,A
TEST_RET_1: @RST_WDT
B0BTS1 P0.0 ;是否TEST按键放开?
JMP TEST_BJ
DECMS COUNT1
JMP TEST_RET_1
B0BSET P1.0 ;关闭LED
CALL PWM_STOP ;关闭升压电路
CALL STOP_Voice ;关闭声音输出
B0BSET FCLKMD ;进入低速模式
B0BSET FSTPHX ;关闭高速时钟 省电
JMP OPEN
;********************************************************************************
;********************************************************************************
;*************报警检测去干扰处理*************************************************
DX_BJ: MOV A,#100
B0MOV COUNT1,A
DX_BJ_1: @RST_WDT
B0BTS1 P1.1 ;是否断线\大力报警(P1.1=1异常 P1.1=0正常)
JMP OPEN
DECMS COUNT1
JMP DX_BJ_1
JMP BJ ;去报警
GY_BJ: MOV A,#100
B0MOV COUNT1,A
GY_BJ_1: @RST_WDT
B0BTS1 P1.2 ;是否感应报警(P1.2=1异常 P1.2=0正常)
JMP OPEN
DECMS COUNT1
JMP GY_BJ_1
JMP BJ ;去报警
DY_BJ: MOV A,#100
B0MOV COUNT1,A
DY_BJ_1: @RST_WDT
B0BTS0 P1.3 ;是否低压报警(P1.2=1正常 P1.2=0异常)
JMP OPEN
DECMS COUNT1
JMP DY_BJ_1
JMP DDY_CL ;去报警
;*************************************************************************
;*******************低电压报警*****B0BTS1 P1.3 *************************************************
DDY_CL:
B0BCLR FSTPHX ;开启高速时钟
CALL DELAY_100MS ;延时
B0BCLR FCLKMD ;进入普通模式
BJBOOT: CALL PWM_START ;启动升压电路
CALL PLAY_Voice_L_H
CALL PLAY_Voice_H_L
CALL PWM_STOP ;关闭升压电路
CALL STOP_Voice ;关闭声音输出
B0BSET P1.0 ;关闭LED
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
CALL DELAY_200MS
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -