Výpis programu pro mikrokontroler AT89C2051

1 cyklus = 1,0850694us

databit    bit p1.7             ;pin,na kterem je TM
led        bit p1.6             ;pin,na kterem je LED dioda

           org 0
           jmp zacatek
           org 30H
zacatek:   mov sp,#35H
           clr rs0              ;banka 0
           clr rs1
           mov scon,#01010000B  ;nastaveni ser.linky+casovace1
           mov tmod,#00100000B  ;19200 bps,8 databit,1 stopbit,bez parity
           mov 87H,#10000000B   ;casovac1 - mod2,serlink - mod 1
           mov th1,#253
           setb ea              ;povoleni vsech preruseni
           setb et1
           setb tr1             ;spusteni casovace1
start:     call touchreset      ;volani procedury-test pritomnosti TM
           jc pritomen          ;pokud je TM pripojen,pokracuje rozsvicenim
           jmp start             LED...,jinak nadale testuje pritomnost TM
pritomen:  clr led              ;rozsviti LED
           clr c                ;nuluje priznak pritomnosti TM
           setb rs0             ;banka 1
           mov a,#33H           ;vysle prikaz pro cteni ROM kodu
           call touchbyte		
           mov a,#0FFH          ;nastavi port jako prijimaci po celou dobu 
                                ;cteni
           call touchbyte       ;v acc je family kod
           cjne a,#01H,nenikod  ;cteni pokracuje pouze s DS1990A
           mov a,#0FFH          ;nastavi port jako prijimaci
           call touchbyte       ;v acc je 1.byte,1.znak-dolni pulbyte
           call prevod          ;volani prevodu bin na ascii kod
           mov r0,b             ;do r0 prvni znak serioveho cisla (zprava) 
           mov r1,a             ;do r1 druhy znak serioveho cisla
           mov a,#0FFH
           call touchbyte       ;v acc je 2.byte
           call prevod
           mov r2,b             ;do r2 treti znak
           mov r3,a             ;do r3 ctvrty znak
           mov a,#0FFH
           call touchbyte       ;v acc je 3.byte
           call prevod
           mov r4,b             ;do r4 paty znak
           mov r5,a             ;do r5 sesty znak
           mov a,#0FFH	
           call touchbyte       ;v acc je 4.byte
           call prevod
           mov r6,b             ;do r6 sedmy znak
           mov r7,a             ;do r7 osmy znak
           setb rs1             ;banka 3
           mov a,#0FFH
           call touchbyte       ;v acc je 5.byte
           call prevod
           mov r0,b             ;do r0 devaty znak
           mov r1,a             ;do r1 desaty znak
           mov a,#0FFH
           call touchbyte       ;v acc je 6.byte
           call prevod
           mov r2,b             ;do r2 jedenacty znak
           mov r3,a             ;do r3 dvanacty znak
           mov a,#0FFH
           call touchbyte       ;v acc je CRC
           clr rs1			
           clr rs0              ;banka 0
           clr c                ;nuluje priznak pritomnosti TM
           call vysilani        ;volani procedury ser.vysilani
           jmp start	        ;test dalsiho TM
nenikod:   clr c                ;nuluje priznak pritomnosti TM
           jmp start
;
;procedura touchreset vysle do TM RESET Pulse a ceka na odpoved v podobe ;Presence Pulsu od TM. Pokud je TM pritomen,nastavi C,jinak ho nuluje.
;
touchreset: push b              ;uchova b a acc
           push a
           mov a,#4             ;pocet opakovani smycky
           clr databit          ;zacatek Reset Pulsu
           mov b,#221           ;zpozdeni 480us, po tuto dobu pridrzi pin 
           djnz b,$             ; v nule
           setb databit         ;pin do jednicky,konec Reset pulsu
           mov b,#6             ;casovy interval pro zpozdeni
           clr c                ;nuluje priznak pritomnosti TM
waitlow:   jb databit,wh        ;skok na wh,kdyz je pin v jednicce (tzn. po
                                ;Reset pulsu)
           djnz b,waitlow       ;ceka po dobu 3360us na prejiti pinu do 1
           djnz a,waitlow
           jmp short            ;pin nepresel do 1,TM neni pritomen
wh:        mov b,#111           ;interval 240us pro detekci Presence pulsu
hl:        orl c,/databit       ;nastavi C,pokud se behem intervalu dostane
                                ;pin do nuly(to je Presence puls)
           djnz b,hl
short:     pop a                ;obnovi puvodni b a acc
           pop b
           ret
;
;procedura vysila obsah acc do TM a soucasne od nej prijima 1 byte opet do
;acc
;
touchbyte: push b               ;uchova b
           mov b,#8             ;pocitadlo 8 bitu
smycka:    rrc a                ;vysilany bit do C 
           call jedenbit        ;volani-odeslani jednoho bitu
           djnz b,smycka        ;dalsi bit k odeslani
           rrc a                ;posledni prijaty bit do acc
           pop b                ;obnovi b
           ret
jedenbit:  clr databit          ;zacatek time slotu
           nop                  ;zpozdeni pres 4us,zajisti,aby nulu TM
           nop                  ;bezpecne zaregistrovalo(min.1us)
           nop
           nop
           mov databit,c        ;vysle bit do TM
           nop                  ;zpozdeni 6,5us pred ctenim bitu z TM
           nop                  ;aby se dodrzel interval 15us pro precteni
           nop                  ;spravne hodnoty
           nop
           nop
           nop
           mov c,databit        ;precte bit z TM (min.15us po zacatku time 
                                ;slotu)
           push b               ;uchova b
           mov b,#12H           ;zpozdeni 41us do konce time slotu
           djnz b,$             ;celkem tedy neco pres 60us(time slot)
           pop b                ;obnovi b
           setb databit         ;konec time slotu
           ret
;	
;
vysilani:  setb rs0             ;banka 3
           setb rs1
           clr ti               ;nuluje priznak prazdneho vysilaciho registru
           mov sbuf,r3          ;vyslat r3 - dvanacty znak ser.cisla
           jnb ti,$             ;ceka,dokud se korektne neodvysila
           clr ti               ;nuluje priznak odvysilaneho bytu
           mov sbuf,r2
           jnb ti,$
           clr ti
           mov sbuf,r1
           jnb ti,$
           clr ti
           mov sbuf,r0
           jnb ti,$
           clr ti
           clr rs1
           clr ti
           mov sbuf,r7
           jnb ti,$
           clr ti
           mov sbuf,r6
           jnb ti,$
           clr ti
           mov sbuf,r5
           jnb ti,$
           clr ti
           mov sbuf,r4
           jnb ti,$
           clr ti	
           mov sbuf,r3
           jnb ti,$
           clr ti
           mov sbuf,r2
           jnb ti,$
           clr ti
           mov sbuf,r1
           jnb ti,$
           clr ti
           mov sbuf,r0          ;vysle r0 - prvni znak ser.cisla
           jnb ti,$
           clr ti
           clr rs0              ;banka 0
           clr rs1
;zpozdeni pro zpozdene zhasnuti LED priblizne 280ms
           mov r0,#255          ;konstanty zpozdeni
nic2:      mov r1,#255
nic1:      nop
           djnz r1,nic1         ;vnorene smycky
           djnz r0,nic2
           setb led             ;zhasne LED
           ret

;v acc je horni pulbyte,v b je dolni pulbyte
;prevod binarniho cisla v acc na ASCII znak do acc (puvod - www.8052.com)
prevod:
           mov b,a              ;kopie acc do b
           anl a,#00fh          ;maska,ponecha pouze dolni pulbyte
           add a,#090h          ;pricte 144
           da a                 ;dekadicka korekce
           addc a,#040h         ;pricte 64
           da a                 ;dekadicka korekce 
           xch a,b              ;prohodi a<>b
           swap a               ;prohodi dolni a horni pulbyte acc
           anl a,#00fh 
           add a,#090h 
           da a	
           addc a,#040h
           da a
           ret
end

Zpět na předchozí stránku