Gömülü tasarımda, mikrodenetleyicinizde yeterli I / O pinine sahip olmadığınız olasılıklar vardır. Bu, herhangi bir nedenle olabilir, uygulamanızın birden fazla LED'e ihtiyacı olabilir veya birden fazla 7 segmentli ekran kullanmak isteyebilirsiniz, ancak mikrodenetleyicinizde gerekli I / O pinlerine sahip değilsiniz. İşte mükemmel bir bileşen, kaydırma yazmacı. Shift register seri veriyi kabul eder ve paralel çıktı verir. Mikrodenetleyicinize bağlanmak için sadece 3 pin gerekir ve ondan 8'den fazla Çıkış pini alırsınız. Popüler vardiya yazmacılarından biri 74HC595'tir. It has 8 bitlik depolama kayıt ve 8 bitlik kaydıran yazmaç. Burada vardiya kayıtları hakkında daha fazla bilgi edinin.
Kaydırma yazmacına seri veri sağlayacaksınız ve bu veri depolama yazmacı üzerinde kilitlenecek ve ardından depolama yazmacı 8 çıkışı kontrol edecek. Daha fazla çıktı istiyorsanız, sadece başka bir kaydıran yazmaç ekleyin. By basamaklı iki vardiya kayıtları, ek 8 çıkışları, toplam 16 bit çıkışını alacak.
Vardiya Kaydı 74HC595:
74HC595'in veri sayfasına göre pim çıkış diyagramı:
HC595'in 16 iğnesi vardır; veri sayfasını görürsek pin işlevlerini anlayacağız-
HY QA pimi numaraları, 1 ila 7 ve 15 olarak kullanılan 8 bitlik çıkışı olarak, değişiklik kaydedicisi, gelen pim 14 alınması için kullanılan seri veri. Diğer pinlerin nasıl kullanılacağına ve kaydıran yazmacın diğer işlevlerinin nasıl kullanılacağına dair doğruluk tablosu da vardır.
74HC595'in arayüzünü oluşturmak için kodu yazdığımızda, istenen çıktıları elde etmek için bu doğruluk tablosunu uygulayacağız.
Şimdi, 74HC595'i PIC16F877A ile birleştirip 8 LED'i kontrol edeceğiz. 74HC595 kaydıran yazmacı ile diğer mikro denetleyiciler arasında arayüz oluşturduk:
- Raspberry Pi ile 74HC595 Seri Vardiya Kaydını Arabirim
- Shift Register 74HC595 ile Arduino Uno Nasıl Kullanılır?
- Shift Register kullanarak LCD ile NodeMCU arasında arayüz oluşturma
Gerekli Bileşenler:
- PIC16F877A
- 2 adet 33pF seramik disk kapasitörler
- 20Mhz Kristal
- 4.7k direnç
- 8 adet LED
- 1k direnç -1 adet (her led için ayrı dirençler gerekiyorsa 8 adet 1k direnç gerekir)
- 74HC595 ic
- 5V duvar adaptörü
- PIC programlama ortamı
- Breadboard ve teller
Devre şeması:
Devre şemasında seri veri pinini bağladık ; sırasıyla mikrodenetleyicinin RB0, RB1 ve RB2 pinindeki saat ve strobe (mandal) pini. Burada 8 LED için bir direnç kullandık. Doğruluk tablosuna göre, 74HC595'in 13 numaralı pimini toprağa bağlayarak çıktıyı etkinleştirdik. HY biz başka basamaklandırılmamalıdır olmayacak şekilde pimi açık bırakılır 74HC595 onunla. Biz net giriş bayrağını devre dışı bağlayarak VCC ile kaydırma yazmacının pimini 10.
Kristal osilatör, mikro denetleyicinin OSC pinlerine bağlanır. PIC16F877A'nın dahili osilatörü yoktur. Bu projede vardiya regitster kullanarak Q0'dan Q7'ye liderliği tek tek aydınlatacağız.
Devreyi bir devre tahtasında inşa ettik.
Kod Açıklaması:
Kaydırma yazmacı ile LED'leri kontrol etmek için tam kod makalenin sonunda verilmiştir. Her zaman olduğu gibi, konfigürasyon bitlerini PIC mikrodenetleyicide ayarlamamız gerekiyor.
#pragma config FOSC = HS // Osilatör Seçim bitleri (HS osilatörü) #pragma config WDTE = OFF // Watchdog Zamanlayıcı Etkin bit (WDT devre dışı) #pragma config PWRTE = KAPALI // Güç Zamanlayıcı Etkinleştirme biti (PWRT devre dışı) # pragma config BOREN = ON // Brown-out Reset Etkinleştirme biti (BOR etkin) #pragma config LVP = OFF // Düşük Voltaj (Tek Kaynak) Devre İçi Seri Programlama Etkinleştirme biti (RB3 / PGM pininde PGM işlevi vardır; düşük -voltaj programlama etkin) #pragma config CPD = KAPALI // Veri EEPROM Bellek Kodu Koruma biti (Veri EEPROM kod koruması kapalı) #pragma yapılandırma WRT = KAPALI // Flash Program Belleği Yazmayı Etkinleştirme bitleri (Yazma koruması kapalı; tüm program belleği olabilir EECON kontrolü tarafından yazılmıştır) #pragma config CP = OFF // Flash Program Hafıza Kodu Koruma biti (Kod koruması kapalı)
Daha sonra gecikme için gerekli olan kristal frekansını ve 74HC595 için pin-out beyanını ilan ettik.
#Dahil etmek
Daha sonra pin yönünü başlatmak için system_init () fonksiyonunu tanımladık .
void system_init (void) { TRISB = 0x00; }
Saat darbesini ve mandal darbesini iki farklı işlevi kullanarak oluşturduk
/ * * Bu işlev Saati etkinleştirecektir. * / void clock (void) { CLK_595 = 1; __delay_us (500); CLK_595 = 0; __delay_us (500); }
ve
/ * * Bu işlev yanıp söner ve çıkış tetikleyicisini etkinleştirir. * / void strobe (void) { STROBE_595 = 1; __delay_us (500); STROBE_595 = 0; }
Bu iki işlevden sonra, seri verileri 74HC595'e göndermek için data_submit (işaretsiz int veri) işlevini ilan ettik.
void data_submit (işaretsiz int data) { for (int i = 0; i <8; i ++) { DATA_595 = (data >> i) & 0x01; saat(); } strobe (); // Veriler sonunda gönderildi }
Bu fonksiyonda 8 bit veriyi kabul ediyoruz ve her biti iki bitsel operatör sola kaydırma ve VE operatörü kullanarak gönderiyoruz. Önce veriyi tek tek kaydırıyoruz ve 0x01 ile AND operatörünü kullanarak 0 mı yoksa 1 mi olduğu kesin biti buluyoruz. Her veri, saat darbesi tarafından saklanır ve son veri çıkışı, mandal veya flaş darbesi kullanılarak yapılır. Bu süreçte veri çıkışı ilk olarak MSB (En Önemli Bit) olacaktır.
Gelen ana işlevi biz ikili gönderilen ve teker çıkış pimleri yüksek birini yaptı.
system_init (); // (1) { data_submit (0b00000000) sırasında sistem hazırlanıyor ; __delay_ms (200); data_submit (0b10000000); __delay_ms (200); data_submit (0b01000000); __delay_ms (200); data_submit (0b00100000); __delay_ms (200); data_submit (0b00010000); __delay_ms (200); data_submit (0b00001000); __delay_ms (200); data_submit (0b00000100); __delay_ms (200); data_submit (0b00000010); __delay_ms (200); data_submit (0b00000001); __delay_ms (200); data_submit (0xFF); __delay_ms (200); } dönüş; }
Bu, daha fazla sensör bağlamak için herhangi bir mikrodenetleyicide daha fazla serbest I / O pini elde etmek için bir vardiya yazmacı nasıl kullanılabilir.