Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <reg51.h>
- //varijabli grijalica pridruzijemo adresu bita u SFR registrima
- //na koji je spojena zarulja(grijalica)
- sbit grijalica = P1^3;
- //prototipi funkcija
- void ispis (unsigned char, unsigned char);
- void PisiControl(unsigned char);
- void PisiKomandu(unsigned char);
- int CitajTemp(void);
- main() {
- bit bdata kvar=0; //zastavica kojom javljamo kvar memorije
- volatile unsigned char xdata *mem; //pokazivac na vanjsku memoriju
- unsigned char vtest; //u vtest cemo spremiti sto procitamo sa adrese 'mem'
- int temp; //u nju spremamo izmjerenu temperaturu
- TMOD = 0x20; //podesavanje serijskog sucelja
- TH1 = 0xF4; //(dobro objasnjeno u skripti za labos)
- TL1 = 0xF4;
- TR1 = 1;
- SCON = 0x52; //kraj podesavanja serijskog sucelja
- //ispis na serijsko sucelje
- printf("Zadatak 3 uspjesno napravljen.\n\n");
- //provjera ispravnosti memorije
- for (mem = 0x0000; mem <= 0x7FFF; mem++) { //prolazimo kroz sve adrese memorije
- *mem = 0xAA; //na adresu 'mem' spremamo podatak '0xAA'
- vtest = *mem; //sa iste adrese citamo podatak
- if (vtest != 0xAA) { //ako nije procitano ono sto smo prethodno
- kvar=1; //upisali, znaci da je memorija neispravna
- break; //pronalaskom prve greske, dalje vise ne moramo provjeravati
- }
- }
- //ispisivanje na serijsko sucelje odgovarajuce poruke
- if (kvar == 0) {
- printf("Memorija je ispravna.\n\n");
- } else {
- printf("Memorija nije ispravna.\n\n");
- }
- //ispis('l','4'); //testni ispis broja 45 na
- //ispis('d','5'); //7-segmentni pokaznik
- PisiControl(0x02); //inicijalizacija
- PisiKomandu(0xEE); //termometra
- TMOD = 0x21; //0x20=0010 0000 mora ostati zbog serijskog sucelja
- //0x01=0000 0001 podesava Brojilo0 u nacin rada 1
- //tip! mogli smo odma na pocetku kod inicijalizacije
- // serijskog sucelja upisati 0x21 i ustediti pokoji
- // ciklus, ali je ovako lakse skuziti sta koji dio
- // programa radi
- TL0 = 0x00; //postavljanje nizeg bajta brojila na 0
- TH0 = 0x00; //i viseg na nula = brojilo broji od nula do 2^(8+8)
- PT0 = 0; //brojilu0 stavljamo nizi prioritet
- ET0 = 1; //omogucujemo brojilu slanje prekida
- EA = 1; //omogucavamo sve prekide koji su postavljeni (pogledati
- //realizaciju IE registra na slici 14.2,str.50 u skripti za lab)
- TR0 = 1; //na kraju pokrecemo brojilo (broji se broj otkucaja takta procesora podijeljen
- //sa 12 - zasto? tako je sklop brojila konstruiran, pogledati
- //sliku 14.1,str.50 skripte za labos)
- //u beskonacnoj petlji citamo temperaturu i ispisujemo je na serijsko sucelje
- //tijekom vrtnje ovog 'while-a', brojac ce slati zahtjev za prekidom kada
- //ponovno dode u nulu, to se dogodi kada dode do prelijeva, odnosno kada
- //izbroji 2^16+1 taktova-procesora-podijeljenih-sa-12 :)
- //dakle kada brojilo za vrijeme ove 'while' petlje padne u nula, program skace na
- //adresu prekidnog potprograma sat(void), odradi tamo sta je isprogramirano i vrati
- //se nazad gdje je stao u ovom 'while-u'
- while(1) {
- temp = CitajTemp() / 2; //termometar uvijek vraca dvostruku temperaturu pa je
- //dijelimo sa 2 (tako dobijemo razlucivost od 0.5stupnjeva)
- printf("Izmjerena je temperatura od %d stupnjeva.\n\n",temp);
- if(temp < 30) { grijalica = 0; } //regulacija temperature paljenjem i
- if(temp > 32) { grijalica = 1; } //gasenjem grijalice (zaruljice)
- }
- //prazan while(1) je obavezan ako nemamo neku drugu beskonacnu petlju koju
- //program vrti (zasto? pogledati kraj prvog zadatka pripreme-onaj u asembleru)
- //while(1) {};
- }
- void ispis (unsigned char izbor, unsigned char broj) {
- unsigned char xdata *pok; //adresa pokaznika, pokaznici se nalaze na adresama vanjske
- //memorije (zbog toga xdata), duljine su 1 byte (zbog toga char)
- //vanjska memorija zavrsava na 0x7FFF, a na daljnje lokacije mozemo
- //spajati sta hocemo, npr. u nasem slucaju dva 7-segmentna prikaznika
- //na adresama 0x8000 i 0x8001
- if (izbor == 'l') { pok = 0x8000; } //'l'ijevi pokaznik je na adresi 0x8000
- else if (izbor == 'd') { pok = 0x8001; } //'d'esni pokaznik je na adresi 0x8001
- switch (broj) { //i sad na tu adresu posaljemo odgovarajuci podatak
- case '0': *pok = 0x77; break; //koji predstavlja (prikazuje na prikazniku) odredeni broj
- case '1': *pok = 0x14; break;
- case '2': *pok = 0xB3; break;
- case '3': *pok = 0xB6; break;
- case '4': *pok = 0xD4; break;
- case '5': *pok = 0xE6; break;
- case '6': *pok = 0xE7; break;
- case '7': *pok = 0x34; break;
- case '8': *pok = 0xF7; break;
- case '9': *pok = 0xF6;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement