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

📄 lu2051.asm

📁 用PIC16C57模拟9600波特率串口通讯
💻 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 + -