Aplike yon limyè pou respire ki ap dirije lè l sèvi avèk 51 mikrokontroleur a

Jun 11, 2026 Kite yon mesaj

[Entwodiksyon]


Teknoloji mikrokontroleur se yon teknoloji endispansab endispansab nan automatisation endistriyèl modèn, elektwonik, jeni elektrik, ak Entènèt bagay sa yo (IoT). Kòm lavi nou vin de pli zan pli entelijan, teknoloji mikrokontwolè te anvayi prèske tout aspè nan lavi chak jou nou an, tankou nan cuisinier diri entelijan, oratè entelijan, ak plis ankò.


Avèk sa a nan tèt ou, seri atik "Relearning the 51 Microcontroller" la vize ede débutan kòmanse ak teknoloji mikrokontroleur. Nou pral kòmanse ak travay ki pi senp la-limen yon sèl LED-epi piti piti pwogrè nan aplikasyon modil tankou kontwòl bouton, ekspozisyon LCD1602, detèktè tanperati DS18B20 ak DS1302, ak kominikasyon ant de mikrokontwolè. Nou pral kouvri tou pwotokòl kominikasyon pyès ki nan konpitè tankou UART, I²C, ak SPI. Lè nou konbine konsèp sa yo ak teknik pwogramasyon C, nou pral sèvi ak pwojè jeni reyèl-monn reyèl pou ilistre apwòch pwogramasyon, sa ki pèmèt ou aplike yon fason fleksib ak estrikti C pou reyalize pwogramasyon modilè.


Koulye a, ann tounen sou sijè prensipal la: lè l sèvi avèk yon mikrokontroleur 51 pou kontwole yon dirije epi kreye yon efè limyè pou l respire.

 

[Kijan limyè pou respire travay]


Ann premye pran yon gade nan ki jan yon efè limyè pou respire travay.
Yon limyè pou respire piti piti eklere epi apre sa piti piti dim, repete sik sa a nan yon fason ki sanble ak respire. Sepandan, depi zepeng yon mikrokontwolè ka sèlman pwodiksyon swa yon 1 (sou) oswa yon 0 (off), ki jan yo ka reyalize yon efè tranzisyon gradyèl?
Sa a se akòz pèsistans vizyon nan je nou. Lè nou gade nan yon bagay, imaj ki te fòme pa je nou pèsiste pou 0.04 segonn (yo figi sa a te jwenn sou entènèt).
Si nou kalkile baze sou 0.04 segonn, sa egal 40 ms. Se poutèt sa, lè LED la limen ak etenn pou 20 ms chak, li parèt nan je imen an kòm si li toujou ap limen.

图片

Èske efè yon LED k ap flache limen pou 20 ms epi etenn pou 20 ms menm jan ak li rete limen tout tan?

 

Haha, li definitivman diferan. Lè limyè a altène ant limen ak etenn chak 20 milisgond, efè a nou wè se dimmer pase lè li rete sou kontinyèlman. Si nou sipoze ke klète yon limyè kontinyèlman limen se 100%, Lè sa a, klète yon limyè ki altène ant limen ak koupe chak 20 milisgond se 50%. Ki baze sou sa a, nou ka ajiste klète ki ap dirije a.

图片

 

Nan pwen sa a, nou ka ajiste klète ki ap dirije a (pa mete dire a nan nivo segondè nan sik la 40ms). Sa a se prensip ki dèyè byen -metòd kontwòl klète PWM (Pulse Width Modulation) li te ye, ak fikse dire wo nivo a ekivalan a ajiste sik devwa a (sa vle di, dire nivo segondè divize pa sik total la: 20/40=50%).


Isit la, faktè ki pi enpòtan an se sik devwa sa a. Pou egzanp, si peryòd la se 20 ms, ak dirije a altène ant 10 ms sou ak 10 ms koupe, klète a konnen se toujou 50% (sa vle di, sik devwa a se 10/20=50%).

Apre sa, ann wè ki jan sa a aplike nan pwogram nan.

 

[Aplikasyon pwogram]


Limen yon LED
Premyèman, ann kòmanse pa vire sou yon dirije, ak Lè sa a, nou pral piti piti aplike yon efè limyè pou l respire. Materyèl nou pral itilize se jan sa a:

Komisyon Konsèy Devlopman ZeroOne Microcontroller Fòmasyon Komisyon Konsèy Devlopman
Modèl mikrokontroleur STC89C52
Entèfas ki ap dirije PIN P4^4
图片

 

Soti nan chema a, nou ka wè ke dirije a konekte ak PIN P4 ^ 4 nan mikrokontwolè a. Lè mikrokontwolè a bay yon 1, dirije a limen; lè li bay yon 0, dirije a etenn. Se poutèt sa, pwogram nan limen yon dirije se byen senp, jan yo montre anba a:

info-299-230

 

 

Pwogram pou limen yon LED se byen senp; Mwen sèten tout moun konnen ki jan fè li.
 

Ajiste klète ki ap dirije


Apre sa, nou pral aplike yon fonksyon ki pèmèt nou ajiste klète a (sa vle di, ajiste sik devwa a), jan sa a:

info-400-538


 

Defini yon varyab estatik "duty_cycle" pou estoke sik devwa a. Lè `drapo` se 1, sik devwa a piti piti ogmante a 255, Lè sa a, mete `drapo` a 0, ak `duty_cycle` piti piti diminye soti nan 255 a 0. Repete sik sa a.
Haha, nan pwen sa a, ou ta ka panse limyè a pou respire deja ap travay, men li pa. Si ou pa kwè mwen, eseye kòd ki anlè tèt ou.

Se konsa, kote egzakteman se pwoblèm nan?


Pwoblèm nan chita nan apèl dirèk nou pou fonksyon klète -set_led_luminance()'. Fonksyon sa a pran 40 ms pou konplete yon sik, sa vle di sik devwa a pa ka chanje pandan 40 ms sa yo; otreman, ajisteman klète a pa pral travay. Ann pran yon lòt gade sou fonksyon `breath_led`. Apre chak apèl nan `set_led_luminance()` pou mete sik devwa a, li imedyatman chanje valè `duty_cycle` san tann 40 ms.


Nan pwen sa a, nou bezwen ajoute yon revèy lojisyèl pou mete ajou valè `duty_cycle` apre 40 ms pase. Pwogram modifye a se jan sa a:

info-495-656

 

 

Remak: Dire revèy la jis bezwen plis pase 40 ms (sa vle di valè `s_breathCounter` dwe pi gran pase 255), men li pi bon pou mete l sou yon miltip sik la. Pa egzanp, si sik nou an se 255 (sa vle di, 256 valè soti nan 0 a 255), nou ka mete li nan de fwa valè sa a: 256 * 2 - 1=511 (sa vle di, 512 valè soti nan 0 a 511).
Epi ou gen li-limyè pou respire nou an konplè! Èske sa pa senp? (* ̄︶ ̄)

 

Pwochen se seksyon bonis jodi a.

Malgre ke nou te reyalize efè limyè respirasyon an, kòd la pa byen kout oswa elegant ase -li itilize yon pakèt deklarasyon si ak else. Ann wè si nou ka senplifye li pi lwen.

Premyèman, ann senplifye seksyon sa a nan fonksyon set_led_luminance(), jan yo montre nan figi ki anba a.
 

图片

 

Anvan nou senplifye sa a, se pou yo kouvri yon ti konsèy rapid sou C: Bitwise AND operasyon an.

info-600-117

 

Apati sa a, nou konnen si li se 1 oswa 0, fè yon operasyon bit ak 0 rezilta nan 0.

Kit li se 1 oswa 0, fè yon operasyon bit ak 1 rezilta nan valè orijinal la.

Pou konvenyans, nou itilize notasyon egzadesimal (prefiks ak "0x"); pa egzanp, 0xff koresponn ak 255 an desimal. Se poutèt sa,

 

Lè yon nimewo ki mwens pase 0xff oswa ki egal a 0xff ak 0xff, rezilta a se nimewo a li menm, jan yo montre anba a.

info-534-63

 

 

Kisa k ap pase si w fè yon operasyon AK bit ant yon nimewo ki pi gran pase 0xff ak 0xff?

info-551-63

Rezilta a se rès la lè nimewo sa a divize pa (0xff + 1) (sa vle di, rezilta a toujou ant 0 ak 0xff).
Avèk operasyon bit sa a AK, kòd ki anwo a ka senplifye nan

info-550-64

 

 

Nan fason sa a, valè s_Counter ap toujou nan seri 0x00 a 0xff.
Menm jan an tou, revèy lojisyèl an nan fonksyon breath_led pi wo a kapab tou senplifye jan sa a:

info-389-353

Nan liy 3, 0x1ff se 511 an desimal. Kondisyon an se vre lè valè s_breathCounter se (0x1ff+1), oswa 512, paske 512 & 0x1ff=0. Mak esklamasyon anvan li endike yon operasyon pa bit (pou yo dwe egzak, kondisyon an satisfè lè valè `s_breathCounter` se yon miltip nan 512 bezwen reset; `s_breathCounter` Mwen espere ke eksplikasyon sa a klè -tanpri reflechi). Si kondisyon an satisfè, sik devwa a kòmanse ogmante oswa diminye.


Men, se pa ranje sik devwa a 0 a 255? Poukisa liy 5 vin tou 0x1ff (511)? Pa enkyete -gade liy 8. Nou soustraksyon 0xff ankò, kidonk seri sik devwa a rete 0 a 255.


Liy 7–10 vle di: Lè `duty_cycle > (0xff)`, sa vle di, 256–511, soustraksyon 0xff ekivalan a ogmante soti nan 1 a 255, kidonk klète a ogmante piti piti.


Lè duty_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, ou te panse senplifikasyon nou an te fini?

 

Non, non, non

Aktyèlman, liy 7 jiska 10 ta ka senplifye menm pi lwen. Sa a se kote fonksyon an valè absoli vini an sou la men.

kisa? Poukisa sèvi ak fonksyon valè absoli?

 

Gade liy 10: 0xff - duty_cycle ekivalan a duty_cycle - 0xff epi answit pran valè absoli. Oke, isit la se kòd la senplifye:

set_led_luminance(ABS(duty_cycle - (0xff)));

 

 

Fonksyon macro pou pran valè absoli se jan sa a

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

 

Finalman, mwen te enkli tout kòd senplifye anba a

 

info-562-684

kisa ou panse? Èske li pa senp? (* ̄︶ ̄)

Voye rechèch

whatsapp

Telefòn

Mel

Rechèch