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

📄 err3.asm

📁 电力仪器仪表智能独立误差计算设备系统程序!
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	MOV	CT_CHECK_TIME+1,#0H
	MOV	RECV_BPW,#RECV_BUF		; 接收缓冲写指针初始化
	MOV	RECV_BPR,#RECV_BUF		; 接收缓冲读指针初始化
	MOV	SYS_T500MS,#0FFH
	MOV	RJ_BF,#01H			; 
	CLR	A
	MOV	UART_LEN,A			; 接收长度初始化
	MOV	UART_CHECK_DATA,A		; 通讯校验和初始化
	MOV	WC_T_C,A			; 回传次数初始化
	MOV	CATCH_SCALE,#80H		; 捕黑试验百分比默认80%
		
;-------------------P1口初始化------------------
;	MOV	P1,#4FH				; (90H) P1口(01001111)
	SETB	PULSE_FC			; 1 允许被试脉冲输入
	SETB	JDQ_X485OFF			; 1 断开被试表的485通讯
	SETB	X5043_SDO			; 1 允许接收EEPROM数据
	SETB	X5043_SDI			; 1 EEPROM数据输入初始化为1
	CLR	X5043_CLK			; 0 EEPROM串行时钟拉低
	SETB	X5043_CS			; 0 EEPROM片选无效
	SETB	JDQ_BSNAP			; 1 断开24V电压回路(捕黑、自动短接用)
	SETB	C485_TRSEL			; 1 本板485口置为接收状态
;---------------判断是否进入板号设置------------	
SYS_SN_SET_PD:	
	MOV	P0,#0F8H
	LCALL	YS100
    JNB	P3.2,SYS_SN_SET  
;------------------------------------------------		
	MOV	P3,#0FFH			; (0B0H)P3口,允许特殊功能		 
;----------------------P0口初始化---------------
	SETB	DISP_A		
	SETB	DISP_B		
	SETB	DISP_C	
	SETB	BH_C1	
	SETB	BH_C2	
	SETB	PULSE_A	
	CLR	    PULSE_B	
	SETB	PULSE_C			
;------------------------------------------------
	SETB	P0.0				; 10111111(80H) P0口,脉冲为有功+(CBA=101);捕黑(11);显示位码为7(空位CBA=111);
	SETB	P0.1
	SETB	P0.2
	SETB	JDQ_BH
	SETB	JDQ_AUTO
	SETB	P0.5
	CLR	    P0.6
	SETB	P0.7

;----------------------P2口初始化----------------
	MOV	P2,#00H				; (0A0H)P2口,显示段码为0(空白)
;------------------------------------------------			
;**********************************************************	
; (0A8H)IE : (.7) EA,(.6)NUL,(.5)ET2,(.4) ES,(.3)ET1,(.2)EX1,(.1)ET0,(.0)EX0
	SETB	EX0				; ENABLE INT0 (KEYBORD COL0) 打开外部中断0
	SETB	EX1				; ENABLE INT1 (KEYBORD COL1) 打开外部中断1
	SETB	ET0				; ENABLE T/C0 (FH OVER)      打开定时器中断0
	SETB	ET1				; ENABLE T/C1 (SYSTEM CLOCK) 打开定时器中断1
	SETB	ET2				; ENABLE T/C2 (FC LOOP)	     打开定时器中断2
	SETB	ES				; ENABLE UART (C485 RECEIVE) 打开串行口中断
;**********************************************************	
	SETB	TR0				; 启动标频计数
	SETB	TR1				; 启动系统时钟
	SETB	TR2				; 启动被试脉冲处理
	CLR	    IE0
	CLR	    IE1				; 先清除键盘中断标志
	SETB	EA				; 开放中断
	LJMP	MAIN_GETSN			; 至主流程	
;+++++++++++++++++++++误差板板号设置++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++	
SYS_SN_SET:
	SETB	EX0				; ENABLE INT0 (KEYBORD COL0) 打开外部中断0
	SETB	ET0				; ENABLE T/C0 (FH OVER)      打开定时器中断0
	SETB	ET1				; ENABLE T/C1 (SYSTEM CLOCK) 打开定时器中断1
	SETB	TR1				; 启动系统时钟
	CLR     IE0				; 清除键盘中断标志
	SETB	EA				; 开放中断
;------------------------------------------------
	MOV	SYS_SN,#CONST_SNDEF		; 默认编号置入0
	MOV	X5043_BYTE_ADDR,#55H
	LCALL	X5043_READ_BYTE			; 读取本板编号
	MOV	A,X5043_BYTE_DATA
	MOV	R1,A				; 读到的本板编号放入R1中
	ADD	A,#6				; BCD码,低4位应<=9
	JB	AC,SN_SET_SHOW
	SUBB	A,#CONST_SNMAX+6
	JZ	SN_SET				; 累加器为零转移
	JNC	SN_SET_SHOW			; 有效编号值1-96
;------------------------------------------------	
SN_SET:
	MOV	X5043_BYTE_ADDR,#0AAH
	LCALL	X5043_READ_BYTE			; 读取编号校验码
	MOV	A,X5043_BYTE_DATA
	XRL	A,#CONST_SNVER			; 5A
	XRL	A,R1
	JNZ	SN_SET_SHOW
	MOV	SYS_SN,R1			; 校验正确后置入编号
;------------------------------------------------	
SN_SET_SHOW:					; 显示本板编号"SET XX"	
	MOV	DPTR,#TABLE_SET		    ;
	LCALL	DISP_STRING			; 显示"SET"
	MOV	A,SYS_SN
	LCALL	DISP_ADIR			; 显示本板编号"SET XX"
	MOV	R7,#0FFH
;------------------------------------------------	
MAIN_SN_SET:
	JB	KEY_PRESS,KEY_TIME
	DJNZ	R7,MAIN_SN_SET
	MOV	R7,#0FFH
	AJMP	SN_SET_SAVE
KEY_TIME:
	MOV	R7,#0FFH
	CLR	KEY_PRESS
	MOV	A,SYS_SN
	ADD	A,#01H
	DA	A
	MOV	SYS_SN,A
	LCALL	DISP_ADIR
	AJMP	MAIN_SN_SET
SN_SET_SAVE:
	LCALL	DGET_ADIR
	MOV	X5043_BYTE_DATA,A
	XRL	A,#CONST_SNVER
	MOV	X5043_BYTE_DATA+1,A
	MOV	X5043_BYTE_ADDR,#55H
	LCALL	X5043_WRITE_BYTE		; 写入新编号
	MOV	A,X5043_BYTE_DATA+1
	MOV	X5043_BYTE_DATA,A
	MOV	X5043_BYTE_ADDR,#0AAH
	LCALL	X5043_WRITE_BYTE		; 写入校验码
	MOV	X5043_STATUS_REG,#20H		; 7   6   5   4   3   2   1   0
						; X   X  WD1 WD0 BL1 BL0 WEL WIP
	LCALL	X5043_WRITE_WRSR		; 写X5043状态寄存器,看门狗200毫秒
	AJMP	MAIN_SN_SET
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++	
;+++++++++++++++++++++计数器/定时器1中断  显示++++++++++++++++++++++++++
SYS_CLK:					; 1ms定时到处理
	PUSH	ACC
	PUSH	PSW
	PUSH	B
	PUSH	00H
;-------------------------------------------------
	SETB	FLAG_TIME_1MS
	SETB	FLAG_BH_1MS
;-------------------------------------------------			
	DJNZ	SYS_T500MS,SYS_CLK_DISP
	CPL	DISP_FLASH	
SYS_CLK_DISP:					; 显示每1ms刷新1位LED
	MOV	A,DISP_DIGIT
	INC	A
	ANL	A,#07H
	MOV	DISP_DIGIT,A			; 取当前显示位码
	ADD	A,#DISP_BUFFER
	MOV	R0,A
	MOV	A,@R0				; 取当前位数值
	MOV	C,ACC.7				; 保留最高位(点)
	ANL	A,#7FH	
	INC	A
	INC	A
	MOVC	A,@A+PC				; 取显示段码
	AJMP	SYS_CLK_DISP_OUT
TABLE_DISP:
	DB	7EH,30H,6DH,79H,33H,5BH,5FH,70H ; 0,1,2,3,4,5,6,7
	DB	7FH,7BH,77H,1FH,4EH,3DH,4FH,47H ; 8,9,A,b,C,d,E,F
	DB	5EH,37H,06H,38H,0FH,0EH,55H,15H ; G,H,I,J,k,L,m,n
	DB	1DH,67H,73H,05H,13H,46H,3EH,1CH ; o,P,q,r,S,T,U,v
	DB	2BH,36H,3BH,49H,00H,00H,00H,00H ; w,X,y,Z, , , , 
	DB	01H,02H,04H,08H,10H,20H,40H,80H ; 各段的单独显示
SYS_CLK_DISP_OUT:
;------------------------------------------------	
	JNB	FLAG_CT_CHECK,WC_ERR		; 检测CT状态
	SJMP	TIME_CHK
WC_ERR:
	JNB	FLAG_ERR,ERR			; 检测误差是否超差
TIME_CHK:	
	JNB	DISP_FLASH,ERR
	CLR	C
	CLR	A
ERR:
    	
	MOV	ACC.7,C				; 恢复最高位(点)
	MOV	P2,A				; 段码送P2口
;------------------------------------------------	
	MOV	A,PULSE_SL			; 读映射寄存器 			
	ANL	A,#0F8H				
	ORL	A,DISP_DIGIT
    MOV	P0,A				; 位码送P0口
;------------------------------------------------
SYS_CLK_KEY:					; 键盘状态检查
	MOV	A,KEY_TIMER
	JZ	SYS_CLK_KEY_END
	DEC	A
	MOV	KEY_TIMER,A
	JNZ	SYS_CLK_KEY_END
SYS_CLK_KEY_FREE:				; 键盘HOLD状态结束
	CLR	IE0
	CLR	IE1				; 先清除之前的中断标志
	SETB	EX0
	SETB	EX1				; 开放键盘中断
SYS_CLK_KEY_END:
	POP	00H
	POP	B
	POP	PSW
	POP	ACC
SYS_CLK_RET:
	RETI
;+++++++++++++++++外部中断0/1 键盘处理++++++++++++++++++++++++++++++
KEY_SCAN:
	PUSH	PSW
	JBC	KEY_DOWN,KEY_SCAN_GET
	SETB	KEY_DOWN			; 键刚按下时应先延时去抖
	MOV	KEY_TIMER,#CONST_KDELAY
KEY_SCAN_END:
	CLR	EX0				; 禁止中断0/1
	CLR	EX1				; 按键延时,禁止按键中断
	POP	PSW
	POP	ACC
	RETI
KEY_SCAN_GET:					; 键已去抖则读入键值
	SETB	KEY_PRESS			; 置“有键标志”
	MOV	KEY_TIMER,#CONST_KWAIT		; 响应按键后
	AJMP	KEY_SCAN_END
;++++++++++++++++++++计数器/定时器0中断  标频处理+++++++++++++++++++++++++++
FH_OVER:					; 标频溢出中断处理
	DJNZ	FH_COUNTER,FH_OVER_END
	DJNZ	FH_COUNTER+1,FH_OVER_END
	DJNZ	FH_COUNTER+2,FH_OVER_END
	DJNZ	FH_COUNTER+3,FH_OVER_END
	DJNZ	FH_COUNTER+4,FH_OVER_END
	DJNZ	FH_COUNTER+5,FH_OVER_END
	DEC	FH_COUNTER+6			; 7字节扩展计数
FH_OVER_END:
	CLR	EC_FHINC			; 清标频溢出处理标志
	JB	EC_FCWAIT,FC_LOOP_JQBEG		; 延后的圈脉冲减圈处理
	RETI
;+++++++++++++++++++计数器/定时器2中断  被检脉冲处理++++++++++++++++++++++++++++
FC_LOOP:					; 圈脉冲中断处理
	JNB	EC_MODE_EE,FC_LOOP_NOJQ		; 禁止误差计算,              判断是否有"开始误差计算"标志
	JB	EC_LOOPFIN,FC_LOOP_NOJQ		; 上次误差未完,不减圈        判断是否有"标志一次减圈完成"标志
;* 捕捉标频计数值及有关冲突处理
	MOV	EC_FHCAP,TL0			; 捕捉标频计数最低字节
	JB	EC_FHINC,FC_LOOP_WAIT		; 正在标频溢出处理期间
	JB	EC_FHCAP7,FC_LOOP_JQBEG
	JB	EC_FHCAP6,FC_LOOP_JQBEG
	JB	TF0,FC_LOOP_WAIT		; 标频已溢出,尚未处理
	PUSH	00H
	MOV	R0,SP
	PUSH	PSW
	DEC	R0
	CJNE	@R0,#HIGH(VEC_T_C0),FC_LOOP_NOSP
	DEC	R0
	CJNE	@R0,#LOW(VEC_T_C0),FC_LOOP_NOSP
	POP	PSW				; 标频溢出被响应的临界时刻
	POP	00H
FC_LOOP_WAIT:					; 与标频溢出冲突时
	SETB	EC_FCWAIT			; 置减圈等待标志,等待稍后标频处理结束
FC_LOOP_NOJQ:					
	AJMP	FC_LOOP_ZZINC			; 此次不减圈
FC_LOOP_NOSP:
	POP	PSW
	POP	00H	
;* 圈脉冲减圈处理
FC_LOOP_JQBEG:
	PUSH	PSW
	PUSH	ACC
	PUSH	00H
	JB	EC_LOOPBEG,FC_LOOP_JQDEC	; 已开始减圈
	SETB	EC_LOOPBEG			; 首脉冲,置已开始减圈标志	
	MOV	FH_CAPTURE,EC_FHCAP		; 记录起始标频值
	MOV	FH_CAPTURE+1,FH_COUNTER		; 结构:0为捕捉的最低字节
	DEC	FH_CAPTURE+1			; 1,2,3为相应位字节的反码
	MOV	FH_CAPTURE+2,FH_COUNTER+1
	DEC	FH_CAPTURE+2
	MOV	FH_CAPTURE+3,FH_COUNTER+2
	DEC	FH_CAPTURE+3
	JNB	PULSE_WIDTH_FLAG,FC_LOOP_CATCH
	CLR	PULSE_EDGE_SET
	AJMP	FC_LOOP_CATCH1
FC_LOOP_CATCH:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>{
    MOV   A,DISP_BUFFER+2				   ;  判断如果未位显示为B,则未位不显示
	CJNE  A,#0BH,CANSCEL_B				   ;
	MOV   DISP_BUFFER+2,#24H			   ;
CANSCEL_B:	  							   ;
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
	MOV	DISP_BUFFER,DISP_BUFFER+2	; 显示右移2位
	MOV	DISP_BUFFER+1,DISP_BUFFER+3
	MOV	DISP_BUFFER+2,DISP_BUFFER+4
	MOV	DISP_BUFFER+3,DISP_BUFFER+5	
FC_LOOP_CATCH1:	
	MOV	A,EC_NUMLOOP			; 重置圈数为满圈数
FC_LOOP_JQMID:					; 未到末圈的处理
	MOV	EC_RUNLOOP,A
	JB	PULSE_WIDTH_FLAG,FC_LOOP_JQEND	 ; 脉宽测试试验标志判断
	ANL	A,#0FH
	MOV	DISP_BUFFER+4,A
	MOV	A,EC_RUNLOOP
	SWAP	A
	ANL	A,#0FH
	MOV	DISP_BUFFER+5,A			; 显示当前圈数
	AJMP	FC_LOOP_JQEND
FC_LOOP_JQDEC:					; 减圈处理
	MOV	A,EC_RUNLOOP			; 取圈数,存放标频计数最低字节
	ADD	A,#99H
	DA	A				; 圈数-1,为PBCD码,需调整一下    
	JZ	FC_LOOP_JQFIN			; 最后一圈
	AJMP	FC_LOOP_JQMID
FC_LOOP_JQFIN:					; 最后一圈处理
	MOV	EC_RUNLOOP,A			; 圈数置0
	CLR	C
	MOV	A,EC_FHCAP			; 取标频计数最低字节
	SUBB	A,FH_CAPTURE
	MOV	FH_RESULT,A
	MOV	A,FH_CAPTURE+1
	MOV	FH_CAPTURE+1,FH_COUNTER
	DEC	FH_CAPTURE+1
	SUBB	A,FH_CAPTURE+1
	MOV	FH_RESULT+1,A
	MOV	A,FH_CAPTURE+2
	MOV	FH_CAPTURE+2,FH_COUNTER+1
	DEC	FH_CAPTURE+2
	SUBB	A,FH_CAPTURE+2
	MOV	FH_RESULT+2,A
	MOV	A,FH_CAPTURE+3
	MOV	FH_CAPTURE+3,FH_COUNTER+2
	DEC	FH_CAPTURE+3
	SUBB	A,FH_CAPTURE+3
	MOV	FH_RESULT+3,A			; 末圈标频值-起始标频值=实测脉冲数
	CLR	EC_LOOPBEG			; 圈已减完,清开始减圈标志
	SETB	EC_LOOPFIN			; 置减圈完成标志(需进行误差计算处理)
	JNB	PULSE_WIDTH_FLAG,FC_LOOP_JQEND
	SETB	PULSE_EDGE_SET
FC_LOOP_JQEND:
	POP	00H
	POP	ACC
	POP	PSW
	JBC	EC_FCWAIT,FC_LOOP_RET		; 延后的减圈,已处理过中断
;* 圈脉冲的一般处理
FC_LOOP_ZZINC:					; 4字节走字计数
	SETB	EC_ZZUP				; 置有新圈脉冲标志
	DJNZ	EC_COUNTER,FC_LOOP_END
	DJNZ	EC_COUNTER+1,FC_LOOP_END
	DJNZ	EC_COUNTER+2,FC_LOOP_END
	DEC	EC_COUNTER+3
FC_LOOP_END:
	CLR	TF2				; 清除圈中断标志
	JB	EC_BIGDIV,FC_LOOP_RET
	MOV	TL2,EC_NUMDIVL			; 小分频时在退出中断前设置分频系数
FC_LOOP_RET:
	RETI
;++++++++++++++++++++++++本板RS485通讯+++++++++++++++++++++++++++++++++
SYS_UART_T:					; 发送
	CLR	UART_TBUSY			; 本次发送完成,发送器就绪
	RETI					; 退出中断
C485_RECE:
	JBC	TI,SYS_UART_T			; 检测是发送中断还是接收中断
SYS_UART_R:					; 接收中断处理
	PUSH	PSW
	PUSH	ACC
	PUSH	B
	PUSH	00H				; 入栈保护
	MOV	A,SBUF				; 读取数据
	CLR	RI				    ; 清接收标志
;*******************************************************************
	JB	FLAG_FRAME_A0,FRAME_A0		; 判断帧标志A0:1接收过帧头,0没接收过帧头
;	JB	FLAG_FRAME_A1,FRAME_A1		; 判断帧标志A1:1接收过帧头,0没接收过帧头
	JB	FLAG_FRAME_A2,FRAME_A2		; 判断帧标志A2:1接收过帧头,0没接收过帧头
	JB	FLAG_FRAME_A3,FRAME_A3		; 判断帧标志A3:1接收过帧头,0没接收过帧头
SET_FRAME_A0:
	CJNE	A,#0A0H,SET_FRAME_A2
	SETB	FLAG_FRAME_A0
	AJMP	SYS_UART_REND
;SET_FRAME_A1:
;	CJNE	A,#0A1H,SET_FRAME_A2
;	SETB	FLAG_FRAME_A1
;	AJMP	SYS_UART_REND
SET_FRAME_A2:
	CJNE	A,#0A2H,SET_FRAME_A3
	SETB	FLAG_FRAME_A2
	CLR	FLAG_ADDR			; 清地址标志
	CLR	FLAG_LEN			; 清长度标志
	CLR	FLAG_ADDR_DATA
	AJMP	SYS_UART_REND
SET_FRAME_A3:	
	CJNE	A,#0A3H,SET_FRAME_END
	SETB	FLAG_FRAME_A3
	CLR	FLAG_LEN			; 清长度标志
	CLR	FLAG_ADDR			; 清地址标志
	CLR	FLAG_SYS_SN
SET_FRAME_END:
	AJMP	SYS_UART_REND
;********帧A0处理*****************	
FRAME_A0:					; 设备查询处理
	CJNE	A,SYS_SN,A0_END		; 判断是否本板地址
	SETB	FLAG_ANSWER			; 置回传标志		
A0_END:	
	CLR	FLAG_FRAME_A0			; 清帧标志A0
	AJMP	SET_FRAME_A0	
;********帧A1处理*****************	
;FRAME_A1:
;	CLR	FLAG_FRAME_A1			; 清帧标志A1
;	AJMP	SET_FRAME_A0	
;********帧A2处理*****************	

⌨️ 快捷键说明

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