51 mikrokontroller yordamida LED nafas olish chiroqini amalga oshirish

Jun 11, 2026 Xabar QOLDIRISH

[Kirish]


Mikrokontroller texnologiyasi zamonaviy sanoat avtomatlashtirish, elektronika, elektrotexnika va narsalar interneti (IoT) sohasida ajralmas asosiy texnologiya hisoblanadi. Hayotimiz tobora aqlli bo'lib borar ekan, mikrokontroller texnologiyasi kundalik hayotimizning deyarli barcha jabhalariga, masalan, aqlli guruch pishirgichlar, aqlli dinamiklar va boshqalarga kirib bordi.


Buni hisobga olgan holda, "51 mikrokontrollerni qayta o'rganish" turkumidagi maqolalar yangi boshlanuvchilarga mikrokontroller texnologiyasidan foydalanishga yordam berishga qaratilgan. Biz eng oddiy vazifa-bitta LEDni yoqishdan- boshlaymiz va asta-sekin tugma boshqaruvlari, LCD1602 displey, DS18B20 va DS1302 harorat sensorlari va ikkita mikrokontroller o'rtasidagi aloqa kabi modullarni amalga oshirishga o'tamiz. UART, I²C va SPI kabi apparat aloqa protokollarini ham qamrab olamiz. Ushbu tushunchalarni C dasturlash texnikasi bilan birlashtirib, biz modulli dasturlashga erishish uchun C koʻrsatkichlari va tuzilmalarini moslashuvchan tarzda qoʻllash imkonini beruvchi dasturlash yondashuvlarini tasvirlash uchun haqiqiy muhandislik loyihalaridan foydalanamiz.


Endi asosiy mavzuga qaytaylik: LEDni boshqarish va nafas olish yorug'lik effektini yaratish uchun 51 mikrokontrollerdan foydalanish.

 

[Nafas olish chiroqlari qanday ishlaydi]


Keling, birinchi navbatda nafas olish yorug'ligi effekti qanday ishlashini ko'rib chiqaylik.
Nafas olish chirog'i asta-sekin yorishib, keyin asta-sekin xiralashadi va bu tsiklni nafas olishga o'xshash tarzda takrorlaydi. Biroq, mikrokontrollerning pinlari faqat 1 (yoqilgan) yoki 0 (o'chirilgan) ni chiqarishi mumkinligi sababli, asta-sekin o'tish effektiga qanday erishish mumkin?
Bu bizning ko'zimizdagi ko'rishning doimiyligi bilan bog'liq. Biror narsaga qaraganimizda, ko'zimiz tomonidan yaratilgan tasvir 0,04 soniya davomida saqlanib qoladi (bu raqam onlaynda topilgan).
Agar biz 0,04 soniyadan kelib chiqib hisoblasak, bu 40 ms ga teng. Shuning uchun, LED har biri 20 ms davomida yoqilgan va o'chirilgan bo'lsa, u inson ko'ziga doimo yonib turgandek ko'rinadi.

图片

LED 20 ms yonib, 20 ms davomida o'chib turishi ta'siri uning doimo yonib turishi bilan bir xilmi?

 

Haha, bu, albatta, boshqacha. Agar yorug'lik har 20 millisekundda yoqilsa va o'chirilsa, biz ko'radigan effekt doimiy yonib turgandan ko'ra xiraroq bo'ladi. Agar uzluksiz yonib turgan yorug'likning yorqinligi 100% deb faraz qilsak, u holda har 20 millisekundda yonish va o'chirish o'rtasida almashinadigan yorug'likning yorqinligi 50% ni tashkil qiladi. Bunga asoslanib, biz LED yorqinligini sozlashimiz mumkin.

图片

 

Ushbu nuqtada biz LEDning yorqinligini sozlashimiz mumkin (40ms tsikli ichida yuqori darajaning davomiyligini belgilash orqali). Bu yorug'likni boshqarishning-ma'lum bo'lgan PWM (Pulse Width Modulation) usulining printsipi bo'lib, yuqori darajaning davomiyligini o'rnatish ish siklini sozlash bilan tengdir (ya'ni, yuqori darajaning davomiyligi umumiy tsiklga bo'lingan: 20/{6}}%).


Bu erda eng muhim omil - bu vazifa aylanishi. Misol uchun, agar LED 10 ms yoqilgan va 10 ms o'rtasida o'zgarib turadigan davr 20 ms bo'lsa, qabul qilingan yorqinlik hali ham 50% bo'ladi (ya'ni, ish aylanishi 10/{8}}%).

Keyinchalik, bu dasturda qanday amalga oshirilganligini ko'rib chiqamiz.

 

[Dasturni amalga oshirish]


LEDni yoqish
Birinchidan, LEDni yoqishdan boshlaylik, keyin esa asta-sekin nafas olish yorug'lik effektini amalga oshiramiz. Biz foydalanadigan uskuna quyidagicha:

Rivojlanish kengashi ZeroOne Microcontroller Training Development Board
Mikrokontroller modeli STC89C52
LED interfeysi P4^4 pin
图片

 

Sxemadan biz LED mikrokontrollerning P4 ^ 4 piniga ulanganligini ko'rishimiz mumkin. Mikrokontroller 1 ni chiqarganda, LED yonadi; 0 ni chiqarganda, LED o'chadi. Shuning uchun, LEDni yoqish dasturi quyida ko'rsatilganidek, juda oddiy:

info-299-230

 

 

LEDni yoqish dasturi juda oddiy; Ishonchim komilki, hamma buni qanday qilishni biladi.
 

LED yorqinligini sozlash


Keyinchalik, yorqinlikni sozlash imkonini beruvchi funktsiyani amalga oshiramiz (ya'ni, ish aylanishini sozlash) quyidagicha:

info-400-538


 

Vazifa siklini saqlash uchun `vazifa_sikl` statik o'zgaruvchisini aniqlang. "Bayroq" 1 bo'lsa, ish aylanishi asta-sekin 255 ga oshadi, keyin "bayroq" ni 0 ga o'rnating va "vazifa_sikl" asta-sekin 255 dan 0 ga kamayadi. Ushbu tsiklni takrorlang.
Haha, bu vaqtda siz nafas olish nuri allaqachon ishlayapti deb o'ylashingiz mumkin, lekin unday emas. Agar menga ishonmasangiz, yuqoridagi kodni o'zingiz sinab ko'ring.

Xo'sh, muammo aynan qayerda?


Muammo yorqinlikni{0}}set_led_luminance()` sozlash funksiyasiga bevosita qo‘ng‘iroq qilishimizdadir. Bu funksiya bir siklni bajarish uchun 40 ms vaqt oladi, ya'ni ish siklini shu 40 ms davomida o'zgartirib bo'lmaydi; aks holda yorqinlikni sozlash ishlamaydi. Keling, "breath_led" funksiyasini yana bir bor ko'rib chiqaylik. Ish siklini o'rnatish uchun "set_led_luminance()" ga har bir qo'ng'iroqdan so'ng, u 40 ms kutmasdan darhol "duty_cycle" qiymatini o'zgartiradi.


Ushbu nuqtada, 40 ms o'tgandan so'ng `duty_cycle` qiymatini yangilash uchun dasturiy ta'minot taymerini qo'shishimiz kerak. O'zgartirilgan dastur quyidagicha:

info-495-656

 

 

Eslatma: Taymerning davomiyligi 40 ms dan kattaroq bo'lishi kerak (ya'ni `s_breathCounter' qiymati 255 dan katta bo'lishi kerak), lekin uni tsiklning ko'pligiga o'rnatgan ma'qul. Misol uchun, agar bizning tsiklimiz 255 (ya'ni, 0 dan 255 gacha bo'lgan 256 qiymat) bo'lsa, biz uni ikki barobar qiymatga o'rnatishimiz mumkin: 256 * 2 - 1=511 (ya'ni, 0 dan 511 gacha bo'lgan 512 ta qiymat).
Mana,-nafas olish chiroqimiz tugallandi! Bu oddiy emasmi? (* ̄︶ ̄)

 

Keyingi - bugungi bonus bo'limi.

Nafas olish yorug'ligi effektiga erishgan bo'lsak-da, kod unchalik ixcham yoki nafis emas-u bir qator if va else iboralaridan foydalanadi. Keling, buni yanada soddalashtirishimiz mumkinligini ko'rib chiqaylik.

Birinchidan, quyidagi rasmda ko'rsatilganidek, set_led_luminance() funksiyasining ushbu qismini soddalashtiramiz.
 

图片

 

Buni soddalashtirishdan oldin, keling, C haqida qisqacha maslahat beraylik: bit bo'yicha VA operatsiyasi.

info-600-117

 

Bundan bilamizki, u 1 yoki 0 bo'ladimi, 0 bilan bit bo'yicha AND operatsiyasini bajarish 0 ga olib keladi.

1 yoki 0 bo'lishidan qat'i nazar, 1 bilan bit bo'yicha AND operatsiyasini bajarish asl qiymatga olib keladi.

Qulaylik uchun biz o'n oltilik belgidan foydalanamiz ("0x" prefiksi bilan); masalan, 0xff o'nlik sonida 255 ga to'g'ri keladi. Shuning uchun,

 

0xff dan kichik yoki unga teng son 0xff bilan AND bo'lsa, natija quyida ko'rsatilganidek, raqamning o'zi bo'ladi.

info-534-63

 

 

0xff va 0xff dan kattaroq sonlar orasida bit bo'yicha AND operatsiyasini bajarsangiz nima bo'ladi?

info-551-63

Natija bu raqam (0xff + 1) ga bo'linganda qoldiq bo'ladi (ya'ni, natija hali ham 0 va 0xff orasida).
Ushbu bitli AND operatsiyasi bilan yuqoridagi kodni soddalashtirish mumkin

info-550-64

 

 

Shunday qilib, s_Counter qiymati har doim 0x00 dan 0xff oralig'ida bo'ladi.
Xuddi shunday, yuqoridagi breath_led funksiyasidagi dasturiy ta'minot taymerini ham quyidagicha soddalashtirish mumkin:

info-389-353

3-qatorda 0x1ff o'nlik kassada 511 ga teng. Shart s_breathCounter qiymati (0x1ff+1) yoki 512 boʻlganda toʻgʻri boʻladi, chunki 512 va 0x1ff=0. Undan oldingi undov belgisi bit yoʻnalishi boʻyicha EMAS amalni bildiradi (aniq boʻlsa, shart bajariladi, `s_breathCounter` qiymati bu 512-sonli recounterni yoʻq qiladi. Umid qilamanki, bu tushuntirish tushunarli boʻldi-iltimos, yaxshilab oʻylab koʻring). Agar shart bajarilsa, ish aylanishi ortib yoki kamayishni boshlaydi.


Ammo ish aylanishi oralig'i 0 dan 255 gacha emasmi? Nima uchun 5-qator ham 0x1ff (511) ga aylanadi? Xavotir olmang{6}}8-qatorga qarang. Biz yana 0xffni ayirib tashlaymiz, shuning uchun ish sikli diapazoni 0 dan 255 gacha qoladi.


7–10 qatorlar quyidagilarni bildiradi: `vazifa_sikl > (0xff)`, ya'ni 256-511 bo'lganda, 0xffni ayirish 1 dan 255 gacha ko'tarilish bilan teng, shuning uchun yorqinlik asta-sekin o'sib boradi.


Qachon vazifa_sikl<= 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, bizning soddalashtirishimiz tugadi deb o'yladingizmi?

 

Yo'q, yo'q, yo'q

Aslida, 7 dan 10 gacha bo'lgan qatorlarni yanada soddalashtirish mumkin. Bu erda mutlaq qiymat funksiyasi yordam beradi.

Nima? Nima uchun mutlaq qiymat funksiyasidan foydalaniladi?

 

10-qatorga qarang: 0xff - duty_cycle duty_cycle - 0xff ga teng va keyin mutlaq qiymatni oladi. OK, bu erda soddalashtirilgan kod:

belgilangan_led_yorqinlik(ABS(vazifa_sikl - (0xff)));

 

 

Mutlaq qiymatni olish uchun makro funksiyasi quyidagicha

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

 

Nihoyat, men quyida butun soddalashtirilgan kodni kiritdim

 

info-562-684

Siz nima deb o'ylaysiz? Bu oddiy emasmi? (* ̄︶ ̄)

So'rov yuborish

whatsapp

Telefon

Elektron pochta

So'rov