// 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 <pic.h>
#include <delay.c>
#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[8]==3 && sifre[2]==4 && sifre[0]==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 }