📄 err3.asm
字号:
; 独立式误差计算器(AT89C52)源程序
; 版本:1.01
; 编写:金在东
; 注:用 ">>>>> ("
; ">>>>> )" 号括起的内容是后加用于实现通道选择功能
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;======================================= SFR
T2CON DATA 0C8H ; 定时器/计数器2控制寄存器(可位寻址)
T2MOD DATA 0C9H ; 定时器/计数器2方式控制寄存器
; HC5,HC4,HC3,HC2,T2CR,-,T2OE,DCEN
; hc5-hc2 =1时外中断5-2标志硬件自动清除。
; t2cr=1 捕获完成时自动复位
; t2oe=1 定时器2输出允许
; dcen=1 减计数允许,结合外部输入t2ex使用,16位自装入模式
RCAP2L DATA 0CAH ; 定时器2捕获低字节
RCAP2H DATA 0CBH ; 定时器2捕获高字节
TL2 DATA 0CCH ; 定时器/计数器2(低字节)
TH2 DATA 0CDH ; 定时器/计数器2(高字节)
;/* T2CON */
TF2 BIT 0CFH ;//定时器2溢出标志,软清除
EXF2 BIT 0CEH ;//定时器2外部标志,当exen2=1且t2ex引脚负跳变引起捕获或重载时置位,软清。
RCLK BIT 0CDH ;//接收时钟标志,=1时串口0用定时器2溢出做时钟。
TCLK BIT 0CCH ;//发送时钟标志,=1时串口0用定时器2溢出做时钟。
EXEN2 BIT 0CBH ;//定时器2外部允许标志,=1时若未用作拨特率发生器,t2ex脚的负跳变引起捕获
TR2 BIT 0CAH ;//定时器2运行控制位
C_T2 BIT 0C9H ;//计数/定时选择,=1时计数
CP_RL BIT 0C8H ;//捕获/重载标志,=1时,外部允许时,vt2ex负跳变发生捕获
;//=0时 溢出或外部允许时,vt2ex负跳变发生重载
;/*--Extensions--------------------------------------------*/
;/* PSW */
F1 BIT 0D1H ;
;/* IE */
ET2 BIT 0ADH ;//定时器2允许
ES1 BIT 0AEH ;//串口1优先
;/* IP */
PT2 BIT 0BDH ;//定时器2优先
PS1 BIT 0BEH ;//串口1优先
;======================================= 中断矢量
VEC_RESET EQU 0000H ; 复位
VEC_EINT0 EQU 0003H ; 外部中断0
VEC_T_C0 EQU 000BH ; 计数器/定时器0
VEC_EINT1 EQU 0013H ; 外部中断1
VEC_T_C1 EQU 001BH ; 计数器/定时器1
VEC_UART EQU 0023H ; 串口通讯中断
VEC_T_C2 EQU 002BH ; 计数器/定时器2
;======================================= 位定义
;------------------------------- P1端口
PULSE_FC BIT P1.0 ; 被检表被试脉冲输入(fc<200kHz)
JDQ_X485OFF BIT P1.1 ; 置高可打开本板被检表的485口
X5043_SDO BIT P1.2 ; 从X5043接收的串行信号
X5043_CS BIT P1.3 ; 发送到X5043的串行信号
X5043_SDI BIT P1.4 ; X5043的串行时钟
X5043_CLK BIT P1.5 ; X5043的片
C485_TRSEL BIT P1.7 ; 本板485口的收发选择(0收,1发)
PULSE_SELECT BIT P3.5 ; 脉冲高低频选择
PULSE_EDGE_SET BIT P3.6 ; 脉冲检测沿设置
CT_CHECK BIT P3.7 ; 电流互感器检测
JDQ_BSNAP BIT P1.6 ; 置低可合上24电压输入
JDQ_BH BIT P0.3 ; 捕黑继电器,默认短接状态
JDQ_AUTO BIT P0.4 ; 自动短接继电器,默认断开状态
;------------------------------- 片内功能位
KEY_DOWN BIT 00H ; 已有键按下 20H
KEY_PRESS BIT 01H ; 按键有效,可处理
;KEY_NUMBER BIT 02H ; 按键为数字键
;DATA_EXIST BIT 03H ; 已有数字键入
DISP_A BIT 08H ; 显示控制位A 21H
DISP_B BIT 09H ; 显示控制位B
DISP_C BIT 0AH ; 显示控制位C
BH_C1 BIT 0BH ; 捕黑控制位
BH_C2 BIT 0CH ; 捕黑控制位
PULSE_A BIT 0DH ; 脉冲选择控制位A
PULSE_B BIT 0EH ; 脉冲选择控制位B
PULSE_C BIT 0FH ; 脉冲选择控制位C
EC_MODE_EE BIT 10H ; EC_FLAGS.0,开始误差计算 22H
EC_LOOPBEG BIT 14H ; EC_FLAGS.4,已有首脉冲
EC_LOOPFIN BIT 15H ; EC_FLAGS.5,一次减圈完成
EC_BIGDIV BIT 18H ; 大分频标志;置1时为大分频,置0时为小分频 23H
EC_FCWAIT BIT 19H ; 被试脉冲中断挂起
EC_FHINC BIT 1AH ; 正在处理标拼溢出标志
EC_ZZUP BIT 1BH ; 被试脉冲走字更新
EC_PASS BIT 1CH ; 本次误差超差标志
EC_SIGN BIT 1DH ; 误差计算结果的符号
EC_TOPSIGN BIT 1EH ; 误差上限符号 0时为+,1时为-
EC_BOTSIGN BIT 1FH ; 误差下限符号 0时为+,1时为-
EC_FHCAP6 BIT 26H ; EC_FHCAP.6 24H
EC_FHCAP7 BIT 27H ; EC_FHCAP.7
FLAG_TIME_1MS BIT 28H ; 定时1mS到标志 25H
FLAG_CT_FIRST BIT 29H ; CT错误第一次检测标志
FLAG_ZZUP_TWO BIT 2AH ; AT93C46_ERR.2,芯片损坏
FLAG_BH_1MS BIT 2BH ; AT93C46_ERR.3
AT93C46_ERR4 BIT 2CH ; AT93C46_ERR.4
AT93C46_ERR5 BIT 2DH ; AT93C46_ERR.5
RESET_FLAG BIT 2EH ; 复位初始化标志 1时不进行RAM初始化
AT93C46_ERR7 BIT 2FH ; AT93C46_ERR.7
FLAG_DL BIT 30H ; 电能误差试验标志 STATE_FLAG 26H
FLAG_RJ BIT 31H ; 日计时误差试验标志
FLAG_XL BIT 32H ; 需量周期误差试验标志
FLAG_ZZ BIT 33H ; 走字试验标志
FLAG_QD BIT 34H ; 潜动试验标志
FLAG_QID BIT 35H ; 启动试验标志
FLAG_BH BIT 36H ; 捕黑试验标志
FLAG_MK BIT 37H ; 脉宽试验标志
FLAG_FRAME_A0 BIT 38H ; 帧标志A0 27H
FLAG_FRAME_A1 BIT 39H ; 帧标志A1
FLAG_FRAME_A2 BIT 3AH ; 帧标志A2
FLAG_FRAME_A3 BIT 3BH ; 帧标志A3
FLAG_ANSWER BIT 3CH ; 查询回传标志
FLAG_ADDR BIT 3DH ; 接收到地址标志
FLAG_GATHER BIT 3EH ; 集合标志
FLAG_LEN BIT 3FH ; 接收到长度标志
FLAG_COMMAND BIT 40H ; 接收到命令标志 28H
FLAG_ADDR_DATA BIT 41H ; 本板地址标志
FLAG_COMMAND_ANSWER BIT 42H ; 确认命令回传标志
UART_TBUSY BIT 43H ; 通讯发送就绪标志
FLAG_SYS_SN BIT 44H ; 本板地址标志,用于确认命令回传
QD_FLAG BIT 45H ; 电表潜动试验处理控制位
QID_FLAG BIT 46H ; 电表启动试验处理控制位
ZZ_FLAG BIT 47H ; 电表走字试验处理控制位
FLAG_ERR BIT 48H ; 误差超差显示处理标志 29H
DISP_FLASH BIT 49H ; 显示闪烁标志
PULSE_WIDTH_FLAG BIT 4AH ; 脉宽测试试验标志
PULSE_CATCH_FLAG BIT 4BH ; 电表捕黑试验标志
FLAG_AUTO_SHORT BIT 4CH ; 表位“自动短接标志”
FLAG_CT_CHECK BIT 4DH ; CT检测“出错标志”
FLAG_EC_ZZUP BIT 4EH
FLAG_UART BIT 4FH ; 通讯联机标志
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.
KEY_CHANNEL BIT 50H ;脉冲通道选择按键标志位
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;======================================= 片内RAM定义
VERIFY_FLAG1 DATA 11H
VERIFY_FLAG2 DATA 12H
ZZMC_BUF DATA 14H ; 4B 走字时脉冲存储初值单元
RJ_BF DATA 18H ; 1B 日计时倍频数
SYS_T500MS DATA 19H ; 1B
CATCH_SCALE DATA 1AH ; 1B,捕黑试验百分比
CT_CHECK_TIME DATA 1EH ; 2B,CT检测时间
PULSE_SL DATA 21H ; 1B,显示、脉冲和捕黑选择信号映射寄存器(.7.6.5脉冲控制位)(.4.3捕黑控制位)(.2.1.0显示位码控制位)
EC_FLAGS DATA 22H ; 1B,误差计算器工作标志群
EC_FHCAP DATA 24H ; 1B,捕捉标频计数最低字节
AT93C46_ERR DATA 25H ; 1B,AT93C46操作错误标志群
STATE_FLAG DATA 26H ; 1B,试验状态标志群
DISP_BUFFER DATA 30H ; 7B,显示缓冲(左到右,最高为灯)
DISP_DIGIT DATA 37H ; 1B,键盘/显示扫描位码(0-7)
SYS_T1MS DATA 38H ; 1B,系统1ms定时器
KEY_TIMER DATA 39H ; 1B,键盘控制计时器
KEY_CODE DATA 3AH ; 1B,译码后键值
CT_ERR_TIME DATA 3BH ; 2B,CT出错时间
WC_T_C DATA 3DH ; 1B,数据发送次数
UART_LEN DATA 3EH ; 1B,通讯长度
UART_CHECK_DATA DATA 3FH ; 1B,校验和
SYS_SN DATA 40H ; 1B,本板序号
FH_COUNTER DATA 41H ; 7B,标频计数扩展
FH_CAPTURE DATA 48H ; 4B,标频计数低4字节捕捉存储 ; FH_COUNTER低三位和硬件
FH_RESULT DATA 4CH ; 4B,一次减圈完成的标频计数值
FH_CONST DATA 50H ; 6B,标准表常数(PBCD,1-999999999999)
EC_COUNTER DATA 56H ; 4B,被检表脉冲走字计数
EC_CONST DATA 5AH ; 3B,被检表常数(分频后,PBCD,1-99999)
EC_NUMLOOP DATA 5DH ; 1B,一次误差计算的圈数
EC_RUNLOOP DATA 5EH ; 1B,减圈中的当前圈数
EC_NUMDIVL DATA 5FH ; 1B,分频的低字节特殊处理用
EC_TOP DATA 60H ; 2B
EC_BOT DATA 2BH ; 2B
RECV_BPW DATA 2EH ; 1B 接收缓冲存储控制指针
RECV_BPR DATA 2FH ; 1B 接收缓冲读取控制指针
TEMP_B0 DATA 62H ; 1B/12B
TEMP_B1 DATA TEMP_B0+1
TEMP_B2 DATA TEMP_B0+2
TEMP_B3 DATA TEMP_B0+3
TEMP_B4 DATA TEMP_B0+4
TEMP_B5 DATA TEMP_B0+5
TEMP_B6 DATA TEMP_B0+6
TEMP_B7 DATA TEMP_B0+7
TEMP_B8 DATA TEMP_B0+8
TEMP_B9 DATA TEMP_B0+9
TEMP_B10 DATA TEMP_B0+10
TEMP_B11 DATA TEMP_B0+11
TEMP_B12 DATA TEMP_B0+12
TEMP_B13 DATA TEMP_B0+13
TEMP_BUFFER DATA 70H ; 16B
RECV_BUF DATA 80H ; 8B 接收缓冲区
WC_BUFFER DATA 88H ; 12B 误差发送缓冲
CHANNEL_BUFFER DATA 0A0H ; 通道号显示缓存
;======================================= AT89C52地址定义
EEADS_SN EQU 00H ; 1B,本板序号
EEADS_SNCHK EQU 70H ; 1B,本板序号校验码
;======================================= 常数定义
;-------------------------------
CONST_T1MS EQU 6 ; 系统1ms基准=6/6kHz
CONST_KDELAY EQU 10 ; 按键时的去抖时间(10ms)
CONST_KWAIT EQU 250 ; 响应按键后的等待时间(200ms)
;-------------------------------
CONST_SF_SN EQU 57H ; 修改本板序号密码:"460415"
;-------------------------------
CONST_SNDEF EQU 0 ; 未设置时的默认序号
CONST_SNMAX EQU 96H ; 允许的最大序号
CONST_SNVER EQU 5AH ; 序号校验码因子
;-------------------------------
CONST_KEY_B EQU 0BH ; "表号"键
CONST_KEY_C EQU 0CH ; "常数"键
CONST_KEY_R EQU 0EH ; "确认"键
CONST_KEY_L EQU 0FH ; "取消"键
;-------------------------------
CONST_CHAR_SPC EQU 24H ; 空格
CONST_CHAR_NEG EQU 28H ; 负号
CONST_LED_OVER EQU 28H ; "超差"指示灯
CONST_LED_PASS EQU 29H ; "合格"指示灯
;-------------------------------通讯变量
CONST_RBLEN EQU 16 ; 接收缓冲大小
CONST_CMLEN EQU 9 ; 命令最大长度
;+++++++++++++++++++++++++X5043控制子程序+++++++++++++++++++++++++
;指令名称 指令格式 操作功能
; WREN 0000 0110 “写允许”指令码
; WRDI 0000 0100 “写禁止”指令码
; WRSR 0000 0101 “写状态寄存器”指令码
; RDSR 0000 0001 “读状态寄存器”指令码
; WRITE 0000 A010 “写数据”指令码
; READ 0000 A011 “读数据”指令码
X5043_WREN_INST EQU 06H ; “写允许”指令
X5043_WRDI_INST EQU 04H ; “写禁止”指令
X5043_WRSR_INST EQU 01H ; “写状态寄存器”指令
X5043_RDSR_INST EQU 05H ; “读状态寄存器”指令
X5043_WRITE_INST EQU 02H ; “写数据”指令
X5043_READ_INST EQU 03H ; “读数据”指令
X5043_STATUS_REG DATA 1BH ;
X5043_BYTE_ADDR DATA 1CH ;
X5043_BYTE_DATA DATA 1DH ;
X5043_PAGE_ADDR EQU 1F0H ;
X5043_PAGE_DATA1 EQU 22H ;
X5043_PAGE_DATA2 EQU 33H ;
X5043_PAGE_DATA3 EQU 44H ;
X5043_MAX_POLL EQU 99H ;
X5043_INIT_STATE EQU 09H ;
X5043_SLIC EQU 30H ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG VEC_RESET
AJMP MAIN_INIT
INTERRUPT_RET:
RETI
;;;;;;;;;;;;;;外部中断0 键盘处理;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG VEC_EINT0
PUSH ACC
MOV A,#00H ; COL0键值范围:00H-07H
AJMP KEY_SCAN
;;;;;;;;;;;;;;计数器/定时器0中断 标频处理 ;;;;;;;;;;;;;;;;;;;
ORG VEC_T_C0
SETB EC_FHINC ; 置标频溢出处理标志
AJMP FH_OVER
;;;;;;;;;;;;;;外部中断1 键盘处理;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG VEC_EINT1
PUSH ACC
MOV A,#08H ; COL1键值范围:08H-0FH
AJMP KEY_SCAN
;;;;;;;;;;;;;;计数器/定时器1中断 时钟处理;;;;;;;;;;;;;;;;;;;
ORG VEC_T_C1
DJNZ SYS_T1MS,INTERRUPT_RET
MOV SYS_T1MS,#CONST_T1MS
AJMP SYS_CLK ; 系统1ms时钟
;;;;;;;;;;;;;;串行通讯中断 RS485;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG VEC_UART
LJMP C485_RECE
FC_LOOP_DIV:
MOV TL2,EC_NUMDIVL ; 大分频时立即设置分频系数
AJMP FC_LOOP
;;;;;;;;;;;;;;计数器/定时器2中断 被检脉冲;;;;;;;;;;;;;;;;;;;
ORG VEC_T_C2
JB EC_BIGDIV,FC_LOOP_DIV
AJMP FC_LOOP
;;;;;;;;;;;;;;;;;;;;;;;;主程序:系统初始化;;;;;;;;;;;;;;;;;;;;
ORG 0030H
MAIN_INIT:
LCALL YS100 ; 延时等待复位稳定
CLR EA ; 关中断
CLR EX0 ; 关闭外部中断0
CLR EX1 ; 关闭外部中断1
CLR ET0 ; 关闭定时器中断0
CLR ET1 ; 关闭定时器中断1
CLR ET2 ; 关闭定时器中断2
CLR ES ; 关闭串行口中断
; (0B0H)P3 : (.7) RD,(.6) WR,(.5) T1,(.4) T0,(.3)EI1,(.2)EI0,(.1)TXD,(.0)RXD
MOV SP,#094H ; (81H)SP:STACK=80H->0FFH;堆栈设置
; (0D0H)PSW : (.7) CY,(.6) AC,(.5) F0,(.4)RS1,(.3)RS0,(.2) OV,(.1)NUL,(.0) P
MOV PSW,#0H ; 清标志,寄存器组使用0组(00H-07H)
; (87H)PCON : (.7)SMD,(.6)NUL,(.5)NUL,(.4)NUL,(.3)GF1,(.2)GF0,(.1) PD,(.0)IDL
MOV PCON,#0H ; 波特率不加倍,系统为正常工作状态
; (88H)TCON : (.7)TF1,(.6)TR1,(.5)TF0,(.4)TR0,(.3)IE1,(.2)IT1,(.1)IE0,(.0)IT0
MOV TCON,#0H ; 停止T0,T1,清中断标志,INT0,INT1用低电平中断
; (89H)TMOD : (.7)GT1,(.6)TC1,(.5)M11,(.4)M01,(.3)GT0,(.2)TC0,(.1)M10,(.0)M00
MOV TMOD,#27H ; 定时器0:模式3,拆为两个8位计数器使用
; TL0为标频计数器,TH0为系统时钟(借用TR1,TF1)
; 定时器1:模式2,8位自动重装载,用于波特率控制
MOV TH1,#0FBH ; (8DH)TH1:ft1=18.432MHz/12/(256-251)=307.2kHz
MOV TL1,#0FBH ; (8BH)TL1 波特率=ft1*1/32=9600bps
MOV TH0,#0H ; (8CH)TH0:系统时钟=18.432MHz/12/256=6kHz
MOV TL0,#0H ; (8AH)TL0:标频计数清零
; (0C8H)T2CON: (.7)TF2,(.6)XF2,(.5)RCL,(.4)TCL,(.3)XE2,(.2)TR2,(.1)TC2,(.0)RC2
MOV T2CON,#02H ; 定时器2:16位自动重装计数器,用于被检脉冲分频0000 0010
; (0C9H)T2MOD: (.7)NUL,(.6)NUL,(.5)NUL,(.4)NUL,(.3)NUL,(.2)NUL,(.1)T2O,(.0)DCE
MOV T2MOD,#0H ; T2不输出,只做加计数
MOV RCAP2L,#0H ; (0CAH)RCAP2L
MOV TL2,#0H ; (0CCH)TL2
MOV TH2,#0H ; (0CDH)TH2,第一圈不分频(1分频)
; (98H)SCON : (.7)SM0,(.6)SM1,(.5)SM2,(.4)REN,(.3)TB8,(.2)RB8,(.1) TI,(.0) RI
MOV SCON,#70H ; 方式1,10位异步,检验停止位,允许接收, 01110000
; (0B8H)IP : (.7)NUL,(.6)NUL,(.5)PT2,(.4) PS,(.3)PT1,(.2)PX1,(.1)PT0,(.0)PX0
MOV IP,#0H
SETB PT2 ; 被检脉冲需立即响应,应优先中断
; OTHER SFR : (83H)DPL,(84H)DPH,(99H)SBUF,(0E0H)ACC,(0F0H)B
;----------------清内部RAM------------------------
INIT_CONTINUE0:
CLR A ; 清内部RAM
MOV R0,#08H
MOV R1,#0F7H
MAIN_INIT_CLRRAM:
MOV @R0,A ; CLEAR RAM INSIDE(20H-B0H)
INC R0
DJNZ R1,MAIN_INIT_CLRRAM
;--------------对外围电路进行初始化---------------
MOV SYS_T1MS,#CONST_T1MS
MOV DISP_DIGIT,#7 ; 从最低位开始显示
MOV EC_NUMDIVL,#0FFH ; 1B,分频的低字节特殊处理用
MOV RCAP2H,#0FFH ; 默认1分频
CLR EC_BIGDIV ; 为小分频
MOV A,EC_NUMDIVL
MOV TL2,A
MOV A,RCAP2H
MOV TH2,A
MOV EC_NUMLOOP,#5 ; 检验圈数默认5圈
MOV EC_CONST+1,#32H ; 被检表常数默认3200
MOV FH_CONST+3,#18H ; 标准表常数默认18 00 00 00
MOV EC_TOP+1,#02H
CLR EC_TOPSIGN ; 误差上限+2.0%
MOV EC_BOT+1,#02H
SETB EC_BOTSIGN ; 误差下限-2.0%
;*************************初始化标志位和变量****************
MOV STATE_FLAG,#0 ; 清“试验状态标志群”
SETB FLAG_DL ; 置“电能校验试验标志”
;***********************************************************
CLR FLAG_FRAME_A0 ; 清帧标志A0
CLR FLAG_FRAME_A1 ; 清帧标志A1
CLR FLAG_FRAME_A2 ; 清帧标志A2
CLR FLAG_FRAME_A3 ; 清帧标志A3
CLR FLAG_ANSWER ; 清除查询设备回传标志
CLR FLAG_ADDR ; 清除地址标志
CLR FLAG_GATHER ; 清除集合标志
CLR FLAG_LEN ; 清除长度标志
CLR FLAG_COMMAND ; 清除命令处理标志
CLR FLAG_ADDR_DATA ; 清除有本板地址标志,用于A2集合命令
CLR FLAG_COMMAND_ANSWER ; 清除命令回传标志
CLR UART_TBUSY ; 通讯发送就绪标志
CLR FLAG_SYS_SN ; 清除本板地址标志,用于确认命令回传
CLR FLAG_ERR
CLR DISP_FLASH
CLR QD_FLAG
CLR QID_FLAG
CLR ZZ_FLAG
CLR PULSE_WIDTH_FLAG
CLR PULSE_CATCH_FLAG
CLR FLAG_AUTO_SHORT
CLR FLAG_CT_CHECK
CLR FLAG_UART
CLR FLAG_TIME_1MS
CLR FLAG_CT_FIRST
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
CLR KEY_CHANNEL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
MOV CT_ERR_TIME,#0H
MOV CT_ERR_TIME+1,#0H
MOV CT_CHECK_TIME,#0H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -