|
纯软件单片机串口
作者:佚名 纯软件单片机串口(一)
;Definition of variables SEND_READ EQU 00H ;Bit for write(0) or read(1) SEND_ENDS EQU 01H ;Bit for communiciating(1) or ends(0) READ_ENDS EQU 02H ;Bit for reading(1) or ends(0) BAUD_RAM_H EQU 30H ;Communite baud TH BAUD_RAM_L EQU 31H ;Communite baud TL AMEND_RAM_L EQU 32H AMEND_RAM_H EQU 33H
SEND_CODE EQU 34H ;Byte that may be send READ_CODE EQU 34H ;Read ends value byte READ_BUFF EQU 35H ;Read bit RRC SEND_COUNT EQU 36H ;Send bit count READ_COUNT EQU 36H ;Read bit count SEND_FLAG EQU 37H ;Send byte flag (0-->start send) ;Definition of constants TXD EQU P1.6 ;TXD line RXD EQU P3.2 ;RXD line BAUD_H EQU 0FFH ;9600 4800 2400 1200 600 300 BAUD_L EQU 0A3H ;FFA0 FF40 FE80 FD00 FA00 F400 AMEND=03H AMEND_H EQU 00H ;0000 0040 0080 0100 0200 0400 AMEND_L EQU 00H ; 20H 40H 80H 100H 200H 400H
ORG 0000H SJMP MAIN ORG 0003H LJMP INPUT_INT ORG 000BH LJMP COMM_INT ORG 0013H LJMP READ_BYTE_INT ORG 0040H MAIN: MOV IE,#00H MOV SP,#60H MOV P1,#0FFH MOV P3,#0FFH
MOV R1,#20H ;Clr CPU RAM MOV R2,#40H LOOP: MOV @R1,#00H INC R1 DJNZ R2,LOOP
MOV BAUD_RAM_H,#BAUD_H MOV BAUD_RAM_L,#BAUD_L MOV AMEND_RAM_H,#AMEND_H MOV AMEND_RAM_L,#AMEND_L MOV TMOD,#01H MOV TH0,BAUD_RAM_H MOV TL0,BAUD_RAM_L SETB ET0 SETB PT0 SETB EX0 ;Read int SETB PX0 SETB IT0 SETB EX1 ;SETB IT1 SETB EA CLR SEND_READ MOV SEND_FLAG,#0FFH SETB TR0
LCALL SEND_TEST_CODE LCALL SEND_LOOP ;LCALL READ_ONE LCALL READ_STRING LCALL ONLY_READ
;************************************ ONLY_READ: MOV R0,#40H CLR SEND_READ MOV SEND_FLAG,#0FH READ_LOOP_1: MOV R7,#20H MOV R0,#40H READ_LOOP_0: SETB READ_ENDS JB READ_ENDS,$ MOV @R0,READ_CODE INC R0 MOV A,READ_CODE CJNE A,#3FH,NEXT_0_0 LJMP SEND_EX NEXT_0_0: DJNZ R7,READ_LOOP_0 LJMP READ_LOOP_1 SEND_EX: MOV R0,#40H MOV R7,#20H CLR SEND_READ SEND_LOOP_0: MOV SEND_CODE,@R0 MOV SEND_FLAG,#00H INC R0 SETB SEND_ENDS JB SEND_ENDS,$ MOV A,SEND_FLAG CJNE A,#03H,READ_LOOP_1 DJNZ R7,SEND_LOOP_0 LJMP READ_LOOP_1 RET
;************************************ SEND_LOOP: MOV SEND_CODE,#3DH SEND_R: MOV SEND_FLAG,#00H SETB SEND_ENDS JB SEND_ENDS,$ MOV A,SEND_FLAG CJNE A,#03H,N1 SJMP SEND_LOOP N1: SETB READ_ENDS JB READ_ENDS,$ MOV SEND_CODE,READ_CODE SJMP SEND_R RET ;************************************ READ_ONE: MOV SEND_FLAG,#0AH RRR1: SETB READ_ENDS JB READ_ENDS,$ MOV SEND_CODE,READ_CODE MOV SEND_FLAG,#00H SETB SEND_ENDS JB SEND_ENDS,$ SJMP RRR1 RET ;*********************************** READ_STRING: CLR SEND_READ READ: MOV SEND_FLAG,#0FH MOV R1,#40H MOV R2,#00H READ_LOOP: SETB READ_ENDS JB READ_ENDS,$ MOV @R1,READ_CODE INC R1 INC R2 MOV A,READ_CODE CJNE A,#3FH,NEXT1 SJMP SEND NEXT1: CJNE R2,#20H,READ_LOOP
SEND: MOV R1,#40H SEND_L: MOV SEND_FLAG,#00H MOV SEND_CODE,@R1 SETB SEND_ENDS JB SEND_ENDS,$ MOV A,SEND_FLAG CJNE A,#03H,READ INC R1 DJNZ R2,SEND_L SJMP READ RET
;****************************** SEND_TEST_CODE: MOV R6,#61H MOV R7,#1AH CLR SEND_READ SEND_LOOP1: MOV SEND_CODE,R6 MOV SEND_FLAG,#00H SETB SEND_ENDS INC R6 JB SEND_ENDS,$ DJNZ R7,SEND_LOOP1 RET ;********************************************************** READ_BYTE_INT: MOV @R1,READ_CODE RETI
;********************************************************************* ;* SEND_READ EQU 01H Bit for send(0) or read(1) * ;* SEND_ENDS EQU 02H Bit for communiciating(1) or ends(0) * ;* READ_ENDS EQU 03H Bit for reading(1) or ends(0) * ;* SEND_COED EQU 31H Byte that may be send * ;* READ_CODE EQU 32H Read ends value byte * ;* SEND_COUNT EQU 33H Send bit count * ;* READ_COUNT EQU 33H Read bit count * ;* READ_BUFF EQU 34H Read bit circulate * ;* SEND_FLAG EQU 34H Send byte flag (0-->start send) * ;* * ;* BAUD_RAM_H EQU 35H Communite buad TH * ;* BAUD_RAM_L EQU 36H Communite buad TL * ;* AMEND_RAM_H EQU 37H Read interrupt amend value * ;* AMEND_RAM_L EQU 38H Read interrupt amend value * ;* TXD EQU P1.4 Data TXD line * ;* RXD EQU P1.3 Data RXD line * ;* When send: MOV SEND_CODE,Value_byte (Byte that will be send) * ;* MOV SEND_FLAG,#00H * ;* SETB SEND_ENDS * ;* if SEND_ENDS is 0 that shows completed send communiciation * ;* if SEND_FLAG isn't 03H that shows send communicating has * ;* beed interrupted by read_input,must jump to prosses * ;* read_input program. * ;* When read: SETB READ_ENDS * ;* SETB EX0 * ;* if READ_ENDS is 0 that shows completed read communiciation * ;* and return the value byte to READ_CODE. * ;* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% * ;* % PROGRAM INITIALIZE % * ;* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% * ;* Timer 0(or 1,2)must be worked with mode 1. * ;* INT_timer_0 and INT_exterior_0 be necessitated corwning priority. * ;* CPU Clock is 11.0592M * ;* Baud rate: 9600 4800 2400 1200 600 300 * ;* Timer value: FFA0H FF40H FE80H FD00H FA00H F400H * ;* Start bit amend: 0000H 0040H 0080H 0100H 0200H 0400H * ;* Timer value amend is 03H * ;* * ;* AUTHOR: Chen Muquan * ;* 1998.2.24 * ;* * ;********************************************************************* COMM_INT: PUSH ACC PUSH PSW MOV A,TL0 ;================ ADD A,BAUD_RAM_L MOV TL0,A ;================ MOV TH0,BAUD_RAM_H ;================ JB SEND_READ,READ_DATA ;0 Send or 1 Read
;******** Send communicating ********** MOV A,SEND_FLAG ;Process send flag CJNE A,#00H,COMM_NEXT1 ;Send start bit CLR TXD ;One start_bit low INC SEND_FLAG MOV SEND_COUNT,#08H POP PSW POP ACC RETI COMM_NEXT1: CJNE A,#01H,COMM_NEXT2 ;Send circulation MOV A,SEND_CODE RRC A MOV TXD,C MOV SEND_CODE,A DJNZ SEND_COUNT,COMM_EXIT ;circulation end INC SEND_FLAG POP PSW POP ACC RETI COMM_NEXT2: CJNE A,#02H,COMM_EXIT ;Send stop bit SETB TXD ;One stop_bit high INC SEND_FLAG CLR SEND_ENDS ;completed send communication COMM_EXIT: POP PSW POP ACC RETI ;********* Read communicating ********** READ_DATA: MOV A,READ_BUFF MOV C,RXD RRC A MOV READ_BUFF,A DJNZ READ_COUNT,READ_EXIT ;Completed read MOV READ_CODE,A ;Write read data byte CLR READ_ENDS ;Completed read communicate CLR IE0 ;Setup for read next byte SETB EX0 ;Enable read interrupt CLR SEND_READ ;Setup send status SETB IE1 READ_EXIT: POP PSW POP ACC RETI ;******************************************************************* ;* The following subroutine is a exterior interrupt serve on * ;* communiciated interrupt * ;******************************************************************* INPUT_INT: PUSH ACC PUSH PSW CLR EX0 ;======================= CLR SEND_ENDS ;Interrup send commiciating MOV SEND_FLAG,#0AH ;Alter the send_flag for main program SETB TXD
CLR TR0 ;Setup for read SETB SEND_READ ;Set INI_timer status for read MOV READ_COUNT,#08H MOV A,BAUD_RAM_L ;Amend start bit clock cycle SUBB A,AMEND_RAM_L MOV TL0,A MOV A,BAUD_RAM_H SUBB A,AMEND_RAM_H MOV TH0,A SETB TR0 CLR TF0 POP PSW POP ACC RETI
END
|