xman
Üye
- Katılım
- 9 Eki 2008
- Mesajlar
- 32
- Puanları
- 1
- Yaş
- 40
Kod:
// 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 <16f84.h>
#use delay(clock=4000000)
#fuses XT,NOWDT
unsigned char kontrol=0;
unsigned int ECN;
//---------------------------------------------------------
// Timer alt programi
// 15 saniye suresince tusa basilmadiysa hatti kapatmak icin
//----------------------------------------------------------
void interrupt_kesme(void)
{
set_timer0(231);
ECN++;
if(ECN>15)kontrol=1;
}
//----------------------------------------------------------
// ANA PROGRAM
//----------------------------------------------------------
unsigned char i,komut,sifre[5],sayac;
void main()
{
//----------------------------------------------------------
// Port konfigurasyonu
//----------------------------------------------------------
SET_TRIS_B(0x1F); // PORTB'nin RB5,6,7 pinleri cikis,digerleri giris
SET_TRIS_A(0x01); // RA0 giris digerleri cikis
//----------------------------------------------------------
output_b(0x00); // cihazlar enerjisiz
output_a(0x00); // hat kapali, LED sonuk
//-------------------------------------------------------------
//Timer islemleri (kesme suresi=1ms)
//-------------------------------------------------------------
SETUP_TIMER_0(RTCC_INTERNAL|RTCC_DIV_256);
// resetten sonra 1 saniye bekle
for(i=0;i<4;i++)DELAY_MS(250);
basla:
sayac=0; ECN=0;
for(;;)
{ // zil sayisi belirleme dongusu
while(input(pin_A0==1));
sayac++;
if(sayac>150)
{ // Zil sayisi 6
output_high(pin_a1); // Hatti ac
sifreoku:
for(i=0;i<5;i++)
{ // sifreyi al
//--------------------------------------
kontrol=0;
SET_TIMER0(231);
ENABLE_INTERRUPTS(INT_TIMER0);
ENABLE_INTERRUPTS(INT_RTCC);
ENABLE_INTERRUPTS(GLOBAL);
//--------------------------------------
while(input(pin_b4==0));
{ // tusa basilmadi ise bekle
if(kontrol==1)
{ // sure>15s ise hatti kapat
output_low(pin_a1);
goto basla; // basa don
}
else {};
}
sifre[i]=output_b(0x0F); // sifreyi oku
while(input(pin_b4==1));//(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.
output_high(pin_a2); // sifre dogru ise LED'i yak
for(;;)
{
while(input(pin_b4==0));//(StD==0); // cihazlar icin komut beklerb4
komut=output_b(0x0F);
if(komut==1)
output_high(pin_b5); // cihaz 1 ON
if(komut==2)
output_high(pin_b6);
if(komut==3)
output_high(pin_b7);
if(komut==4)// cihaz 1 OFF
output_low(pin_b5);
if(komut==5)
output_low(pin_b6);
if(komut==6)
output_low(pin_b7);
if(komut==12)
{ // # tusuna basildi ise hatti kapat
output_low(pin_a1); //hat
output_low(pin_a2);//led
goto basla;
// Cihazlarin ON/OFF durumlari degismeden kalir.
}
}
}
else
{
goto sifreoku; //sifre yanlis ise tekrar sifre okumaya git
}
}
else{ // sayac<150 ise
while(input(pin_A0==0));
}
} // for dongusu
}