w programie chodzi o to,ze:
- powinien oczekiwac na zero logiczne na p1.3
- jesli pojawi sie to "0" powinien odmierzyc czas i po tym czasie wykonac procedure (***), chyba ze na /t0 zostana podane dwa impulsy, wtedy ma nic nie wlaczyc i czekac az na p1.3 pojawi sie "1" i od nowa program
- przy 1 na p1.3 powinien sprawdzac, czy na /int nie pojawil sie impuls, jesli sie pojawil ma sie wlaczyc procedura (***)
procedura (***) polega na czasowym wlaczaniu i wylaczaniu pinu p1.4 (kilka takich cykli po czym koniec)
oto moj program:
teraz pytanie: co w nim namieszalem???
- powinien oczekiwac na zero logiczne na p1.3
- jesli pojawi sie to "0" powinien odmierzyc czas i po tym czasie wykonac procedure (***), chyba ze na /t0 zostana podane dwa impulsy, wtedy ma nic nie wlaczyc i czekac az na p1.3 pojawi sie "1" i od nowa program
- przy 1 na p1.3 powinien sprawdzac, czy na /int nie pojawil sie impuls, jesli sie pojawil ma sie wlaczyc procedura (***)
procedura (***) polega na czasowym wlaczaniu i wylaczaniu pinu p1.4 (kilka takich cykli po czym koniec)
oto moj program:
ORG 000H
LJMP START ;IDZ DO START
ORG 000BH ;PRZERWANIE OD T0
LJMP PRZERW_T0
ORG 001BH ;PRZERWANIE OD T1
LJMP PRZERW_T1
ORG 0013H ;PRZERWANIE OD INT1
LJMP PRZERW_INT1
START:
LICZNIK EQU 0
LICZ_ALARM EQU 0
SETB ET0 ;ODBLOKUJ T0
SETB ET1 ;ODBLOKUJ T1
SETB EX1 ;ODBLOKUJ /INT1
SETB EA ;ODBLOKUJ PRZERWANIA
CLR P1.4 ;WYLACZ TO CO JEST NA P1.4
CLR P1.3
LJMP PETLA_OTWARCIA
PETLA_OTWARCIA: ;SPRAWDZA CZY JEST SYGNAL ("0") NA P1.3
JB P1.3,PETLA_OTWARCIA ;JESLI 1 TO PETLA W KOLO
MOV TMOD,#00010110B ;USTAW T0 W TRYB ZLICZ IMP. ;WEJSC,T1-ODMIERZA CZAS
;A TERAZ WLACZAMY T0:
MOV TH0,#0FEh ;FEh=256-2=254 CZYLI ZLICZA 2 ;IMPULSY
MOV TL0,TH0 ;konieczne!
SETB TR0 ;WLACZA LICZNIK T0
LJMP TAJMER
TAJMER:
;TERAZ WLACZAMY T1:
MOV TH1,#03CH ;DLA KWARCU 6MHz 600 PRZEPELNIEN TO ;5S
MOV TL1,#0B0H ; 1 PRZEPELNIENIE CO 8,(3)ms
LJMP TAJMERSTART
TAJMERSTART:
SETB TR1 ;WLACZA T1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;TU JEST PRZERWANIE LICZNIKA CZASU ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PRZERW_T1:
INC LICZNIK
LJMP WKOLO
;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;
;;TU JEST GLOWNY PROGRAM;;
;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;
WKOLO:
MOV A,#00H
MOV A,LICZNIK
CJNE A,#064h,NEXT ;CZY LICZNIK SIE ZAPELNIL
ZAMK:
CLR TR1 ;ZATRZYMAJ T1
MOV LICZNIK,#0 ;JEZELI LICZNIK SIE ZAPELNI WYZERUJ
INC LICZ_ALARM ;ZWIEKSZ LICZ_ALARM O 1
MOV A,00H
MOV A,LICZ_ALARM
CJNE A,#01H,DWA
SETB P1.4
LJMP TAJMERSTART
NEXT:
JB P1.3,ZAMK ;JESLI ZAMKNIETO SKOCZ
LJMP WKOLO
DWA:
MOV A,00H
MOV A,LICZ_ALARM
CJNE A,#02H,TRZY
LJMP TAJMERSTART
TRZY:
MOV A,00H
MOV A,LICZ_ALARM
CJNE A,#03H,CZTERY
CLR P1.4
LJMP TAJMERSTART
CZTERY:
MOV A,00H
MOV A,LICZ_ALARM
CJNE A,#04H,PIEC
LJMP TAJMERSTART
PIEC:
MOV A,00H
MOV A,LICZ_ALARM
CJNE A,#05H,SZESC
SETB P1.4
LJMP TAJMERSTART
SZESC:
MOV A,00H
MOV A,LICZ_ALARM
CJNE A,#06H,SIEDEM
LJMP TAJMERSTART
SIEDEM:
MOV A,00H
MOV A,LICZ_ALARM
CJNE A,#07H,OSIEM
CLR P1.4
LJMP TAJMERSTART
OSIEM:
MOV A,00H
MOV A,LICZ_ALARM
CJNE A,#08H,DZIEWIEC
LJMP TAJMERSTART
DZIEWIEC:
MOV A,00H
MOV A,LICZ_ALARM
CJNE A,#09H,DZIESIEC
SETB P1.4
LJMP TAJMERSTART
DZIESIEC:
MOV A,00H
MOV A,LICZ_ALARM
CJNE A,#0AH,JEDENASCIE
LJMP TAJMERSTART
JEDENASCIE:
MOV A,00H
MOV A,LICZ_ALARM
CJNE A,#0BH,POZOSTALE
CLR P1.4
MOV LICZ_ALARM,#00H ;ZERUJ LICZ_ALARM
WAIT:
JB P1.3,TRALALA
LJMP WAIT
POZOSTALE:
MOV LICZ_ALARM,#00H ;ZERUJ LICZ_ALARM
RETI
PRZERW_T0:
LJMP PRZERWANIE
PRZERWANIE:
MOV LICZ_ALARM,00H ;USTAW LICZ_ALARM NA ZERO
CLR P1.4 ;WYLACZ TO CO JEST NA P1.4
LJMP CZEKAJ
CZEKAJ:
JNB P1.3,CZEKAJ ;CZEKAJ NA "1" NA P1.3
LJMP START ;JAK NIE MA TO DALEJ CZEKAJ
RETI
PRZERW_INT1:
LJMP ZAMK ;SKOCZ DO ZAMK W PRZERW_T1
RETI
TRALALA:
LJMP START
ENDteraz pytanie: co w nim namieszalem???