📄 200.asm
字号:
;有功无功一体表初稿
;地址分配 20H,21H,22H设为位标志位区,23H-2FH设为字节标志位,54H-57H设为字节标志,30H-43H为与上位机通信缓冲区,
; 58H 59H 5AH为除法商暂存区 5AH-7FH为暂时空区 26H.27H.28H为数据读出再次缓冲区,即计算区((2EH,2FH,都为空 ))
;4CH,4DH,4EH,4FH为SPI数据写入缓冲区,50H,51H,52H,53H,为SPI数据读出缓冲区
;((4AH,4BH暂时空的 )), 44H,45H,46H,47H,48H,49H数据暂存器(与I2C总线通信)
;存储器内空间分配:0010H-0013H为有功电能,0014H-0017H为无功电能,0020H-0023H为有功电能初始值,0024H-0027H为
; 无功电能初始值,0018H-001DH为表地址,0028H-002BH为掉电保护存储数据
;20H
RESET_BZ BIT 01H
SIG_BZ BIT 02H
TXDA_BZ BIT 03H
TXST_BZ BIT 04H
ACK_BZ BIT 05H
JYOK_BZ BIT 06H
TXOV_BZ BIT 07H
JYOK1_BZ BIT 08H ;非本表地址无应答标志位
JYOK2_BZ BIT 09H ;非广播地址标志位
TXONE EQU 23H
CJSJ_CS EQU 24H
TXLJSH_CS EQU 25H
MUHC EQU 26H
;MUHC+1 EQU 27H
;MUHC+2 EQU 28H
WUGONG_CS EQU 54H
YOUGONG_CS EQU 55H
YGJISHU_CS EQU 56H
WGJISHU_CS EQU 57H
OO EQU 58H
QQ EQU 59H
UU EQU 5AH
SLA EQU 0A0H ;2404存储器的入口地址
MTRD EQU 29H
NUMBYTE EQU 2AH
SUBAH EQU 2BH
SUBAL EQU 2CH
RTEMP_CS EQU 2DH
JSCD_CS EQU 2EH
FEJC_CS EQU 2FH
SPI_CS BIT P1.0
SPI_CK BIT P1.1
SPI_DI BIT P1.2
SPI_DO BIT P1.3
SCL BIT P1.4
SDA BIT P1.5
TXC BIT P1.7
MT0 BIT P2.2
MT1 BIT P2.3
MT2 BIT P2.0
MT3 BIT P2.1
ORG 0000H
AJMP MAIN ;主要完成初始化,复位,存储器存数,计度器动作
NOP
ORG 0003H
JMP XIAOBIAO ;校表参数设置 外部中断0 INT0
DB 0,0,0,0,0
ORG 000BH
JMP QUDIANLIANG ;定时到ATT7022里去取电量 定时中断0
DB 0,0,0,0,0
ORG 0013H
JMP DIAODIAN ;掉电保护,应设为最高级中断
DB 0,0,0,0,0,0
DB 0,0,0,0,0,0,0
ORG 0023H
JMP CHUANKOU ;串行口通信,接受数据
MAIN:
MOV SP,#76H ;把堆栈放到哪???????
MOV P1,#0f6H ;P1的初始状态再定 ?????
MOV P2,#0ffH ;P2的初始状态再定 ?????
;LCALL MS100
;LCALL MS100
;LCALL MS100
;LCALL MS100
;LCALL MS100
MOV R0,#08H ;清零
QINGLING:
MOV @R0,#00H
INC R0
CJNE R0,#00H,QINGLING
SHANGDIAN:
MOV MTRD,#54H
MOV SUBAH,#00H
MOV SUBAL,#28H
MOV NUMBYTE ,#04H
LCALL IRDNBYTE ;上电后把无功常数,有功常数再取回来,要取四个
JNB ACK_BZ,SHANGDIAN
CLR ACK_BZ
LCALL RESET7022 ;校表参数写入
LCALL XBZHUCHENGXU
MOV TXONE,#30H ;通讯指针首地址
MOV SCON,#0D0H ;串口方式3,允许接收
MOV PCON,#00H ;
MOV TMOD,#21H ;定时器T0为方式1,T1为方式2
MOV TH1,#0F8H ;波特率为BPS 1200,3.589M
MOV TL1,#0F8H
MOV TL0,#01H ;定时器65毫秒(待定)
MOV TH0,#01H
CLR IT0 ;负边沿触发
SETB TR0 ;启T0计数
SETB TR1 ;启T1计数
SETB ET0 ;开T0中断
SETB EX0 ;开INT0中断
SETB EX1 ;开INT1中断
SETB PX1 ;设INT1为高优先级
SETB ES ;开串行口中断
SETB EA ;开所有中断
KAISHI:
JB RESET_BZ,BUFUWEI ;判断是否刚上电或还没复位,如果没有就复位
FUWEI:
LCALL RESET7022 ;复位
BUFUWEI:
JNB SIG_BZ,KAISHI1 ;是否已经完成了INT0中断,是否开始校表?
XB:
LCALL XBZHUCHENGXU ;进入真正的校表程序
CLR SIG_BZ
KAISHI1:
LCALL JDQDONGZUO
CLR TXC
NOP
NOP
JNB TXST_BZ,JIESHU ;收到数据了么?
JNB TXDA_BZ,JIESHU ;数据接收完了么?
CLR ES
SETB TXC
LCALL TXACK ;通讯应答
CLR TXDA_BZ
CLR TXST_BZ
MOV FEJC_CS,#00H
MOV R0,#30H ;清零
MOV R2,#14H ;20个字节
JIESHU2:
MOV @R0,#00H
INC R0
DJNZ R2,JIESHU2
MOV TXONE,#30H
MOV CJSJ_CS,#00H
CLR TXC
SETB ES
JMP JIESHU1
JIESHU:JNB TXOV_BZ,JIESHU1 ;如果数据还没接受完,就看通信超时了么?
NOP
NOP
MOV R0,#30H ;清零
MOV R2,#14H ;20个字节
JIESHU3:
MOV @R0,#00H
INC R0
DJNZ R2,JIESHU3
MOV TXONE,#30H
MOV CJSJ_CS,#00H
CLR TXC
clr TXDA_BZ
CLR TXST_BZ
CLR TXOV_BZ
SETB ES
;SETB REN
; NOP
; NOP
JIESHU1:LJMP KAISHI1
NOP
NOP
LJMP ERR
;*****************************************************************************************************
;复位子程序
RESET7022:
SETB RESET_BZ
CLR P2.7
MOV R7,#20H
DELAY1:NOP
DJNZ R7,DELAY1
SETB P2.7
MOV R7,#0FFH
DELAY2:NOP
DJNZ R7,DELAY2
RET
;************************************************************************************************************
;校表程序,向7022输入校表数据
XBZHUCHENGXU:
MOV 4CH,#80H ;写起始校表命令字,任意三个字节写到校表寄存器00H里
MOV 4DH,#00H
MOV 4EH,#00H
MOV 4FH,#00H
LCALL WRITE_SPI ;写命令
MOV 4CH,#0A0H ;写高频脉冲输出参数到校表寄存器20H(命令0A0H)
MOV 4DH,#00H
MOV 4EH,#00H
MOV 4FH,#89H ;三个字节数据根据公式计算出来
LCALL WRITE_SPI
MOV 4CH,#9FH
MOV 4DH,#00H
MOV 4EH,#08H
MOV 4FH,#7EH
LCALL WRITE_SPI ;写启动电流
MOV 4CH,#9EH
MOV 4DH,#02H
MOV 4EH,#0E7H
MOV 4FH,#2EH
LCALL WRITE_SPI ;写比差分段补偿区域设置 在35%
MOV 4CH,#82H
MOV 4DH,#0EH
MOV 4EH,#83H
MOV 4FH,#0E4H
LCALL WRITE_SPI ;写相位补偿区域设置1 区域在175%
MOV 4CH,#83H
MOV 4DH,#06H
MOV 4EH,#38H
MOV 4FH,#86H
LCALL WRITE_SPI ;写相位补偿区域设置2 区域在75%
MOV 4CH,#84H
MOV 4DH,#01H
MOV 4EH,#3EH
MOV 4FH,#81H
LCALL WRITE_SPI ;写相位补偿区域设置3 区域在15%
MOV 4CH,#85H
MOV 4DH,#00H
MOV 4EH,#0A9H
MOV 4FH,#0DEH
LCALL WRITE_SPI ;写相位补偿区域设
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -