Dalam tutorial sebelumnya, kami belajar mengenai Mengedipkan LED menggunakan mikrokontroler PIC dan membina litar yang sama di papan Perf. Kemudian kami menggunakan PICkit 3, ICSP dan MPLAB IPE untuk membuang program ke papan Perf kami. Sekarang, dalam tutorial ini kita akan memajukan diri kita untuk menggunakan lebih banyak pin pada mikrokontroler PIC. Kami akan menggunakan 7 output (LED) dan satu Input. Untuk tutorial ini, kita akan menggunakan papan Perf lama (ditunjukkan di bawah) dan akan menambah tongkat berg untuk mengeluarkan pin yang diperlukan ke papan LED kedua. Pada akhir tutorial ini kita akan Menghasilkan Urutan LED Berkelip menggunakan mikrokontroler PIC PIC16F877A dan akan belajar bagaimana menggunakan pelbagai input dan output, beberapa asas mengenai panggilan gelung dan fungsi 'untuk'.
Papan LED tidak lain adalah papan perf lain, di mana kita akan menyolder LED dengan Perintang yang mengehadkan semasa (ditunjukkan di bawah). Kami juga akan menambah butang tekan untuk memulakan urutan LED berkelip.
Rajah Litar:
Kod Urutan Berkelip LED PIC16F877A PIC Mikrokontroler dan Penjelasan Bekerja:
Kod Lengkap telah diberikan di bawah (periksa di akhir), di sini kita akan mendapatkannya melalui baris demi baris. Kod ini akan mula menyala LED secara berurutan apabila butang tekan ditekan. Untuk memahami urutan sila tonton video di akhir tutorial. Saya mengesyorkan anda membandingkan output yang ditunjukkan dalam video dengan kod di bawah ini dan cuba memahami programnya.
Mari lihat kod baris demi baris. Beberapa baris pertama adalah untuk menetapkan bit konfigurasi yang telah dijelaskan dalam tutorial sebelumnya jadi saya melewatkannya buat masa ini. Kaedah terbaik untuk memahami sebarang program adalah dengan memulakan dari fungsi utama ( void main () ), jadi mari kita lakukannya
TRISB0 = 1; // Arahkan MCU bahawa pin PORTB 0 digunakan sebagai input untuk butang. TRISD = 0x00; // Arahkan MCU bahawa semua pin adalah output PORTD = 0x00; // Memulakan semua pin ke 0
Kata TRIS digunakan untuk menentukan apakah pin digunakan sebagai input / output dan kata PORT digunakan untuk membuat pin Tinggi / Rendah. Garis TRISB0 = 1 akan menjadikan pin PORT B ke-0 sebagai input. Ini akan menjadi butang tekan kami. Garis TRISD = 0x00; PORTD = 0x00; akan menjadikan semua pin port D sebagai Output dan memberikan nilai awal RENDAH kepada pin tersebut.
Oleh kerana kami mengatakan bahawa B0 digunakan sebagai input, kami akan menghubungkan satu hujung butang tekan ke pin B0 dan ujung yang lain ke tanah. Pada masa itu setiap kali kita menekan butang pin akan ditahan ke tanah seperti yang ditunjukkan dalam rajah sambungan di atas. Tetapi untuk mewujudkannya, kita mesti menggunakan resistor tarik sehingga pin akan ditahan tinggi apabila butang tidak ditekan. Perintang penarik adalah seperti ini.
Tetapi MCU PIC kami mempunyai resistor penarik lemah dalaman yang dapat diaktifkan oleh perisian yang dapat menjimatkan banyak kerumitan (apabila lebih banyak butang dihubungkan)
Apakah perintang penarik Lemah?
Terdapat dua jenis pull up resistor, satu adalah Weak Pull Up dan yang lain adalah Strong Pull Up. Perintang tarik yang lemah bernilai tinggi dan dengan itu membiarkan arus yang lemah mengalir dan perintang penarik yang kuat bernilai rendah sehingga memungkinkan arus yang kuat mengalir. Semua MCU kebanyakannya menggunakan perintang penarik lemah. Untuk mengaktifkannya di MCU PIC kami, kami perlu melihat lembaran data kami untuk OPTION_REG (daftar pilihan) seperti yang ditunjukkan dalam gambar di bawah.
Seperti yang ditunjukkan bit 7 berkaitan dengan perintang penarik lemah. Ia mesti dibuat sifar untuk mengaktifkannya. Ini dilakukan oleh OPTION_REG <7> = 0 . Ini secara khusus berkaitan dengan bit 7 meninggalkan bit yang lain pada nilai lalai. Dengan ini kita memasuki loop sementara kita, di mana ia memeriksa apakah butang ditekan dengan menggunakan if (RB0 == 0). Sekiranya keadaan itu dipenuhi, kita memanggil fungsi kita dengan parameter 1, 3, 7 dan 15.
sblink (1); // FUNGSI PANGGILAN 1 dengan parameter 1 sblink (3); // FUNGSI PANGGILAN 3 dengan parameter 3 sblink (7); // FUNGSI PANGGILAN 7 dengan parameter 7 sblink (15); // FUNGSI PANGGILAN 4 dengan parameter 15
Mengapa kita menggunakan fungsi?
Fungsi digunakan untuk mengurangkan bilangan baris dalam kod kami. Inilah yang pasti kita ketahui. Tetapi mengapa kita perlu mengurangkan bilangan baris, terutama dalam soal pengaturcaraan MCU. The sebabnya ialah ruang yang terhad dalam ingatan Program kami. Sekiranya kita tidak mengoptimumkan kod dengan betul, kita mungkin kehabisan ruang memori. Ini akan menjadi berguna apabila kita menulis halaman kod yang panjang.
Fungsi apa pun akan mempunyai fungsi Definisi ( sblink (int get) dalam kes kami) dan fungsi Call ( sblink (1) dalam kes kami). Adalah pilihan untuk mempunyai deklarasi fungsi, untuk mengelakkannya saya telah meletakkan definisi fungsi saya sebelum memanggil fungsi tersebut ke fungsi utama saya.
Parameter fungsi adalah nilai yang akan diteruskan dari fungsi panggilan ke definisi fungsi. Dalam kes kami, nilai integer (1, 3, 7, 15) adalah parameter yang dilewatkan dari fungsi panggilan dan pemboleh ubah "get" mendapat nilai parameter ke dalam definisi fungsi untuk memprosesnya. Fungsi boleh mempunyai lebih dari satu parameter.
Setelah fungsi dipanggil, baris di bawah dalam definisi fungsi akan dijalankan.
untuk (int i = 0; i <= 7 && RB0 == 0; i ++) {PORTD = dapatkan << i; // LED bergerak Urutan Kiri __delay_ms (50); } untuk (int i = 7; i> = 0 && RB0 == 0; i--) {PORTD = dapatkan << i; // LED bergerak Urutan Kiri __delay_ms (50); }
Sekarang garis ini kelihatan ganjil: PORTD = dapatkan << i . Saya akan menerangkan apa yang sebenarnya berlaku di sini.
"<<" adalah operator shift kiri yang mengalihkan semua bit ke kedudukan kirinya. Sekarang apabila kita memanggil fungsi sblink (int get) dengan parameter '1' sebagai sblink (1), ia akan menjadikan nilai 'get' sebagai 1, yang dalam biner adalah 0b00000001. Oleh itu garis ini akan menjadi seperti PORTD = 0b00000001 << i .
Nilai "i" akan berbeza dari 0 hingga 7 kerana kita telah menggunakan 'untuk gelung' untuk (int i = 0; i <= 7 && RB0 == 0; i ++). Nilai 'i' dari 0 hingga 7 akan mengubah hasilnya seperti berikut:
Seperti yang anda lihat, kami telah menyalakan satu LED pada satu masa (dari kiri ke kanan) dengan membiarkan yang lain mati. ' For loop' seterusnya untuk (int i = 7; i> = 0 && RB0 == 0; i--) , juga akan melakukan perkara yang sama tetapi kali ini LED akan dihidupkan dari kanan ke kiri secara berurutan, semasa kami bermula dari 7 dan turun ke 0. Kami telah menggunakan kelewatan 200ms sehingga kami dapat menggambarkan LED yang dihidupkan dan dimatikan.
Sekarang apabila kita melewati nilai 3 dalam fungsi sblink (int get) , maka fungsi sblink (3) akan dijalankan yang menjadikan nilai 'get' sebagai 0b00000011, maka hasilnya pada PORTD akan menjadi:
Jadi sekarang ini dua LED akan dihidupkan pada waktu tertentu dengan menggunakan sblink (3). Begitu juga untuk sblink (7) dan sblink (15), tiga dan empat LED akan menyala secara berurutan. Setelah ini selesai, kami akan menjadikan semua LED menyala menggunakan garis PORTD = 0xFF . Lihat Video di bawah untuk Demonstrasi penuh.
Harap anda memahami kod tersebut dan dengan demikian telah belajar bagaimana menggunakan fungsi, gelung 'for' dan 'while' untuk mendapatkan output yang anda inginkan. Sekarang anda boleh mengubah kod untuk mendapatkan urutan LED anda yang berkedip. Teruskan menyusun kod anda dan membuangnya pada MCU anda dan nikmati hasilnya. Anda boleh menggunakan bahagian komen jika tersekat di suatu tempat. Saya juga melampirkan fail simulasi dan program di sini.
Itu sahaja untuk saat ini dalam tutorial seterusnya kami akan belajar bagaimana menggunakan pemasa PIC16F877A dan bukannya menggunakan fungsi tunda. Anda boleh melihat semua tutorial mikrokontroler PIC di sini.