Indholdsfortegnelse til Bilag 1.: Side 1: Include filer. Side 1: Erklæring af variabler. Side 2: Void indstil (Indstiller starttidspunkt og måleinterval). Side 3: Void indstil (Indstiller starttidspunkt og måleinterval). Side 4: Void indstil (Indstiller starttidspunkt og måleinterval). Side 5: Void indstil (Indstiller starttidspunkt og måleinterval). Side 5: void init (Initialiserer programmet). Side 6: indstil (indstiller ur og måleinterval). Side 6: void timer (Timer tæller sec og sekund 1 op hvert sekundt). Side 6: int input (Konvertere analoge input) Side 7: int input (Konvertere analoge input) Side 8: int output (Udskriver gemte data på Pcen). Side 9: void display (Viser forskellige ting på P5) Side 10: void display (Viser forskellige ting på P5) Side 11: void display (Viser forskellige ting på P5) Side 12: void display (Viser forskellige ting på P5) Side 12: int reset Side 13: void main
//Programnavn: Dataopsamling //Programmør: Ole Rud, Klaus Jørgensen & Jacob Clausen //Dato: 02. Dec. 2002 til 20. Dec. 2002 //Version: 1.0 //Program til opsamling af data fra temperaturmåler //Gemmer opsamlede data sammen med tidregistrering //Viser data på pc'en ved forespørgsel #pragma debug #include <reg515.h> //Definerer Flag osv i microprocessoren #include <stdio.h> //Til printf #include <stdlib.h> //Til random funktionen struct temperaturmaalingsstruct //Repræsenterer en dataopsamling med: unsigned int tid; //Tidsregistrering int pt1000; //Temperaturen fra PT1000'eren i grader C int lm35; //Temperaturen fra LM35'eren i grader C ; xdata struct temperaturmaalingsstruct maalinger[1000] _at_ 0x0000; //Et array af temperaturmålingstructen med 1000 pladser unsigned int sec, frac; //Variabler, brugt af timeren unsigned int starttime,startminut=0; //Start tidspunktet unsigned int mint = 1; //Måle interval unsigned int sekund = 0; //Antallet af sekunder siden start char warning = 0; //Warning er en variabel der er 1 når ram er fuld char w2=0, w3=0; //Hjælpevariabler til infernoet af vildskab 1
void indstil() //Funktion: Indstiller starttidspunkt og måleinterval //Modtager: Tstetryk fra brugeren //Sender: Sætter starttime, startminut og mint int temp = 0,finnish = 0; //variabler til hjælp med indstilling af systemet int i; //tællevariabel til pauserne :) printf("\f***************************************************************************\n"); printf("* Welcome to program **TempCheck** ver. 1b *\n"); printf("* *\n"); printf("* ^^ ^^ *\n"); printf("* (o)(o) *\n"); printf("* *\n"); printf("****************----mmm-------------()-------------mmm-----******************\n\n\n"); printf("take a moment to setup the program.\n"); printf("sit back and follow the instructions on the screen\n\n\n"); printf("to setup the time, press the left button to select hours and minuttes. \n"); printf("and press the right button to accept\n"); printf("\nhour: %02.d",temp); while(!finnish) //Så længe vi ikke er færdige... for(i=0;i<32000;i++); //Pause for at undgå at systemet tæller mere end en op ved hvert tryk if((p1&2)==0) //Hvis knap Right er trykket ned (=færdig med indstilling af timer) starttime = temp; //StartTime sættes lig med det sidst på skærmen viste timetal finnish = 1; //finnish = 1 (=færdig med indstilling af timer) 2
else if ((P1&1)==0) //Hvis knap Left er nede (=timer skal tælles en op) if (temp < 23) //Hvis timer er under 24: temp++; //skal timer tælles en op printf("\b\b%02.d",temp); //og det nye timetal vises på skærmen else //hvis timer er over 24 temp = 0; //starter timer fra 0 igen printf("\b\b%02.d",temp); //og nul udskrives //----------------------Nu til indstilling af minutter temp = 0; //minutter skal starte ved 0 finnish = 0; //vi er ikke færdige med minutter endnu printf("\n\nminuttes: %02.d",temp); while(!finnish) //så længe vi ikke er færdige for(i=0;i<16000;i++); //pause if((p1&2)==0) //Hvis knap Right er trykket ned (=færdig med indstilling af minutter) startminut = temp; //StartMinut sættes lig med det sidst på skærmen viste timetal finnish = 1; //finnish = 1 (=færdig med indstilling af minutter) else if ((P1&1)==0) //hvis knap Left er trykket ned: if (temp < 59) //Hvis minutter er under 59: temp++; //skal minutter tælles en op printf("\b\b%02.d",temp); //og det nye minuttal vises 3
else //Hvis minutter er 60: temp = 0; //starter minut ved 0 igen printf("\b\b%02.d",temp); //og nul udskrives printf("\n\n\nstartime is %02.d : %02.d\n",startTime,startMinut); //--------------------------------Nu til indstilling af måle interval printf("\nsetup measuring interval\n"); temp = mint; //måleinterval skal starte ved 1 finnish = 0; //vi er ikke færdige printf("\nseconds: %02.d",temp); while(!finnish) //så længe vi ikke er færdige for(i=0;i<24000;i++); //pause if((p1&2)==0) //Hvis knap Right er trykket ned (=færdig med indstilling af måle interval) mint = temp; //mint sættes lig med det sidst på skærmen viste interval finnish = 1; //finnish = 1 (=færdig med indstilling af interval) else if ((P1&1)==0) //Hvis knap Left er trykket ned: if (temp < 60) //Hvis intervallet er under 60 sekunder if (temp < 5) //hvis intervallet er under 5 sekunder temp++; //skal intervallet tælles en op printf("\b\b%02.d",temp); //og det nye interval vises på skærmen 4
else //hvis intervallet er 5: temp = temp + 5; //skal intervballet tælles 5 op printf("\b\b%02.d",temp); //og det nye interval vises else //hvis intervallet er 60 temp = mint; //startes forfra ved 1 igen printf("\b\b%02.d",temp); //og et skrives ud printf("\n\nthank you! Measureing will happen every %d second(s) now",mint); void init() //Funktion: Initialiserer programmet; //Modtager: Intet (bliver kaldt af main) //Sender: Sætter flag og variabler og Kalder Indstil printf("press the right button when ready..."); while((p1&2)!=0); //Venter på brugeren melder sig klar ved tryk på knap R (f.eks. kan det anbefales at //sklifte til hyperterminal) P5 = 0; //Displayet slukkes for at vise at programmet er igang TI = 1; //Seriel interrupt transfer interrupt enables ADM = 0; //Fortløbende konvertering slås fra (ADC'en konverterer kun ved forespørgsel) MX2 = 0; //Analog indgang vælges MX1 = 0; // - - MX0 = 0; // - - 5
indstil(); //Funktionen der indstiller ur og måleinterval EAL = 1; //Enabler generel interrupt(nødvendigt for timeren) TR0 = 1; //Enabler timer0 ET0 = 1; //Enabler timer0 interrupt TMOD = 2; //vælger 8-bit auto reload timer TH0 = 6; //Sætter timer start til 6 bit ==> timeren kalder interrupt hvert 250us frac = 0; //Variabel brugt af timeren sec = 0; // - - void timer() interrupt 1 //Funktion: Timer tæller sec og sekund 1 op hvert sekundt //Modtager: Intet (bliver kaldt af hardwaren via interrupt) //Sender: Sætter sekundvariablerne if (frac++ == 4000) //frac tælles en op og ved 4000 (4000 * 250us = 1 sekund): sec++; //tælles sekundvariablerne 1 op sekund++; frac=0; //og starter forfra int input(int i) //Funktion: Konvertere analoge input (temperaturerne) og gemmer dem // i ram sammen med tidsstempel en gang pr måle interval //Modtager: Variabel der peger på den næste ledige plad i ram //Sender: Variabel der peger på den næste ledige plad i ram int t; 6
if (i<10) //hvis der er flere ledige pladser i ram if(sec>=mint) //hvis det er mint sekunder siden sidste indlæsning MX0=1; MX2=0; //vælger analog indgang 1 (PT1000) DAPR=0; //starter konvertering while(bsy); //venter på konvertering er slut t=addat; maalinger[i].pt1000=((t*10)/51)-10; //omregner konverteringsresultat til grader celcius og gemmer i ram MX0=0; MX2=1; //vælger analog indgang 4 (LM35) DAPR=0; //starter konvertering while(bsy); //venter på konvertering er slut t= ADDAT; maalinger[i].lm35=((t*6)/51)+5; //omregner konverteringsresultat til grader celcius og gemmer i ram maalinger[i].tid=sekund; //gemmer tidsstempel sec = 0; //nulstiller sekundtælleren så der går mint sekunder inden næste indlæsning i++; //sætter i til at pege på den næste ledige plads i ram else if (!warning) //hvis der ikke er flere ledige pladser i ram OG warning ikke er sat printf("\n\n%s\n\n","memory is full!! Measuring has been stopped \a\a\a\a\n"); printf("\nplease press the left button to download data and start measuring again\a\n\a"); warning = 1; //sætter warning til 1, så advarslen kun printes en gang return i; int output(int ramstatus) //Funktion: Udskriver gemte data på PCen (helst i hyperterminal :o) //Modtager: Variabel der peger på den næste ledige plad i ram //Sender: Variabel der peger på den næste ledige plad i ram ("0") 7
int i,time,minut,sekund; printf("\nall data is now being printed on the screen"); printf("\nnotice that measuring is stopped while printing"); printf("\n Tid \t\tpt1000 \t\tlm35\n"); //kolonne overskrifter udskrives for(i=0;i<ramstatus;i++) //løkke der kører en gang for hvert entry i ram time = maalinger[i].tid / 3600; //time sættes til antallet af timer i tidsstemplet time = time + starttime; //time lægges til starttime maalinger[i].tid = maalinger[i].tid % 3600; //tidsstempel sættes til rest efter timerne er trukket fra minut = maalinger[i].tid / 60; //minut sættes til antallet af minutter i tidstemplet minut = minut + startminut; //minut lægges til startminut if (minut >= 60) //hvis minut bliver over 60: minut = minut - 60; //trækkes 60 fra minut time++; //og time tælles en op if (time >= 24) //Hvis time bliver over 24 time = time - 24; //trækkes 24 fra time maalinger[i].tid = maalinger[i].tid % 60; //tidsstempel sættes til rest efter minutterne er trukket fra sekund = maalinger[i].tid; //sekund sættes til resten af tidsstemplet printf("%02.d:%02.d:%02.d \t %d \t\t %d \n",time,minut,sekund, maalinger[i].pt1000, maalinger[i].lm35); //en måling skrives ud på en linie warning = 0; //warnnig sættes til 0 ligemeget forhenværende status sec = 0; //Efter udskrivning skal måleintervallet beregnes fra ny return 0; //Variabel der peger på den næste ledige plad i ram = 0 ==> vi starter forfra med at skrive i ram 8
void display(int i) //Funktion: Viser forskellige ting på P5 // P4 vælger hvad der skal vises // Medmindre der er warning, så skal P5 blinke i et inferno af vildskab //Modtager: Variabel der peger på den næste ledige plad i ram //Sender: Forskellige lysdesigns på P5 int j; if (!warning) if (P4==0) //alle off ==> P5=ramstatus P5=(i/3.92156); //Ved fuld ram (1000) vises 255 (lys i alle 8 dioder) if (P4==1) //1on ==> P5 = PT1000temp binært if (maalinger[i-1].pt1000 >= 0) //Hvis temperaturen er over 0: P5=maalinger[i-1].pt1000; //vises den på P% else P5=0-maalinger[i-1].pt1000+128; //ellers vises den med lys i den 8. diode for at indikere negativ temperatur if (P4==3) //2on ==> P5 = LM35temp binært P5=maalinger[i-1].lm35; //Temperaturen vises på P5 if (P4==7) //3on ==> P5 = forskel mellem LM35 og PT1000 if (maalinger[i-1].lm35 > maalinger[i-1].pt1000) //Hvis LM35 er størst: P5 = maalinger[i-1].lm35 - maalinger[i-1].pt1000; //vises forskellen else P5 = maalinger[i-1].lm35 - maalinger[i-1].pt1000 + 128; //ellers vises forskellen med lys i den 8. diode for at indikere at der er koldere indendørs end udendørs!!! 9
if (P4==255) //8 on ==> P5 = NightRider int n; P5=1; //P5 starter med at være 1 (=lys i 1. diode) for (n=0;n<8;n++) //7 gange: for(j=0;j<8000;j++);//pause P5=P5*2; //P5 fordobles ==> lyset flytter en tak til højre P5=128; //P5 er nu 128 (=lys i 8. diode) for (n=0;n<8;n++) //7 gange: for(j=0;j<8000;j++);//pause P5=P5/2; //P5 halveres ==> lyset flytter en tak til venstre if (P4==127) //7 on ==> P5 = NightRider2 int n,p; p=1; //p starter med at være 1 P5=~p; //P5 = den inverterede værdi af p ==> lys i alle dioder undtagen den 1. for (n=0;n<8;n++) //7 gange: for(j=0;j<8000;j++);//pause p=p*2; //p fordobles P5=~p; //P5 = den inverterede værdi af p ==> det slukkede lys flytter en tak til højre p=128; //p er nu 128 P5=~p; //P5 = den inverterede værdi af p ==> kun den 8. diode er slukket for (n=0;n<8;n++) //7 gange: 10
for(j=0;j<8000;j++);//pause p=p/2; //p halveres P5=~p; //P5 = den inverterede værdi af p ==> det slukkede lys flytter en tak til venstre else //altså hvis warning er 1(=ram er fuld) vises det med følgende lys-inferno: // //w2 tæller 10 gange og w3 er et tilfældigt tal mellem 0 og 4 if (w2 < 10 && w3==0) //så længe w2 er under 10 og P5=15; //P5=15 ==> de fire dioder til venstre lyser P5=240; //P5=250 ==> de fire dioder til højre lyser w2++; //w2 tælles en op else if (w2 < 10 && w3==1) //så lønge w2 er under 10 og w3 er 1: P5=170; //P5=170 ==> første diode lyser, derefter skiftes on/off P5=85; //P5=85 ==> første diode slukket, derefter skiftes on/off w2++; //w2 tælles en op else if (w2 < 10 && w3==2) //så længe w2 er under 10 og w3 er 2: P5=0; //P5=0 ==> alle dioder slukket P5=255; //P5=255 ==> alle dioder lyser w2++; //w2 tælles en op 11
else if (w2 < 10 && w3==3) //så længe w2 er under 10 og w3 er 3: P5=195; //P5=195 ==> de fire yderste dioder lyser P5=60; //P5=60 ==> de fire inderste dioder lyser w2++; //w2 tælles en op else if (w2 < 10 && w3==4) //så længe w2 er under 10 og w3 er 4: P5=204; //P5=204 ==> to dioder lyser, næste to er slukket osv P5=51; //P5=51 ==> to dioder slukket, næste to lyser osv w2++; //w2 tælles en op else //hvis w2 er 10 (=der er blevet blinket 10 gange) w3 = rand() % 5; //w3 sættes til et nyt tilfældigt tal w2 = 0; //w2 starter ved 0 igen int reset() //Funktion: Nulstiller apparatet ved at kalde init og sætte ramstatus tælleren til 0 //Modtager: Intet (bliver kaldt af main) //Sender: Sætter variablen der peger på næste ledige ram-plads til 0 init(); //Kalder initialiseringsfunktionen return 0; //Sætter variablen der peger på næste ledige ram-plads til 0 12
void main() //Funktion: Starter programmet og holder det igang :) //Modtager: Intet (startes automatisk) //Sender: Sender variablen der peger på næste ledige ram-plads til flere funktioner int ramstatus = 0; //ramstatus = 0 ==> vi starter fra bunden i rammen init(); //Initialiserer programmet while(1) //uløkke :) display(ramstatus); //Viser ting på P5 ramstatus = input(ramstatus); //Gemmer ting i ram if((p1&4)==0) //Hvis knap Reset er trykket ned ramstatus = reset(); //genstartes systemet if((p1&1)==0) //Hvis knap Left er trykket ned ramstatus = output(ramstatus); //udskrives ting fra ram 13