📄 lu2051.asm
字号:
length EQU 043h ;
data1 EQU 021h ;
data2 EQU 022h ;
data3 EQU 023h ;
data4 EQU 024h ;
data5 EQU 025h ;
data6 EQU 026h ;
data7 EQU 027h ;
data8 EQU 028h ;
data9 EQU 029h ;
dataa EQU 02ah ;
datab EQU 02bh ;
datac EQU 02ch
datad EQU 02dh ;
datae EQU 02eh ;
dataf EQU 02fh ;
status EQU 040h
zhuangtai EQU 041H
flagg EQU 042H
rxl BIT p1.7 ;
txl BIT P1.6 ;p1.3 ;
ledr BIT P1.0 ;
ledt BIT p1.1
org 0000h
ajmp START
org 0023h
ajmp INTER
org 0044h
START:
call DELAY ;JIAN QU DOU
call DELAY
call DELAY
call DELAY
call DELAY
call DELAY
call DELAY
call DELAY
call DELAY
mov pcon ,#00h ;not double band
mov sp, #050h
mov tmod,#020h
mov th1, #0fdh;e8h;#0fdh
mov tl1, #0fdh;e8h;#0fdh
mov zhuangtai,#0h ;77=high
setb tr1
setb txl
mov flagg,#0
SETB P1.3
ajmp START2 ;change at 4.29 ,2000
START8:
mov ie,#0h
SETB p1.2
call DELAY ;JIAN QU DOU
call DELAY
call DELAY
call DELAY
call DELAY
call DELAY
call DELAY
call DELAY
call DELAY
NOP
jb P1.2,START2 ;LOW IS ENABLE
mov data1,#0b5h ; it's order: read meter status
mov data2,#0abh
mov data3,#028h ;
mov data4,#000h
mov data5,#0a6h ;
mov r0,#021h
setb p1.5
clr txl
call DELAY
call DELAY
call DELAY
mov r7,#05h
T_YYY: call T_MICS
inc r0
djnz r7,T_YYY
clr p1.5
setb rxl
mov r5,#10h ;DELAY waiting time to 1 second
R_YY0: mov r4,#0ffh
R_YY1: mov r3,#0ffh
R_YY2: jnb rxl,R_YY3
djnz r3,R_YY2
djnz r4,R_YY1
djnz r5,R_YY0
ajmp START3 ;NO ACK
R_YY3: call DELAY2
mov r4,#0ffh
R_YY4: mov r3,#0ffh
R_YY5: jnb rxl,R_YY6
djnz r3,R_YY5
djnz r4,R_YY4
ajmp START3;9,26,2000;START2
R_YY6: mov r0,#021h
CALL RECE
jb psw.5,START3
mov a,@r0
cjne a,#0abh,START3 ;If ACK=ab,IT'S RIGHT ,OR ,IT'S WRONG
SETB P1.3 ;IT'S RIGHT
AJMP START2
START3: CLR P1.3 ; IT'S WRONG
START2: mov ip, #010h
mov ie, #090h;#090h ;permit serial interuppt
mov scon,#0d0h;#050h
clr p1.5
setb p1.1
setb p1.0
mov data3,#0h
mov data4,#0h
mov flagg,#0
START1: mov status,#00h
mov length,#00h
mov r0,#021h
mov data1,#0
;;##################################################################3
;;wait for data from pc,and stored in ram from 021h unit
;IF p1.2=0 ,then need test system and biao ,it 's the first
STA: mov a,status ;wait for a correct receiving
cjne a,#088h,YANG
AJMP TTTXX
YANG: SETB p1.2
NOP
jb P1.2,STA1XX ;LOW IS ENABLE
call DELAY
jb P1.2,STA1XX ;LOW IS ENABLE
mov a,zhuangtai
cjne a,#077h ,STA ;P1.2 must change from hi to low ,then it can send data out
mov zhuangtai ,#0 ;p1.2 =1
ajmp START8
STA1XX: SETB P1.3 ;NOT NEED TO TEST,TURN OFF LED
mov zhuangtai,#077h ;p1.2 =1
AJMP STA
;;#################################################################
;translate data to picm57,data from 021h unit
TTTXX: mov ie,#0h
;;;;############################
;1,9,2001 add computer connect with system control
mov a,data1
cjne a,#0abh,NEWADD
mov ie,#080h
mov scon,#0C0H;40h
mov a,#0abh
clr p1.0
mov c,psw.0
mov tb8,c
mov sbuf,a
NEWWAIT: JBC TI,NEWOVER
SJMP NEWWAIT
NEWOVER: AJMP CHUN
;;;#################################################
NEWADD: mov a,data2
cjne a,#0abh,TLUWEI
jnb data3.5 ,T_MIC
AJMP T_MMM ;read command
TLUWEI: jnb data4.5,T_MIC ;at "xxxx",read command
T_MMM: mov status,#099h ;receive tiwce ,AB and data
T_MIC: mov r7,length ;send data to microchip
mov r0,#021h
setb p1.5
clr txl
call DELAY
call DELAY
call DELAY
call DELAY
T_M0: call T_MICS
inc r0
djnz r7,T_M0
mov flagg,#0H
mov a,data4
cjne a,#041h,TT_MM
AJMP START2
TT_MM: cjne a,#042h,R_MICL
AJMP START2
;;#################################################################33
;receive data from picm57 ,stored at unit 031h
;;##############################################################
R_MICL: clr p1.5
mov ie,#00h
mov length,#00h
setb rxl
mov r5,#10h ;DELAY waiting time to 1 second
R_SHI: mov r4,#0ffh
R_LU: mov r3,#0ffh
R_MI: jnb rxl,R_MI1
djnz r3,R_MI
djnz r4,R_LU
djnz r5,R_SHI
ajmp CHUN;9,26,2000;START2
R_MI1: call DELAY2
mov r4,#0ffh
R_LUX: mov r3,#0ffh
R_MIXX: jnb rxl,R_MIX
djnz r3,R_MIXX
djnz r4,R_LUX
ajmp CHUN;9,26,2000;START2
R_MIX: mov r0,#021h
CALL RECE
jb psw.5,R_MID
mov a,@r0
cjne a,#0abh,R_MI5
mov length,#0h
mov a,status
cjne a,#099h,XYZ ;write order
mov status,#0h
TIMEAGAIN:ajmp R_MICL
R_MI5: cjne a,#0b5h,CHUN;START2
AJMP R_MI2
XYZ: mov ie,#080h
mov scon,#0C0H;40h
mov a,#0abh
clr p1.0
mov c,psw.0
mov tb8,c
mov sbuf,a
WAITXXXX: JBC TI,OVER
SJMP WAITXXXX
OVER: AJMP CHUN
R_MI2: inc r0
call RECE1
jb psw.5,CHUN
inc length
mov a,length
cjne a,#011h,R_MI3
CHUN: mov length,#0H
mov flagg,#0H
SETB REN
AJMP START2
R_MI3: mov a,@r0
cjne a,#0a6h,R_MI2
inc length
; AJMP TRANT
;;;##########################################
;data maybe error
R_MID: mov ie,#080h
mov scon,#0C0H;40h
mov a,#0abh
clr p1.0
mov c,psw.0
mov tb8,c
mov sbuf,a
WAITXX: JBC TI,LUWRONG
SJMP WAITXX
LUWRONG:
;;##########################################################
TRANT : mov r0,#021h
mov r7,length
mov ie,#080h
mov scon,#0C0H;40h
TAAN: mov a,@r0
clr p1.0
mov c,psw.0
mov tb8,c
mov sbuf,a
WAIT1: JBC TI,TRAN8
SJMP WAIT1
TRAN8: inc r0
djnz r7,TAAN
setb p1.0
; mov a,status
; cjne a,#099h,JJJ
mov status,#0h
; ajmp R_MICL
JJJ: ajmp CHUN
;;###########################################################
DELAY: mov r4,#0ffh;(1/9600) *(11.059/12)=96 ;20
D1X: nop
djnz r4,D1X
nop
ret
;;########################################################33
T_MICS: clr txl ;start
clr p1.0
CALL DELAY
CALL DELAY1
mov r2,#08h
mov a,@r0 ;8-bits
mov c,psw.0
mov psw.5,c
T_SR: rrc a
mov txl,c
T_S: CALL DELAY
CALL DELAY1
djnz r2,T_SR
mov c,psw.5
mov txl,c
CALL DELAY ;parity
CALL DELAY1
setb txl ;stop bit
CALL DELAY
CALL DELAY1
setb p1.0
ret
;;#################################################33
DELAY1: mov r4,#02h;
D12: nop
djnz r4,D12
nop
ret
;;#######################################################
DELAY2: mov r4,#03eh;080h;(1/1200) *(11.059/12)= 768/2/2=192
D1XY: nop
djnz r4,D1XY
jnb rxl,DISEND
inc r1 ;rxl=1
DISEND: ret
;;####################################################
COMPRE: cjne r1,#03h,COMM1
setb c ;rxl=1
ajmp COMCOM
COMM1: cjne r1,#02h,COMM0
setb c ;rxl=1
ajmp COMCOM
COMM0: clr c
COMCOM: mov r1,#0h
ret
;;####################################################
RECE: mov r2,#04H
RR_CC: clr p1.5
clr p1.1
setb rxl
mov r3,#0ffh
R_MIC1: mov r4,#0ffh
R_MIC0: jb rxl,R_007 ;start bit
djnz r4,R_MIC0
djnz r3,R_MIC1
ajmp PROR
R_007: mov r1,#0h
call DELAY2
call DELAY2
call DELAY2
call COMPRE
jc RR_RR
djnz r2,RR_CC
AJMP PROR
RR_RR: rrc a
call DELAY2
mov r3,#07h
AJMP R_3
;;#################################################
;;####################################################
RECE1: clr p1.5
clr p1.1
setb rxl
mov r3,#0ffh
R_MICX: mov r4,#0ffh
R_MICY: jnb rxl,R_01 ;start bit
djnz r4,R_MICY
djnz r3,R_MICX
ajmp PROR
R_01: call DELAY2
call DELAY2
call DELAY2
call DELAY2
mov r3,#08h
;;###################################
R_3: mov r1,#0h
call DELAY2
call DELAY2
call DELAY2
call COMPRE
rrc a
call DELAY2
;call DELAY1
djnz r3,R_3
mov @r0,a
mov r1,#0h
call DELAY2
call DELAY2
call DELAY2
call COMPRE
mov @r0,a
jb psw.0,R_4
jc PROR ;p=0,rxl=1
ajmp R_5
R_4: jnc PROR ;P=1,RXL=0,ERROR
R_5: call DELAY2
call DELAY2
;call DELAY2
;call DELAY1
clr psw.5
setb p1.1
ret
PROR: setb psw.5
setb p1.1
ret
;;##################################################
INTER: clr p1.1
INXTREE: jbc RI,INTCC
SJMP INXTREE
INTCC: mov a,sbuf
jb psw.0,INTXXX
jnb rb8,INTRIGHT ;psw=0,test rb8=0?;
AJMP INITL ;ERROR
INTXXX: jnb rb8,INITL ;psw=1,test rb8=1?;
INTRIGHT: mov a,sbuf
mov @r0,a
mov a,length
cjne a,#00h,INX ;the first byte is b5(ab)
mov a,@r0
cjne a,#0abh,IN_B5
mov length,#01h
ajmp ACK2
IN_B5: cjne a,#0b5h,INITL ;data start
mov length,#01h
inc r0
ajmp PERROR
INX: mov a,@r0
cjne a,#0a6h,INTTT
inc length
ajmp ACK2
INTTT: inc length
inc r0
mov r6,length
cjne r6,#011h,PERROR
INITL: mov length,#00h
PERROR: mov status,#00h ;error
IN3: mov ie,#090h
setb p1.1
reti
ACK2: mov status,#088h
mov ie,#00h ;right
setb p1.1
reti
ajmp START2
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -