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

📄 comsre.bak

📁 采用ST的UPSD33XX系列单片机的双串口
💻 BAK
字号:
$include(REG51.inc)
$include(upsd3300.inc)

baudrateuart0      equ 30h
baudrateuart1_h    equ 31h
baudrateuart1_l    equ 32h

dphuart0_r         equ 33h
dpluart0_r         equ 34h
dphuart0_s         equ 35h
dpluart0_s         equ 36h

dphuart1_r         equ 37h
dpluart1_r         equ 38h
dphuart1_s         equ 39h
dpluart1_s         equ 3ah

PORTA_DIR          EQU 8006H
PORTA_DATA         EQU 8000H

TH0_TEMP           EQU 0D8H 
TL0_TEMP           EQU 0F0H  ;1MS, 2MS:0F060,3MS:0E890, 4MS:0E0C0, 5MS:0D8F0, 10MS:0B1E0

FLAG_UART0_S       BIT 00H
FLAG_UART1_S       BIT 01H
 

    ORG 0000H
    LJMP  MAIN
    ORG 000BH
    LJMP TIMER0_INTT
    ORG 0023H
    LJMP SRE_INTT0   ;uart0 data receive and send int
    ORG 004BH
    LJMP SRE_INTT1   ;uart1 data receive and send int
        
    ORG  0080H
MAIN:   
    MOV  DPTR,#PORTA_DIR
    MOV  A,#00H
    MOVX @DPTR,A
    MOV  DPTR,#PORTA_DATA
    MOVX A,@DPTR
    MOV  R1,A
    ANL  A,#0F0H
    MOV  R2,A         ;UART1 BAUDRATE CHOOSE
    MOV  A,R1
    ANL  A,#0FH
    MOV  R3,A         ;UART0 BAUDRATE CHOOSE
    
UART1_BAUDSET0:    
    CJNE R2,#80H,UART1_BAUDSET1
    MOV  baudrateuart1_h,#0FFH
    MOV  baudrateuart1_l,#0D9H    ;UART1 BAUDRATE 19200  
    LJMP UART0_BUADSET0
UART1_BAUDSET1: 
    CJNE R2,#40H,UART1_BAUDSET2
    MOV  baudrateuart1_h,#0FFH
    MOV  baudrateuart1_l,#0B2H    ;UART1 BAUDRATE 9600 
    LJMP UART0_BUADSET0    
UART1_BAUDSET2:
    CJNE R2,#20H,UART1_BAUDSET3
    MOV  baudrateuart1_h,#0FFH
    MOV  baudrateuart1_l,#64H    ;UART1 BAUDRATE 4800
    LJMP UART0_BUADSET0  
UART1_BAUDSET3:
    ;CJNE R2,#10H,UART1_BAUDSET4
    MOV  baudrateuart1_h,#0FEH
    MOV  baudrateuart1_l,#0C8H    ;UART1 BAUDRATE 2400,THE OTHERS ARE ALL 2400   
                 
UART0_BUADSET0:
    CJNE R3,#01H,UART0_BAUDSET1
    MOV  baudrateuart0,#98H      ;UART0 BAUDRATE 1200
    LJMP MAIN_UART
UART0_BAUDSET1:
    CJNE R3,#02H,UART0_BAUDSET2
    MOV  baudrateuart0,#0CCH      ;UART0 BAUDRATE 2400
    LJMP MAIN_UART
UART0_BAUDSET2:
    CJNE R3,#04H,UART0_BAUDSET3
    MOV  baudrateuart0,#0E6H      ;UART0 BAUDRATE 4800
    LJMP MAIN_UART
UART0_BAUDSET3:
    ;CJNE R3,#01H,UART0_BAUDSET4
    MOV  baudrateuart0,#0F3H      ;UART0 BAUDRATE 9600,ALL OTHERS ARE 9600  
    ;sjmp $      
          
MAIN_UART:
    MOV  SP,#80h
    MOV  SCON,#50h
    MOV  SCON1,#50h
    
    MOV  P3SFS, #03h ;SET P3.1,P3.0 AS UART0,THE OTHERS AS GPIO
    MOV  P1SFS0,#0CH
    MOV  P1SFS1,#00H  ;SET P1.2,P1.3 AS UART1,THE OTHERS AS GPIO
    
    
    MOV   IE,#92H
    MOV   IEA,#10H 
    MOV   IP, #00H
    ;MOV   IPA,#10H   ;uart1 has high interrupt preference  
    
    MOV   PCON,#8ch ;use timer2 as uart1 baudrate generator
    
  ;uart0  baudrate SET,24M xtal
  ;use timer1 as the uart0 baudrate generator
    MOV  TMOD,#21h
    MOV  TL1,baudrateuart0
    MOV  TH1,baudrateuart0  ;reload  
    SETB TR1 
  
  ;uart1 baudrate SET,24M xtal
  ;use timer2 as the uart1 baudrate generator
    MOV  RCAP2H,baudrateuart1_h
    MOV  RCAP2L,baudrateuart1_l  
    MOV  TH2,baudrateuart1_h
    MOV  TL2,baudrateuart1_l
    MOV  T2CON,#04H
    
    LCALL RESETDPTR0 
    LCALL RESETDPTR1
    CLR   FLAG_UART0_S
    CLR   FLAG_UART1_S
     
    SJMP  $
    
TIMER0_INTT:
   CLR  TR0
   JBC  FLAG_UART0_S,UART1_SEND
   CLR  FLAG_UART1_S
   SETB TI1   ;when one data package finished,uart0 start to send data
   LJMP RETURN_TIMER0
   
 UART1_SEND:
   SETB TI
 RETURN_TIMER0:       
   RETI     
    
SRE_INTT0:
    jbc  TI, sendint0
    clr  RI
    
    MOV TH0,#TH0_TEMP
    MOV TL0,#TL0_TEMP
    SETB  TR0          ;use timer0 as data package discrimination
    SETB  FLAG_UART1_S
   
    mov  a,sbuf   
    mov dph,dphuart0_r
    mov dpl,dpluart0_r
    movx @dptr,a
    
 overflow_check0:
   mov  a,dph
   cjne a,#3fh,returninc_r0
   mov  a,dpl
   cjne a,#0ffh,returninc_r0
   CLR  REN       ;when overflow,forbide receiving data
   LCALL LED_BLINK  
   ljmp  return0
   
 returninc_r0:
   inc  dptr
   mov  dphuart0_r,dph
   mov  dpluart0_r ,dpl
   ljmp return0    
   
 sendint0:
    mov  dph,dphuart1_r
    mov  dpl,dpluart1_r
    mov  a,dphuart0_s
    cjne a,dph,returninc_s0
    mov  a,dpluart0_s
    cjne a,dpl,returninc_s0
    lcall resetdptr0
    ;;;;;;;mov  scon1, #50h   ;when return from overflow,SCON1 must be reset
    ljmp  return0
    
  returninc_s0:
    mov  dph,dphuart0_s
    mov  dpl,dpluart0_s
    movx a,@dptr
    mov  sbuf,a  
    inc  dptr
    mov dphuart0_s,dph
    mov dpluart0_s,dpl
  return0:
    reti
    
    
SRE_INTT1:
   JBC  TI1, sendint1  ;RI IS SET 1,DATA RECEIVED
   CLR  RI1               ;It seems that TI and RI in SCON1 cann't bit addressing
   
   MOV TH0,#TH0_TEMP
   MOV TL0,#TL0_TEMP
   SETB  TR0          ;use timer0 as data package discrimination
   SETB  FLAG_UART0_S
   
   mov a,sbuf1
   mov dph,dphuart1_r
   mov dpl,dpluart1_r
   movx @dptr,a        ;receive data and save in extra ram

 overflow_check1:
   mov  a,dph
   cjne a,#7fh,returninc_r1
   mov  a,dpl
   cjne a,#0ffh,returninc_r1
   CLR   REN1   ;when overflow,forbide receiving data
   LCALL LED_BLINK   ;in this program,when overflow happens,led start to blink
                     ;the only way to resume is to press reset
   ljmp return1
   
 returninc_r1:
   inc   dptr
   mov   dphuart1_r,dph
   mov   dpluart1_r,dpl   
   ljmp  return1
 
 sendint1:
    mov  dph,dphuart0_r
    mov  dpl,dpluart0_r
    mov  a,dphuart1_s
    cjne a,dph,returninc_s1
    mov  a,dpluart1_s
    cjne a,dpl,returninc_s1
    lcall resetdptr1
    ;;;;;;;mov  scon1, #50h   ;when return from overflow,SCON1 must be reset
    ljmp  return1
   
 returninc_s1:
   mov  dph,dphuart1_s
   mov  dpl,dpluart1_s
   movx a,@dptr
   mov  sbuf1,a 
   inc dptr
   mov dphuart1_s,dph
   mov dpluart1_s,dpl
 
 return1:
   reti

 resetdptr0:
    mov  dptr,#0000h
    mov  dphuart1_r,#40h
    mov  dpluart1_r,#00h
    mov  dphuart0_s,#40h
    mov  dpluart0_s,#00h  
    ret
   
resetdptr1:
    mov  dptr,#0000h
    mov  dphuart0_r,#00h
    mov  dpluart0_r,#00h
    mov  dphuart1_s,#00h
    mov  dpluart1_s,#00h  
    ret
    
LED_BLINK:               ;WHEN OVERFLOW LED START TO BLINK
    MOV  DPTR,#8015H      
    MOV  A,#06H
    MOVX @DPTR,A
    MOV  DPTR,#8013H
    MOV  A,#06H
    MOVX @DPTR,A
    LCALL DELAY
    LCALL DELAY
    MOV  A,#0F9H
    MOVX @DPTR,A
    LCALL DELAY
    LCALL DELAY
    LJMP  LED_BLINK
    RET
    
DELAY:
    MOV  R6,#0FFH
LOOP:
    MOV  R7,#9FFH
LOOP1:    
    NOP
    DJNZ R7,LOOP1
    NOP
    DJNZ R6,LOOP
    RET         
    
   END        
  
  
  



⌨️ 快捷键说明

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