Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

Efekt PWM na 2 linijkach diodowych

bastik
-
-
Posty:18
Rejestracja:26 paź 2014, o 23:45
Efekt PWM na 2 linijkach diodowych

Postautor: bastik » 18 kwie 2015, o 21:20

Witam
Napisałem program który zaświeca na przemian dwie linijki diodowe (7 czerwonych, 7 zielonych), poziom niski na porcie P2 zapala diody zielone a wysoki czerwone. Teraz mam tak zmodyfikować program aby jedna linijka diodowa się rozjaśniała a druga w tym czasie przyciemniała i na odwrót. Tylko nie mam pojęcia jak takie coś zrealizować, będę bardzo wdzięczny za jakieś rady jak zmodyfikować program.

Kod: Zaznacz cały

NAME efektLED T0_r EQU 0CCCCh IRAM_r EQU 07Fh LED_cz EQU P3.3 LED_z EQU P3.5 ;------------------------------------------------ BSEG at 0h ;segment w obszarze bitowym BDATA FLAGA DBIT 01h ;zarezerwuj bit zerowy bajtu 20h, ;(zmienna bitowa o nazwie Flaga) ;------------------------------------------------ DSEG at 21h ;segment danych w obszarze DATA L_cz DS 01h ;deklaracja jedno bajtowej zmiennej (adres 21h w DATA) L_z DS 01h ;dyrektywa DS rezerwuje na zmienną podaną liczbę bajtów ;------------------------------------------------ CSEG at 0000h ljmp Start ;------------------------------------------------ ORG 000Bh ljmp Int_T0 ;------------------------------------------------- Start: mov SP,#60 ;wskaźnik stosu domyślnie jest ustawiony na 07h orl TMOD,#0000$0001b ;inicjalizacja układu czasowo – licznikowego mov TH0,#HIGH(T0_r) mov TL0,#LOW(T0_r) orl IE,#1000$0010b setb TR0 mov R0,#IRAM_r ;czyszczenie pamięci wewnętrznej clr A Reset: mov @R0,A djnz R0,Reset Dodaj: mov R1,#0000$0001b ;zapalanie kolejnej diody Dodaj1: mov A,L_cz orl A,R1 mov L_cz,A ;ustawienie wartości wyświetlanej na LED czerwon. xrl A,#1111$1111b mov L_z,A ;ustawienie wartości wyświetlanej na LED zielonych mov A,R1 rl A mov R1,A cjne R0,#100,$ ;opóźnienie zmieniania wyświetlanych wartości mov R0,#0 cjne R1,#0000$0001b,Dodaj1 ;przejście do kolejnego cyklu – zmiana pętli Odejmij: mov R1,#1111$1110b ;gaszenie kolejnej diody Odejmij1: mov A,L_cz anl A,R1 mov L_cz,A xrl A,#1111$1111b mov L_z,A mov A,R1 rl A mov R1,A cjne R0,#100,$ mov R0,#0 cjne R1,#1111$1110b,Odejmij1 ljmp Dodaj ;----------------------------------------------- Int_T0: ;obsługa przerwania od T0 mov TH0,#HIGH(T0_r) mov TL0,#LOW(T0_r) inc R0 cpl FLAGA ;FLAGA znacznik realizowanej części podprogramu jb FLAGA,Int_cz ;zmiana aktywnej linijki LED setb LED_cz ;wyświetlanie informacji na diodach zielonych mov P2,L_z ;pobieranie informacji ze zmiennej L_z clr LED_z reti Int_cz: setb LED_z ;wyświetlanie informacji na diodach czerwonych mov P2,L_cz ;pobieranie informacji ze zmiennej L_cz clr LED_cz reti ;----------------------------------------------- END

Awatar użytkownika
Jacek Bogusz
-
-
Posty:470
Rejestracja:12 maja 2010, o 17:37
Lokalizacja:Poznań
Kontaktowanie:

Re: Efekt PWM na 2 linijkach diodowych

Postautor: Jacek Bogusz » 30 kwie 2015, o 18:03

Musisz bardzo szybko zaświecać i gasić diodę LED, tak aby oko nie zauważyło migotania. Im dłuższy będzie czas przerwy w świeceniu, tym bardziej "ciemna" będzie wydawała się dioda. A jak to zrobić w praktyce? No cóż, można na wiele sposobów. Można np. wykorzystać licznik timera, można wykonać licznik programowy itd. A niektóre 51-ki miały sprzętowy generator PWM (np. Infineona).

Wróć do „8051”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 6 gości