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