Implementácia LED dýchacieho svetla pomocou mikrokontroléra 51

Jun 11, 2026 Zanechajte správu

[Úvod]


Technológia mikrokontrolérov je nepostrádateľnou mainstreamovou technológiou v modernej priemyselnej automatizácii, elektronike, elektrotechnike a internete vecí (IoT). Ako sa naše životy stávajú čoraz inteligentnejšími, technológia mikrokontrolérov prenikla prakticky do všetkých aspektov nášho každodenného života, napríklad do inteligentných varičov ryže, inteligentných reproduktorov a ďalších.


S ohľadom na túto skutočnosť je cieľom série článkov „Relearning the 51 Microcontroller“ pomôcť začiatočníkom začať s technológiou mikrokontrolérov. Začneme najjednoduchšou úlohou-zapnutím jednej LED diódy-a postupne pokročíme k implementácii modulov, ako sú tlačidlá, displej LCD1602, snímače teploty DS18B20 a DS1302 a komunikácia medzi dvoma mikrokontrolérmi. Budeme sa zaoberať aj hardvérovými komunikačnými protokolmi ako UART, I²C a SPI. Skombinovaním týchto konceptov s technikami programovania v jazyku C použijeme skutočné{10}projekty inžinierstva sveta na ilustráciu programovacích prístupov, čo vám umožní flexibilne použiť ukazovatele a štruktúry v jazyku C na dosiahnutie modulárneho programovania.


Teraz sa vráťme k hlavnej téme: použitie 51 mikrokontroléra na ovládanie LED a vytvorenie efektu dýchacieho svetla.

 

[Ako fungujú dýchacie svetlá]


Poďme sa najprv pozrieť na to, ako funguje efekt dýchacieho svetla.
Dýchacie svetlo sa postupne rozjasňuje a potom postupne stmieva, pričom sa tento cyklus opakuje spôsobom, ktorý pripomína dýchanie. Keďže však kolíky mikrokontroléra môžu vydávať iba 1 (zapnuté) alebo 0 (vypnuté), ako možno dosiahnuť efekt postupného prechodu?
Je to kvôli pretrvávaniu videnia v našich očiach. Keď sa na niečo pozeráme, obraz vytvorený našimi očami pretrváva 0,04 sekundy (tento údaj bol nájdený online).
Ak počítame na základe 0,04 sekundy, rovná sa to 40 ms. Preto, keď sa LED dióda rozsvieti a zhasne na 20 ms, ľudskému oku sa zdá, ako keby neustále svietila.

图片

Je účinok blikania LED na 20 ms a zhasnutia na 20 ms rovnaký, ako keby svietila stále?

 

Haha, určite je to iné. Keď sa svetlo striedavo zapína a vypína každých 20 milisekúnd, efekt, ktorý vidíme, je slabší, ako keď svieti nepretržite. Ak predpokladáme, že jas nepretržite svietiaceho svetla je 100 %, potom jas svetla, ktoré sa striedavo zapína a vypína každých 20 milisekúnd, je 50 %. Na základe toho môžeme upraviť jas LED.

图片

 

V tomto bode môžeme upraviť jas LED (nastavením trvania vysokej úrovne v rámci 40ms cyklu). Toto je princíp-známej metódy PWM (Pulse Width Modulation) ovládania jasu a nastavenie trvania vysokej úrovne je ekvivalentné úprave pracovného cyklu (tj trvanie vysokej úrovne vydelené celkovým cyklom: 20/40=50%).


Tu je najdôležitejším faktorom tento pracovný cyklus. Napríklad, ak je perióda 20 ms, pričom LED dióda svieti striedavo medzi 10 ms a 10 ms zhasnutá, vnímaný jas je stále 50 % (tj pracovný cyklus je 10/20=50 %).

Ďalej sa pozrime, ako je to implementované v programe.

 

[Implementácia programu]


Zapnutie LED
Najprv začnime zapnutím LED a potom postupne implementujeme efekt dýchacieho svetla. Hardvér, ktorý budeme používať, je nasledujúci:

rozvojová rada ZeroOne Microcontroller Training Development Board
Model mikrokontroléra STC89C52
Rozhranie LED Pin P4^4
图片

 

Zo schémy vidíme, že LED je pripojená na kolík P4^4 mikrokontroléra. Keď mikrokontrolér vydá 1, LED sa rozsvieti; keď je na výstupe 0, LED zhasne. Preto je program na zapnutie LED pomerne jednoduchý, ako je uvedené nižšie:

info-299-230

 

 

Program na zapnutie LED je pomerne jednoduchý; Určite každý vie, ako na to.
 

Nastavenie jasu LED


Ďalej implementujeme funkciu, ktorá nám umožňuje upraviť jas (tj upraviť pracovný cyklus) takto:

info-400-538


 

Definujte statickú premennú `duty_cycle` na uloženie pracovného cyklu. Keď je „príznak“ 1, pracovný cyklus sa postupne zvýši na 255, potom sa „príznak“ nastaví na 0 a „príznak“ sa postupne zníži z 255 na 0. Tento cyklus zopakujte.
Haha, v tomto bode si možno myslíte, že dýchacie svetlo už funguje, ale nie je to tak. Ak mi neveríte, vyskúšajte kód vyššie.

Kde je teda presne problém?


Problém spočíva v našom priamom volaní{0}}funkcie nastavenia jasu `set_led_luminance()`. Tejto funkcii trvá dokončenie jedného cyklu 40 ms, čo znamená, že pracovný cyklus sa počas týchto 40 ms nedá zmeniť; inak nebude nastavenie jasu fungovať. Pozrime sa ešte raz na funkciu `breath_led`. Po každom volaní funkcie `set_led_luminance()` na nastavenie pracovného cyklu sa okamžite zmení hodnota `duty_cycle` bez čakania 40 ms.


V tomto bode musíme pridať softvérový časovač na aktualizáciu hodnoty `duty_cycle` po uplynutí 40 ms. Upravený program je nasledovný:

info-495-656

 

 

Poznámka: Trvanie časovača musí byť väčšie ako 40 ms (to znamená, že hodnota `s_breathCounter` musí byť väčšia ako 255), ale najlepšie je nastaviť ho na násobok cyklu. Napríklad, ak je náš cyklus 255 (tj 256 hodnôt od 0 do 255), môžeme ho nastaviť na dvojnásobok tejto hodnoty: 256 * 2 - 1=511 (tj 512 hodnôt od 0 do 511).
A tu to máte-naše dýchacie svetlo je hotové! Nie je to jednoduché? (* ̄︶ ̄)

 

Nasleduje dnešná bonusová časť.

Hoci sme dosiahli efekt dýchajúceho svetla, kód nie je celkom stručný ani dostatočne elegantný-používa množstvo príkazov if a else. Uvidíme, či to dokážeme ešte viac zjednodušiť.

Najprv si túto časť funkcie set_led_luminance() zjednodušíme, ako je znázornené na obrázku nižšie.
 

图片

 

Predtým, ako to zjednodušíme, pokryjeme rýchly tip o C: bitovú operáciu AND.

info-600-117

 

Z toho vieme, že či už je to 1 alebo 0, vykonanie bitovej operácie AND s 0 má za následok 0.

Či už je to 1 alebo 0, vykonanie bitovej operácie AND s 1 vedie k pôvodnej hodnote.

Pre pohodlie používame hexadecimálny zápis (s predponou "0x"); napríklad 0xff zodpovedá 255 v desiatkovej sústave. preto

 

Keď je číslo menšie alebo rovné 0xff spojené AND s 0xff, výsledkom je samotné číslo, ako je uvedené nižšie

info-534-63

 

 

Čo sa stane, ak vykonáte bitovú operáciu AND medzi číslom väčším ako 0xff a 0xff?

info-551-63

Výsledkom je zvyšok, keď sa toto číslo vydelí (0xff + 1) (tj výsledok je stále medzi 0 a 0xff).
Pomocou tejto bitovej operácie AND je možné kód vyššie zjednodušiť

info-550-64

 

 

Týmto spôsobom bude hodnota s_Counter vždy v rozsahu 0x00 až 0xff.
Podobne, softvérový časovač vo funkcii breath_led vyššie možno tiež zjednodušiť takto:

info-389-353

V riadku 3 je 0x1ff 511 v desiatkovej sústave. Podmienka je pravdivá, keď je hodnota s_breathCounter (0x1ff+1), alebo 512, pretože 512 & 0x1ff=0. Výkričník pred ňou označuje bitovú operáciu NOT (presnejšie povedané, podmienka je splnená, keď je hodnota `s_breathCounter` násobkom 51`s_Counter;` s elimináciou 51;` Dúfam, že toto vysvetlenie je jasné-premyslite si to). Ak je podmienka splnená, pracovný cyklus sa začne zvyšovať alebo znižovať.


Ale nie je rozsah pracovného cyklu 0 až 255? Prečo sa riadok 5 tiež zmení na 0x1ff (511)? Nebojte sa-pozrite sa na riadok 8. Znova odpočítame 0xff, takže rozsah pracovného cyklu zostane od 0 do 255.


Riadky 7–10 znamenajú: Keď `pracovný_cyklus > (0xff)`, tj 256–511, odčítanie 0xff je ekvivalentné zvýšeniu z 1 na 255, takže jas sa postupne zvyšuje.


Keď clo_cycle<= 0xff, the duty_cycle increases from 0 to 255, while the set brightness is 255 - duty_cycle. This effectively decreases the brightness from 255 to 0, causing the light to gradually dim. This achieves the breathing light effect.


Haha, mysleli ste si, že naše zjednodušenie skončilo?

 

Nie, nie, nie

V skutočnosti by sa riadky 7 až 10 mohli ešte viac zjednodušiť. Tu sa hodí funkcia absolútnej hodnoty.

čo? Prečo používať funkciu absolútnej hodnoty?

 

Pozrite sa na riadok 10: 0xff - duty_cycle je ekvivalentné k duty_cycle - 0xff a potom vezmeme absolútnu hodnotu. Dobre, tu je zjednodušený kód:

set_led_luminance(ABS(pracovný_cyklus - (0xff)));

 

 

Funkcia makra na získanie absolútnej hodnoty je nasledovná

#define ABS(N) ((N) < 0 ? -(N) : (N))

 

Nakoniec som nižšie uviedol celý zjednodušený kód

 

info-562-684

čo myslíš? Nie je to jednoduché? (* ̄︶ ̄)

Zaslať požiadavku

whatsapp

Telefón

E-mailom

Vyšetrovanie