Version:0.9 StartHTML:0000000105 EndHTML:0000017377 StartFragment:0000001499 EndFragment:0000017361
sbit LCD_RS at RB5_bit;
sbit LCD_EN at RB4_bit;
sbit LCD_D4 at RB3_bit;
sbit LCD_D5 at RB2_bit;
sbit LCD_D6 at RB1_bit;
sbit LCD_D7 at RB0_bit;
sbit LCD_RS_Direction at TRISB5_bit;
sbit LCD_EN_Direction at TRISB4_bit;
sbit LCD_D4_Direction at TRISB3_bit;
sbit LCD_D5_Direction at TRISB2_bit;
sbit LCD_D6_Direction at TRISB1_bit;
sbit LCD_D7_Direction at TRISB0_bit;
unsigned int Temp; //Variabile temperatura
unsigned short DuCy, Vel; //Variabile duty cycle
char txt0[7];
char txt1[7];
void main() { //Programma principale
TRISC = 0; //PORTC uscite
PWM1_Init(6250); //Frequenza PWM 6.25KHz
PWM1_Set_Duty(0); //PWM spento
PWM1_Start(); //PWM acceso
ADC_Init(); //ADC inizializzato
Lcd_Init(); // Initialize LCD
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Cmd(_LCD_CURSOR_OFF);
while(1){ //Ciclo infinito
Temp = ADC_Read(1); //Leggi valore ADC
Temp = Temp * 0.48828; //Converti in gradi centigradi
if(Temp < 30){ //Se la Temp è minore di trenta...
DuCy = 0;
PWM1_Set_Duty(DuCy); //Ventola spenta
}
else if(Temp > 80){ //Se la Temp è maggiore di ottanta...
DuCy = 255;
PWM1_Set_Duty(DuCy); //Ventola accesa al massimo
}
else{ //Se Temp è nel range 30-80 gradi allora...
DuCy = Temp * 3.18; //Moltiplica Temp per 255/TempMax (255/80=3.18)
PWM1_Set_Duty(DuCy); //Imposta il duty cycle calcolato
}
Delay_ms(400); //Aspetta 0.5S prima di ricontrollare la Temp
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_FIRST_ROW);
Lcd_Out_Cp(" Temp ");
IntToStrWithZeros(Temp, txt0);
Lcd_Out_Cp(txt0);
Lcd_Out_Cp("^C ");
Lcd_Cmd(_LCD_SECOND_ROW);
Lcd_Out_Cp(" Vel ");
DuCy = DuCy/2.55;
IntToStrWithZeros(DuCy, txt1);
Lcd_Out_Cp(txt1);
Lcd_Out_Cp("%");
}
}