31 Ağustos 2019 Cumartesi

PIC16F877A Mikrodenetleyici ve 74HC595 Shift Register ile 7 Segment Displayli İleri Geri Sayıcı (Up Down) Uygulama Devresi ve Program Kodu


Yukarıdaki devrede PIC16F877A Mikrodenetleyici ve 74HC595 Shift Register kullanılarak yapılan 7 Segment Displayli Sayıcı Uygulama Devresi görülmektedir.

Bu devrede Up yazan butona basıldığında ileri yönlü sayma işlemi yapılırken, Down yazan butona basıldığında geri yönlü sayma işlemi yapılmaktadır.


PIC16F877A Mikrodenetleyici Program Kodu :

// 4-Digit 7-Segment display with 74HC595 interfacing with PIC16F877A CCS C code
// http://elektrikelektronikegitimi.blogspot.com/
#define data_pin PIN_B0
#define clock_pin PIN_B1
#define latch_pin PIN_B2

#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock = 8000000)
#use fast_io(B)
#use fast_io(D)

short s; // Used to know buttons position
unsigned int j, digit ;
unsigned long i = 0;
unsigned int seg(unsigned int num) {
switch (num) {
case 0 : return 0x80;
case 1 : return 0xF2;
case 2 : return 0x48;
case 3 : return 0x60;
case 4 : return 0x32;
case 5 : return 0x24;
case 6 : return 0x04;
case 7 : return 0xF0;
case 8 : return 0;
case 9 : return 0x20;
}
}
void write_data(unsigned int number){
for(j = 0x80; j > 0; j = j >> 1) {
if(number & j)
output_high(data_pin);
else
output_low(data_pin);
output_high(clock_pin);
output_low(clock_pin);
}
output_high(latch_pin);
output_low(latch_pin);
}
void main(){
port_b_pullups(TRUE); // Enable PORTB pull-ups
output_b(0); // PORTB initial state
set_tris_b(0x18); // Configure RB3 & RB4 pins as inputs
output_d(0); // PORTD initial state
set_tris_d(0); // Configure PORTD pins as inputs
while(TRUE){
if(input(PIN_B3) && input(PIN_B4))
s = 1;
if(s == 1) {
if(input(PIN_B3) == 0) {
s = 0;
i++;
if(i > 9999)
i = 0;
}
if(input(PIN_B4) == 0) {
s = 0;
if(i < 1)
i = 1;
i--;
}
}
digit = seg(i % 10); // Prepare to display ones
output_d(0x0F); // Turn off all displays
write_data(digit);
output_d(0x07); // Turn on display for ones
delay_ms(1);
digit = seg((i / 10) % 10); // Prepare to display tens
output_d(0x0F); // Turn off all displays
write_data(digit);
output_d(0x0B); // Turn on display for tens
delay_ms(1);
digit = seg((i / 100) % 10); // Prepare to display hundreds
output_d(0x0F); // Turn off all displays
write_data(digit);
output_d(0x0D); // Turn on display for hundreds
delay_ms(1);
digit = seg((i / 1000) % 10); // Prepare to display thousands
output_d(0x0F); // Turn off all displays
write_data(digit);
output_d(0x0E); // Turn on display for thousands
delay_ms(1);
}
}

Arduino UNO ve 74HC595 Shift Register ile 7 Segment Displayli Sayıcı Uygulama Devresi ve Program Kodu



Yukarıdaki devrede Arduino UNO ve 74HC595 Shift Register ile 7 Segment Displayli Sayıcı Uygulama Devresi görülmektedir.

Bu devrede push butona basılarak 7 segment displayde ileri yönde sayma yapılmaktadır.

Kullanılan Malzemeler : 

Arduino UNO board
4 Digit ortak anotlu 7 segment display
74HC595 shift register
4 x PNP transistor (2SA1015, 2S9015, 2N3906 …)
8 x 100 ohm direnç
4 x 4.7k ohm direnç
Push buton
Breadboard

Devrenin board üzerinde kurulmuş görüntüsü

Arduino Kod :


/*
* 7-segment display with 74HC595 shift register
* 4-Digit counter example.
* Common anode 7-segment display is used.
* This is a free software with NO WARRANTY.
* http://elektrikelektronikegitimi.blogspot.com/
*/

// counter button definition
#define button A0

// shift register pin definitions
#define clockPin 7 // clock pin
#define dataPin 6 // data pin

// common pins of the four digits definitions
#define Dig1 5
#define Dig2 4
#define Dig3 3
#define Dig4 2

// variable declarations
byte current_digit;
int count = 0;
void disp(byte number, bool dec_point = 0);

void setup()
{
pinMode(button, INPUT_PULLUP);
pinMode(Dig1, OUTPUT);
pinMode(Dig2, OUTPUT);
pinMode(Dig3, OUTPUT);
pinMode(Dig4, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);

disp_off(); // turn off the display

// Timer1 module overflow interrupt configuration
TCCR1A = 0;
TCCR1B = 1; // enable Timer1 with prescaler = 1 ( 16 ticks each 1 µs)
TCNT1 = 0; // set Timer1 preload value to 0 (reset)
TIMSK1 = 1; // enable Timer1 overflow interrupt
}

ISR(TIMER1_OVF_vect) // Timer1 interrupt service routine (ISR)
{
disp_off(); // turn off the display

switch (current_digit)
{
case 1:
disp(count / 1000); // prepare to display digit 1 (most left)
digitalWrite(Dig1, LOW); // turn on digit 1
break;

case 2:
disp( (count / 100) % 10 ); // prepare to display digit 2
digitalWrite(Dig2, LOW); // turn on digit 2
break;

case 3:
disp( (count / 10) % 10 ); // prepare to display digit 3
digitalWrite(Dig3, LOW); // turn on digit 3
break;

case 4:
disp(count % 10); // prepare to display digit 4 (most right)
digitalWrite(Dig4, LOW); // turn on digit 4
}

current_digit = (current_digit % 4) + 1;
}

// main loop
void loop()
{
if(digitalRead(button) == 0)
{
count++; // increment 'count' by 1
if(count > 9999)
count = 0;
delay(200); // wait 200 milliseconds
}
}

void disp(byte number, bool dec_point)
{
switch (number)
{
case 0: // print 0
shiftOut(dataPin, clockPin, MSBFIRST, 0x02 | !dec_point);
digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
break;

case 1: // print 1
shiftOut(dataPin, clockPin, MSBFIRST, 0x9E | !dec_point);
digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
break;

case 2: // print 2
shiftOut(dataPin, clockPin, MSBFIRST, 0x24 | !dec_point);
digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
break;

case 3: // print 3
shiftOut(dataPin, clockPin, MSBFIRST, 0x0C | !dec_point);
digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
break;

case 4: // print 4
shiftOut(dataPin, clockPin, MSBFIRST, 0x98 | !dec_point);
digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
break;

case 5: // print 5
shiftOut(dataPin, clockPin, MSBFIRST, 0x48 | !dec_point);
digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
break;

case 6: // print 6
shiftOut(dataPin, clockPin, MSBFIRST, 0x40 | !dec_point);
digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
break;

case 7: // print 7
shiftOut(dataPin, clockPin, MSBFIRST, 0x1E | !dec_point);
digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
break;

case 8: // print 8
shiftOut(dataPin, clockPin, MSBFIRST, !dec_point);
digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
break;

case 9: // print 9
shiftOut(dataPin, clockPin, MSBFIRST, 0x08 | !dec_point);
digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
}
}

void disp_off()
{
digitalWrite(Dig1, HIGH);
digitalWrite(Dig2, HIGH);
digitalWrite(Dig3, HIGH);
digitalWrite(Dig4, HIGH);
}

// end of code.

30 Ağustos 2019 Cuma

Arduino UNO ve LM335 Sıcaklık Sensörü ile 7 Segment Displayli Uygulama Devresi ve Program Kodu


Yukarıdaki devredeArduino UNO ve LM335 Sıcaklık Sensörü ile 7 Segment Displayli Uygulama Devresi görülmektedir.

Bu devrede LM335 sıcaklık sensörü ile yapılan ölçüm 7 segment displayde görülmektedir.

LM335 sıcaklık sensörü 10 mV/°K. 10 mV çıkışı 1 Kelvi derecesini göstermektedir. Örneğin LM335 çıkış gerilimi 3.03 V (3030 mV) olduğunda sıcaklık 303 Kelvin = 30 °Celsius (30 derece) olur.

Kullanılan Devre Elemanları :

Arduino UNO board
3-digit veya 4-digit ortak anotlu 7 segment display
LM335 sıcaklık sensörü
3 x PNP transistor (2SA1015, 2S9015, 2N3906 …)
7 x 100 ohm direnç
3 x 4.7k ohm direnç
2.2k ohm direnç
Breadboard

Arduino Kodu

/*
* Interfacing Arduino with LM335 temperature sensor and 7-segment display.
* Common anode 7-segment display is used.
* This is a free software with NO WARRANTY.
* http://elektrikelektronikegitimi.blogspot.com
*/

// define LM335 data pin connection
#define LM335_pin A0

// segment pins definitions
#define SegA 12
#define SegB 11
#define SegC 10
#define SegD 9
#define SegE 8
#define SegF 7
#define SegG 6
// common pins of the three digits definitions
#define Dig1 4
#define Dig2 3
#define Dig3 2

// variable declarations
byte current_digit;
int temp;

void setup()
{
pinMode(SegA, OUTPUT);
pinMode(SegB, OUTPUT);
pinMode(SegC, OUTPUT);
pinMode(SegD, OUTPUT);
pinMode(SegE, OUTPUT);
pinMode(SegF, OUTPUT);
pinMode(SegG, OUTPUT);
pinMode(Dig1, OUTPUT);
pinMode(Dig2, OUTPUT);
pinMode(Dig3, OUTPUT);

disp_off(); // turn off the display

// Timer1 module overflow interrupt configuration
TCCR1A = 0;
TCCR1B = 1; // enable Timer1 with prescaler = 1 ( 16 ticks each 1 µs)
TCNT1 = 0; // set Timer1 preload value to 0 (reset)
TIMSK1 = 1; // enable Timer1 overflow interrupt
}

ISR(TIMER1_OVF_vect) // Timer1 interrupt service routine (ISR)
{
disp_off(); // turn off the display

byte abs_temp = abs(temp); // abs: absolute value

switch (current_digit)
{
case 1:
if(temp < 0 || temp >= 100){
if(temp < 0)
disp(10); // print minus sign (-)
else
disp(1); // print 1
digitalWrite(Dig1, LOW); // turn on digit 1
}
break;

case 2:
disp( (abs_temp / 10) % 10); // prepare to display digit 2
digitalWrite(Dig2, LOW); // turn on digit 2
break;

case 3:
disp(abs_temp % 10); // prepare to display digit 3
digitalWrite(Dig3, LOW); // turn on digit 3
}

current_digit = (current_digit % 3) + 1;
}

// main loop
void loop()
{
int kelvin = analogRead(LM335_pin) * 0.489; // get temperature in degree Kelvin
temp = kelvin - 273; // convert to degree Celsius

delay(1000); // wait 1 second
}

void disp(byte number)
{
switch (number)
{
case 0: // print 0
digitalWrite(SegA, LOW);
digitalWrite(SegB, LOW);
digitalWrite(SegC, LOW);
digitalWrite(SegD, LOW);
digitalWrite(SegE, LOW);
digitalWrite(SegF, LOW);
digitalWrite(SegG, HIGH);
break;

case 1: // print 1
digitalWrite(SegA, HIGH);
digitalWrite(SegB, LOW);
digitalWrite(SegC, LOW);
digitalWrite(SegD, HIGH);
digitalWrite(SegE, HIGH);
digitalWrite(SegF, HIGH);
digitalWrite(SegG, HIGH);
break;

case 2: // print 2
digitalWrite(SegA, LOW);
digitalWrite(SegB, LOW);
digitalWrite(SegC, HIGH);
digitalWrite(SegD, LOW);
digitalWrite(SegE, LOW);
digitalWrite(SegF, HIGH);
digitalWrite(SegG, LOW);
break;

case 3: // print 3
digitalWrite(SegA, LOW);
digitalWrite(SegB, LOW);
digitalWrite(SegC, LOW);
digitalWrite(SegD, LOW);
digitalWrite(SegE, HIGH);
digitalWrite(SegF, HIGH);
digitalWrite(SegG, LOW);
break;

case 4: // print 4
digitalWrite(SegA, HIGH);
digitalWrite(SegB, LOW);
digitalWrite(SegC, LOW);
digitalWrite(SegD, HIGH);
digitalWrite(SegE, HIGH);
digitalWrite(SegF, LOW);
digitalWrite(SegG, LOW);
break;

case 5: // print 5
digitalWrite(SegA, LOW);
digitalWrite(SegB, HIGH);
digitalWrite(SegC, LOW);
digitalWrite(SegD, LOW);
digitalWrite(SegE, HIGH);
digitalWrite(SegF, LOW);
digitalWrite(SegG, LOW);
break;

case 6: // print 6
digitalWrite(SegA, LOW);
digitalWrite(SegB, HIGH);
digitalWrite(SegC, LOW);
digitalWrite(SegD, LOW);
digitalWrite(SegE, LOW);
digitalWrite(SegF, LOW);
digitalWrite(SegG, LOW);
break;

case 7: // print 7
digitalWrite(SegA, LOW);
digitalWrite(SegB, LOW);
digitalWrite(SegC, LOW);
digitalWrite(SegD, HIGH);
digitalWrite(SegE, HIGH);
digitalWrite(SegF, HIGH);
digitalWrite(SegG, HIGH);
break;

case 8: // print 8
digitalWrite(SegA, LOW);
digitalWrite(SegB, LOW);
digitalWrite(SegC, LOW);
digitalWrite(SegD, LOW);
digitalWrite(SegE, LOW);
digitalWrite(SegF, LOW);
digitalWrite(SegG, LOW);
break;

case 9: // print 9
digitalWrite(SegA, LOW);
digitalWrite(SegB, LOW);
digitalWrite(SegC, LOW);
digitalWrite(SegD, LOW);
digitalWrite(SegE, HIGH);
digitalWrite(SegF, LOW);
digitalWrite(SegG, LOW);
break;

case 10: // print -
digitalWrite(SegA, HIGH);
digitalWrite(SegB, HIGH);
digitalWrite(SegC, HIGH);
digitalWrite(SegD, HIGH);
digitalWrite(SegE, HIGH);
digitalWrite(SegF, HIGH);
digitalWrite(SegG, LOW);
}
}

void disp_off()
{
digitalWrite(Dig1, HIGH);
digitalWrite(Dig2, HIGH);
digitalWrite(Dig3, HIGH);
}

// end of code. 
 

PIC16F84A Mikrodenetleyici ile DC Motor Hız Kontrol ve Devir Yönü Değiştirme Uygulama Devresi ve Program Kodu



Yukarıdaki devrede PIC16F84A Mikrodenetleyici ile yapılan DC Motor Hız Kontrol ve Devir Yönü Değiştirme Uygulama Devresi görülmektedir.

Bu devrede Speed UP yazan butona basıldığında motor devri artarak hızlanmaktadır. Speed DOWN yazan butona basıldığında motor devri azalarak yavaşlamaktadır. Bu butonlara basarak motorun hızını istediğimiz gibi artırıp yavaşlatmak mümkündür. Motor maksimum hızına geldiğinde LED3 lambası yanmaktadır.

Direction1 ve Direction2 butonları devir yönünü değiştirmektedir. Değişen devir yönünde de Speed UP ve Speed DOWN butonları ile hız kontrolü yapılabilir. Devir yönüne göre LED1 ve LED2lambaları yanmaktadır.

PIC16F84A Mikrodenetleyici CCS C kodu

1  // DC motor speed and direction control using PIC16F84A CCS C code
2  // http://elektrikelektronikegitimi.blogspot.com
3  #include <16F84A.h>
4  #fuses HS,NOWDT,PUT,NOPROTECT
5  #use delay(clock = 8000000)
6  #use fast_io(B)
7  #use fast_io(A)
8  #use pwm(output = pin_a0, output = pin_a1, timer = 0, frequency= 500Hz, duty = 0)
9
10  unsigned int8 i = 1;
11  void main() {
12  port_b_pullups(TRUE); // Enable PORTB pull-ups
13  output_a(0); // PORTA initial state
14  set_tris_a(0); // All PORTA pins are configured as outputs
15  output_b(0); // PORTB initial state
16  set_tris_b(0x1F); // Configure RB0 to RB4 as inputs
17  pwm_off(); // Turn off all pwm outputs
18  while(TRUE) {
19  if(input(PIN_B0) == 0){ // If RB0 button pressed
20  i++; // Increment i by 1 (i = i + 1)
21  if(i > 99){
22  i = 100;
23  output_high(PIN_B7);} // RB7 LED ON
24  pwm_set_duty_percent(i * 10UL); // Duty cycle change in tenths %
25  delay_ms(100); } // Wait 100ms
26  if(input(PIN_B1) == 0){ // If RB1 button pressed
27  output_low(PIN_B7); // RB7 LED OFF
28  i--; // Decrement i by 1 (i = i - 1)
29  if(i < 1)
30  i = 1;
31  pwm_set_duty_percent(i * 10UL); // Duty cycle change in tenths %
32  delay_ms(100); } // Wait 100ms
33  if(input(PIN_B2) == 0){ // If RB2 button pressed
34  if(input(PIN_B5) == 0){
35  output_low(PIN_B6); // RB6 LED OFF
36  pwm_off(); // Turn off pwm for both outputs
37  output_a(0); // PORTA pins low
38  delay_ms(100); // Wait 100ms
39  pwm_on(PIN_A0); // Turn pwm on at RA0
40  output_high(PIN_B5); // RB5 LED ON
41  if(i > 99)
42  output_high(PIN_B7);}}
43  if(input(PIN_B3) == 0){ // If RB3 button pressed
44  if(input(PIN_B6) == 0){
45  output_low(PIN_B5); // RB5 LED OFF
46  pwm_off(); // Turn off pwm for both outputs
47  output_a(0); // PORTA pins low
48  delay_ms(100); // Wait 100ms
49  pwm_on(PIN_A1); // Turn PWM on at RA1
50  output_high(PIN_B6);
51  if(i > 99)
52  output_high(PIN_B7);}}
53  if(input(PIN_B4) == 0){ // If RB4 button pressed
54  pwm_off(); // Turn off pwm for both outputs
55  output_a(0); // PORTA pins low
56  output_b(0);} // PORTB pins low
57  }
58  }

PIC16F84A Mikrodenetleyici ile DC Motor Hız Kontrol Uygulama Devresi ve Program Kodu

Yukarıdaki devrede PIC16F84A Mikrodenetleyici ile yapılmış DC Motor Hız Kontrol Uygulama Devresi görülmektedir.


Bu devrede Speed UP yazan butona basıldığında motor devri artarak hızlanmaktadır. Speed DOWN yazan butona basıldığında motor devri azalarak yavaşlamaktadır. Butonlara basarak motorun hızını istediğimiz gibi artırıp yavaşlatmak mümkündür. Motor maksimum hızına geldiğinde LED yanmaktadır.

PIC16F84A Mikrodenetleyici CCS C kodu

1  // DC motor speed control using PIC16F84A CCS C code
2  // http://elektrikelektronikegitimi.blogspot.com
3  #include <16F84A.h>
4  #fuses HS,NOWDT,PUT,NOPROTECT
5  #use delay(clock = 8000000)
6  #use fast_io(B)
7  #use pwm(output = pin_a0, timer = 0, frequency= 500Hz, duty = 0)
8
9  unsigned int8 i;
10  void main() {
11  port_b_pullups(TRUE); // Enable PORTB pull-ups
12  output_b(0); // PORTB initial state
13  set_tris_b(3); // Configure RB0 & RB1 as inputs
14  while(TRUE) {
15  if(input(PIN_B0) == 0){ // If RB0 button pressed
16  i++; // Increment i by 1 (i = i + 1)
17  if(i > 100){
18  i = 100;
19  output_high(PIN_B2);} // Turn RB2 LED ON
20  pwm_set_duty_percent(i * 10UL); // Duty cycle change in tenths %
21  delay_ms(100); } // Wait 100ms
22  if(input(PIN_B1) == 0){ // If RB1 button pressed
23  output_low(PIN_B2); // Turn RB2 LED OFF
24  i--; // Decrement i by 1 (i = i - 1)
25  if(i < 1)
26  i = 1;
27  pwm_set_duty_percent(i * 10UL); // Duty cycle change in tenths %
28  delay_ms(100); } // Wait 100ms
29  }
30  }

PIC16F84A Mikrodenutonla 2 Lambanın Yakıp Söndürülmesi Uygulama Devresi ve Program Kodu


Yukarıdaki devrede PIC16F84A Mikrodenetleyici ile yapılmış 2 Lambanın Yakıp Söndürülmesi Uygulama Devresi görülmektedir.

Bu devrede bir butona basıldığında lambalardan birini yakmakta tekrar butona basıldığında aynı lambayı söndürmektedir. Diğer butona basıldığında diğer lambayı yakmakta tekrar basıldığında söndürmektedir.

PIC16F84A Mikrodenetleyici CCS C kodu

1  // PIC16F84A LED blink example
2  // http://elektrikelektronikegitimi.blogspot.com
3
4  #include <16F84A.h>;
5  #fuses HS,NOWDT,PUT,NOPROTECT
6  #use delay(crystal=8000000)
7
8  void main(){
9  while(TRUE){ // Endless loop
10  if(input(PIN_B0) == 0){ // If RB0 button is pressed
11  output_toggle(PIN_A0); // Toggle RA0 LED status
12  delay_ms(500); // Wait 500 ms
13  }
14  if(input(PIN_B1) == 0){ // If RB1 button is pressed
15  output_toggle(PIN_A1); // Toggle RA1 LED status
16  delay_ms(500); // Wait 500 ms
17  }
18  }
19  }

PIC16F84A Mikrodenetleyici ile 1 Butonla Lamba Yakıp Söndürme Uygulama Devresi ve Program Kodu


Yukarıdaki devrede PIC16F84A Mikrodenetleyici ile yapılmış 1 Butonla Lamba Yakıp Söndürme Uygulama Devresi görülmektedir.

Bu devrede butona basıldığında lamba yanmakta, tekrar basıldığında sönmektedir.

PIC16F84A Mikrodenetleyici CCS C kodu

1  // PIC16F84A external interrupt example
2  // https://simple-circuit.com/
3
4  #include <16F84A.h>
5  #fuses HS,NOWDT,PUT,NOPROTECT
6  #use delay(crystal=8000000)
7
8  #INT_EXT
9  void ext_isr(void)
10  {
11  output_toggle(PIN_A0);
12  }
13
14  void main()
15  {
16  output_low(PIN_A0);
17  ext_int_edge(H_TO_L); // Interrupt on falling edge of RB0/INT pin
18  clear_interrupt(INT_EXT); // Clear RB0/INT external interrupt flag bit
19  enable_interrupts(INT_EXT); // Enable RB0/INT external interrupt
20  enable_interrupts(GLOBAL); // Enable all unmasked interrupt
21 
22  while(TRUE) ; // Endless loop
23  }

Postayla Gelen Deniz Kabuğu (Behiç Ak) Kitabının Özeti, Konusu ve Kitap Hakkında Bilgi

Kitabın Adı: Postayla Gelen Deniz Kabuğu Kitabın Yazarı:  Behiç Ak Kitap Hakkında Bilgi: Dijital dünyanın labirentlerinden çıkış mümkün mü?...