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

📄 serio1_i.a51

📁 用于51系列单片机的串口程序源码
💻 A51
字号:
$nomod51	symbols	debug	nolist
$INCLUDE(\i\rg51fb.pdf)
$INCLUDE(charname.a51)
$list
;
;	CONSOLE I/O ROUTINES AND DRIVERS:
;	======= === ======== === =======
; S_INIT - Initializes Serial port.
;
; C_IN   - waits for character from serial port. Returns it in A.
; C_OUT  - sends character in A.
; C_STS  - console status. if char RXD, C=1, A=char, else C=0.
; STROUT - Sends in-line character string to console. String is terminated
;	by last character's MSB set.  Hence, can only handle 7 bit ASCII.
;
;********************************************
;
; Baud rate manually set to desired rate
; Using TIMER 1
; This version uses 1x baud rate
; This Version is interrupt driven on both the receive and transmit ends.
;
;********************************************
;
CODE_SEG	segment	code
data_seg	segment data
bit_seg		segment bit
;
public	S_init,C_IN,C_OUT,STROUT
;
cseg	at	sint
	ljmp	Ser_isr
;
	rseg	data_seg
rxbuf:	ds	1
txbuf:	ds	1

	rseg	bit_seg
txflag:	dbit	1
rxflag: dbit	1
txdone:	dbit	1
;
;Baud_Rate = Fosc/12 * (2^smod/32) / (256-TH1)
;	where 2^smod = 2 for smod=1, and 1 for smod=0
;	Fosc is oscillator frequency; and TH1 is timer 1 reload value.
;TH1 =  256 - (Fosc/12 * (2^smod/32) / Baud_Rate)
;
;Fosc =	12MHz	16MHz	20MHz	11.0592	14.7456	18.4320	smod
;Rate
;150	030H	--	--	040H	000H	-- 	0
;300	098H	075H	052H	0A0H	080H	060H	0
;600	0CCH	0BBH	0A9H	0D0H	0C0H	0B0H	0
;1200	0E6H	0DEH	0D5H	0E8H	0E0H	0D8H	0
;2400	0F3H	0EFH	0EAH	0F4H	0F0H	0ECH	0
;4800	*	*	0F5H	0FAH	0F8H	0F6H	0
;9600	--	--	*	0FDH	0FCH	0FBH	0
;19200	--	--	--	0FDH	0FCH	0FBH	1
;38400  --	--	--	--	0FEH	--	1
;76800	--	--	--	--	0FFH	--	1
;* These baud rates available by using the previous value, and setting SMOD=1
BaudLoad	equ	0f6h	;9600 baud @ 18.432
;*****************
;
	rseg	CODE_SEG
;
;*****************
; Serial Interrupt service routine.
;  This is a simple example of a serial interrupt service routine,
;  with only a 1 character buffer each for
;  reception and transmission.  A practical program would use a receive
;  buffer large enough to hold received characters without danger of overflow
;  before being serviced,  and a transmit buffer large enough to hold the
;  largest string to be sent, or some other buffering scheme, like perhaps 
;  a queue of pointers to constant strings and/or string buffers.
;
Ser_isr:
	jbc	ri,RXisr	; incoming character?
TXisr:                          ; else a TX interrupt
	jbc	txflag,sendit	; if no character waiting
	clr	ti		;   then we just finished 
	setb	txdone
	sjmp	ser_ret

sendit:	mov	sbuf,txbuf
	clr	ti
	clr	txdone
	sjmp	ser_ret
;
RXisr:	mov	rxbuf,sbuf	; read incoming character
	setb	rxflag    	;  set received flag
ser_ret:
	reti
;*****************
S_INIT:
	CLR	TR1
	CLR	TXFLAG
	clr	rxflag
	setb	txdone
	MOV	SCON,#01011010B	;TI set indicates transmitter ready.
				; mode 1,REN
	MOV	TMOD,#00100001B	;Timer 1 is set to 8 bit auto reload mode
	orl	PCON,#SMOD	; Set to double rate.
	mov	th1,#BaudLoad	; Set reload value
	setb	tr1		; start timer.
	setb	es		; enable serial interrupts!
	setb	ea		; Enable them all!
	ret
;
;=======
;
C_IN:
;	Console character input routine.
;	Waits for next input from console device and returns with character
;	code in accumulator.
;
        JNB     RXFLAG,$        ;Wait until character received.
        MOV     A,RXBUF         ;Read input character.
	CLR	RXFLAG		;Clear reception flag.
	ret			;
;
;=======
;
C_OUT:
;	Console character output routine.
;	Outputs character received in accumulator to console output device.
;
	JB	TXFLAG,$	; not too hot, because it's blocking.

	MOV	TXBUF,A		;Write out character.
	SETB	TXFLAG
	JNB	TXDONE,CORET
	SETB	TI
CORET:	RET
;
;=======
;
;Console Status
;
; Returns C=0 if no character is ready
; if character ready, returns C=1 and character in A
; Note: Serial input status can be checked by RI bit, also.
;
C_STS:	MOV	C,RXFLAG
	JNC	CNTRET		;Poll whether character has been typed.
	CALL	C_IN
CNTRET:	RET
;
;=======
;
;STROUT
;	Copy in-line character string to console output device.
;	uses:	DPTR,ACC
;
STROUT:	POP	DPH		;get in-line string address from stack
	POP	DPL
STRO_1:	CLR	A
	MOVC	A,@A+DPTR	;Read next byte.
	INC	DPTR		;Bump pointer.
	JBC	ACC.7,STRO_2	;Escape after last character.
	CALL	C_OUT		;Output character.
	SJMP	STRO_1		;Loop until done.
;
STRO_2:	CALL	C_OUT		;Output character.
	CLR	A
	JMP	@A+DPTR		;Return to program.
;
	end

⌨️ 快捷键说明

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