Advertisement
Guest User

Untitled

a guest
Jun 26th, 2017
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
BNF 4.64 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <reg51.h>
  3.  
  4. //varijabli grijalica pridruzijemo adresu bita u SFR registrima
  5. //na koji je spojena zarulja(grijalica)
  6. sbit grijalica = P1^3;
  7.  
  8. //prototipi funkcija
  9. void ispis (unsigned char, unsigned char);
  10. void PisiControl(unsigned char);
  11. void PisiKomandu(unsigned char);
  12. int CitajTemp(void);
  13.  
  14. main() {
  15.     bit bdata kvar=0;               //zastavica kojom javljamo kvar memorije
  16.     volatile unsigned char xdata *mem;      //pokazivac na vanjsku memoriju
  17.     unsigned char vtest;                //u vtest cemo spremiti sto procitamo sa adrese 'mem'
  18.     int temp;                   //u nju spremamo izmjerenu temperaturu
  19.  
  20.     TMOD = 0x20;                    //podesavanje serijskog sucelja
  21.     TH1  = 0xF4;                    //(dobro objasnjeno u skripti za labos)
  22.     TL1  = 0xF4;
  23.     TR1  = 1;
  24.     SCON = 0x52;                    //kraj podesavanja serijskog sucelja
  25.    
  26.     //ispis na serijsko sucelje
  27.     printf("Zadatak 3 uspjesno napravljen.\n\n");
  28.    
  29.     //provjera ispravnosti memorije
  30.     for (mem = 0x0000; mem <= 0x7FFF; mem++) {  //prolazimo kroz sve adrese memorije
  31.         *mem = 0xAA;                //na adresu 'mem' spremamo podatak '0xAA'
  32.         vtest = *mem;               //sa iste adrese citamo podatak
  33.         if (vtest != 0xAA) {            //ako nije procitano ono sto smo prethodno
  34.             kvar=1;             //upisali, znaci da je memorija neispravna
  35.             break;              //pronalaskom prve greske, dalje vise ne moramo provjeravati
  36.         }
  37.     }
  38.    
  39.     //ispisivanje na serijsko sucelje odgovarajuce poruke
  40.     if (kvar == 0) {
  41.         printf("Memorija je ispravna.\n\n");
  42.     } else {
  43.         printf("Memorija nije ispravna.\n\n");
  44.     }
  45.  
  46.     //ispis('l','4');               //testni ispis broja 45 na
  47.     //ispis('d','5');               //7-segmentni pokaznik
  48.  
  49.     PisiControl(0x02);              //inicijalizacija
  50.     PisiKomandu(0xEE);              //termometra
  51.  
  52.     TMOD = 0x21;                    //0x20=0010 0000 mora ostati zbog serijskog sucelja
  53.                             //0x01=0000 0001 podesava Brojilo0 u nacin rada 1
  54.                             //tip! mogli smo odma na pocetku kod inicijalizacije
  55.                             //     serijskog sucelja upisati 0x21 i ustediti pokoji
  56.                             //     ciklus, ali je ovako lakse skuziti sta koji dio
  57.                             //     programa radi           
  58.     TL0  = 0x00;                    //postavljanje nizeg bajta brojila na 0
  59.     TH0  = 0x00;                    //i viseg na nula = brojilo broji od nula do 2^(8+8)
  60.     PT0  = 0;                   //brojilu0 stavljamo nizi prioritet
  61.     ET0  = 1;                   //omogucujemo brojilu slanje prekida
  62.     EA   = 1;                   //omogucavamo sve prekide koji su postavljeni (pogledati
  63.                             //realizaciju IE registra na slici 14.2,str.50 u skripti za lab)
  64.     TR0  = 1;                   //na kraju pokrecemo brojilo (broji se broj otkucaja takta procesora podijeljen
  65.                             //sa 12 - zasto? tako je sklop brojila konstruiran, pogledati
  66.                             //sliku 14.1,str.50 skripte za labos)
  67.  
  68.     //u beskonacnoj petlji citamo temperaturu i ispisujemo je na serijsko sucelje
  69.     //tijekom vrtnje ovog 'while-a', brojac ce slati zahtjev za prekidom kada
  70.     //ponovno dode u nulu, to se dogodi kada dode do prelijeva, odnosno kada
  71.     //izbroji 2^16+1 taktova-procesora-podijeljenih-sa-12 :)
  72.     //dakle kada brojilo za vrijeme ove 'while' petlje padne u nula, program skace na
  73.     //adresu prekidnog potprograma sat(void), odradi tamo sta je isprogramirano i vrati
  74.     //se nazad gdje je stao u ovom 'while-u'
  75.     while(1) {     
  76.         temp = CitajTemp() / 2;         //termometar uvijek vraca dvostruku temperaturu pa je
  77.                             //dijelimo sa 2 (tako dobijemo razlucivost od 0.5stupnjeva)
  78.         printf("Izmjerena je temperatura od %d stupnjeva.\n\n",temp);
  79.         if(temp < 30) { grijalica = 0; }    //regulacija temperature paljenjem i
  80.         if(temp > 32) { grijalica = 1; }    //gasenjem grijalice (zaruljice)
  81.     }
  82.  
  83.     //prazan while(1) je obavezan ako nemamo neku drugu beskonacnu petlju koju
  84.     //program vrti (zasto? pogledati kraj prvog zadatka pripreme-onaj u asembleru)
  85.     //while(1) {};
  86. }
  87.  
  88. void ispis (unsigned char izbor, unsigned char broj) {
  89.     unsigned char xdata *pok;           //adresa pokaznika, pokaznici se nalaze na adresama vanjske
  90.                             //memorije (zbog toga xdata), duljine su 1 byte (zbog toga char)
  91.                             //vanjska memorija zavrsava na 0x7FFF, a na daljnje lokacije mozemo
  92.                             //spajati sta hocemo, npr. u nasem slucaju dva 7-segmentna prikaznika
  93.                             //na adresama 0x8000 i 0x8001
  94.  
  95.     if (izbor == 'l') { pok = 0x8000; }     //'l'ijevi pokaznik je na adresi 0x8000
  96.     else if (izbor == 'd') { pok = 0x8001; }    //'d'esni pokaznik je na adresi 0x8001
  97.  
  98.     switch (broj) {                 //i sad na tu adresu posaljemo odgovarajuci podatak
  99.         case '0': *pok = 0x77; break;       //koji predstavlja (prikazuje na prikazniku) odredeni broj
  100.         case '1': *pok = 0x14; break;
  101.         case '2': *pok = 0xB3; break;
  102.         case '3': *pok = 0xB6; break;
  103.         case '4': *pok = 0xD4; break;
  104.         case '5': *pok = 0xE6; break;
  105.         case '6': *pok = 0xE7; break;
  106.         case '7': *pok = 0x34; break;
  107.         case '8': *pok = 0xF7; break;
  108.         case '9': *pok = 0xF6;
  109.     }
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement