OBJECTIF :
Realiser un systeme de controle de mot de passe a base de microcontroleur. on utilisera un clavier téléphonique pour recevoir le code et des LED pour indiquer l'état..
DETAILS
L'utilisateur tape sur '*' du clavier et le système écoute alors le mot de passe de 4 chiffres qui est par défaut 1234 (ce mot de passer se conserve dans l'EEPROM);
Si le mot de passe est faut, la LED rouge flash et le systeme revient en veille
Si le mot de passe est correct, le systeme une commance du clavier:
- '*' pour executer l'action relatif a la protection. Par exemple commander une gache. Dans notre cas nous faisons flasher la led vert
- '#' pour changer le mot de passe. Le systeme attend qu'on entre deux fois de suite le nouveau mot de passe (pour verifier). si les deux mots de passe sont identiques, le mot de passe est mis a jour dans l'EEPROM, sinon, le systeme ignore l'etape
SCHEMAS
CODE :
Voici le code pour le microcontroleur PIC16F876. Je compile avec PICC de HI-TECH, inclut dans MPLAB, l'IDE de Microship
#include
#include
#define _XTAL_FREQ 1000000;
__EEPROM_DATA(0x11,0x12,0x14,'!',NULL ,0x05,0x06,0x07);
char mot[5]; //entree clavier
char mot2[5]; // pour la sauvegarde pour une 2nd lecture
char smot[5];
char onechar;
void init();
char get1ch(); // attend et recupere un carater du clavier
void getmot(); // recupere 4 char et les sauve dans mot[4]
void error(int code); // traite les erreurs
void readpw();// recupere le mot de passe dans l'eeprom
void savepw(); // enregistre le mot de passe dans l'eeprom
void action(); // action a realiser
int main(){
init();
readpw(); // on charge le mot de passe enregistre au demarrage
while(1){
onechar=get1ch();
if(onechar==0b10000001){
//on ecoute le mot de passe
getmot();
if(strcmp(smot, mot)==0){
// the pw is good
onechar=get1ch();
if(onechar==0b10000001){
// on deverouille temporairement la protection
PORTC = 1;
_delay(100000);
PORTC = 0;
action();
}else if (onechar=0b00100001){
//changement de mot depasse
PORTC = 5; // reading
_delay(100000);
PORTC = 0; // reading getmot();
strcpy(mot2, mot);
getmot();
if(strcmp(mot, mot2)==0){
//mot de passe id, on peut sauver
savepw();
PORTC = 1; // reading _delay(100000);
PORTC = 0; // reading
}else{
// mots de passe non identiques error(2); // mot de pass diff PORTC = 4; // reading _delay(100000);
PORTC = 0; // reading
}
}else{
//pas d'action valide
}
}else{
//bad pw PORTC= 4; // reading
_delay(100000);
PORTC= 0; // reading
//error(1); // to do: codes d'erreurs
}
}
}
return 0;
}
void init(){
TRISC = 0; // PORTC en entree
TRISB= 0XF0; // PORTC = 0x0F; // reading
_delay(100000);
PORTC = 0; // reading
}
char get1ch(){
PORTC=2; // LED JAUNE char tmp;
char tmp2;
char lum;
while(1){
tmp = 1;
PORTB = tmp;
if (PORTB!=tmp){
tmp = PORTB;
tmp2 = PORTB;
while(tmp == PORTB);
PORTC=0;
return tmp2;
}
tmp = 2;
PORTB = tmp;
if (PORTB!=tmp){
tmp = PORTB;
tmp2 = PORTB;
while(tmp == PORTB);
PORTC=0;
return tmp2;
}
tmp = 4;
PORTB = tmp;
if (PORTB!=tmp){
tmp = PORTB;
tmp2 = PORTB;
while(tmp == PORTB);
PORTC=0;
return tmp2;
}
}
}
void getmot(){
int i;
PORTC=2;
_delay(100000);
PORTC=0;
_delay(100000);
PORTC=2;
_delay(100000);
PORTC=0;
_delay(100000);
for(i=0;i<4;i++){
mot[i]=get1ch();
}
}
void error(int code){
if (code==1){
//erreur d'authentification
}else if (code=2){
//echec de verification mot de pass a sauvegarder
}
PORTC = 4; _delay(100000);
PORTC = 0; _delay(100000);
PORTC = 4; _delay(100000);
PORTC = 0;
}
void readpw(){
// devra lire dans l'eeprom
int i;
for(i=0;i<5;i++){
smot[i] = eeprom_read (i);
}
}
void savepw(){
// devra ecrire dans l'eeprom
int i;
for(i=0;i<5;i++){
eeprom_write (i, mot[i]);
}
strcpy(smot, mot); // actualise le pw dans la RAM}
void action(){
PORTC=1;
_delay(100000);
_delay(100000);
PORTC=0;
}
Commentaires