📄 baojing.asm
字号:
;*************************************************************
;功能: 报警器PIC程序
;说明: 利用PIC16C56实现报警器控制全过程
;作者: 蓝劲松
;版本: V1.0
;日期: 2006.1.20
;*************************************************************
;端口设置
;-------------------------------------------------------------
#define CS_93C46 PORTB, 7 ;输出口
#define SK_93C46 PORTB, 6 ;输出口
#define DI_93C46 PORTB, 5 ;输出口
#define DO_93C46 PORTB, 4 ;输入口
; CE_9200 利用硬件控制
#define CLK_9200 PORTB, 5 ;输出口
#define DA_9200 PORTB, 4 ;输出口
#define INH_9170 PORTB, 1 ;输出口
#define DV_9170 PORTB, 2 ;输入口
#define D0_9170 PORTB, 4 ;输入口
#define D1_9170 PORTB, 5 ;输入口
#define D2_9170 PORTB, 6 ;输入口
#define D3_9170 PORTB, 7 ;输入口
#define MING PORTB, 3 ;蜂鸣 输出口
;
#define ZJ_CTRL PORTA, 0 ;摘机 输出口
#define CTR_LAMP PORTA, 1 ;指示灯 输出口
#define BAOJING PORTA, 2 ;报警信号,常态='1',报警 = '0' 输入口
#define BUTTON PORTA, 3 ;设置按钮 输入口
#define PAGE1 STATUS, 5 ;页面1定义
; PORTB,0 空闲为以后报警地址用
;------------------------------------------------------------
;系统寄存器
INDF EQU 00H
TMR0 EQU 01H
PCL EQU 02H
STATUS EQU 03H
FSR EQU 04H
PORTA EQU 05H
PORTB EQU 06H
;寄存器分配
ADDRESS_93C46 EQU 08H ;93C46操作地址
DATA_H_93C46 EQU 09H ;高8位
DATA_L_93C46 EQU 0AH ;低8位
BIT_CNT_93C46 EQU 0BH ;BIT计数器
BIT_SEND_93C46 EQU 0CH
DATSEND_93C46 EQU 0DH
SYS_STATUS EQU 0FH ;0:解防,1:设防,2:报警
LOOP_CNT EQU 10H ;控制发报警音+延时总圈数
REV_DAT_9170 EQU 11H ;9170接收DTMF号码
BIT_CNT_9200 EQU 12H ;DTMF 5bit 计数器
SEND_DAT_9200 EQU 13H ;DTMF发送号码寄存器
DELAY_CNT1 EQU 14H ;延时计数器1
DELAY_CNT2 EQU 15H ;延时计数器2
DELAY_CNT3 EQU 16H ;延时计数器3
;------------------------------------------------------------
ORG 0000H
GOTO MAIN
;************************************************************
;名称: MAIN
;功能: 主循环程序
;************************************************************
MAIN:
CALL INIT ;系统初始化
M_LOOP:
CALL REV_BAO ;接收报警信号,改变系统状态
CALL BNT_SET ;接收按键设置
MOVF SYS_STATUS, W
BNZ SYS_1
GOTO M_LOOP ;SYS_STATUS = 0 不报警
SYS_1:
MOVLW 02H
SUBWF SYS_STATUS, W
BZ SYS_2
GOTO M_LOOP ;SYS_STATUS = 1 不报警
SYS_2: ;SYS_STATUS = 2 报警
GOTO BJ_INIT ;报警初始化,10S延时+500MS闪断
SYS_3:
MOVLW 10H ;号码首地址
MOVWF ADDRESS_93C46
GOTO SEND_DTMF_DAT ;发送一组设置的被叫号码
SYS_4:
MOVLW 08H
MOVWF LOOP_CNT
SYS_5:
MOVF SYS_STATUS, W
BNZ SYS_6
GOTO M_LOOP ;SYS_STATUS = 0 解除报警
SYS_6:
CALL BJYIN
CALL BJYIN
CALL BJYIN
MOVLW 030H ;延时5S同时接收是否有解除
MOVWF DELAY_CNT3
D_5S:
CALL DELAY_100MS
MOVLW 02H
SUBWF SYS_STATUS, W
BZ D_5S1
GOTO M_LOOP ;报警解除,返回主循环
D_5S1:
DECFSZ DELAY_CNT3,F
GOTO D_5S
DECFSZ LOOP_CNT, F
GOTO SYS_6
MOVLW 20H ;号码首地址
MOVWF ADDRESS_93C46
GOTO SEND_DTMF_DAT ;发送一组设置的被叫号码
GOTO M_LOOP
;****************************************************************
;名称: SEND_DTMF
;功能: 利用9200A发送双音号码
;****************************************************************
SEND_DTMF:
; BCF CE_9200 ;让HT9200a开始工作
BSF CLK_9200 ;将CLK设置为搞电平
SEND_DATA_9200: ;HT9200A串行模式数据发送程式
MOVLW 05H ;05H表示需要传送5 BITS 数据
MOVWF BIT_CNT_9200
NEXT_BIT_9200:
RRF SEND_DAT_9200, F ;右移待发送数据,根据其数据
BC SEND_1_9200 ;位值将DATA线设置为相应的0或者1
SEND_0_9200:
BCF DA_9200 ;将DATA线设为0
GOTO ACT_9200
SEND_1_9200:
BSF DA_9200 ;将DATA线设为1
ACT_9200:
BCF CLK_9200 ;产生时钟下降沿,让HT9200A抓取数据
NOP
BSF CLK_9200
DECFSZ BIT_CNT_9200, F
GOTO NEXT_BIT_9200
RETLW 0
;***************************************************************
;名称: INIT
;功能: 程序初始化
;***************************************************************
INIT:
BSF INH_9170 ;9170停止工作
BSF CS_93C46 ;93C46停止工作
BCF ZJ_CTRL ;挂机
BSF MING ;关蜂鸣
BSF BUTTON ;设置按钮收零有效
BSF BAOJING ;报警'0'有效
CLRF SYS_STATUS ;系统状态 = '0'
CLRF ADDRESS_93C46 ;读取设置状态
BSF PAGE1
CALL READ
BCF PAGE1
MM1:
DECFSZ DATA_H_93C46, 0
GOTO MM2 ;设/解!= '0' OR '1' 初始化
BSF CTR_LAMP ;设防状态, 控制灯亮
INCF SYS_STATUS,0 ;系统状态 = '1' 设防
GOTO MM3
MM2:
CLRF ADDRESS_93C46 ;93C46 '00'地址内容进行初始化
CLRF DATA_H_93C46
CLRF DATA_L_93C46
CLRF SYS_STATUS ;系统状态 = '0' 解防
BSF PAGE1
CALL WRITE
BCF PAGE1
BCF CTR_LAMP ;控制灯灭
MM3:
CALL FMING
CALL FMING
CALL FMING
BSF MING
RETLW 0
;**************************************************************
;名称:FMING
;功能:蜂鸣音
;**************************************************************
FMING:
BSF MING
CALL DELAY_100MS
BCF MING
CALL DELAY_100MS
BSF MING
RETLW 0
;**************************************************************
;名称: BJYIN
;功能: 发报警音,;;;;;;;;;;;;;;;;1000HZ 500MS,1300HZ 400MS
; 941HZ 500MS, 1209HZ 400MS
;**************************************************************
BJYIN:
MOVLW 13H
MOVWF SEND_DAT_9200 ;941HZ 单音
CALL SEND_DTMF
CALL DELAY_100MS
CALL DELAY_100MS
CALL DELAY_100MS
CALL DELAY_100MS
MOVLW 0FFH
MOVWF SEND_DAT_9200
CALL SEND_DTMF
CALL DELAY_100MS
MOVLW 14H
MOVWF SEND_DAT_9200 ;1209HZ 单音
CALL SEND_DTMF
CALL DELAY_100MS
CALL DELAY_100MS
CALL DELAY_100MS
MOVLW 0FFH
MOVWF SEND_DAT_9200
CALL SEND_DTMF
CALL DELAY_100MS
RETLW 0
;**************************************************************
;名称: DELAY_500US
;功能: 延时500US,内部4MHZ
;**************************************************************
DELAY_500US:
CLRWDT
MOVLW 0A4H
MOVWF DELAY_CNT1
D500US:
DECFSZ DELAY_CNT1, F
GOTO D500US
RETLW 0
;*************************************************************
;名称: DELAY_100MS
;功能: 延时100MS,同时读是否有解除操作
;*************************************************************
DELAY_100MS:
CLRWDT
CALL BNT_SET ;判断是否有解除,修改SYS_STATUS
MOVLW 0C8H
MOVWF DELAY_CNT2
D_100MS:
CALL DELAY_500US
DECFSZ DELAY_CNT2,F
GOTO D_100MS
RETLW 0
;************************************************************
;名称: SETHAO
;功能: 接收双音号码设置
;************************************************************
SETHAO:
BCF INH_9170 ;置INH,PWDN=0,启动9170
MOVLW 10H ;号码首地址
SHAO:
BTFSS DV_9170 ;检测是否收到DTMF信号,'1'有效
GOTO SHAO
MOVLW B'11110000' ;去掉低4位
ANDWF PORTB, W
MOVWF REV_DAT_9170
SWAPF REV_DAT_9170,F ;读入高四位
MOVLW 0BH ;0BH = '*'号
SUBWF REV_DAT_9170,W
BNZ SHAO1
MOVLW 20H ;是否='*'是:第一组结束
MOVWF ADDRESS_93C46
GOTO SHAO
SHAO1:
MOVLW 0CH ;0CH = '#'号
SUBWF REV_DAT_9170,W
BNZ SHAO2
RETLW 0 ;是否='#'是:设置结束
SHAO2:
CALL WCODE
GOTO SHAO
;************************************************************
;名称: REV_BAO
;功能:收到报警信号,判断设置状态,改变系统状态
;************************************************************
REV_BAO:
MOVF SYS_STATUS, 0
BNZ BAO1 ;解防状态,不收报警
RETLW 0 ; =0 返回
BAO1:
BTFSC BAOJING ;判断有无报警信号,=0 跳
RETLW 0 ; =1 无报警返回
BAO2:
BTFSS BAOJING ; =0 有报警,判'0'结束
GOTO BAO1
CLRF ADDRESS_93C46
BSF PAGE1
CALL READ
BCF PAGE1
DECFSZ DATA_L_93C46, 0 ;判在设防状态下,是否为首次报警
GOTO BAO3 ;首次报警,准备接收正式报警
MOVLW 02H ;正式报警
MOVWF SYS_STATUS
RETLW 0
BAO3:
CLRF ADDRESS_93C46
MOVLW 01H
MOVWF SYS_STATUS ;系统状态 = 1 设防
MOVWF DATA_H_93C46
MOVWF DATA_L_93C46
BSF PAGE1
CALL WRITE
BCF PAGE1
RETLW 0
;******************************************************************
;名称:BNT_SET
;功能:接收设置按键
;操作:1.收"0"有效,>100MS 鸣一声(2S内抬手,进入"设防/解防")
; 2.>2S鸣三声,进入设置号码状态
; 3.解防->设防,鸣一声
;******************************************************************
BNT_SET:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -