⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 baojing.asm

📁 利用无线模块开发的报警器源程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;*************************************************************
;功能: 报警器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 + -