Adı Soyadı - Bilecik Şeyh Edebali Üniversitesi Bilgisayar Mühendisliği

Transkript

Adı Soyadı - Bilecik Şeyh Edebali Üniversitesi Bilgisayar Mühendisliği
Adı Soyadı:
No:
Bilecik Üniversitesi Mühendislik Fakültesi Bilgisayar Mühendisliği Bölümü
Mikroişlemcili Sistemler Ara Sınav II. (05.11.2011)
Aşağıdaki şekilde bir kronometre uygulaması verilmiştir. Sayma işlemi 4 dört sekmeli displayde gösterilmektedir. Sağdan ilk 2
sekme saniyeyi sonraki 2 sekme dakikayı göstermektedir.Saniye sekmesi 1sn de bir artmakta (TIMER2 kullanılacak) ve 59. sn
den sonra sıfırlanmakta dakika sekmesi 1 artmaktadır. Dakika sekmesi 59 a ulaşınca sayma işlemi sıfırlanmaktadır. RB0/INT
pinine bağlı Start/Stop butonuna basınca kronometre sayma işlemi durmakta tekrar basınca saymaya devam etmektedir.
RA4/T0CKI pinine bağlı İleri butonuna sırayla 4 defa basınca (TIMER0 kullanılacak) kronometre ileri sayma moduna geçmekte,
RC0/T1OSO/T1CKI pinine bağlı geri butonuna sırayla 4 defa basınca (TIMER1 kullanılacak) kronometre geri sayma moduna
geçmektedir. Aşağıdaki hususları da dikkate alarak sistemin C kodunu yazınız (100p)
• Kristal frekansı 4 Mhz
• Kronometre sayma işleminde 1sn lik zamanlayıcı olarak TIMER2 kullanılacak
• (RB0/INT) butonu kesmeli çalışacak : Kronometreyi Start /Stop yapacak
• (RA4/T0CKI) TIMER0 sayıcı girişi : Butona 4 defa basınca kronometre ileri sayma moduna geçecek ve D2 LED yanacak
• (RC0/T1CKI) TIMER1 sayıcı girişi : Butona 4 defa basınca kronometre geri sayma moduna geçecek ve D1 LED yanacak
• (RB4) butonu kesmeli çalışacak : Butona her basınca saniye 1 artırma yapacak
• (RB5) butonu kesmeli çalışacak : Butona her basınca saniye 1 azaltma yapacak
• (RB6) butonu kesmeli çalışacak : Butona her basınca dakika 1 artırma yapacak
• (RB7) butonu kesmeli çalışacak : Butona her basınca dakika 1 azaltma yapacak
• Displeyler 74LS48 entegresi ile sürülecek
• Displayler (Common Catode) ortak katot yapıda, seçme girişleri(1234) aktif "0" olacak yani seçmek istediğiniz dipleye "0"
göndereceksiniz.
+5V
C1
R13
R15
R17
R18
10k
10k
10k
10k
R3
10k
R21
R22
10k
10k
X1
22pF
+5V
8
9
10
R1
10k
RESET
RD0/PSP0
RD1/PSP1
RD2/PSP2
RD3/PSP3
RD4/PSP4
RD5/PSP5
RD6/PSP6
RD7/PSP7
15
16
17
18
23
24
25
26
Dakika
19
20
21
22
27
28
29
30
D2
R86
R89
220
220
D1
İleri Sayıcı
İleri Butonu
RA0/AN0
RA1/AN1
RA2/AN2/VREFRA3/AN3/VREF+
RA4/T0CKI
RA5/AN4/SS
RC0/T1OSO/T1CKI
RC1/T1OSI/CCP2
RE0/AN5/RD
RC2/CCP1
RE1/AN6/WR
RC3/SCK/SCL
RE2/AN7/CS
RC4/SDI/SDA
RC5/SDO
RC6/TX/CK
RC7/RX/DT
33
34
35
36
37
38
39
40
Geri Butonu
RB0/INT
RB1
RB2
RB3/PGM
RB4
RB5
RB6/PGC
RB7/PGD
Saniye +
2
3
4
5
6
7
OSC1/CLKIN
OSC2/CLKOUT
MCLR/Vpp/THV
Saniye -
22pF
Dakika +
U1
13
14
1
Dakika -
C2
Start / Stop Butonu
CRYSTAL
FREQ=4MHz
Saniye
Geri Sayıcı
PIC16F877
U2
7
1
2
6
4
5
3
A
B
C
D
BI/RBO
RBI
LT
7x220 Ohm
QA
QB
QC
QD
QE
QF
QG
13
12
11
10
9
15
14
74LS48
+5V
Süre: 65 dk. BAŞARILAR
Yrd.Doç. Dr. Metin KESLER
/******************************************************
Bilecik Üniversitesi Mühendislik Fakültesi Bilgisayar Mühendisliği Bölümü
Mikroişlemcili Sistemler Ara Sınav II. Cevap (05.11.2011)
*******************************************************/
#include <16f877A.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.
//***********Denetleyici konfigürasyon ayarları************
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay(clock=4000000) // Gecikme fonksiyonu için kullanılan osilatör frekansı belirtiliyor
#use fast_io(a) // Port yönlendirme komutları a portu için geçerli
#use fast_io(b) // Port yönlendirme komutları b portu için geçerli
#use fast_io(c) // Port yönlendirme komutları d portu için geçerli
#use fast_io(d) // Port yönlendirme komutları d portu için geçerli
#define
#define
#define
#define
#define
#define
arttirSn pin_b4 // arttir butonu pin_b4 ile eşleniyor
azaltSn pin_b5 // azalt butonu pin_b5 ile eşleniyor
arttirDk pin_b6 // arttir butonu pin_b6 ile eşleniyor
azaltDk pin_b7 // azalt butonu pin_b7 ile eşleniyor
LED_Geri pin_c6
LED_Ileri pin_c7
#define dspBirler
#define dspOnlar
#define dspYuzler
#define dspBinler
0b01110000
0b10110000
0b11010000
0b11100000
char IleriGeri=1,StartStop=0,Sn=0,Dk=0,birler=0, onlar=0,yuzler=0,binler=0,counter=0; // int tipinde değişkenler
tanımlanıyor
// Ortak katot display için veri değerleri
const int digit[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
/********* KESME FONKSİYONLARI ********/
#INT_EXT
void Int_External()
{
StartStop=!StartStop; // veya if (StartStop) StartStop=0 else StartStop=1;
if(StartStop)
{
setup_timer_2(T2_DIV_BY_16,255,16); // Timer2 ayarları yapılıyor
enable_interrupts(INT_timer2); // int_timer2 kesmesini aktif yapar
}
else
{
setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
disable_interrupts(INT_timer2); // int_timer2 kesmesini pasif yapar
}
}
#INT_RB
void Int_RBChange()
{
if (!input(arttirSn)) // arttır butonuna basıldığında
{
Sn++;
// Sn değerini 1 arttır
if (Sn>=60) {Dk++;Sn=0;} // Sn kontrolü yapılıyor
birler=Sn%10;
onlar= Sn/10;
yuzler=Dk%10;
binler=Dk/10;
}
if (!input(azaltSn)) // azalt butonuna basıldığında
{
Sn--;
// Sn değerini 1 arttır
if (Sn<=0) {Dk--;Sn=59;} // Sn kontrolü yapılıyor
birler=Sn%10;
onlar= Sn/10;
yuzler=Dk%10;
binler=Dk/10;
}
if (!input(arttirDk)) // arttır butonuna basıldığında
{
Dk++;
// Sn değerini 1 arttır
if (Dk>=60) {Dk=0;Sn=0;} // Dk kontrolü yapılıyor
birler=Sn%10;
onlar= Sn/10;
yuzler=Dk%10;
binler=Dk/10;
}
if (!input(azaltDk)) // azalt butonuna basıldığında
{
Dk--;
// Sn değerini 1 arttır
if (Dk<=0) {Dk=59;Sn=59;} // Dk kontrolü yapılıyor
birler=Sn%10;
onlar= Sn/10;
yuzler=Dk%10;
binler=Dk/10;
}
}
#INT_TIMER0 // Timer0 kesmesi
void timer0_kesme () // Kesme fonksiyonu ismi
{
clear_interrupt(int_timer0);
set_timer0(254); // TMR0 değeri belirleniyor
output_high(LED_Ileri);
output_low(LED_Geri);
IleriGeri=1;
}
#INT_TIMER1 // Timer1 kesmesi
void timer1_kesme () // Kesme fonksiyonu ismi
{
clear_interrupt(int_timer1);
set_timer1(65532); // TMR1 değeri belirleniyor
output_low(LED_Ileri);
output_high(LED_Geri);
IleriGeri=0;
}
#INT_TIMER2 // Timer2 kesmesi
void timer2_kesme () // Kesme fonksiyonu ismi
{
clear_interrupt(int_timer2);
set_timer2(0); // TMR2 PRD değeri belirleniyor
counter++;
if (counter >=20) //couter*0.050176sn=20*0.050176sn= 1.00352 sn de bir sayma işlemi yapacak
{
counter=0;
if(IleriGeri)
{
Sn++;
// Sn değerini 1 arttır
if (Sn>=60) {Dk++;Sn=0;} // Sn kontrolü yapılıyor
if (Dk>=60) {Dk=0;Sn=0;}
birler=Sn%10;
onlar= Sn/10;
yuzler=Dk%10;
binler=Dk/10;
}
else
{
Sn--;
// Sn değerini 1 arttır
if (Sn<=0) {Dk--;Sn=59;} // Sn kontrolü yapılıyor
if (Dk<=0) {Dk=59;Sn=59;}
birler=Sn%10;
onlar= Sn/10;
yuzler=Dk%10;
binler=Dk/10;
}
}
}
/********* ANA PROGRAM FONKSİYONU********/
void main ()
{
setup_psp(PSP_DISABLED);
// PSP birimi devre dışı
setup_spi(SPI_SS_DISABLED); // SPI birimi devre dışı
setup_adc_ports(NO_ANALOGS); // ANALOG giriş yok
setup_adc(ADC_OFF);
// ADC birimi devre dışı
setup_CCP1(CCP_OFF);
// CCP1 birimi devre dışı
setup_CCP2(CCP_OFF);
// CCP2 birimi devre dışı
set_tris_a(0xFF); // A portu tümüyle giriş olarak yönlendiriliyor
set_tris_b(0xFF); // B portu tümüyle giriş olarak yönlendiriliyor
set_tris_c(0x0F); // C portu ilk4 giriş ve Son4 çıkış olarak yönlendiriliyor
set_tris_d(0x00); // D portu tümüyle çıkış olarak yönlendiriliyor
output_d(0x00);
output_c(0x00);
setup_timer_0(RTCC_EXT_H_TO_L | RTCC_DIV_2);
// Timer0 ayarları yapılıyor (RTCC_DIV_BY_2 * 256-254)=2*2=4 pulse gelince kesme oluşturacak
set_timer0(254); // TMR0 değeri belirleniyor
setup_timer_1(T1_EXTERNAL | T1_DIV_BY_1); // Timer1 ayarları yapılıyor
set_timer1(65532);
// TMR1 değeri belirleniyor (T1_DIV_BY_1 * 65536-65532)=4 pulse gelince kesme oluşturacak
setup_timer_2(T2_DIV_BY_16,196,16);
// Timer2 ayarları yapılıyor Tkesme=1us*T2_DIV_BY_16*196*16=1us*50176=0.050176sn de kesme oluşacak
set_timer2(0);
enable_interrupts(INT_timer0); // int_timer0 kesmesini aktif yapar
enable_interrupts(INT_timer1); // int_timer1 kesmesini aktif yapar
// enable_interrupts(INT_timer2); // int_timer2 kesmesini aktif yapar //#int_ext kesmesi içinde aktif pasif yapılıyor
ext_int_edge(H_TO_L);
enable_interrupts(INT_EXT);
enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);
while(1) // Sonsuz döngü
{
birler=Sn%10;
onlar= Sn/10;
yuzler=Dk%10;
binler=Dk/10;
output_d(digit[birler]|(dspBirler)); // 1.display aktif, diğer displeyler pasif ve birler basamağı gönderiliyor
delay_ms(5);
// Gecikme veriliyor
output_d(digit[onlar]|(dspOnlar)); // 2.display aktif, diğer displeyler pasif ve onlar basamağı gönderiliyor
delay_ms(5);
// Gecikme veriliyor
output_d(digit[Yuzler]|(dspYuzler)); // 3.display aktif, diğer displeyler pasif ve yuzler basamağı gönderiliyor
delay_ms(5);
// Gecikme veriliyor
output_d(digit[Binler]|(dspBinler)); // 4.display aktif, diğer displeyler pasif ve binler basamağı gönderiliyor
delay_ms(5);
// Gecikme veriliyor
}
}

Benzer belgeler

Display Uygulaması-3(Kesme Yöntemi Kullanarak 7448 Entegresi

Display Uygulaması-3(Kesme Yöntemi Kullanarak 7448 Entegresi RA0/AN0 RA1/AN1 RA2/AN2/VREFRA3/AN3/VREF+ RA4/T0CKI RA5/AN4/SS RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RE0/AN5/RD RC2/CCP1 RE1/AN6/WR RC3/SCK/SCL RE2/AN7/CS RC4/SDI/SDA RC5/SDO RC6/TX/CK RC7/RX/DT

Detaylı

butonu kesmeli çalışacak:butona basınca birler basamağı

butonu kesmeli çalışacak:butona basınca birler basamağı RA0/AN0 RA1/AN1 RA2/AN2/VREFRA3/AN3/VREF+ RA4/T0CKI RA5/AN4/SS RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RE0/AN5/RD RC2/CCP1 RE1/AN6/WR RC3/SCK/SCL RE2/AN7/CS RC4/SDI/SDA RC5/SDO RC6/TX/CK RC7/RX/DT

Detaylı

UYGULAMA 4 DEVRE BAĞLANTISI VE ĠSTENENLER

UYGULAMA 4 DEVRE BAĞLANTISI VE ĠSTENENLER RA4/T0CKI RA5/AN4/SS RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RE0/AN5/RD RC2/CCP1 RE1/AN6/WR RC3/SCK/SCL RE2/AN7/CS RC4/SDI/SDA RC5/SDO RC6/TX/CK RC7/RX/DT

Detaylı