Precision Tempereringsaggregatet (6 / 7 steg)
Steg 6: Programmet
Filerna här är en version av C-programmet tillsammans med komplett Cypress Designer filen i zip-format text.Dess inte fruktansvärt länge...
//----------------------------------------------------------------------------
C-program för PSOC temperatur styrenhet
//----------------------------------------------------------------------------
#include < m8c.h > / / del särskilda konstanter och makron
#include "PSoCAPI.h" / / PSoC API definitioner för alla användare moduler
#include "stdlib.h"
int MAXC = 0;
int TEMPC = 500.
char degC [] = "500".
char degF [] = "932";
int TEMPF = 932;
void main)
{
int w, z;
int KeyRead, KeyBuffer;
int x, buffert;
flyta temperatur = 0;
flyta temperature2 = 0;
int count = 0;
int stop = 1;
int CycleBuffer;
int bas = 1;
int InputADC;
int InputADC2;
char lcd_Reading [8].
char lcd_Setting [8].
PGA_1_SetGain(PGA_1_G1_00);
PGA_1_Start(PGA_1_LOWPOWER);
DAC9_1_Start(DAC9_1_FULLPOWER);
LCD_1_Start(); Initiera LCD
M8C_EnableGInt; Aktivera Global avbryter
AboveTop:
DAC9_1_WriteBlind(0); Ställ in utgång till 0V
ADCINC12_1_Start(ADCINC12_1_LOWPOWER); Gälla SC blocket makt
ADCINC12_1_GetSamples(0); Har ADC köras kontinuerligt
LCD_1_Control(LCD_1_DISP_CLEAR_HOME);
LCD_1_Position(0,0);
LCD_1_PrCString ("MAX Limit");
LCD_1_Position(0,10);
om (bas == 0)
{
MAXC = TEMPF;
LCD_1_PrString(degF);
LCD_1_Position(0,14);
LCD_1_PrCString("F");
} annat
{
MAXC = TEMPC;
LCD_1_PrString(degC);
LCD_1_Position(0,14);
LCD_1_PrCString("C");
}
for(;;) {
Överst:
KeyRead = PRT1DR; läsa för knapptryckning
While(ADCINC12_1_fIsDataAvailable() == 0); Loop tills värdet redo
ADCINC12_1_ClearFlag(); Tydlig ADC flagga
x=ADCINC12_1_iGetData(); ADC resultat
om (InputADC > = temperatur) / / ställa upp Pauseringar och ursprungliga skick
{
DAC9_1_WriteBlind(0); output 0V
}
om (stoppa == 0) / / slinga för automatisk omstart i början skick
{
om (CycleBuffer < temperatur)
{
DAC9_1_WriteBlind(510); utgång 5V
}
}
IF (x == buffert) / / kontrollera giltig ADC läsning
{
InputADC =(x*0.5208)-12. / / korrigering för sonden motstånd.
om (bas == 0)
{
InputADC = (9.0/5.0*InputADC) + 32;
}
om (InputADC < = 99) / / ställa in displayen till öka 10: or och 100-tals till vänster
{
lcd_Reading [0] = "";
w = 1;
om (InputADC < = 9)
{
lcd_Reading [1] = "";
w = 2;
}
} annat w = 0;
InputADC2 = abs(InputADC); absolut värde
konvertera int till en bas 10 null avslutade ASCII-sträng
itoa (& lcd_Reading [w], (unsigned int) InputADC2, 10);
om (temperatur < = 99) / / Ställ in ingång att läsa korrekt
{
lcd_Setting [0] = "";
z = 1;
om (temperatur < = 9)
{
lcd_Setting [1] = "";
z = 2.
}
} annat z = 0;
temperature2 = abs(temperature);
konverterar int till en bas 10 null avslutade ASCII-sträng
itoa (& lcd_Setting [z], (unsigned int) temperature2, 10);
CycleBuffer = InputADC + 2. Lägre gränsvärde för omstart
LCD_1_Position(1,0);
LCD_1_PrString(lcd_Reading); kontinuerlig temperatur display
LCD_1_Position(1,5);
LCD_1_PrCString ("SET ->").
LCD_1_Position(1,10);
LCD_1_PrString(lcd_Setting);
Ange viktiga upprepa funktion för upp ned tangenter bara
om (KeyRead! = 0x00) //0x03 när programmerare fäst
{
greve ++;
om (count > 15)
om (KeyRead == 0x80|| KeyRead == 0x40)
goto här;
} annat count = 0;
om (KeyBuffer == KeyRead) / / Ignorera dubblettnyckel
gå till toppen;
Här:
Programmerare kommer att lägga till 0X03 i alla fall när ansluten
växel (KeyRead) {
fall (0x80): / / öka temperaturen
IF(count>15)
{temperatur = temperatur + 10.
Count = 0;
om (temperatur > = MAXC)
{goto HIGHlimit;
}
gå till toppen;
}
KeyBuffer = KeyRead;
om (temperatur > = MAXC)
{goto HIGHlimit;
}
goto TempUp;
bryta;
fall (0x40): / / minska temperatur
IF(count>15)
{temperatur = temperatur-10;
Count = 0;
om (temperatur < = 0)
{goto LOWlimit;
}
gå till toppen;
}
KeyBuffer = KeyRead;
om (temperatur < = 0)
{goto LOWlimit;
}
gå till TempDown;
bryta;
fall (0x20): / / clear
KeyBuffer = KeyRead;
gå till klart;
bryta;
fallet (0X10): //start
KeyBuffer = KeyRead;
gå till Start;
bryta;
fall (0x08): //stop
KeyBuffer = KeyRead;
gå till stopp;
bryta;
fall (0x04): //base förändring
KeyBuffer = KeyRead;
om (bas == 1)
{//Change till F
bas = 0;
gå till bas;
}
om (bas == 0)
{//Change till C
bas = 1;
}
gå till bas;
bryta;
standard:
KeyBuffer = KeyRead;
bryta;
}
}
buffert = x; ADC validering buffert
gå till toppen;
TempUp:
temperaturen ++; öka inställningen
gå till toppen;
TempDown:
temperaturen--; Sänk inställningen
gå till toppen;
Klart:
temperatur = 0;
Count = 0;
LCD_1_Position(1,10);
LCD_1_PrString(lcd_Setting);
gå till AboveTop;
Stanna:
LCD_1_Control(LCD_1_DISP_CLEAR_HOME);
LCD_1_Position(0,0);
LCD_1_PrCString ("slutat på");
LCD_1_PrString(lcd_Reading);
DAC9_1_WriteBlind(0);
stoppa = 1;
om (bas == 0)
{
MAXC = TEMPF;
LCD_1_Position(0,15);
LCD_1_PrCString("F");
} annat
{
MAXC = TEMPC;
LCD_1_Position(0,15);
LCD_1_PrCString("C");
}
gå till toppen;
Start:
LCD_1_Control(LCD_1_DISP_CLEAR_HOME);
LCD_1_Position(0,0);
LCD_1_PrCString ("uppvärmning till");
LCD_1_PrString(lcd_Setting);
om (InputADC < = temperatur)
{
DAC9_1_WriteBlind(510);
} annat
{
DAC9_1_WriteBlind(0);
}
stoppa = 0;
om (bas == 0)
{
MAXC = TEMPF;
LCD_1_Position(0,15);
LCD_1_PrCString("F");
} annat
{
MAXC = TEMPC;
LCD_1_Position(0,15);
LCD_1_PrCString("C");
}
gå till toppen;
LOWlimit:
temperatur = 0;
gå till toppen;
HIGHlimit:
temperatur = MAXC;
gå till toppen;
Bas:
om (bas == 1) //Degrees F till grader C
{
om (temperatur! = 0)
{
temperature2 = temperatur;
temperature=(5.0/9.0*(temperature2-32)); konvertera F c
}
gå till BaseBottom;
} annat
om (temperatur! = 0)
{
temperature2 = temperatur;
temperatur = (9.0/5.0*temperature2) + 32; konvertera C till F
}
BaseBottom:
om (stoppa == 0)
{
gå till toppen;
} annat goto AboveTop;
}
}