Isi kandungan:

Monitor Suhu dan Tahap Cahaya Dengan Paparan di LCD NOKIA 5110: 4 Langkah
Monitor Suhu dan Tahap Cahaya Dengan Paparan di LCD NOKIA 5110: 4 Langkah

Video: Monitor Suhu dan Tahap Cahaya Dengan Paparan di LCD NOKIA 5110: 4 Langkah

Video: Monitor Suhu dan Tahap Cahaya Dengan Paparan di LCD NOKIA 5110: 4 Langkah
Video: Bimbingan Teknis Interpretasi Citra Satelit (Rabu, 7 Oktober 2020) 2024, Julai
Anonim
Image
Image

Hai semua!

Di bahagian ini kami membuat alat elektronik sederhana untuk memantau suhu dan tahap cahaya. Pengukuran parameter ini ditunjukkan pada LCD NOKIA 5110. Peranti ini berdasarkan mikrokontroler AVR ATMEGA328P. Peranti pemantauan dilengkapi termometer digital DS18B20 dan fotoresistor untuk mengukur tahap cahaya.

Langkah 1: Komponen Penerangan

Komponen Huraian
Komponen Huraian
Komponen Huraian
Komponen Huraian

Komponen asas peranti pemantauan:

  • Mikrokontroler AVR «ATMEGA328P»
  • LCD Grafik Monokrom «NOKIA 5110»
  • Resolusi 1-Wayar Digital Termometer yang Boleh Diprogramkan «DS18B20»
  • Perintang bergantung cahaya
  • Wayar

Mikrokontroler AVR «ATMEGA328P»

Peranti pemantauan menggunakan ciri mikrokontroler berikut:

  1. Pemasa / Kaunter 16-bit mengganggu
  2. ADC 10-bit 8-saluran
  3. Antara muka bersiri SPI induk / hamba

LCD Grafik Monokrom «NOKIA 5110»

Spesifikasi:

  1. Paparan LCD 48 x 84 Dot
  2. Antaramuka Bas Bersiri dengan kelajuan tinggi maksimum 4 Mbits / S
  3. Pengawal Dalaman / Pemandu «PCD8544»
  4. Lampu Belakang LED
  5. Jalankan pada Voltan 2.7-5 Volt
  6. Penggunaan kuasa rendah; ia sesuai untuk aplikasi bateri
  7. Suhu antara -25˚C hingga + 70˚C
  8. Input CMOS Isyarat Sokongan

Pengendalian Alamat LCD (Pengalamatan):

Susunan alamat memori yang ditunjukkan pada Paparan LCD (DDRAM) adalah Matriks yang terdiri dari 6 baris (Alamat Y) dari Y-Alamat 0 hingga Y-Alamat 5 dan 84 lajur (Alamat X) dari X-Alamat 0 hingga X- Alamat 83. Sekiranya pengguna ingin mengakses ke kedudukan memaparkan hasil pada Paparan LCD, mesti merujuk pada hubungan antara Alamat X dan Alamat-Y.

Data yang akan dihantar untuk dipaparkan adalah 8 bit (1 Byte) dan ia akan disusun sebagai garis menegak; dalam kes ini, Bit MSB akan lebih rendah dan Bit LSB akan lebih tinggi seperti yang ditunjukkan dalam gambar.

Resolusi Boleh Diprogram 1-Wire Digital Thermometer DALLAS «DS18B20»

Ciri-ciri:

  1. Antaramuka 1-Wire® Unik Hanya Memerlukan Satu Pin Port untuk Komunikasi
  2. Kurangkan Kiraan Komponen dengan Sensor Suhu Bersepadu dan EEPROM
  3. Mengukur Suhu dari -55 ° C hingga + 125 ° C (-67 ° F hingga + 257 ° F)
  4. ± 0.5 ° C Ketepatan dari -10 ° C hingga + 85 ° C
  5. Resolusi Boleh Diprogramkan dari 9 Bits hingga 12 Bits
  6. Tidak Perlu Komponen Luaran
  7. Mod Kuasa Parasit Hanya Memerlukan 2 Pin untuk Operasi (DQ dan GND)
  8. Memudahkan Aplikasi Sensing Suhu Terdistribusi dengan Keupayaan Multidrop
  9. Setiap Peranti Mempunyai Kod Siri 64-Bit Unik yang Disimpan dalam ROM On-Board
  10. Tetapan Penggera Tidak Bervolatile (NV) yang Boleh Digunakan oleh Pengguna yang Fleksibel dengan Perintah Carian Penggera Mengenal pasti Peranti dengan Suhu Di Luar Had yang Diprogramkan

Permohonan:

  1. Kawalan Termostatik
  2. Sistem Perindustrian
  3. Produk pengguna
  4. Termometer
  5. Sistem Sensitif Termal

Perintang bergantung cahaya

Light Dependent Resistor (LDR) adalah transduser yang mengubah rintangannya apabila cahaya jatuh di permukaannya berubah.

Biasanya LDR akan mempunyai dari satu megaOhms hingga dua megaOhms pada kegelapan total, dari sepuluh hingga dua puluh kiloOhms pada sepuluh LUX, dari dua hingga lima kiloohms pada 100 LUX. Rintangan antara dua kenalan sensor menurun dengan intensiti cahaya atau kekonduksian antara dua kenalan sensor meningkat.

Gunakan litar pembahagi voltan untuk menukar perubahan rintangan kepada perubahan voltan.

Langkah 2: Kod Firmware Mikrokontroler

#ifndef F_CPU # define F_CPU 16000000UL // memberitahu frekuensi kristal pengawal (16 MHz AVR ATMega328P) #endif

// SPI INTERFACE DEFINES #define MOSI 3 // MOSI itu PORT B, PIN 3 #define MISO 4 // MISO itu PORT B, PIN 4 #define SCK 5 // SCK itu PORT B, PIN 5 #define SS 2 // SS itu PORT B, PIN 2

// RESET TAMPILAN #define RST 0 // RESET itu PORT B, PIN 0

// PILIH MODE TAMPILAN - Input untuk memilih sama ada arahan / alamat atau input data. #tentukan DC 1 // DC itu PORT B, PIN 1

// kod tatasusunan konstanta negatif yang tidak ditandatangani char neg [4] = {0x30, 0x30, 0x30, 0x30};

// kod tatasusunan digit [0..9] char static unsigned char font6x8 [10] [16] = {{0xFC, 0xFE, 0xFE, 0x06, 0x06, 0xFE, 0xFE, 0xFC, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01}, // 0 {0x00, 0x00, 0x18, 0x1C, 0xFE, 0xFE, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x01, 0x00}, // 1 { 0x0C, 0x8E, 0xCE, 0xE6, 0xE6, 0xBE, 0x9E, 0x0C, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01}, // 2 {0x00, 0x04, 0x06, 0x, 0x, 0x8C, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01}, // 3 {0x3C, 0x3E, 0x7C, 0x60, 0x60, 0xFC, 0xFE, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x01, 0x03, 0x01}, // 4 {0x1C, 0x3E, 0x3E, 0x36, 0x36, 0xF6, 0xF6, 0xE4, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01}, // 5 {0 0xFE, 0xFE, 0x36, 0x36, 0xF6, 0xF6, 0xE4, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01}, // 6 {0x04, 0x06, 0x06, 0x86, 0x, 0x00, 0x00, 0x00, 0x01, 0x03, 0x01, 0x00, 0x00}, // 7 {0xCC, 0xFE, 0xFE, 0x36, 0x36, 0xFE, 0xFE, 0xCC, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03 0x0 3, 0x01}, // 8 {0x3C, 0x7E, 0x7E, 0x66, 0x66, 0xFE, 0xFE, 0xFC, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01} // 9};

// kod susunan kata "TEMP:" stat stat const unsigned char TEMP_1 [165] = {0x02, 0x06, 0x06, 0xFE, 0xFE, 0xFE, 0x06, 0x06, 0x02, 0x00, 0xFC, 0xFE, 0xFE, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26 0x24, 0x00, 0xFC, 0xFE, 0xFE, 0x1C, 0x38, 0x70, 0x38, 0x1C, 0xFE, 0xFE, 0xFC, 0x00, 0xFC, 0xFE, 0xFE, 0x66, 0x66, 0x7E, 0x7E, 0x8, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7 0x00, 0x00, 0x00, 0x01, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x01, 0x00, 0x01, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x01, 0x03, 0x01, 0x00, 0x01, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0C, 0x1E, 0x33, 0x33, 0x1E, 0x0C, 0x00, 0x0, 0x00, 0x00, 0x00, 0x 0x9C, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x01,};

// kod susunan kata "LUX:" const unsigned char TEMP_2 [60] = {0xFC, 0xFE, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFE, 0xFC, 0x00, 0x00, 0xFC, 0xFE, 0xFC, 0x00, 0x04, 0x8E, 0xDE, 0xFC, 0xF8, 0xFC, 0xDE, 0x8E, 0x04, 0x00, 0x8C, 0x8C, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x00, 0x01, 0x03, 0x03, 0x01, 0x00, 0x01, 0x03, 0x03, 0x01, 0x00, 0x01, 0x01};

#sertakan

#sertakan #sertakan

// Port Initializationvoid Port_Init () {DDRB = (1 << MOSI) | (1 << SCK) | (1 << SS) | (1 << RST) | (1 << DC); // Tetapkan MOSI, SCK, SS, RST, DC sebagai output, semua yang lain memasukkan PORTB | = (1 << RST); // Tetapkan pin RST setinggi PORTB | = (1 << SS); // Tetapkan pin SS setinggi - Paparan adalah Lumpuhkan DDRC = 0xFFu; // Tetapkan semua pin PORTC sebagai output. DDRC & = ~ (1 << 0); // Menjadikan pin pertama PORTC sebagai Input PORTC = 0x00u; // Tetapkan semua pin PORTC rendah yang mematikannya. }

// ADC Initialization batal ADC_init () {// Aktifkan ADC, pengambilan sampel freq = osc_freq / 128 set prescaler ke nilai maksimum, 128 ADCSRA | = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); ADMUX = (1 << REFS0); // Pilih rujukan voltan untuk ADC // Pilih saluran sifar secara lalai menggunakan ADC Multiplexer Select register (ADC0). }

// Fungsi untuk membaca hasil penukaran analog ke digital uint16_t get_LightLevel () {_delay_ms (10); // Tunggu beberapa saat sehingga saluran terpilih ADCSRA | = (1 << ADSC); // Mulakan penukaran ADC dengan menetapkan bit ADSC. tulis 1 ke ADSC sementara (ADCSRA & (1 << ADSC)); // tunggu penukaran selesai // ADSC menjadi 0 lagi sehingga kemudian, jalankan gelung berterusan _delay_ms (10); pulangan (ADC); // Kembalikan hasil 10-bit}

// Permulaan SPI batal SPI_Init () {SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0); // Aktifkan SPI, Tetapkan sebagai Master, Tetapkan Prescaler sebagai Fosc / 16 dalam kawalan SPI daftar}

// inisialisasi 16 bit Timer1, interrupt dan variabel void TIMER1_init () {// tetapkan pemasa dengan prescaler = 256 dan mod CTC TCCR1B | = (1 << WGM12) | (1 << CS12); // memulakan kaunter TCNT1 = 0; // memulakan nilai perbandingan - 1 saat OCR1A = 62500; // aktifkan membandingkan gangguan TIMSK1 | = (1 << OCIE1A); // aktifkan gangguan global sei (); }

// Paparan Aktifkan kekosongan SPI_SS_Enable () {PORTB & = ~ (1 << SS); // Aktifkan pin SS untuk logik 0}

// Paparan Lumpuhkan tidak sah SPI_SS_Disable () {PORTB | = (1 << SS); // Lumpuhkan pin SS untuk logik 1}

// Fungsi untuk menghantar data ke dalam buffer paparan kosong SPI_Tranceiver (data char yang tidak ditandatangani) {SPDR = data; // Muatkan data ke dalam penyangga sementara (! (SPSR & (1 << SPIF))); // Tunggu sehingga penghantaran selesai}

// Tetapkan semula Paparan pada awal inisialasi kosong Display_Reset () {PORTB & = ~ (1 << RST); _delay_ms (100); PORTB | = (1 << RST); }

// Fungsi tulis perintah tidak sah Display_Cmnd (data char yang tidak ditandatangani) {PORTB & = ~ (1 << DC); // buat pin DC ke logik 0 untuk operasi perintah SPI_Tranceiver (data); // hantar data pada daftar data PORTB | = (1 << DC); // jadikan pin DC ke logik tinggi untuk operasi data}

// Permulaan Paparan kosong Display_init () {Display_Reset (); // tetapkan semula paparan Display_Cmnd (0x21); // perintah ditetapkan dalam mod tambahan Display_Cmnd (0xC0); // tetapkan voltan dengan menghantar C0 bermaksud VOP = 5V Display_Cmnd (0x07); // tetapkan suhu. pekali hingga 3 Display_Cmnd (0x13); // tetapkan nilai Voltage Bias System Display_Cmnd (0x20); // arahan ditetapkan dalam mod asas Display_Cmnd (0x0C); // hasil paparan dalam mod biasa}

// Kosongkan paparan kekosongan Display_Clear () {PORTB | = (1 << DC); // jadikan pin DC ke logik tinggi untuk operasi data untuk (int k = 0; k <= 503; k ++) {SPI_Tranceiver (0x00);} PORTB & = ~ (1 << DC); // jadikan pin DC ke logik sifar untuk operasi arahan}

// tetapkan lajur dan baris ke posisi memaparkan hasil pada Paparan LCD batal Display_SetXY (char x unsigned, char unsigned y) {Display_Cmnd (0x80 | x); // lajur (0-83) Paparan_Cmnd (0x40 | y); // baris (0-5)}

// Fungsi untuk memaparkan tanda negatif batal Display_Neg (tanda tidak ditandatangani) {Display_SetXY (41, 0); // Tetapkan alamat posisi di paparan untuk (int index = 0; index0) {SPDR = 0x30;} // Muatkan data ke dalam buffer display (tanda negatif display) yang lain {SPDR = 0x00;} // Muatkan data ke penampan paparan (tanda negatif yang jelas) sementara (! (SPSR & (1 << SPIF))); // Tunggu sehingga penghantaran selesai _delay_ms (100); }}

// Fungsi untuk mengosongkan tanda digital dari Off_Dig (char x yang tidak bertanda tangan, char yang tidak ditandatangani) {Display_SetXY (x, y); // Tetapkan alamat posisi di paparan (baris atas) untuk (int index = 0; index <8; index ++) {SPI_Tranceiver (0);} // Muatkan data ke dalam buffer display (bahagian atas tanda digital yang jelas) y ++; Display_SetXY (x, y); // Tetapkan alamat kedudukan di paparan (baris bawah) untuk (int index = 0; index <8; index ++) {SPI_Tranceiver (0);} // Muatkan data ke dalam buffer display (bahagian bawah tanda digital yang jelas)}

// Fungsi untuk memaparkan tanda digital kosong Display_Dig (int dig, char x unsigned, char unsigned y) {Display_SetXY (x, y); // Tetapkan alamat kedudukan di paparan (baris atas) untuk (int index = 0; index <16; index ++) {if (index == 8) {y ++; Display_SetXY (x, y);} // Tetapkan alamat kedudukan pada paparan (baris bawah) SPI_Tranceiver (font6x8 [dig] [index]); // Muatkan kod susunan data digit ke dalam penyangga paparan _delay_ms (10); }}

// Permulaan DS18B20 char tidak bertanda DS18B20_init () {DDRD | = (1 << 2); // Tetapkan pin PD2 PORTD sebagai output PORTD & = ~ (1 << 2); // Tetapkan pin PD2 sebagai _delay_us rendah (490); // Masa Permulaan DDRD & = ~ (1 << 2); // Tetapkan pin PD2 PORTD sebagai input _delay_us (68); // Waktu OK_Flag = (PIND & (1 << 2)); // dapatkan denyutan sensor _delay_us (422); kembali OK_Flag; // kembali sensor 0-ok adalah palam, sensor 1-ralat dicabut}

// Fungsi membaca byte dari DS18B20 char unsigned read_18b20 () {char unsigned, data = 0; untuk (i = 0; i <8; i ++) {DDRD | = (1 << 2); // Tetapkan pin PD2 PORTD sebagai output _delay_us (2); // Timing DDRD & = ~ (1 1; // Next bit if (PIND & (1 << 2)) data | = 0x80; // masukkan bit ke dalam bait _delay_us (62);} kembalikan data;}

// Fungsi untuk menulis byte ke DS18B20 batal write_18b20 (data char yang tidak ditandatangani) {char i yang tidak ditandatangani; untuk (i = 0; i <8; i ++) {DDRD | = (1 << 2); // Tetapkan pin PD2 PORTD sebagai output _delay_us (2); // Masa jika (data & 0x01) DDRD & = ~ (1 << 2); // jika kita mahu menulis 1, lepaskan baris lain DDRD | = (1 1; // Next bit _delay_us (62); // Timing DDRD & = ~ (1 << 2); // Tetapkan pin PD2 dari PORTD sebagai input _delay_us (2);}}

// Fungsi untuk memaparkan tahap cahaya kosong Read_Lux () {uint16_t buffer; tidak bertanda int temp_int_1, temp_int_2, temp_int_3, temp_int_0; // satu digit, dua digit, tiga digit, penyangga seperempat digit = get_LightLevel (); // baca hasil penukaran analog ke digital temp_int_0 = buffer% 10000/1000; // tri-digit temp_int_1 = penampan% 1000/100; // triple-digit temp_int_2 = penampan% 100/10; // temp_int_3 dua digit = penampan% 10; // satu digit jika (temp_int_0> 0) // jika hasilnya adalah nombor seperempat digit {Display_Dig (temp_int_0, 32, 2); // paparkan 1 digit tahap cahaya Display_Dig (temp_int_1, 41, 2); // paparkan 2 digit tahap cahaya Display_Dig (temp_int_2, 50, 2); // paparkan 3 digit tahap cahaya Display_Dig (temp_int_3, 59, 2); // paparkan 4 digit tahap cahaya} yang lain {if (temp_int_1> 0) // jika hasilnya adalah nombor tiga digit {Off_Dig (32, 2); // kosongkan 1 tanda nombor Display_Dig (temp_int_1, 41, 2); // paparkan 1 digit tahap cahaya Display_Dig (temp_int_2, 50, 2); // paparkan 2 digit tahap cahaya Display_Dig (temp_int_3, 59, 2); // paparkan 3 digit tahap cahaya} yang lain {if (temp_int_2> 0) // jika hasilnya adalah nombor dua digit {Off_Dig (32, 2); // kosongkan 1 tanda nombor Off_Dig (41, 2); // kosongkan 2 tanda nombor Display_Dig (temp_int_2, 50, 2); // paparkan 1 digit tahap cahaya Display_Dig (temp_int_3, 59, 2); // paparkan 2 digit tahap cahaya} yang lain // jika hasilnya adalah nombor satu digit {Off_Dig (32, 2); // kosongkan 1 tanda nombor Off_Dig (41, 2); // kosongkan 2 tanda nombor Off_Dig (50, 2); // jelaskan 3 tanda nombor Display_Dig (temp_int_3, 59, 2); // paparkan 1 digit tahap cahaya}}}}

// Fungsi untuk memaparkan suhu tidak sah Read_Temp () {buffer int yang tidak ditandatangani; int temp_int_1 yang tidak ditandatangani, temp_int_2, temp_int_3; // satu digit, dua digit, tiga digit, seperempat digit tidak ditandai char Temp_H, Temp_L, OK_Flag, temp_flag; DS18B20_init (); // Permulaan DS18B20 write_18b20 (0xCC); // Semak kod sensor tulis_18b20 (0x44); // Mula penukaran suhu _delay_ms (1000); // Penundaan pengundian sensor DS18B20_init (); // Permulaan DS18B20 write_18b20 (0xCC); // Periksa kod sensor tulis_18b20 (0xBE); // Perintah untuk membaca kandungan Sensor RAM Temp_L = read_18b20 (); // Baca dua bait pertama Temp_H = read_18b20 (); temp_flag = 1; // Suhu 1-positif, suhu 0-negatif // Dapatkan suhu negatif jika (Temp_H & (1 << 3)) // Tandakan Bit Periksa (jika bit ditetapkan - suhu negatif) {suhu int ditandatangani; temp_flag = 0; // bendera ditetapkan 0 - suhu suhu negatif = (Temp_H << 8) | Temp_L; temp = -temp; // Tukarkan kod tambahan dalam Temp_L = temp langsung; Temp_H = temp >> 8; } buffer = ((Temp_H 4); temp_int_1 = buffer% 1000/100; // temple-digit temp_int_2 = buffer% 100/10; // dua digit temp_int_3 = buffer% 10; // satu digit

// Sekiranya suhu adalah paparan negatif tanda suhu, yang lain jelas

if (temp_flag == 0) {Display_Neg (1);} lain {Display_Neg (0);} if (temp_int_1> 0) // jika hasilnya adalah nombor tiga digit {Display_Dig (temp_int_1, 45, 0); // paparkan 1 digit suhu Display_Dig (temp_int_2, 54, 0); // paparkan 2 digit suhu Display_Dig (temp_int_3, 63, 0); // paparkan 3 digit suhu} yang lain {if (temp_int_2> 0) // jika hasilnya adalah nombor dua digit {Off_Dig (45, 0); // kosongkan 1 tanda nombor Display_Dig (temp_int_2, 54, 0); // paparkan 1 digit suhu Display_Dig (temp_int_3, 63, 0); // paparkan 2 digit suhu} lain // jika hasilnya adalah nombor satu digit {Off_Dig (45, 0); // kosongkan 1 tanda nombor Off_Dig (54, 0); // jelaskan 2 tanda nombor Display_Dig (temp_int_3, 63, 0); // paparkan 1 digit suhu}}}

// ISR ini dilancarkan setiap kali berlaku pencocokan jumlah pemasa dengan nilai perbandingan (setiap 1 saat) ISR (TIMER1_COMPA_vect) {// Membaca, memaparkan suhu dan tahap cahaya Read_Temp (); Baca_Lux (); }

// Fungsi untuk memaparkan perkataan "TEMP" dan "LUX" batal Display_label () {// Kata "TEMP" Display_SetXY (0, 0); // Tetapkan alamat posisi pada paparan (baris atas) untuk (int index = 0; index <105; index ++) {if (index == 40) {Display_SetXY (0, 1);} // Tetapkan alamat kedudukan di paparan (baris bawah) jika (indeks == 80) {Display_SetXY (72, 0);} // Tetapkan alamat kedudukan di paparan (baris atas) jika (indeks == 92) {Display_SetXY (72, 1); } // Tetapkan alamat kedudukan di paparan (baris bawah) SPDR = TEMP_1 [indeks]; // Muatkan data array kod ke dalam penyangga paparan semasa (! (SPSR & (1 << SPIF))); // Tunggu sehingga penghantaran selesai _delay_ms (10); } // Perkataan "LUX" Display_SetXY (0, 2); // Tetapkan alamat kedudukan pada paparan (baris atas) untuk (int index = 0; index <60; index ++) {if (index == 30) {Display_SetXY (0, 3);} // Tetapkan alamat kedudukan di paparan (baris bawah) SPDR = TEMP_2 [indeks]; // Muatkan data array kod ke dalam penyangga paparan semasa (! (SPSR & (1 << SPIF))); // Tunggu sehingga penghantaran selesai _delay_ms (10); }}

int utama (tidak sah)

{Port_Init (); // Permulaan Port ADC_init (); // Permulaan ADC SPI_Init (); // Permulaan SPI SPI_SS_Aktifkan (); // Paparan Aktifkan DS18B20_init (); // Permulaan DS18B20 Display_init (); // Permulaan paparan Display_Clear (); // Paparan label Display_ jelas (); // Paparkan perkataan "TEMP" dan "LUX" TIMER1_init (); // Permulaan 1 Pemasa. Mulakan pemantauan. Mendapatkan parameter setiap satu saat. // Gelung tak terhingga semasa (1) {}}

Langkah 3: Berkelip Firmware ke Mikrokontroler

Memuat naik fail HEX ke dalam memori flash mikrokontroler. Tonton video dengan penerangan terperinci mengenai pembakaran memori kilat mikrokontroler: Pembakaran memori kilat mikrokontroler…

Langkah 4: Pemasangan Litar Peranti Pemantauan

Pemasangan Litar Peranti Pemantauan
Pemasangan Litar Peranti Pemantauan
Pemasangan Litar Peranti Pemantauan
Pemasangan Litar Peranti Pemantauan

Sambungkan komponen mengikut gambarajah skematik.

Pasang kuasa dan ia berfungsi!

Disyorkan: