📄 jlout.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 + -