; 31.12.2004 16:31:58 #cpu = AT89C2051 ; @22,1184 MHz #Exclude Byte 64 - 127 ;Datenpuffer #Exclude Byte 0 - 47 ;Bits, Stack #Bit Empfang, Clk=P3.7, Dat=P3.3, Latch=P3.4, OE=P3.5 #Byte MuxPos, Writepointer ajmp Initialisierung EXTI0: ; externer Interrupt 0 Writepointer=#64 reti Timer 0: ; Timer 0 Interrupt mov TH0, #250 ajmp Timer 0 Interrupt SINT: ; serieller Interrupt clr RI push psw push acc r1=Writepointer @r1=sbuf inc Writepointer inc Writepointer a=Writepointer if a=#128 then Writepointer=#65 elseif a=#129 then Writepointer=#64 end if exsub: pop acc pop psw reti Initialisierung: r0=#64 clr a for r2=#64 @r0=a inc r0 next ; Serieller Port mov SCON, # 50h ; Modus 1, asynchron, 8 Bit, Baudrate Timer 1 Überlauf, Datenempfang freigeben mov TMOD, # 20h ; Timer 1 Autoreloadmodus mov TH1, # FFh ; Reloadwert für Baudrate 19200 setb TR1 ; Timer 1 Start orl PCON, # 80h ; Bit SMOD für Baudratenverdoppelung setzen orl TMOD, # 01h ; Timer 0 als 16-Bit Timer. ; Die Überlauffrequenz des Timer 0 beträgt 28,125 Hz, die Periodendauer 35,55556 ms. mov TH0, # 250 setb TR0 ; Timer 0 läuft. ; Interrupts setb EX0 ; externen Interrupt 0 freigeben setb IT0 ; Auslöser: negative Flanke an P3.2 setb PX0 ; Priorität für externen Interrupt 0 setb ET0 ; Timer 0 Interrupt freigeben setb ES ; seriellen Interrupt freigeben setb PS ; Priorität für seriellen Interrupt setb EA ; globale Interruptfreigabe MuxPos=#0 Writepointer=#64 loop ; Routine für seriellen Empfang if bit Empfang then clr Empfang Serielle Daten auswerten end if end loop ; * * * Hauptprogramm Ende * * * Serielle Daten auswerten: mov a, SBUF ; weitere Befehle ret Timer 0 Interrupt: clr P3.2 inc MuxPos a=MuxPos if a=#16 then MuxPos=#0 a=#0 end if rl a setb acc.6 push acc setb acc.5 r0=a ;Rechte Hälfte inc r0 a= @r0 for r7=#8 clr Clk rlc a Dat=c nop setb Clk next dec r0 a= @r0 for r7=#8 clr Clk rlc a Dat=c nop setb Clk next pop acc r0=a ;Linke Hälfte inc r0 a= @r0 for r7=#8 clr Clk rlc a Dat=c nop setb Clk next dec r0 a= @r0 for r7=#8 clr Clk rlc a Dat=c nop setb Clk next clr OE a=MuxPos swap a P1=a setb Latch nop clr Latch nop setb OE setb P3.2 reti