Proje Adı : PIC16F628 mikro denetleyicisi ile kişinin tepki süresini ölçen LCD göstergeli elektronik devre
Devrenin Amacı;
Projede Kişinin Görsel uyarılara karşı verdiği tepki süresinin hesaplanması amaçlandırılmıştır.Devrede bulunan 2 adet Başlat ve Durdur butonları ile kişinin görsel uyarıya verdiği tepki süresi LCD ekran üzerinde ms biriminde okunmaktadır.
Devrede Kullanınlan Malzemeleri Listesi
- Pic16F628 Mikro Denetleyici
- 18 ‘ Li Entegre Soketi
- 16 ‘Lı Pin Dizisi
- 2×16 Lcd Gösterge
- 4mhz Kristal
- 22 Pf Kutupsuz Kondansatör(0.25w)(2 adet)
- 4.7 K Direnç(0.25w) (2 adet)
- 1 K Direnç(2 adet)
- 150 Ohm Direnç(2 adet)
- 330 Ohm
- Buton(Bas-Çek) (2 adet)
- Kırmızı-Yeşil Led
- Tek Yüzlü Bakır Plaket (10cmx15cm)
5v ‘ Luk Regülatör Devresi
- Lm7805 Gerilim Regülatörü
- 1n4001 Diyot
- 330nf Kutupsuz Kondansatör
- 10uF/16V Elektrolitik Kondansatör
- Aç /Kapa Anahtar
- 9 V Alkalin Pil Ve pil başlığı
Devre Şeması
5V’Luk Regülatör Devresi Şeması
Devrenin PROTEUS programında çizilmiş hali ve Devrenin Çalışma Akışı
STEP-1 Programı Başlat tuşuna basınca devre çalışır konuma geçiyor ve LCD Ekranda ‘Refleks Ölçer Başlat’a Basın’ Komutu geliyor.
STEP-2
Başlat Butona basınca Devremizde PIC16F628 Devreye giriyor ve Kırmızı Led ışık Yanıyor. Kırmızı Led ışığın ne kadar süre yanacağı bilinmiyor
.
STEP-3
Kırmızı Led sönüp Yeşil Led yanmaya başladığında PIC16F28 zamanlayıcı çalışıyor her 1ms’de bir kesme üretiyor.Durdur Butonuna basıncaya kadar geçen süredeki her kesme oluştuğunda Cx adlı sayıcı değeri artıyor durdur butonuna basıncaya kadar.
STEP-4
Durdur butonuna basıldığında zamanlacı duruyor Ölçülen Cx Tepki süresi LCD Ekrana Yazdırılıyor.
PIC16F628 Mikrodenetleyicisinin C++ Programındaki Yazılımın Yüklenmesi
PIC16F628 için Kullandığımız Kodlar Aşağıda Belirtilmiştir
#include <pic.h>
#include <delay.c>
#include <lcd.c>
#include <stdio.h>
#include <stdlib.h>
// Butonlar ve LED’ler için pin tanımlamaları
#define BASLAT RB4
#define DURDUR RB5
#define KIRMIZI RB6
#define YESIL RB7
// Konfigürasyon ayarları
__CONFIG(WDTDIS&LVPDIS&PWRTEN&XT);
// Global değişkenler
unsigned int CX;
unsigned char kontrol;
// TIMER Kesme Alt Programı
void interrupt kesme(void){
CX++;
if(CX>2000)kontrol=1; // Zaman aşımı için
T0IF=0; // Bayrağı temizle
TMR0=131; // TIMER’ı tekrar yükle
}
//———— ANA PROGRAM —————–
main(void)
{
unsigned char sonuc[]=”GECiKME= “;
unsigned int i,deger;
unsigned char sayi,hata;
// Port ayarları
TRISA=0x00; // Bütün pinler çıkış
TRISB=0x30; // RB4,RB5 giriş, diğerleri çıkış
PORTA=0; PORTB=0;
CMCON=0x07;
// TIMER işlemleri
T0CS=0; // Dahili clock
PSA=0; // Prescaler TMR0 için ayarlı
PS0=0; PS1=1; PS2=0; // Oran 1:8
ei(); // Bütün kesmeler etkin
T0IE=0; //Başlangıçta TIMER pasif
T0IF=0; // Bayrağı temizle
DelayMs(250); // 250 ms bekle
lcd_init(); // LCD hazırlık aşaması
lcd_clear(); // LCD’yi temizle
lcd_write(0x0C); // imleci gizle
lcd_goto(0x00); lcd_puts(” REFLEKS OLCER “);
lcd_goto(0x40); lcd_puts(” BASLAT’A BASIN “);
for(;;){ // Ana işlem döngüsü
kontrol=0; CX=0; hata=0;
while(BASLAT==0); // Butona basılana kadar bekle
lcd_clear(); // Butona basılınca LCD’yi temizle
KIRMIZI=1; YESIL=0; // Kırmızı LED’i yak
lcd_goto(0x00); lcd_puts(” YESiL YANINCA “);
lcd_goto(0x40); lcd_puts(” DURDUR’A BASIN “);
sayi=rand(); // rand() ile rastgele sayı üret
deger=3*sayi;
if(deger<=75)deger=deger+75; //en düşük 75 yap
// Rastgele bir süre bekle. Süre=degerx(10 ms)
for(i=0;i<deger;i++){
DelayMs(10);
if(DURDUR==1){hata=1; break;}
}
if(hata==1){ // Kırmızı ışıkta durdur’a basılırsa
lcd_goto(0x00); lcd_puts(“BUTONA COK ERKEN”);
lcd_goto(0x40); lcd_puts(” BASTIN !!! “);
KIRMIZI=0;
}
else{
YESIL=1; KIRMIZI=0; // Yeşil LED’i yak
TMR0=131;//125 sayım için değer yükle (256-131=125)
T0IE=1; // TIMER’ı başlat
while(DURDUR==0); //Durdur’a basılmadıysa bekle
T0IE=0; // TIMER’ı durdur
lcd_clear();
lcd_goto(0x00);
if(kontrol==0){//CX değerine göre uygun mesajı yaz
if(CX<=100)lcd_puts(” TEBRiKLER ! “);
if(CX>100&CX<=200)lcd_puts(” MUKEMMEL “);
if(CX>200&CX<=300)lcd_puts(” DAHA HIZLI OL “);
if(CX>300&CX<=600)lcd_puts(“BiRAZ PRATiK YAP”);
if(CX>600&CX<=1000)lcd_puts(” COK YAVASSIN “);
if(CX>1000&CX<2000)lcd_puts(“UYUYORSUN GALiBA”);
// Tepki süresini milisaniye cinsinden yaz
sprintf(sonuc+8,”%d ms”,CX);
lcd_goto(0x40); lcd_puts(sonuc);
}
// Zaman aşımı durumunu dikkate al
else lcd_puts(” YENiDEN DENE “);
}
} // İşlemleri tekrarla
}// Programın sonu
Devremizin Proteus Programındaki Baskı Devre Çizimi
Devremizin Baskı Devre Şeması Ve Üstten Görünüş Şeması
Devrenin 3D Şeması Devrenin Yapım Aşaması
Baskı Devrenin Ütü İle Plakete Aktarılması
Bakır Plaketin Eritilmesi
Devre Elemanlarının Lehimlenmesi ve Devre Montajı
Devrenin Çalışma Prensibi
Proje Ekibi ;
Burak SAPMAZ
Fatih Sultan Mehmet ÇULHACI
Alper ÇELİK
Sercan ÖZLÜ