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

📄 200.asm

📁 一个完整的ASM程序
💻 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 + -