📄 err3.asm
字号:
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 + -