|
純軟件單片機串口(一)
;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 純軟件單片機串口(二) 這是另外一個使用中斷查尋的程序! www.ubicom.com or www.scenix.com 到UBICOM看看 , 那里的串口都是純軟件的
SEND_READ EQU 01H ;Bit for write(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) READ_INT EQU 04H ;Bit intettupt sending to reading BUAD_RAM_H EQU 30H ;Communite buad TH BUAD_RAM_L EQU 31H ;Communite buad TL SEND_TIME EQU 32H ;Send int times count READ_TIME EQU 33H ;Read int times count SEND_CODE EQU 34H ;Byte that may be send READ_CODE EQU 35H ;Read ends value byte READ_BUFF EQU 36H ;Read bit RRC SEND_COUNT EQU 37H ;Send bit count READ_COUNT EQU 38H ;Read bit count SEND_FLAG EQU 39H ;Send byte flag (0-->start send) READ_FLAG EQU 3AH ;Read byte flag (0-->check start bit) TXD_LINE EQU P3.1;P1.6 ;TXD line RXD_LINE EQU P3.0;P3.2 ;RXD line BUAD_H EQU 0FFH ;9600 4800 2400 1200 600 300 BUAD_L EQU 0C3H ;FFE0 FFC0 FF80 FF00 FE00 FC00
ORG 0000H SJMP MAIN ORG 000BH LJMP COMM_INT ORG 0040H MAIN: MOV IE,#00H MOV SP,#62H MOV P1,#0FFH MOV P3,#0FFH
MOV R1,#30H ;Clr CPU RAM MOV R2,#30H LOOP: MOV @R1,#00H INC R1 DJNZ R2,LOOP
MOV BUAD_RAM_H,#BUAD_H MOV BUAD_RAM_L,#BUAD_L MOV TMOD,#01H MOV TH0,BUAD_RAM_H MOV TL0,BUAD_RAM_L SETB TR0 SETB ET0 SETB PT0 SETB EA SETB SEND_ENDS SETB READ_ENDS LCALL SEND_TEST_CODE LCALL TEST1
LOOP0: MOV R1,#40H MOV R2,#00H MOV READ_FLAG,#00H SETB SEND_READ LOOP1: ;SETB READ_ENDS JB READ_ENDS,$ SETB READ_ENDS MOV A,READ_CODE MOV @R1,A INC R1 INC R2 CJNE A,#3FH,NEXT1 SJMP NEXT2 NEXT1: CJNE R2,#20H,LOOP1
NEXT2: MOV R1,#40H LOOP2: MOV SEND_FLAG,#00H MOV SEND_CODE,@R1 CLR SEND_READ JB SEND_ENDS,$ SETB SEND_ENDS JB READ_INT,LOOP3 INC R1 DJNZ R2,LOOP2 SJMP LOOP0 LOOP3: CLR READ_INT MOV R1,#40H MOV R2,#00H SJMP LOOP1
;LCALL SEND_TEST_CODE MOV SEND_CODE,READ_CODE CLR SEND_READ MOV SEND_FLAG,#00H SETB SEND_ENDS JB SEND_ENDS,$ SJMP $ SJMP $ ;********************************************** TEST1: MOV READ_FLAG,#00H SETB SEND_ENDS MM1: MOV SEND_CODE,#3DH MOV SEND_FLAG,#00H MM3: ;CLR SEND_READ JB SEND_ENDS,$ SETB SEND_ENDS
JNB READ_INT,MM1 CLR READ_INT
SETB READ_ENDS
JB READ_ENDS,$
MOV R7,#00H DJNZ R7,$ MOV SEND_CODE,READ_CODE MOV SEND_FLAG,#00H SJMP MM3 RET
;****************************** SEND_TEST_CODE: MOV R6,#61H MOV R7,#1AH SEND_LOOP: MOV SEND_CODE,R6 CLR SEND_READ MOV SEND_FLAG,#00H SETB SEND_ENDS INC R6 JB SEND_ENDS,$ DJNZ R7,SEND_LOOP RET
;********************************************************************* ;* SEND_READ EQU 01H Bit for write(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_TIME EQU 30H Send int times count * ;* READ_TIME EQU 30H Read int times count * ;* READ_BUFF EQU 31H Read bit RRC * ;* SEND_COED EQU 32H 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 * ;* BUAD_RAM_H EQU 34H Communite buad TH * ;* BUAD_RAM_L EQU 35H Communite buad TL * ;* SEND_FLAG EQU 36H Send byte flag (0-->start send) * ;* READ_FLAG EQU 37H Read byte flag (0-->check start bit) * ;* TXD_LINE EQU P1.4 Data TXD line * ;* RXD_LINE EQU P1.3 Data RXD line * ;* When send: SETB SEND_ENDS // CLR SEND_READ * ;* MOV SEND_CODE,(Byte that will be send) * ;* MOV SEND_FLAG,#00H * ;* if COMM_ENDS is 0 that completed send communiciation. * ;* if COMM_FLAG isn't 03H the send communiciating has been * ;* interrupted by read communiciation. * ;* When read: SETB READ_ENDS // SETB SEND_READ * ;* MOV READ_FLAG,#00H * ;* if READ_ENDS is 0 that completed read communiciation * ;* and the value is READ_CODE. * ;********************************************************************* COMM_INT: PUSH ACC PUSH PSW MOV A,TL0 ;================ ADD A,BUAD_RAM_L MOV TL0,A ;================ MOV TH0,BUAD_RAM_H ;================ JB SEND_READ,READ_DATA ;0 Send or 1 Read
JB RXD_LINE,COMM_NEXT0 ;Read first CLR SEND_ENDS ;Close send SETB TXD_LINE SETB READ_INT
MOV READ_FLAG,#01H ;Start read SETB SEND_READ POP PSW POP ACC RETI ;******** Send communicating ********** COMM_NEXT0: DJNZ SEND_TIME,COMM_EXIT MOV SEND_TIME,#03H MOV A,SEND_FLAG ;Process send flag CJNE A,#01H,COMM_NEXT1 ;Loop send MOV A,SEND_CODE RRC A MOV TXD_LINE,C MOV SEND_CODE,A DJNZ SEND_COUNT,COMM_EXIT ;Loop end INC SEND_FLAG POP PSW POP ACC RETI COMM_NEXT1: CJNE A,#00H,COMM_NEXT2 ;Send start bit CLR TXD_LINE ;1 start_bit low INC SEND_FLAG MOV SEND_COUNT,#08H MOV SEND_TIME,#03H SJMP COMM_EXIT COMM_NEXT2: CJNE A,#02H,COMM_EXIT ;Send stop bit SETB TXD_LINE INC SEND_FLAG CLR SEND_ENDS ;completed communicate SETB SEND_READ ;Setup read status COMM_EXIT: POP PSW POP ACC RETI ;********* Read communicating ********** READ_DATA: MOV A,READ_FLAG CJNE A,#02H,READ_NEXT1 ;Read a byte DJNZ READ_TIME,READ_EXIT MOV READ_TIME,#03H MOV A,READ_BUFF MOV C,RXD_LINE RRC A MOV READ_BUFF,A DJNZ READ_COUNT,READ_EXIT ;Completed read MOV READ_CODE,A ;Write read data byte INC READ_FLAG ;Setup for next byte MOV READ_TIME,#02H POP PSW POP ACC RETI READ_NEXT1: CJNE A,#00H,READ_NEXT2 JB RXD_LINE,READ_EXIT ;Check RXD(RXD_LINE) first CLR SEND_ENDS INC READ_FLAG POP PSW POP ACC RETI READ_NEXT2: CJNE A,#01H,READ_NEXT3 JB RXD_LINE,CHECK_ERROR ;Check start bit twice INC READ_FLAG ;Setup for read data MOV READ_COUNT,#08H ;MOV A,TL0 ;============= ;ADD A,#05H ;MOV TL0,A ;============= MOV READ_TIME,#03H ; POP PSW POP ACC RETI CHECK_ERROR: MOV READ_FLAG,#00H ;fail quit POP PSW POP ACC RETI READ_NEXT3: DJNZ READ_TIME,READ_EXIT ;Wait stop bit MOV READ_TIME,#03H MOV READ_FLAG,#00H CLR READ_ENDS ;CLR SEND_READ READ_EXIT: POP PSW POP ACC RETI END
|