// Telefonla uzaktan cihaz kontrolu projesine ait PIC16F84A programi // CM8870'in Q1-Q4 cikislari PIC16F84A'nin RB0-RB3 pinlerine baglidir. // StD ucu RB4'e baglidir. Hat acma rolesi RA1'e baglidir. // Sifre onay LED'i RA2'ye baglidir. // Zil calma sayisi icin pals devresi RA1'e baglidir. // Kontrol edilecek cihazlar sirasiyla RB5,RB6,RB7'ye baglidir. #include #include #define StD RB4 #define HAT_ROLE RA1 #define LED RA2 #define PALS RA0 // 4MHz osilator __CONFIG(XT&WDTDIS&PWRTEN); unsigned char kontrol=0; unsigned int CX; //---------------------------------------------------------- // Timer alt programi // 15 saniye suresince tusa basilmadiysa hatti kapatmak icin //---------------------------------------------------------- void interrupt kesme(void){ CX++; if(CX>15000)kontrol=1; T0IF=0; // bayragi temizle TMR0=131; } //---------------------------------------------------------- //---------------------------------------------------------- // ANA PROGRAM //---------------------------------------------------------- main(void){ unsigned char i,komut,sifre[5],sayac; //---------------------------------------------------------- // Port konfigurasyonu //---------------------------------------------------------- TRISB=0x1F; // PORTB'nin RB5,6,7 pinleri cikis,digerleri giris TRISA=0x01; // RA0 giris digerleri cikis //---------------------------------------------------------- PORTB=0; // cihazlar enerjisiz PORTA=0; // hat kapali, LED sonuk //------------------------------------------------------------- //Timer islemleri (kesme suresi=1ms) //------------------------------------------------------------- T0CS=0; // Dahili clock PSA=0; // Prescaler TMR0 icin ayarli PS0=0; PS1=1; PS2=0; // Oran 1:8 ei(); // butun kesmeler etkin T0IE=0; //Baslangicta timer pasif T0IF=0; // bayrak temizle //------------------------------------------------------------- // resetten sonra 1 saniye bekle for(i=0;i<4;i++)DelayMs(250); basla: sayac=0; CX=0; for(;;){ // zil sayisi belirleme dongusu while(PALS==1); sayac++; if(sayac>50){ // Zil sayisi 2 HAT_ROLE=1; // Hatti ac sifreoku: for(i=0;i<5;i++){ // sifreyi al //-------------------------------------- kontrol=0; TMR0=131; // T0IE=1; // TIMER ON //-------------------------------------- while(StD==0){ // tusa basilmadi ise bekle if(kontrol==1){ // sure>15s ise hatti kapat HAT_ROLE=0; goto basla; // basa don } else {}; } T0IE=0; CX=0; // Tusa basildi ise Timer'i durdur, CX'i sifirla // Boylece yeni bir 15s'lik ek sure kazanilmis olur sifre[i]=PORTB&0x0F; // sifreyi oku while(StD==1); // tus basili ise bekle } //-------------------------------------- // sifrenin son hanesi * olmalidir //--------Sifre konrol------------------ if(sifre[0]==1 && sifre[1]==2 && sifre[2]==3 && sifre[3]==4 && sifre[4]==11){ // 11 degeri tus takimindaki * tusuna karsilik gelir. LED=1; // sifre dogru ise LED'i yak for(;;){ while(StD==0); // cihazlar icin komut bekle komut=PORTB&0x0F; if(komut==1)RB5=1; // cihaz 1 ON if(komut==2)RB6=1; if(komut==3)RB7=1; if(komut==4)RB5=0; // cihaz 1 OFF if(komut==5)RB6=0; if(komut==6)RB7=0; if(komut==12){ // # tusuna basildi ise hatti kapat HAT_ROLE=0; LED=0; goto basla; // Cihazlarin ON/OFF durumlari degismeden kalir. } } //-------------------------------------- } else{ goto sifreoku; //sifre yanlis ise tekrar sifre okumaya git } } else{ // sayac<50 ise while(PALS==0); } } // for dongusu }