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

📄 jlout.asm

📁 单片机将数据写如RAM1024中
💻 ASM
字号:
;******************************************************************
;陕西敏峰电子科技有限公司
;归档文件 电源控制板编号11/+15V
;编写:成海朋   修改日期:2008年1月8日
;完成功能:将十二位D/A数值通过RS485传送给模拟输出板,使用11.0592M晶振,波特率为19200
;程序实现将一帧数据200个字节接收并存入IS61C1024芯片RAM中,然后将RAM中的数据读出,通过DA转换输出
;帧格式为:8A ** 1* ##............ (共204字节)
;8A为帧头;**为数据字节长度字节(00代表200个字节,并表示本帧非最后一帧,**代表最后一帧,其值表示本帧有效字节数)
;##为有效字节的效验(取和)。成功接受帧信息则返回55 55 55 并将接收的数据存入RAM 否则返回AA AA AA等待重收
;******************************************************************


          TIME_L      EQU  29H     
          TIME_H      EQU  2AH     ;100US定时器中断计数单元
          SIO_T1CNT   EQU  2BH     ;
          ADDRE_L     EQU  2CH     ;存储器地址存放单元低位
          ADDRE_H     EQU  2DH     ;存储器地址存放单元高位
          SADDRE_L0   EQU  2EH     ;重复触发地址保存单元
          SADDRE_H0   EQU  2FH
          SADDRE_L    EQU  30H     ;
          SADDRE_H    EQU  31H     ;存储器单元指针
          LEN         EQU  32H     ;一帧数据长度
          
          SIOBUSY    BIT 00H
          SIOFAIL    BIT 01H
          RECFAIL    BIT 02H
          DA_FAIL    BIT 03H
          
          
          SIOREC     EQU  33H
          
          INT0       EQU P3.2
          RT485      EQU P3.3     ;IC485 *RX/TX CONTROL
          RAM_CE1    EQU P3.5
          RAM_OE     EQU P3.4
          RAM_WE     EQU P3.7
          A16        EQU P3.6
          RAM_CE2    EQU P2.0
          HC573_1    EQU P2.1
          HC573_2    EQU P2.2
          AD_LDAC    EQU P2.3
          AD_CLR     EQU P2.4
          AD_WR      EQU P2.5
          AD_CS      EQU P2.6
          AD_HBEN    EQU P2.7

          ORG 0000H
          LJMP MAIN
          
          ORG 0003H
          LJMP SETPOWER
          
          ORG 000BH            ;定时器用于接收数据的时间处理,暂时定位65535US
          LJMP TIME0
          
          ORG 0013H
          RETI
          
          org 001bH
          reti
          
          ORG 0023H
          LJMP siosm1
          
          ORG 002BH
          LJMP TIME2
          
          ORG 0050H
          NOP
MAIN:     NOP
	      MOV R0,#1FH
QRAM:     MOV A,#00H
          INC R0
          MOV @R0,A
	      MOV A,R0
	      CJNE A,#0FFH,QRAM
	      MOV ADDRE_L,#00H
          MOV ADDRE_H,#00H
          MOV TL2,#00H
          MOV TH2,#00H
          SETB ET2
          CLR TR2
start:    nop
          CLR SIOBUSY
          CLR SIOFAIL
          CLR RECFAIL
          CLR HC573_1
          CLR HC573_2
          NOP
          CLR RT485
          MOV TMOD,#20H
          MOV TH1,#0FDH
          MOV TL1,#0FDH        ;现在波特率为19200
          MOV PCON,#80H        ;SMOD=1, SINGLE RATE
          MOV SCON,#50H        ;8 BIT DATA, 1 BIT(1)
          SETB PS
          SETB TR1
          SETB EA
          SETB ES
          MOV TH0,#0F7H
          MOV TL0,#00H
          SETB ET0
          SETB TR0
          CLR IE0
          SETB RAM_CE1
          CLR RAM_CE2
          CLR AD_CLR
          NOP  
          SETB AD_CLR
SIORE:    nop
          JB SIOFAIL,ST_DATA
          NOP
          NOP
          LJMP SIORE
          NOP

;******************************************************
;通讯数据包解包程序
;******************************************************

ST_DATA:
          NOP
	      CLR C
          MOV R0,#SIOREC
          MOV A,@R0
          CJNE A,#8AH,START
          INC R0
          MOV A,@R0
          CJNE A,#00H,SET_LEN
          MOV LEN,#200
          LJMP LEN_OK
SET_LEN:  MOV LEN,A
          SETB RECFAIL                 ; 数据帧接收完标志位,最后一帧
LEN_OK:   INC R0
          MOV A,@R0
          CJNE A,#11H,START1            ;电源控制板卡编号为11H
          LCALL DATA_CHECK
          NOP
          MOV R0,#SIOREC+3              ;数据校验和
          MOV A,@R0  
          CJNE A,B,SIOERR              ;判断校验码是否正确#SIOREC+0EH
          LCALL DATA_SAVE              ;正确则将本帧数据存储
          NOP
SIO_OK:   NOP
          MOV A,#55H
          LJMP SIOS
SIOERR:   NOP
          MOV A,#0AAH
SIOS:     NOP
          SETB RT485
          NOP
          MOV SBUF,A
          JNB TI,$
          CLR TI
          MOV SBUF,A
          JNB TI,$
          CLR TI
          MOV SBUF,A
          JNB TI,$
          CLR TI
          NOP
START1:   LJMP START
          NOP

;******************************************************
;RAM数据存储程序
;实现将地址从#SIOREC+04开始的LEN长度的相应字节存入RAM,RAM地址
;由 ADDRE_L和 ADDRE_H顺序递增,不需要帧号,顺序完成一帧数据的存入
;******************************************************

DATA_SAVE:PUSH ACC
          PUSH PSW
          MOV R7,LEN
          MOV R0,#SIOREC+04
          CLR A16
          CLR RAM_CE1
          SETB RAM_CE2
          CLR RAM_OE
RAM_WR:   ;写程序RAM根据时序
          LCALL ADDR_WR
          MOV A,@R0
          MOV P0,A
          CLR RAM_WE
          NOP
          SETB RAM_WE
          INC R0
          DJNZ R7,RAM_WR
          JB RECFAIL,INIT_ADDR       ;判断是否为最后一帧数据连续写入,是则将写入地址ADDRE_L,ADDRE_H清零,
                                     ;并将当前存储器数据存入地址保存,输出取值读数时用
          LJMP SAVE_RET
INIT_ADDR:CLR RECFAIL
          MOV SADDRE_L,ADDRE_L  ;
          MOV SADDRE_H,ADDRE_H
          MOV SADDRE_L0,ADDRE_L  ;
          MOV SADDRE_H0,ADDRE_H
          SETB EX0                   ; 打开中断同步触发输出控制
          MOV ADDRE_L,#00H
          MOV ADDRE_H,#00H
SAVE_RET: SETB RAM_CE1
          CLR RAM_CE2
          pop psw
          pop acc
          RET

;******************************************************
;RAM数据存储地址改变程序
;******************************************************

ADDR_WR:  PUSH ACC
          SETB HC573_1
          MOV A,ADDRE_L
          MOV P1,A
          CLR HC573_1
          SETB HC573_2
          MOV A,ADDRE_H
          MOV P1,A
          CLR HC573_2
          CLR C
          MOV A,ADDRE_L
          ADD A,#01
          MOV ADDRE_L,A
          MOV A,ADDRE_H
          ADDC A,#00
          MOV ADDRE_H,A 
          POP ACC 
          RET
          
;******************************************************
;串口接收程序
;******************************************************

SIOSM1:   PUSH ACC
          PUSH PSW
          mov a,sbuf
          JB SIOBUSY,MSSM
          CJNE A,#8AH,SIORET           ;数据包头
          CLR SIOFAIL
          MOV R0,#SIOREC
          MOV SIO_T1CNT,#00            ;接收到数据包头则开启定时器0,并将定时中断次数清零,10次定时中断为655MS
MSSM:     NOP
          MOV @R0,A
          MOV A,R0
          CJNE A,#SIOREC+02H,MSSM1
          MOV A,@R0
          CJNE A,#11H,SIORET           ;地址SIOREC+02H为电源控制板卡编号为11H
MSSM1:    NOP
          SETB SIOBUSY
          CLR SIOFAIL
          MOV A,R0
          CJNE A,#SIOREC+203,SIOEXIT   ;判断一帧数据字节是否接收完
          SETB SIOFAIL
SIORET:   NOP
          CLR SIOBUSY
          NOP
SIOEXIT:  NOP
          CLR C
          INC R0
          CLR RI
          pop psw
          pop acc
          RETI
          
;******************************************************
;定时器0中断
;******************************************************

TIME0:    NOP
          NOP
          CLR TF0           
          MOV TH0,#00H
          MOV TL0,#00H
          PUSH ACC
          PUSH B
          PUSH PSW
          JNB SIOBUSY,EXX              ;SIO COMU IS STARING ? IF NOT JUMP EXX
          JB SIOFAIL,EXX               ;SIO COMU IS ENDED ? IF YES JUMP EXX
          INC SIO_T1CNT
          MOV A,SIO_T1CNT
          CJNE A,#15,EXX               ;定时器中断15次判断
          CLR SIOFAIL                  
          CLR SIOBUSY                  ;如在15H*65535US时间内一帧数据未接受完,则结束本帧接受
EXX:      SETB TR0
          POP PSW
          POP B
          POP ACC
          RETI
          NOP
          
;******************************************************
;定时器2中断(100US)
;******************************************************
TIME2:    CLR TF2
          MOV TL2,#0A6H        ; 定时器100US时间定时
          MOV TH2,#0FFH
          JB INT0,POWER4
          JB DA_FAIL,POWER2
          CLR C                ; 一个16位的计数器,计算定时器中段的次数
          MOV A,TIME_L
          SUBB A,#01
          MOV TIME_L,A
          MOV A,TIME_H
          SUBB A,#00
          MOV TIME_H,A
          MOV A,TIME_L
          CJNE A,#00,POWER2
          MOV A,TIME_H
          CJNE A,#00,POWER2
          LJMP POWER3
POWER4:   CLR AD_CLR
          NOP  
          SETB AD_CLR
          CLR DA_FAIL
          SETB TR0
          SETB RAM_CE1
          CLR RAM_CE2          ;RAM转入禁止读写状态
          SETB AD_LDAC
          MOV ADDRE_L,#00H
          MOV ADDRE_H,#00H
          SETB EX0   ;要求可重复触发,INT0中断开
          SETB ES
          CLR TR2    
POWER2:   RETI  
          
POWER3:   CLR C               ; 读出RAM中的数据,每次4个字节为一个信息,2个数据字节,2个差值时间字节 
          MOV A,SADDRE_L
          SUBB A,#04
          MOV SADDRE_L,A
          MOV A,SADDRE_H
          SUBB A,#00
          MOV SADDRE_H,A
          MOV A,SADDRE_L
          CJNE A,#00,POWER1
          MOV A,SADDRE_H
          CJNE A,#00,POWER1
          SETB DA_FAIL
POWER1:   
          CLR AD_CS
          CLR AD_WR
          CLR AD_HBEN
          SETB AD_LDAC
          
          SETB HC573_1          ;读RAM低位字节
          MOV A,ADDRE_L
          MOV P1,A
          CLR HC573_1
          SETB HC573_2
          MOV A,ADDRE_H
          MOV P1,A
          CLR HC573_2
          CLR C
          MOV A,ADDRE_L         ;修改地址
          ADD A,#01
          MOV ADDRE_L,A
          MOV A,ADDRE_H
          ADDC A,#00
          MOV ADDRE_H,A
          SETB AD_WR            ; 送DA输出
          SETB AD_HBEN
          CLR AD_WR   
                    
          SETB HC573_1          ;读RAM低位字节
          MOV A,ADDRE_L
          MOV P1,A
          CLR HC573_1
          SETB HC573_2
          MOV A,ADDRE_H
          MOV P1,A
          CLR HC573_2
          CLR C                 ;修改地址
          MOV A,ADDRE_L
          ADD A,#01
          MOV ADDRE_L,A
          MOV A,ADDRE_H
          ADDC A,#00
          MOV ADDRE_H,A
          SETB AD_WR            ; 送DA输出
          CLR AD_LDAC
          MOV TL2,#0A6H
          MOV TH2,#0FFH
          
          SETB HC573_1          ;读RAM低位字节
          MOV A,ADDRE_L
          MOV P1,A
          CLR HC573_1
          SETB HC573_2
          MOV A,ADDRE_H
          MOV P1,A
          CLR HC573_2
          CLR C
          MOV A,ADDRE_L         ;修改地址
          ADD A,#01
          MOV ADDRE_L,A
          MOV A,ADDRE_H
          ADDC A,#00
          MOV ADDRE_H,A
         
          MOV A,P0
          MOV TIME_L,A          ;读时间低位信息 
          
          SETB HC573_1          ;读RAM低位字节
          MOV A,ADDRE_L
          MOV P1,A
          CLR HC573_1
          SETB HC573_2
          MOV A,ADDRE_H
          MOV P1,A
          CLR HC573_2
          CLR C
          MOV A,ADDRE_L         ;修改地址
          ADD A,#01
          MOV ADDRE_L,A
          MOV A,ADDRE_H
          ADDC A,#00
          MOV ADDRE_H,A
  
          MOV A,P0
          MOV TIME_H,A          ;读时间高位信息
          
          JNB DA_FAIL,POWER0
          MOV ADDRE_L,#00H
          MOV ADDRE_H,#00H
POWER0:   RETI   
          
          

;******************************************************
;校验和
;ADD RESULT RETURN B
;******************************************************

DATA_CHECK:PUSH PSW                  ;OUT B IS ADDVER_CODE
          MOV B,#00H
          CLR C
          MOV A,LEN
          MOV R7,A
          MOV R1,#SIOREC+4
DAVER1:   MOV A,@R1
          ADD A,B
          XCH A,B
          CLR C
          INC R1
          DJNZ R7,DAVER1
          POP PSW
          RET

;******************************************************
;设置AD5341
;******************************************************
SETDA:   NOP
         CLR AD_CS
         CLR AD_WR
         CLR AD_HBEN
         SETB AD_LDAC
         LCALL ADDR_WR
         NOP
         SETB AD_WR
         SETB AD_HBEN
         CLR AD_WR
         LCALL ADDR_WR
         NOP
         SETB AD_WR
         CLR AD_LDAC
         NOP
         RET

;********************************************************
;中断相应IN0,服务程序
;完成将数据从RAM中读出并送DA处理,一次完成一个十六位的数据要求在60US内完成,时间严格控制
;地址从00取到SADDRE_L,SADDRE_H
;********************************************************

SETPOWER: NOP
          PUSH ACC
          PUSH PSW
          CLR IE0
          CLR ES
          CLR EX0   ;关中断
          ; 读写程序
          CLR RAM_OE
          CLR RAM_CE1
          SETB RAM_CE2
          SETB RAM_WE
          SETB AD_CS
          SETB AD_LDAC
          SETB AD_WR 
          CLR AD_CLR
          NOP  
          SETB AD_CLR
          CLR TR0
          CLR TF2
          CLR DA_FAIL
          MOV TL2,#0ABH
          MOV TH2,#0FFH
          MOV SADDRE_L,SADDRE_L0 ;
          MOV SADDRE_H,SADDRE_H0
          MOV TIME_L,#01H
          MOV TIME_H,#00H
          LCALL ADDR_WR
          LCALL ADDR_WR
          SETB TR2
          POP PSW
          POP ACC
          RETI

;********************************************************************
;延时子程序
;********************************************************************
DAYMS:   NOP
         MOV R0,#05H
DAY1:    NOP
         NOP
         MOV R1,#0FFH
DAY11:   DJNZ R1,DAY11
         DJNZ R0,DAY1
         RET
   END

⌨️ 快捷键说明

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