#include <xc.h>
#define _XTAL_FREQ 20000000
// CONFIG
#pragma config FOSC = HS
#pragma config WDTE = OFF
#pragma config PWRTE = OFF
#pragma config BOREN = ON
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config WRT = OFF
#pragma config CP = OFF
// LCD pins
#define RS RD0
#define EN RD1
#define D4 RD4
#define D5 RD5
#define D6 RD6
#define D7 RD7
#define BUZZER RC2
#define BUTTON RB0
// ---------- LCD FUNCTIONS ----------
void lcd_cmd(unsigned char cmd) {
RS = 0;
D4 = (cmd >> 4) & 1; D5 = (cmd >> 5) & 1;
D6 = (cmd >> 6) & 1; D7 = (cmd >> 7) & 1;
EN = 1; __delay_us(5); EN = 0;
D4 = cmd & 1; D5 = (cmd >> 1) & 1;
D6 = (cmd >> 2) & 1; D7 = (cmd >> 3) & 1;
EN = 1; __delay_us(5); EN = 0;
__delay_ms(2);
}
void lcd_char(unsigned char data) {
RS = 1;
D4 = (data >> 4) & 1; D5 = (data >> 5) & 1;
D6 = (data >> 6) & 1; D7 = (data >> 7) & 1;
EN = 1; __delay_us(5); EN = 0;
D4 = data & 1; D5 = (data >> 1) & 1;
D6 = (data >> 2) & 1; D7 = (data >> 3) & 1;
EN = 1; __delay_us(5); EN = 0;
__delay_ms(2);
}
void lcd_string(const char *s) {
while (*s) lcd_char(*s++);
}
void lcd_init(void) {
__delay_ms(20);
lcd_cmd(0x02);
lcd_cmd(0x28);
lcd_cmd(0x0C);
lcd_cmd(0x06);
lcd_cmd(0x01);
}
// ---------- ADC ----------
unsigned int adc_read(void) {
GO_nDONE = 1;
while (GO_nDONE);
return ((ADRESH << 8) + ADRESL);
}
// ---------- MAIN ----------
void main(void) {
unsigned int x[20], y[20];
unsigned long sumx=0, sumy=0, sumxy=0, sumx2=0;
float a, b, y_est, err, min_err = 99999;
unsigned int best = 0;
unsigned char i;
TRISA = 0x01;
TRISB0 = 1;
TRISC2 = 0;
TRISD = 0x00;
ADCON1 = 0x80;
ADCON0 = 0x01;
BUZZER = 0;
lcd_init();
lcd_string("READY");
while (1) {
if (BUTTON == 1) {
__delay_ms(200);
sumx = sumy = sumxy = sumx2 = 0;
min_err = 99999;
for (i=0; i<20; i++) {
x[i] = i;
y[i] = adc_read();
sumx += x[i];
sumy += y[i];
sumxy += x[i]*y[i];
sumx2 += x[i]*x[i];
__delay_ms(50);
}
a = (20.0*sumxy - sumx*sumy) / (20.0*sumx2 - sumx*sumx);
b = (sumy - a*sumx) / 20.0;
for (i=0; i<20; i++) {
y_est = a*x[i] + b;
err = (y[i] > y_est) ? (y[i]-y_est) : (y_est-y[i]);
if (err < min_err) {
min_err = err;
best = y[i];
}
}
lcd_cmd(0x01);
lcd_string("Temp = ");
lcd_char((best/10)+'0');
lcd_char((best%10)+'0');
BUZZER = 1;
__delay_ms(300);
BUZZER = 0;
}
}
}
1 / 5 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans l'interface ou les textes ? Ou savez-vous comment améliorer l'interface utilisateur de StudyLib ? N'hésitez pas à envoyer vos suggestions. C'est très important pour nous!