Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // 1. Napisz ponga w C używając softwarowych przerwań
- #include <8051.h>
- #define TIM 19456 // 50ms
- #define LEDS P1 // port do diod
- unsigned char acc, flag; // flag = 0 - lewo, flag = 1 - prawo
- void timer0(void) __interrupt(1) __using(1){
- // Lewo czy prawo?
- if(flag)
- acc = acc >> 1;
- else
- acc = acc << 1;
- // Jeżeli pali się ostatnia dioda z lewej lub z prawej:
- if(acc == 128 || acc == 1)
- flag = !flag;
- LEDS = acc; // wartość zostaje wrzucona na port diod
- // Ponownie wrzucam wartości od których ma zliczać Timer 0:
- TH0 = TIM / 256; // 4 starsze bity
- TL0 = TIM % 256; // 4 młodsze bity
- return;
- }
- int main(void){
- acc = 1; // wartość wrzucana na port diod
- flag = 0; // lewo czy prawo, lewo = 0, prawo = 1
- LEDS = 1; // zaczynam od zapalenia pierwszej diody z prawej
- // Timer:
- TH0 = TIM / 256; // 4 starsze bity
- TL0 = TIM % 256; // 4 młodsze bity
- TMOD = 1; // Timer 0 w trybie 1
- TR0 = 1; // włączam Timer 0
- // Przerwania:
- EA = 1; // włączenie przerwań
- ET0 = 1 // włączenie przerwania Timera 0
- while(1){
- // nieskończona pętla, przerywana przerwaniami
- }
- }
- // 3. Napisz miganie diodą z przerwaniami
- // Dioda migająca co 500ms.
- #include <8051.h>
- #define TIM 19456 // 50ms
- #define LEDS P2 // port diod
- #define LED P2.0 // konkretna dioda
- unsigned char count = 1;
- void timer1(void) __interrupt(3) __using(1){
- if(count == 10){
- LED = !LED;
- count = 1;
- }
- else
- count++;
- TH1 = TIM / 256;
- TL1 = TIM % 256;
- return;
- }
- int main(void){
- LED = 0;
- // Wartości timerów:
- TH1 = TIM / 256;
- TL1 = TIM % 256;
- // Ustalenie trybu timera 1
- TMOD = 0b00010000; // timer 1 w trybie 1 - 16 bitowym
- // Włączenie timera 1
- TR1 = 1;
- // Włączenie przerwań
- ET1 = 1; // włączenie przerwania timera 1
- EA = 1; // włączenie przerwań - w ogóle
- // Nieskończona pętla przerywana przerwaniami co 50ms
- while(1);
- }
- // Zadanie z lab5 - https://imgur.com/a/imBf9sM
- CZAS EQU 19456 ; 50ms
- DIODA EQU P2.7
- ORG 0
- MOV P2, #0
- MOV TMOD, #1 ; tryb pierwszy, timer0
- SETB TR0
- LOOP:
- SETB DIODA
- MOV R0, #6
- CALL DELAY
- CLR DIODA
- MOV R0, #4
- CALL DELAY
- SETB DIODA
- MOV R0, #3
- CALL DELAY
- CLR DIODA
- MOV R0, #17
- CALL DELAY
- SJMP LOOP
- DELAY: ; opóźnienie R0 * 50ms
- MOV TL0, #LOW CZAS
- MOV TH0, #HIGH CZAS
- JNB TF0, $
- CLR TF0
- DJNZ R0, DELAY
- RET
- // To samo zadanie co wyżej, na dwóch timerach
- CZAS EQU 19456 ; 50ms
- DIODA EQU P2.7
- ORG 0
- MOV P2, #0
- MOV TMOD, #00010001b ; tryb pierwszy, timer0 i timer1
- SETB TR0
- SETB TR1
- LOOP:
- SETB DIODA
- MOV R0, #6
- CALL DELAY_T0
- CLR DIODA
- MOV R1, #4
- CALL DELAY_T1
- SETB DIODA
- MOV R0, #3
- CALL DELAY_T0
- CLR DIODA
- MOV R1, #17
- CALL DELAY_T1
- SJMP LOOP
- DELAY_T0: ; opóźnienie R0 * 50ms
- ;MOV TL0, #LOW CZAS
- ;MOV TH0, #HIGH CZAS
- MOV TL0, #CZAS_L
- MOV TH0, #CZAS_H
- JNB TF0, $
- CLR TF0
- DJNZ R0, DELAY_T0
- RET
- DELAY_T1: ; opóźnienie R1 * 50ms
- ;MOV TL1, #LOW CZAS
- ;MOV TH1, #HIGH CZAS
- MOV TL1, #CZAS_L
- MOV TH1, #CZAS_H
- JNB TF1, $
- CLR TF1
- DJNZ R1, DELAY_T1
- RET
- // Miganie diodą na przerwaniu w ASM
- ORG 0
- DIODA EQU P2.1
- CZAS EQU 65536 - (50000 / 1,08507) ; 50ms
- LJMP START
- ORG 0BH:
- CPL DIODA
- MOV TL0, #LOW CZAS
- MOV TH0, #HIGH CZAS
- RETI
- START:
- MOV P2, #0 ; zgaś wszystkie diody
- MOV TMOD, #1 ; timer 0 w trybie 1
- MOV TL0, #LOW CZAS
- MOV TH0, #HIGH CZAS
- SETB TR0 ; włączenie timera 0
- SETB ET0 ; włączenie przerwania timera 0
- SETB EA ; włączenie przerwań
- SJMP $ ; zapętlenie
- // Obsługa przycisku w ASM bez eliminacji drgań styków
- ORG 0
- KLAW1 EQU P0.4
- LICZNIK EQU R7
- MOV P2, #0 ; gaszę wszystkie diody
- MOV LICZNIK, #0 ; zeruje licznik
- SETB KLAW1 ; ustawiam bit odpowiadający za przycisk
- PETLA:
- JB KLAW1, $ ; dopóki przycisk nie jest wciśnięty to czekam
- INC LICZNIK ; przycisk wciśnięty - inkrementuje licznik
- MOV P2, LICZNIK ; wrzucam na diody stan licznika
- JNB KLAW1, $ ; czekam na puszczenie przycisku
- SJMP PETLA ; zapętlenie
- END
- // Obsługa przycisków w C z eliminacją drgań styków
- #include <8051.h>
- #define stykP1 P1_4
- #define stykP2 P1_5
- #define portLED P2
- unsigned char licznik = 0;
- void czekaj(unsigned int ilosc){
- TL0 = (65536 - ilosc) % 256;
- TH0 = (65536 - ilosc) / 256;
- TF0 = 0;
- TR0 = 1;
- while(!TF0);
- TR0 = 0;
- }
- int main(void){
- portLED = 0;
- while(1){
- while(stykP1 && StykP2);
- czekaj(9600);
- if(stykP1)
- licznik++;
- else
- licznik--;
- portLED = licznik;
- while(!stykP1 || !stykP2);
- czekaj(9600);
- }
- }
- // Makro + timer jako opóźnienie
- ORG 0
- DL EQU 4608 ; 5ms
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- DELMAC MACRO x
- LOCAL DELAY
- MOV TMOD, #00000001B
- SETB TR0
- MOV R0, #x
- DELAY:
- MOV TH0,#HIGH DL
- MOV TL0,#LOW DL
- JNB TF0, $
- CLR TF0
- DJNZ R0, DELAY
- ENDM
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- MOV P2, #0
- LOOP:
- SETB P2.0
- DELMAC 60
- CLR P2.0
- DELMAC 40
- SETB P2.0
- DELMAC 27
- CLR P2.0
- DELMAC 135
- DELMAC 138
- SJMP LOOP
- END
Add Comment
Please, Sign In to add comment