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

📄 cj_hqf2.asm

📁 又一个远程抄表系统程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;用跳针短路可对表号进行处理.
;在初始化时和定时器0中断中清狗
;硬件4051管脚定义
WDI					BIT			P1.5			;清狗位
ROM_SCL				BIT			P1.6			;读写AT24C04数据的时钟位
ROM_SDA				BIT			P1.7			;读写AT24C04数据的数据位
R_T					BIT			P1.4			;载波发送和接收的判断标志位,0--->发送,1--->接收
RXD_TXD				BIT			P1.3			;载波接收和发送的数据位
ROM_WP				BIT			P3.5			;AT24C04的读写位
R_T_485				BIT			P3.4			;485接收发送标志,0--->接收,1--->发送
COM_SELECT			BIT			P3.7			;控制CD4052	 (修改RS_485为COM_SELECT)
;定义保存于2404中数据的地址
METER_NO			EQU			00H				;表号的首地址,最大可以存34块电表,采用208字节,如果存34块表的话,还空出4字节
METER_SUM			EQU			0D0H			;表号总数
METER_LEN			EQU			0D1H			;表号长度
METER_USE			EQU			0D2H			;实际存储表号数,即采集器管理了几块电表
;定义保存于RAM中的数据的地址
;内部寄存器定义
NR00				DATA		000H
NR01				DATA		001H
NR02				DATA		002H
NR03				DATA		003H
NR04				DATA		004H
NR05				DATA		005H
NR06				DATA		006H
NR07				DATA		007H
;
NR10				DATA		008H
NR11				DATA		009H
NR12				DATA		00AH
NR13				DATA		00BH
NR14				DATA		00CH
NR15				DATA		00DH
NR16				DATA		00EH
NR17				DATA		00FH
;
NR20				DATA		010H
NR21				DATA		011H
NR22				DATA		012H
NR23				DATA		013H
NR24				DATA		014H
NR25				DATA		015H
NR26				DATA		016H
NR27				DATA		017H
;
NR30				DATA		018H
NR31				DATA		019H
NR32				DATA		01AH
NR33				DATA		01BH
NR34				DATA		01CH
NR35				DATA		01DH
NR36				DATA		01EH
NR37				DATA		01FH
;
;20H全局通讯标志
MCU_RECEIVE_ALL		BIT			00H			;HQF
MCU_SEND_ALL		BIT			01H			;HQF
BROADCAST_BIT		BIT			02H			;(E99_BIT改为BROADCAST_BIT)
REC_ERRS			BIT			03H			;HQF
MCU_DATA_OK			BIT			04H			;HQF
SEND_FIRST_OK		BIT			05H			;HQF
RE_FE_OK			BIT			06H			;HQF
MCU_END_OK			BIT			07H			;HQF


;21H,22H,23H载波通讯标志		
ZB_SEND_ALL			BIT			08H			;HQF
ZB_RECEIVE_ALL		BIT			09H			;HQF
ZB_REC_H_L			BIT			0AH			;HQF
ZB_REC_H_H			BIT			0BH			;HQF
ZB_HEAD_OK			BIT			0CH			;HQF
ZB_S_OK				BIT			0DH			;HQF
ZB_SEND_CL_OK		BIT			0EH			;HQF
ZB_SEN_ERR			BIT			0FH			;HQF
ZB_SEND_CODE_OK		BIT			10H			;HQF
ZB_REC_INIT_OK		BIT			11H			;HQF
ZB_REC_INFO_OK		BIT			12H			;HQF
ZB_REC_CL_OK		BIT			13H			;HQF
ZB_REC_DATA_OK		BIT			14H			;HQF
ZB_REC_CS_OK		BIT			15H			;HQF
ZB_ERR				BIT			16H			;HQF
ZB_SEND_METER_OK	BIT			17H			;HQF
ZB_SEND_DATA_OK		BIT			18H			;HQF
ZB_SEND_CS_OK		BIT			19H			;HQF
ZB_SEND_ADDR_OK		BIT			1AH			;HQF
ZB_SEND_L_OK		BIT			1BH			;HQF
ZB_SEND_FROM_485	BIT			1CH			;HQF
ZB_SEND_WAIT		BIT			1DH			;HQF
ZB_TO_JZQ			BIT			1EH			;HQF




;24H MCU用到的标识	
REC_ERR				BIT			20H			;HQF
SEN_HE_OK			BIT			21H			;HQF
SEND_68_OK			BIT			22H			;HQF
MCU_CS_ADD			BIT			23H			;HQF
MCU_CS_OK			BIT			24H			;HQF
METER_OK			BIT			25H			;HQF
HEAD_OK				BIT			26H			;HQF
MCU_CL_OK			BIT			27H			;HQF







;采集器发送接收数据的BUFFER采用48字节
BUFFER				EQU			30H			;采集器发送接受的BUFFER入口地址,BUFE为30H---5FH
/*
30H--35H------为接收到的A0---A6
36H-----------为接收到的分隔符
37H-----------为接收到的COMMAND
38H-----------为接收到的LENGTH
39H-3AH-------为接收到的DI0,DI1
*/
A0					EQU			30H
A1					EQU			31H
A2					EQU			32H
A3					EQU			33H
A4					EQU			34H
A5					EQU			35H
COMMAND				EQU			37H
LENGTH				EQU			38H
DI0					EQU			39H
DI1					EQU			3AH

;DOG1				EQU			60H			;采用软件清狗方式,采用双循环模式
;DOG2				EQU			61H
METER_TEMP			EQU			60H			;从2404里读出电表表号后临时存储区。6字节。62H----67H
METER_SUM_TEMP		EQU			66H			;2404里存电表总数
CS					EQU			67H			;校验值存储
ZB_CS_L				EQU			68H
ZB_CS_H				EQU			69H

ZB_CODE				EQU			6AH			;载波用的DI0,DI1使用空间6FH,70H
ZB_L				EQU			6CH

;采集器和485通讯采用的特殊示
RS485HEAD			EQU			0FEH		;采集器和电表通讯的帧头
RS485HEAD2			EQU			68H			;采集器和电表通讯的帧起始符
RS485END			EQU			16H			;采集器和电表通讯的结束符



;采集器和ZB通讯采用的特殊示
ZB_HEAD_L			EQU			09H			;载波用的帧头AF,09
ZB_HEAD_H			EQU			0AFH
ZB_UP_ADDR			EQU			0BBH		;载波用的集中器地址

;
WR_COM				EQU			0A0H        ;AT24C04写命令字
RD_COM				EQU			0A1H        ;AT24C04读命令字




;**********************************************************************************************
;**************************************    程  序  头    **************************************
;**********************************************************************************************
					ORG			0000H
					LJMP		INIT_SYS
					NOP
					NOP
					RETI
					
					ORG			0003H
					LJMP		ZB
					NOP
					NOP
					RETI

 
					ORG			001BH
					RETI
					NOP
					NOP
					RETI

					ORG			0023H
					LJMP		MCU_COM
					NOP
					NOP
					RETI
					
;**********************************************************************************************
					ORG			0030H
INIT_SYS:			CLR			P1.0
					CLR			P1.1
					CLR			EA
					MOV			SP,#70H
					MOV			P1,#0FFH
					MOV			P3,#0FFH
					CLR			PSW.3
					CLR			PSW.4
					
					MOV			TH1,#0D6H
					MOV			TL1,#0D6H
					MOV			TMOD,#21H
					MOV			PCON,#80H
					MOV			SCON,#0D0H
					MOV			IP,#07H

					SETB		IT0							;载波中断(int1)沿触发
              		SETB		EX0							;载波中断允许
					SETB		TR1							;允许t1计数
					;SETB		ET0							;T0中断允许
					SETB		P3.0
					SETB		P3.1
					
					CLR			PSW.3
					CLR			PSW.4
					SETB		ES
					SETB		EX0
					CLR			P1.0
					CLR			P1.1
					MOV			R0,#7FH
CLEAR_RAM:			MOV			A,#00H
					MOV			@R0,A
					DJNZ		R0,CLEAR_RAM
					SETB		EA
MAIN:				
					CLR			R_T_485						;485接收状态
					SETB		EX0
					SETB		ET0							;T0中断允许
					SETB		P3.0
					SETB		P3.1
					SETB		REN
					SETB		COM_SELECT					;初始化为红外通讯
					MOV			R1,#02H
					MOV			R6,#0FH
START_DELAY:		CLR			WDI
					NOP
					NOP
					SETB		WDI
					LCALL		DELAY
					DJNZ		R1,START_DELAY
START_DELAY1:		SETB		P1.0
					SETB		P1.1
					LCALL		CLR_WATCHER_DOG
					LCALL		DELAY
					JNB			MCU_RECEIVE_ALL,DO_NEXT
					JB			ZB_SEND_FROM_485,UP_TO_JZQ1
					LCALL		RECEIVE
					LJMP		START_DELAY1
DO_NEXT:			JNB			ZB_RECEIVE_ALL,DO_NEXT2
					LCALL		ZB_REC_DO
					LJMP		START_DELAY1
DO_NEXT2:			;JNB			ZB_SEND_FROM_485,DO_NEXT3
					;LCALL		UP_TO_JZQ
					;LJMP		START_DELAY1
DO_NEXT3:			JNB			MCU_SEND_ALL,RS485_WAIT
					CLR			MCU_SEND_ALL
					
					;JB			ZB_SEND_WAIT,UP_TO_JZQ1
					;SETB		P3.2
					;SETB		ES
					LJMP		START_DELAY1
UP_TO_JZQ1:			LCALL		UP_TO_JZQ
					;CLR			P3.2
;					JNB			COM_SELECT,RS485_TO_MCU
					MOV			R6,#0FH
					LJMP		START_DELAY1
RS485_WAIT:			DJNZ		R6,RS485_TO_MCU
					LJMP		MAIN
RS485_TO_MCU:		LJMP		START_DELAY1

MAIN_END:			LJMP		MAIN
;************************************************************************
;* MCU串口接收处理 使用工作寄存器0区*
;************************************************************************
RECEIVE:			CLR			EA
					CLR			BROADCAST_BIT
					CLR			WDI
					NOP
					NOP
					SETB		WDI
					CLR			MCU_RECEIVE_ALL
					
					MOV			A,LENGTH
					ADD			A,#09H
					ADD			A,R7
					MOV			NR21,A
					MOV			A,#BUFFER
					MOV			NR20,A
					SETB		TI
					SETB		EA
					RET






;************************************************************************
;*载波处理			使用工作寄存器0区*
;************************************************************************
ZB_REC_DO:			CLR			EA
					CLR			ZB_RECEIVE_ALL			
					MOV			R0,#BUFFER+6
					MOV			@R0,#68H
					MOV			A,LENGTH
					SUBB		A,#3
					MOV			LENGTH,A
					MOV			R7,A
					MOV			R0,#BUFFER+9
REBUILD_BUFFER:		MOV			A,@R0
					ADD			A,#33H
					MOV			@R0,A
					INC			R0
					DJNZ		R7,REBUILD_BUFFER
					MOV			A,#BUFFER
					MOV			NR20,A
					MOV			A,LENGTH
					ADD			A,#09H
					MOV			NR21,A
					CLR			COM_SELECT
					SETB		ZB_SEND_WAIT
					CLR			EX0
					SETB		TI
					SETB		ES
					SETB		EA
					RET
					
UP_TO_JZQ:			CLR			P1.1
					CLR			EA
					CLR			ZB_SEND_FROM_485
					MOV			R7,#6
					MOV			R0,#BUFFER
					MOV			R1,#METER_TEMP
RE_ZB_INFO:			MOV			A,@R0
					MOV			@R1,A
					INC			R0
					INC			R1
					DJNZ		R7,RE_ZB_INFO	 ;R2--->R7
					MOV			R0,#BUFFER+8
					MOV			A,@R0
					MOV			R7,A
ZB_DATA:			INC			R0
					MOV			A,@R0
					SUBB		A,#33H
					DJNZ		R7,ZB_DATA
					MOV			R0,#BUFFER
					MOV			R1,#BUFFER+7
					MOV			R7,#4
RE_ZB_CL:			MOV			A,@R1
					MOV			@R0,A
					LCALL		ZB_CS_ADD
					DJNZ		R7,RE_ZB_CL
					MOV			R0,#BUFFER
					INC			R0
					;MOV			A,@R0
					;ADD			A,#4
					;MOV			@R0,A
					MOV			R0,#5FH
					;MOV			R1,#METER_TEMP
					MOV			R1,#BUFFER+11
					MOV			R7,LENGTH
MOV_DATA:			MOV			A,@R1
					MOV			@R0,A
					INC			R1
					DEC			R0
					DJNZ		R7,MOV_DATA
					MOV			R0,#BUFFER+4
					MOV			R1,#METER_TEMP
					MOV			R7,#6
RE_ZB_METER:		MOV			A,@R1
					MOV			@R0,A
					LCALL		ZB_CS_ADD
					INC			R0
					INC			R1
					DJNZ		R7,RE_ZB_METER
					MOV			@R0,#0FH		  ;HQF
					MOV			A,LENGTH
					;SUBB		A,#2
					MOV			A,#0FFH
					MOV			R7,A
					MOV			R1,#5FH
					INC			R0
RE_ZB_DATA:			MOV			A,@R1
					MOV			@R0,A
					LCALL		ZB_CS_ADD
					INC			R0
					DEC			R1
					DJNZ		R7,RE_ZB_DATA
					MOV			NR14,#0FFH	
					;SETB		ZB_TO_JZQ
					CLR			R_T
					CLR			ES
					SETB		EX0
					SETB		EA


ZB_REC_NEXT:		RET



					
;************************************************************************
;*载波接收和发送			使用工作寄存器1区*
;************************************************************************
ZB:					CLR			EA
					;CLR			ES
					PUSH		ACC
					PUSH		PSW
					PUSH		B
					SETB		PSW.3
					CLR			PSW.4
					JNB			R_T,TRANS	;判断是接收还是发射状态,做出相应处理
					LCALL		ZB_RECEIVE	;当R_T=1时,转发射
					LJMP		ZB_RETURN
TRANS:				LCALL		ZB_TRANS	;当R_T=0时,转发射
					LJMP		ZB_RETURN
ZB_RETURN:			POP			B
					POP			PSW
					POP			ACC
					SETB		EA
					RETI


;************************************************************************
;*载波接收*
;************************************************************************
ZB_RE_RET:			LJMP		ZB_REC_RET
ZB_RE_ERR1:			LJMP		ZB_RE_ERR
/*ZB_REC_INTI:		SETB   		R_T
					
					JB			ZB_REC_INIT_OK,ZB_RECEIVE
					;MOV			R7,#8
					SETB		ZB_REC_INIT_OK */
ZB_RECEIVE:			
					SETB		R_T
					MOV			C,RXD_TXD
					MOV			A,R5
					RLC			A
					MOV			R5,A

ZB_REC_NO_END:		JB			ZB_REC_H_L,ZB_HEAD_H_BIT
					CJNE		A,#09H,ZB_RE_RET
					SETB		ZB_REC_H_L
					MOV			R6,#8
					LJMP		ZB_RE_RET


ZB_HEAD_H_BIT:		DJNZ		R6,ZB_RE_RET
					MOV			R6,#8
					;CLR			C
					;MOV			R5,#0
					JB			ZB_REC_H_H,ZB_REC_INFO
					CJNE		A,#0AFH,ZB_RE_ERR1
					SETB		ZB_REC_H_H
					MOV			R0,#BUFFER
					MOV			R7,#6
					MOV			R3,#0
					MOV			R2,#0
					MOV			R6,#8
					LJMP		ZB_REC_RET


ZB_REC_INFO:		JB			ZB_RECEIVE_ALL,ZB_RE_RET
					JB			ZB_REC_INFO_OK,ZB_REC_CL
					CLR			C
					MOV			@R0,A
					LCALL		ZB_CS_ADD

					INC			R0
					DJNZ		R7,ZB_RE_RET
					SETB		ZB_REC_INFO_OK
					MOV			R7,#2
		
					;MOV			@R0,#68H		;增加的为后面MCU串口发送服务的
					INC			R0
					LJMP		ZB_RE_RET
ZB_REC_CL:			JB			ZB_REC_CL_OK,ZB_REC_DATA
					MOV			@R0,A
					LCALL		ZB_CS_ADD
					
					INC			R0
					DJNZ		R7,ZB_RE_RET
					SETB		ZB_REC_CL_OK
					
					MOV			A,LENGTH
					MOV			R7,A
					LJMP		ZB_RE_RET
ZB_REC_DATA:		JB			ZB_REC_DATA_OK,ZB_REC_CS
					MOV			@R0,A
					LCALL		ZB_CS_ADD
					
					INC			R0
					DJNZ		R7,ZB_RE_RET
					SETB		ZB_REC_DATA_OK
					MOV			R7,#2
					LJMP		ZB_RE_RET
																					
ZB_REC_CS:			JB			ZB_REC_CS_OK,ZB_REC_END_INFO
					MOV			@R0,A
					INC			R0
					CLR			C
					SUBB		A,R2
					JNZ			ZB_RE_ERR
					MOV			A,R3
					MOV			R2,A
					DJNZ		R7,ZB_REC_RET
					SETB		ZB_REC_CS_OK
					LJMP		ZB_REC_RET					
ZB_REC_END_INFO:	JB			ZB_RECEIVE_ALL,ZB_REC_RET
					;MOV			@R0,A
					;SUBB		A,#16H
					;JNZ			ZB_RE_ERR
					CLR			ES
					CLR			ZB_REC_INIT_OK
					CLR			ZB_REC_H_L
					CLR			ZB_REC_H_H
					CLR			ZB_REC_INFO_OK
					CLR			ZB_REC_CL_OK
					CLR			ZB_REC_DATA_OK
					CLR			ZB_REC_CS_OK
					CLR			P1.0
					CLR			EX0
					SETB		ZB_RECEIVE_ALL
					;LCALL		CLR_BUFFER
					LJMP		ZB_REC_RET
ZB_RE_ERR:			CLR			ZB_REC_INIT_OK
					CLR			ZB_REC_H_L
					CLR			ZB_REC_H_H
					CLR			ZB_REC_INFO_OK
					CLR			ZB_REC_CL_OK
					CLR			ZB_REC_DATA_OK
					CLR			ZB_REC_CS_OK
					CLR			ZB_RECEIVE_ALL
					SETB		P1.0
					SETB		ZB_ERR
ZB_REC_RET:			RET			
								

;************************************************************************
;*载波发送处理* R0发送BUFFER的首地址,R4发送确认字符'S'
;************************************************************************
ZB_SEN_RET:			LJMP		ZB_SEND_RET
ZB_SEND_ERR1:		LJMP		ZB_SEND_ERR
ZB_TRANS:			
					CLR			R_T

					JB			ZB_SEND_ALL,ZB_SEN_RET
					JB			ZB_S_OK,ZB_YES_SEND
					CLR			P1.1
					MOV			A,R4
					CJNE		A,#0FFH,ZB_SEND_ERR1
					SETB		ZB_S_OK
					MOV			R2,#00

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -