- Bahan yang Diperlukan:
- Prasyarat:
- Rajah Litar:
- Pengaturcaraan untuk Jam Penggera:
- Simulasi:
- Mengendalikan Jam Penggera Digital menggunakan PIC16F877A:
Revolusi digital yang dimulakan pada tahun 1950 mengubah semua struktur elektronik mekanikal dan analog yang ada menjadi komputer digital. Oleh kerana pertumbuhan elektronik digital berkembang pesat, hari ini hampir mustahil bagi seseorang untuk menolak menggunakan peralatan elektronik apa pun. Bermula dari jam penggera yang membangunkan anda dan pembakar roti yang menyajikan sarapan, semuanya adalah sumbangan dari elektronik digital. Memikirkan semua ini, sangat menggembirakan untuk memprogramkan barang-barang kita sendiri yang dapat melakukan tugas yang mudah tetapi berguna, seperti Jam Penggera yang akan kita bina dalam projek ini dengan PIC Microcontroller. Kami sebelumnya telah membina jam penggera dengan Pengawal Mikro lain:
- Jam Penggera Raspberry Pi menggunakan Modul RTC DS1307
- Jam Digital Berasaskan Arduino dengan Penggera
- Jam Penggera menggunakan Mikrokontroler ATmega32
Jam penggera ini akan mempunyai paparan LCD 16x2 yang akan memaparkan waktu semasa dan waktu yang ditetapkan. Kami akan menggunakan beberapa butang tekan untuk menetapkan waktu penggera bila diperlukan. Masa semasa akan dijejaki menggunakan modul RTC DS3231 dan kami akan menggunakan komunikasi IIC untuk mendapatkan nilai-nilai ini dari modul RTC. Kami telah belajar mengenai modul RTC dan bagaimana menghubungkannya dengan PIC. Oleh itu, disarankan untuk membaca tutorial itu, kita akan melewatkan sebahagian besar maklumat yang diliputi dalam tutorial itu.
Bahan yang Diperlukan:
- Papan Roti - 2Nos
- PIC16F877A
- Sumber kuasa 5V - Modul bekalan
- Kristal 20 MHz
- Kapasitor 33pf - 2Nos
- Modul RTC DS3231
- Modul paparan LCD 16 * 2
- 10K POT
- Perintang 10k dan 1K
- Butang tekan - 5Nos
- Buzzer
- Menyambung wayar
Prasyarat:
Projek ini memerlukan anda mengetahui beberapa asas mengenai mikrokontroler PIC dan cara memprogramnya. Kami akan menggunakan GPIO, paparan LCD dan modul RTC untuk projek ini. Oleh itu, lebih baik belajar bagaimana menggunakan modul ini terlebih dahulu. Pautan berikut akan membantu anda mempelajari perkara yang sama
- Menulis program pertama anda dengan PIC Microcontroller
- Memadankan LCD dengan PIC
- Komunikasi I2C menggunakan PIC
- DS3231 RTC berinteraksi dengan PIC
Rajah Litar:
Gambarajah litar untuk Projek Jam Penggera berdasarkan PIC ditunjukkan di bawah, yang dibuat menggunakan perisian proteus. Wasiat ini juga akan digunakan untuk simulasi lebih jauh dalam projek ini.
Lima butang tekan akan bertindak sebagai input untuk mengatur penggera untuk masa yang diperlukan. Oleh itu satu hujung dari semua butang tekan disambungkan ke tanah dan hujung yang lain disambungkan ke pin PORTB, perintang penarik dalaman akan digunakan pada pin ini untuk mengelakkan pin melayang. Buzzer akan bertindak sebagai output dan akan memberi kita bip ketika penggera dipicu dan disambungkan ke pin PORT S. Masa semasa selalu dilacak oleh modul RTC DS3231 dari mana PIC menerima data melalui bas I2C, sehingga pin SCL dan SDA modul RTC disambungkan ke pin SCL dan SDA pengawal PIC. Paparan LCD dilampirkan ke PORTD PIC yang digunakan untuk memaparkan waktu semasa dan waktu yang ditetapkan. Ketahui lebih lanjut mengenai penggunaan modul RTC DS3231 dengan PIC di sini.
Litar lengkap boleh dibina di atas papan roti. Oleh kerana terdapat beberapa lusin wayar untuk disambungkan, jadi sabar dan pastikan sambungannya betul. Penyediaan perkakasan saya kelihatan seperti ini di bawah ini setelah saya selesai dengan sambungan
Saya telah menggunakan modul papan roti dan penyesuai 12V untuk menghidupkan modul. Ini adalah sumber voltan bekalan + 5V saya. Saya juga harus menggunakan dua papan roti untuk memastikan litar sentiasa bersih. Anda juga boleh menyolder keseluruhan litar ke papan perf jika anda ingin membuat projek yang lebih mantap.
Pengaturcaraan untuk Jam Penggera:
The program PIC lengkap untuk projek Jam Penggera ini boleh didapati di bahagian bawah laman ini. Projek ini juga memerlukan tiga perpustakaan untuk menggunakan LCD, I2C dan RTC dengan PIC. Kod lengkap dengan fail tajuk boleh dimuat turun dari fail ZIP di sini dan boleh dibuka menggunakan MPLABX setelah mengekstrak. Di bawah ini saya hanya menerangkan fail c utama sebagai coretan kecil. Anda boleh kembali ke tutorial yang disebutkan di atas jika anda ingin mengetahui bagaimana fail header berfungsi.
Sebelum masuk ke program utama, kita harus menentukan pin yang telah kita gunakan dengan nama yang lebih bermakna. Dengan cara ini akan mudah menggunakannya semasa pengaturcaraan. Pin yang ditentukan dalam program kami ditunjukkan di bawah
// Tentukan pin LCD # tentukan RS RD2 // Tetapkan semula pin LCD #define EN RD3 // Aktifkan pin LCD #define D4 RD4 // Bit data 0 dari LCD # tentukan D5 RD5 // Bit data 1 dari LCD #define D6 RD6 // Data bit 2 dari LCD # tentukan D7 RD7 // Bit data 3 dari LCD // Tentukan Butang # tentukan MB RB1 // Butang tengah # tentukan LB RB0 // Butang kiri # tentukan RB RB2 // Butang kanan # menentukan UB RB3 // Butang Atas #menentukan BB RB4 // Butang bawah // Tentukan Buzz #define BUZZ RD1 // Buzzer disambungkan ke RD1
Di dalam fungsi utama kita mulakan dengan menyatakan pin Input dan output. Dalam projek kami PORTB digunakan untuk menekan butang yang merupakan alat input sehingga kami menetapkan pin mereka sebagai input dan PORTD digunakan untuk LCD dan buzzer sehingga kami menetapkan pin mereka sebagai Output. Juga pin tidak boleh dibiarkan mengambang makna, pin I / O harus selalu disambungkan ke Ground atau voltan + 5V. Dalam kes kami untuk butang tekan, pin tidak akan dihubungkan dengan apa-apa apabila butang tidak ditekan, jadi kami menggunakan perintang penarik dalaman yang menetapkan pin ke Tinggi ketika tidak digunakan. Ini dilakukan dengan menggunakan register kawalan seperti di bawah
TRISD = 0x00; // Jadikan pin Port D sebagai pilihan untuk LCD antara muka TRISB = 0xFF; // Suis dinyatakan sebagai pin input OPTION_REG = 0b00000000; // Aktifkan pull up Resistor pada port B untuk suis BUZZ = 0; // Pusing bel
Oleh kerana kami mempunyai fail header LCD dan I2C yang dihubungkan dengan program utama, kami dapat memulakan inisialisasi LCD dengan memanggil fungsi sederhana. Perkara yang sama boleh dilakukan untuk inisialisasi I2C juga. Di sini kita memulakan komunikasi I2C pada 100kHz kerana modul RTC berfungsi dengan 100kHz.
Lcd_Start (); // Memulakan modul LCD I2C_Initialize (100); // Memulakan I2C Master dengan jam 100KHz
Fungsi di bawah ini digunakan untuk menetapkan waktu dan tarikh pada modul RTC, setelah waktu dan tarikh ditetapkan, hapus baris ini. Lain kali setiap kali anda memulakan program, waktu dan tarikh akan ditetapkan berulang kali
// Buang di bawah garis apabila masa dan tarikh yang ditetapkan untuk kali pertama. Tetapkan_Tarikh_Tarikh (); // tetapkan masa dan tarikh pada modul RTC
Untuk menunjukkan bahawa program sedang dimulakan, kami memaparkan skrin intro kecil yang memaparkan nama projek dan nama laman web seperti yang ditunjukkan di bawah
// Beri mesej pengenalan pada LCD Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Jam Penggera"); Lcd_Set_Cursor (2,1); Lcd_Print_String ("-Circuit Digest"); __delay_ms (1500);
Selanjutnya di dalam loop sementara kita perlu membaca masa dan tarikh semasa dari modul RTC, ini dapat dilakukan dengan hanya memanggil fungsi di bawah.
Kemas kini_Tarikh_Tarikh_Time (); // Baca tarikh dan masa semasa dari modul RTC
Memanggil fungsi di atas akan mengemas kini pemboleh ubah detik, min dan jam dengan nilai semasa. Untuk memaparkannya di layar LCD, kita harus membaginya menjadi watak individu menggunakan kod di bawah.
// Bahagikan menjadi char untuk dipaparkan pada lcd char sec_0 = sec% 10; char sec_1 = (saat / 10); char min_0 = min% 10; char min_1 = min / 10; char hour_0 = jam% 10; char hour_1 = jam / 10;
Seterusnya, kami mengemas kini nilai di skrin LCD. Waktu semasa akan dipaparkan pada baris pertama dan waktu yang ditetapkan di mana penggera harus dipicu ditampilkan di baris kedua. Kod yang melakukan perkara yang sama ditunjukkan di bawah.
// Paparkan Masa Semasa di skrin LCD Lcd_Clear (); Lcd_Set_Cursor (1, 1); Lcd_Print_String ("MASA:"); Lcd_Print_Char (jam_1 + '0'); Lcd_Print_Char (jam_0 + '0'); Lcd_Print_Char (':'); Lcd_Print_Char (min_1 + '0'); Lcd_Print_Char (min_0 + '0'); Lcd_Print_Char (':'); Lcd_Print_Char (sec_1 + '0'); Lcd_Print_Char (sec_0 + '0'); // Paparkan Tarikh pada skrin LCD Lcd_Set_Cursor (2, 1); Lcd_Print_String ("Penggera:"); Lcd_Print_Char (alarm_val + '0'); Lcd_Print_Char (alarm_val + '0'); Lcd_Print_Char (':'); Lcd_Print_Char (alarm_val + '0 '); Lcd_Print_Char (alarm_val + '0');
Sekarang, kita telah menunjukkan waktu dan menetapkan waktu di LCD kita harus memeriksa apakah pengguna berusaha mengatur waktu penggera. Untuk melakukan ini pengguna harus menekan butang tengah, jadi kami akan memeriksa apakah butang tengah ditekan dan beralih pemboleh ubah untuk masuk ke mod set penggera. Butang yang sama akan ditekan lagi untuk mengesahkan bahawa nilainya telah ditetapkan dan dalam hal ini kita harus keluar dari mod set penggera. Oleh itu, kami menggunakan baris kod di bawah untuk mengubah status pemboleh ubah set_alarm .
// Gunakan butang tengah untuk memeriksa apakah penggera harus diatur jika (MB == 0 && set_alarm == 0) {// Sekiranya butang tengah ditekan dan penggera tidak dihidupkan semasa (! MB); // Tunggu sehingga butang dilepaskan set_alarm = 1; // mula menetapkan nilai penggera } jika (MB == 0 && set_alarm == 1) {// Sekiranya butang tengah ditekan dan penggera tidak dimatikan semasa (! MB); // Tunggu sehingga butang dilepaskan set_alarm = 0; // berhenti menetapkan nilai penggera }
Sekiranya pengguna telah menekan butang tengah, maka itu bermaksud bahawa dia sedang berusaha untuk menetapkan waktu penggera. Dalam kes ini, program memasuki mod penggera menggunakan kod di atas. Di dalam mod set penggera jika pengguna menekan butang kiri atau kanan itu bermakna kita harus menggerakkan kursor ke kiri atau ke kanan. Untuk melakukan ini, kita hanya menambah penurunan nilai kedudukan di mana kursor harus diletakkan
if (LB == 0) {// Sekiranya butang kiri ditekan sambil (! LB); // Tunggu sehingga butang dilepaskan pos--; // Kemudian gerakkan kursor ke kiri } if (RB == 0) {// Sekiranya butang kanan ditekan sambil (! RB); // Tunggu sehingga butang dilepaskan pos ++; // Gerakkan kursor ke kanan }
Semasa menggunakan butang tekan dengan mikrokontroler atau mikropemproses ada satu masalah yang sering dihadapi. Masalah ini dipanggil sebagai suis memantul. Iaitu apabila butang ditekan, ia mungkin memberikan denyut bising kepada MCU / MPU yang mungkin memalsukan MCU untuk beberapa entri. Masalah ini dapat diselesaikan dengan menambahkan kapasitor melintasi suis atau dengan menggunakan fungsi kelewatan sebaik sahaja tekan butang dikesan. Jenis penyelesaian ini disebut de-bouncing. Di sini kita telah menggunakan loop sementara untuk menahan program di tempat sehingga butang dilepaskan. Ini bukan penyelesaian penghilang yang terbaik tetapi bagi kami ia akan berjalan lancar.
sementara (! RB);
Sama seperti butang kiri dan kanan, kami juga memiliki butang atas dan bawah yang dapat digunakan untuk menambah atau menurunkan nilai waktu penggera. Kod untuk melakukan perkara yang sama ditunjukkan di bawah. Perhatikan bahawa setiap watak masa penggera yang ditetapkan ditangani oleh nilai indeks array. Ini adalah kita dapat dengan mudah mengakses watak yang diperlukan yang nilainya harus diubah.
if (UB == 0) {// Sekiranya butang atas ditekan semasa (! UB); // Tunggu sehingga butang dilepaskan alarm_val ++; // Tingkatkan nilai char tertentu } jika (BB == 0) {// Sekiranya butang bawah ditekan semasa (! UB); // Tunggu sehingga butang dilepaskan alarm_val--; // Kurangkan nilai char tertentu }
Setelah waktu penggera ditetapkan pengguna akan menekan butang tengah sekali lagi. Maka kita boleh mula membandingkan masa sekarang dengan masa yang ditetapkan. Perbandingan dengan memeriksa sama ada setiap watak masa sekarang sama dengan watak masa yang ditetapkan. Sekiranya nilainya sama maka kita mencetuskan penggera dengan menetapkan pemboleh ubah trigger_alarm yang lain kita hanya membandingkan sehingga ia sama.
// JIKA penggera diatur Periksa sama ada nilai set sama dengan nilai semasa jika (set_alarm == 0 && alarm_val == hour_1 && alarm_val == hour_0 && alarm_val == min_1 && alarm_val == min_0) trigger_alarm = 1; // Hidupkan pencetus jika nilai sepadan
Sekiranya penggera diatur, kita harus membunyikan bel untuk memberi amaran kepada pengguna mengenai penggera. Ini dapat dilakukan dengan hanya menukar Buzzer pada selang waktu seperti yang ditunjukkan di bawah.
if (trigger_alarm) {// Sekiranya penggera dicetuskan // Bunyikan buzzer BUZZ = 1; __delay_ms (500); BUZZ = 0; __delay_ms (500); }
Simulasi:
Program ini juga dapat disimulasikan menggunakan perisian proteus. Cukup buat semula litar yang ditunjukkan di atas dan muatkan fail hex ke dalam PIC. Kod hex untuk projek ini boleh didapati di fail ZIP yang dipautkan di sini. Rakaman skrin yang diambil semasa simulasi ditunjukkan di bawah
Simulasi menjadi sangat berguna ketika anda cuba menambahkan ciri baru pada projek tersebut. Anda juga boleh menggunakan modul debugger I2C untuk memeriksa data apa yang masuk dan keluar melalui bas I2C. Anda boleh mencuba menekan butang dan juga menetapkan waktu penggera. Apabila masa yang ditetapkan sama dengan waktu semasa maka bel akan naik tinggi.
Mengendalikan Jam Penggera Digital menggunakan PIC16F877A:
Bina litar di papan roti, dapatkan kod dari pautan muat turun dan kumpulkan dengan menggunakan penyusun MplabX dan XC8. Sekiranya anda telah memuat turun kod dari fail ZIP yang disediakan di sini, maka anda seharusnya tidak mempunyai masalah untuk menyusunnya kerana fail header sudah dilampirkan.
Setelah menyusun muat naik program ke perkakasan anda menggunakan programmer PicKit3. Sambungan untuk menghubungkan pengaturcara pickit ke IC PIC juga ditunjukkan dalam rajah litar. Setelah program dimuat, anda akan melihat layar intro dan kemudian waktu yang dipaparkan, anda kemudian boleh menggunakan butang tekan untuk mengatur waktu penggera. Penyediaan perkakasan saya ketika dihidupkan kelihatan seperti di bawah ini.
Apabila waktu penggera sesuai dengan waktu semasa, bel akan mula berbunyi untuk membimbangkan pengguna. Kerja lengkapnya boleh didapati di video di bawah. Projek ini mempunyai banyak pilihan untuk dibangunkan. Modul RTC dapat melacak setiap waktu dan tarikh, jadi anda dapat melakukan tugas yang dijadualkan pada bila-bila masa / tarikh yang diperlukan. Anda juga boleh menyambungkan alat AC seperti kipas atau lampu dan menjadwalkannya untuk menghidupkan atau mematikan apabila diperlukan. Masih banyak lagi yang dapat anda bina berdasarkan projek ini, beritahu saya idea apa yang terlintas di fikiran anda sebagai peningkatan kepada projek ini dan saya akan senang mendengarnya daripada anda.
Harap anda memahami projek dan mengetahui sesuatu yang berguna dari prosesnya. Sekiranya anda mempunyai keraguan dalam projek ini, gunakan bahagian komen untuk menghantarnya atau gunakan forum untuk sebarang bantuan teknikal.
Kod PIC lengkap dengan fail tajuk boleh didapati di sini