VEndymionV

Kody - SW

Jun 17th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.38 KB | None | 0 0
  1. // 1. Napisz ponga w C używając softwarowych przerwań
  2.  
  3. #include <8051.h>
  4.  
  5. #define TIM 19456 // 50ms
  6. #define LEDS P1 // port do diod
  7.  
  8. unsigned char acc, flag; // flag = 0 - lewo, flag = 1 - prawo
  9.  
  10. void timer0(void) __interrupt(1) __using(1){
  11.  
  12.     // Lewo czy prawo?
  13.     if(flag)
  14.         acc = acc >> 1;
  15.     else
  16.         acc = acc << 1;
  17.  
  18.     // Jeżeli pali się ostatnia dioda z lewej lub z prawej:
  19.     if(acc == 128 || acc == 1)
  20.         flag = !flag;
  21.  
  22.     LEDS = acc; // wartość zostaje wrzucona na port diod
  23.  
  24.     // Ponownie wrzucam wartości od których ma zliczać Timer 0:
  25.     TH0 = TIM / 256; // 4 starsze bity
  26.     TL0 = TIM % 256; // 4 młodsze bity
  27.  
  28.     return;
  29. }
  30.  
  31. int main(void){
  32.  
  33.     acc = 1; // wartość wrzucana na port diod
  34.     flag = 0; // lewo czy prawo, lewo = 0, prawo = 1
  35.  
  36.     LEDS = 1; // zaczynam od zapalenia pierwszej diody z prawej
  37.     // Timer:
  38.     TH0 = TIM / 256; // 4 starsze bity
  39.     TL0 = TIM % 256; // 4 młodsze bity
  40.     TMOD = 1; // Timer 0 w trybie 1
  41.     TR0 = 1; // włączam Timer 0
  42.     // Przerwania:
  43.     EA = 1; // włączenie przerwań
  44.     ET0 = 1 // włączenie przerwania Timera 0
  45.  
  46.     while(1){
  47.         // nieskończona pętla, przerywana przerwaniami
  48.     }
  49. }
  50.  
  51. // 3. Napisz miganie diodą z przerwaniami
  52.  
  53. // Dioda migająca co 500ms.
  54. #include <8051.h>
  55.  
  56. #define TIM 19456 // 50ms
  57. #define LEDS P2 // port diod
  58. #define LED P2.0 // konkretna dioda
  59.  
  60. unsigned char count = 1;
  61.  
  62. void timer1(void) __interrupt(3) __using(1){
  63.  
  64.     if(count == 10){
  65.         LED = !LED;
  66.         count = 1;
  67.     }
  68.     else
  69.         count++;
  70.  
  71.     TH1 = TIM / 256;
  72.     TL1 = TIM % 256;
  73.  
  74.     return;
  75. }
  76.  
  77. int main(void){
  78.  
  79.     LED = 0;
  80.     // Wartości timerów:
  81.     TH1 = TIM / 256;
  82.     TL1 = TIM % 256;
  83.     // Ustalenie trybu timera 1
  84.     TMOD = 0b00010000; // timer 1 w trybie 1 - 16 bitowym
  85.     // Włączenie timera 1
  86.     TR1 = 1;
  87.     // Włączenie przerwań
  88.     ET1 = 1; // włączenie przerwania timera 1
  89.     EA = 1; // włączenie przerwań - w ogóle
  90.     // Nieskończona pętla przerywana przerwaniami co 50ms
  91.     while(1);
  92. }
  93.  
  94. // Zadanie z lab5 - https://imgur.com/a/imBf9sM
  95.  
  96.     CZAS    EQU     19456 ; 50ms
  97.     DIODA   EQU     P2.7
  98.  
  99.     ORG     0
  100.     MOV     P2, #0
  101.  
  102.     MOV     TMOD, #1 ; tryb pierwszy, timer0
  103.     SETB    TR0
  104. LOOP:
  105.     SETB    DIODA
  106.     MOV     R0, #6
  107.     CALL    DELAY
  108.  
  109.     CLR     DIODA
  110.     MOV     R0, #4
  111.     CALL    DELAY
  112.  
  113.     SETB    DIODA
  114.     MOV     R0, #3
  115.     CALL    DELAY
  116.  
  117.     CLR     DIODA
  118.     MOV     R0, #17
  119.     CALL    DELAY
  120.  
  121.     SJMP    LOOP
  122.  
  123. DELAY: ; opóźnienie R0 * 50ms
  124.     MOV     TL0, #LOW CZAS
  125.     MOV     TH0, #HIGH CZAS
  126.     JNB     TF0, $
  127.     CLR     TF0
  128.     DJNZ    R0, DELAY
  129.     RET
  130.  
  131. // To samo zadanie co wyżej, na dwóch timerach
  132.  
  133.     CZAS    EQU     19456 ; 50ms
  134.     DIODA   EQU     P2.7
  135.  
  136.     ORG     0
  137.     MOV     P2, #0
  138.  
  139.     MOV     TMOD, #00010001b ; tryb pierwszy, timer0 i timer1
  140.     SETB    TR0
  141.     SETB    TR1
  142. LOOP:
  143.     SETB    DIODA
  144.     MOV     R0, #6
  145.     CALL    DELAY_T0
  146.  
  147.     CLR     DIODA
  148.     MOV     R1, #4
  149.     CALL    DELAY_T1
  150.  
  151.     SETB    DIODA
  152.     MOV     R0, #3
  153.     CALL    DELAY_T0
  154.  
  155.     CLR     DIODA
  156.     MOV     R1, #17
  157.     CALL    DELAY_T1
  158.  
  159.     SJMP    LOOP
  160.  
  161. DELAY_T0: ; opóźnienie R0 * 50ms
  162.     ;MOV        TL0, #LOW CZAS
  163.     ;MOV        TH0, #HIGH CZAS
  164.     MOV     TL0, #CZAS_L
  165.     MOV     TH0, #CZAS_H
  166.     JNB     TF0, $
  167.     CLR     TF0
  168.     DJNZ    R0, DELAY_T0
  169.     RET
  170.  
  171. DELAY_T1: ; opóźnienie R1 * 50ms
  172.     ;MOV        TL1, #LOW CZAS
  173.     ;MOV        TH1, #HIGH CZAS
  174.     MOV     TL1, #CZAS_L
  175.     MOV     TH1, #CZAS_H
  176.     JNB     TF1, $
  177.     CLR     TF1
  178.     DJNZ    R1, DELAY_T1
  179.     RET
  180.  
  181. // Miganie diodą na przerwaniu w ASM
  182.  
  183.     ORG    0
  184.     DIODA    EQU    P2.1
  185.     CZAS    EQU    65536 - (50000 / 1,08507) ; 50ms
  186.     LJMP    START
  187.    
  188.     ORG    0BH:
  189.     CPL    DIODA
  190.     MOV    TL0, #LOW CZAS
  191.     MOV    TH0, #HIGH CZAS
  192.     RETI
  193.    
  194. START:
  195.     MOV    P2, #0 ; zgaś wszystkie diody
  196.     MOV    TMOD, #1 ; timer 0 w trybie 1
  197.     MOV    TL0, #LOW CZAS
  198.     MOV    TH0, #HIGH CZAS
  199.     SETB    TR0 ; włączenie timera 0
  200.     SETB    ET0 ; włączenie przerwania timera 0
  201.     SETB    EA ; włączenie przerwań
  202.     SJMP    $ ; zapętlenie
  203.  
  204. // Obsługa przycisku w ASM bez eliminacji drgań styków
  205.  
  206.     ORG     0
  207.     KLAW1   EQU     P0.4
  208.     LICZNIK EQU     R7
  209.  
  210.     MOV     P2, #0 ; gaszę wszystkie diody
  211.     MOV     LICZNIK, #0 ; zeruje licznik
  212.    
  213.     SETB    KLAW1 ; ustawiam bit odpowiadający za przycisk
  214.  
  215. PETLA:
  216.     JB      KLAW1, $ ; dopóki przycisk nie jest wciśnięty to czekam
  217.     INC     LICZNIK ; przycisk wciśnięty - inkrementuje licznik
  218.     MOV     P2, LICZNIK ; wrzucam na diody stan licznika
  219.     JNB     KLAW1, $ ; czekam na puszczenie przycisku
  220.     SJMP    PETLA ; zapętlenie
  221.     END
  222.  
  223.  
  224. // Obsługa przycisków w C z eliminacją drgań styków
  225.  
  226. #include <8051.h>
  227. #define stykP1 P1_4
  228. #define stykP2 P1_5
  229. #define portLED P2
  230.  
  231. unsigned char licznik = 0;
  232.  
  233. void czekaj(unsigned int ilosc){
  234.     TL0 = (65536 - ilosc) % 256;
  235.     TH0 = (65536 - ilosc) / 256;
  236.     TF0 = 0;
  237.     TR0 = 1;
  238.     while(!TF0);
  239.     TR0 = 0;
  240. }
  241.  
  242. int main(void){
  243.     portLED = 0;
  244.     while(1){
  245.         while(stykP1 && StykP2);
  246.         czekaj(9600);
  247.         if(stykP1)
  248.             licznik++;
  249.         else
  250.             licznik--;
  251.         portLED = licznik;
  252.         while(!stykP1 || !stykP2);
  253.         czekaj(9600);
  254.     }
  255. }
  256.  
  257. // Makro + timer jako opóźnienie
  258.  
  259.     ORG 0
  260.     DL      EQU 4608 ; 5ms
  261.  
  262. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  263. DELMAC  MACRO   x
  264.         LOCAL DELAY
  265.         MOV TMOD, #00000001B
  266.         SETB    TR0
  267.         MOV R0, #x
  268. DELAY:
  269.         MOV TH0,#HIGH DL
  270.         MOV TL0,#LOW DL
  271.         JNB TF0, $
  272.         CLR TF0
  273.         DJNZ    R0, DELAY
  274.         ENDM
  275. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  276.  
  277.         MOV P2, #0
  278. LOOP:
  279.         SETB    P2.0
  280.         DELMAC  60
  281.         CLR P2.0
  282.         DELMAC  40
  283.         SETB    P2.0
  284.         DELMAC  27
  285.         CLR P2.0
  286.         DELMAC  135
  287.         DELMAC  138
  288.         SJMP    LOOP   
  289.         END
Add Comment
Please, Sign In to add comment