|
纯软件单片机串口(二) 这是另外一个使用中断查寻的程序! 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
|