51 مائیکرو کنٹرولر کا استعمال کرتے ہوئے ایل ای ڈی بریتھنگ لائٹ کا نفاذ

Jun 11, 2026 ایک پیغام چھوڑیں۔

[تعارف]


مائکروکنٹرولر ٹیکنالوجی جدید صنعتی آٹومیشن، الیکٹرانکس، الیکٹریکل انجینئرنگ، اور انٹرنیٹ آف تھنگز (IoT) میں مرکزی دھارے کی ایک ناگزیر ٹیکنالوجی ہے۔ جیسے جیسے ہماری زندگی تیزی سے سمارٹ ہوتی جا رہی ہے، مائیکرو کنٹرولر ٹیکنالوجی نے ہماری روزمرہ کی زندگی کے تقریباً ہر پہلو، جیسے کہ سمارٹ رائس ککرز، سمارٹ سپیکرز، اور بہت کچھ میں گھیر لیا ہے۔


اس بات کو ذہن میں رکھتے ہوئے، مضامین کی "51 مائیکرو کنٹرولر کو دوبارہ سیکھنا" کا مقصد مائیکرو کنٹرولر ٹیکنالوجی کے ساتھ شروعات کرنے والوں کی مدد کرنا ہے۔ ہم سب سے آسان کام کے ساتھ شروع کریں گے-ایک ایل ای ڈی کو چالو کریں-اور آہستہ آہستہ بٹن کنٹرولز، LCD1602 ڈسپلے، DS18B20 اور DS1302 درجہ حرارت کے سینسر، اور دو مائیکرو کنٹرولرز کے درمیان مواصلات جیسے ماڈیولز کو لاگو کرنے کی طرف بڑھیں گے۔ ہم ہارڈ ویئر کمیونیکیشن پروٹوکول جیسے UART، I²C، اور SPI کا بھی احاطہ کریں گے۔ ان تصورات کو C پروگرامنگ تکنیکوں کے ساتھ جوڑ کر، ہم پروگرامنگ کے طریقوں کو واضح کرنے کے لیے حقیقی دنیا کے انجینئرنگ پروجیکٹس کا استعمال کریں گے، جس سے آپ ماڈیولر پروگرامنگ حاصل کرنے کے لیے C پوائنٹرز اور ڈھانچے کو لچکدار طریقے سے لاگو کر سکیں گے۔


اب، آئیے اصل موضوع پر واپس آتے ہیں: ایل ای ڈی کو کنٹرول کرنے اور سانس لینے والی روشنی کا اثر بنانے کے لیے 51 مائیکرو کنٹرولر کا استعمال۔

 

[سانس لینے والی لائٹس کیسے کام کرتی ہیں]


آئیے پہلے ایک نظر ڈالتے ہیں کہ سانس لینے والی روشنی کا اثر کیسے کام کرتا ہے۔
سانس لینے والی روشنی آہستہ آہستہ روشن ہوتی ہے اور پھر آہستہ آہستہ مدھم ہوتی جاتی ہے، اس چکر کو اس انداز میں دہراتے ہیں جو سانس لینے سے مشابہ ہو۔ تاہم، چونکہ ایک مائیکرو کنٹرولر کی پن صرف 1 (آن) یا 0 (آف) آؤٹ پٹ کر سکتی ہے، اس لیے بتدریج منتقلی کا اثر کیسے حاصل کیا جا سکتا ہے؟
یہ ہماری آنکھوں میں بصارت کی برقراری کی وجہ سے ہے۔ جب ہم کسی چیز کو دیکھتے ہیں تو ہماری آنکھوں سے بننے والی تصویر 0.04 سیکنڈ تک برقرار رہتی ہے (یہ اعداد و شمار آن لائن پایا گیا تھا)۔
اگر ہم 0.04 سیکنڈ کی بنیاد پر حساب لگائیں تو یہ 40 ایم ایس کے برابر ہے۔ لہٰذا، جب ایل ای ڈی 20 ایم ایس ہر ایک کے لیے آن اور آف ہوتی ہے، تو یہ انسانی آنکھ کو ایسا لگتا ہے جیسے یہ مسلسل روشن ہے۔

图片

کیا ایل ای ڈی چمکنے کا اثر 20 ایم ایس کے لیے اور 20 ایم ایس کے لیے بند ہونے کا اثر ویسا ہی ہوتا ہے جیسا کہ اس کے ہر وقت چلتا ہے؟

 

ہاہاہا، یہ یقینی طور پر مختلف ہے۔ جب روشنی ہر 20 ملی سیکنڈ میں آن اور آف کے درمیان بدلتی ہے، تو ہم جو اثر دیکھتے ہیں وہ اس کے مسلسل رہنے کے مقابلے میں مدھم ہوتا ہے۔ اگر ہم فرض کریں کہ مسلسل روشن ہونے والی روشنی کی چمک 100% ہے، تو روشنی کی چمک جو ہر 20 ملی سیکنڈ میں آن اور آف کے درمیان بدلتی ہے 50% ہے۔ اس کی بنیاد پر، ہم ایل ای ڈی کی چمک کو ایڈجسٹ کر سکتے ہیں.

图片

 

اس مقام پر، ہم ایل ای ڈی کی چمک کو ایڈجسٹ کر سکتے ہیں (40ms سائیکل کے اندر اعلی سطح کی مدت مقرر کر کے)۔ یہ برائٹنس کنٹرول کے معروف PWM (Pulse Width Modulation) طریقہ کے پیچھے اصول ہے، اور ہائی لیول کا دورانیہ سیٹ کرنا ڈیوٹی سائیکل کو ایڈجسٹ کرنے کے مترادف ہے (یعنی، ہائی لیول کی مدت کو کل سائیکل سے تقسیم کیا جاتا ہے: 20/40=50%)۔


یہاں، سب سے اہم عنصر یہ ڈیوٹی سائیکل ہے۔ مثال کے طور پر، اگر دورانیہ 20 ایم ایس ہے، ایل ای ڈی 10 ایم ایس آن اور 10 ایم ایس آف کے درمیان تبدیل ہوتی ہے، تب بھی سمجھی جانے والی چمک 50 فیصد ہے (یعنی ڈیوٹی سائیکل 10/20=50% ہے)۔

اگلا، آئیے دیکھتے ہیں کہ اس کو پروگرام میں کیسے لاگو کیا جاتا ہے۔

 

[پروگرام کا نفاذ]


ایل ای ڈی آن کرنا
سب سے پہلے، آئیے ایک ایل ای ڈی کو آن کرکے شروع کریں، اور پھر ہم آہستہ آہستہ سانس لینے والی روشنی کے اثر کو نافذ کریں گے۔ ہم جو ہارڈ ویئر استعمال کریں گے وہ درج ذیل ہے:

ترقیاتی بورڈ ZeroOne مائیکرو کنٹرولر ٹریننگ ڈویلپمنٹ بورڈ
مائیکرو کنٹرولر ماڈل STC89C52
ایل ای ڈی انٹرفیس P4^4 پن کریں۔
图片

 

اسکیمیٹک سے، ہم دیکھ سکتے ہیں کہ ایل ای ڈی مائکروکنٹرولر کے پن P4^4 سے منسلک ہے۔ جب مائیکرو کنٹرولر 1 آؤٹ پٹ کرتا ہے، LED آن ہو جاتا ہے۔ جب یہ 0 آؤٹ پٹ کرتا ہے تو ایل ای ڈی بند ہوجاتا ہے۔ لہذا، ایل ای ڈی کو آن کرنے کا پروگرام کافی آسان ہے، جیسا کہ ذیل میں دکھایا گیا ہے:

info-299-230

 

 

ایل ای ڈی کو آن کرنے کا پروگرام بہت آسان ہے۔ مجھے یقین ہے کہ ہر کوئی جانتا ہے کہ اسے کیسے کرنا ہے۔
 

ایل ای ڈی کی چمک کو ایڈجسٹ کرنا


اگلا، ہم ایک ایسا فنکشن نافذ کریں گے جو ہمیں چمک کو ایڈجسٹ کرنے کی اجازت دیتا ہے (یعنی ڈیوٹی سائیکل کو ایڈجسٹ کریں)، جیسا کہ درج ذیل ہے:

info-400-538


 

ڈیوٹی سائیکل کو ذخیرہ کرنے کے لیے ایک جامد متغیر `duty_cycle` کی وضاحت کریں۔ جب `پرچم` 1 ہو تو ڈیوٹی سائیکل آہستہ آہستہ بڑھ کر 255 ہو جاتا ہے، پھر `پرچم` کو 0 پر سیٹ کریں، اور `ڈیوٹی_سائیکل` 255 سے 0 تک بتدریج کم ہو جاتا ہے۔ اس سائیکل کو دہرائیں۔
ہاہاہا، اس وقت، آپ کو لگتا ہے کہ سانس لینے کی روشنی پہلے ہی کام کر رہی ہے، لیکن ایسا نہیں ہے۔ اگر آپ کو مجھ پر یقین نہیں ہے تو خود اوپر کا کوڈ آزمائیں۔

تو اصل میں مسئلہ کہاں ہے؟


مسئلہ برائٹنس-سیٹنگ فنکشن `set_led_luminance()` کو ہماری براہ راست کال میں ہے۔ یہ فنکشن ایک سائیکل مکمل کرنے میں 40 ایم ایس لیتا ہے، یعنی ان 40 ایم ایس کے دوران ڈیوٹی سائیکل کو تبدیل نہیں کیا جا سکتا۔ دوسری صورت میں، چمک ایڈجسٹمنٹ کام نہیں کرے گا. آئیے `breath_led` فنکشن پر ایک اور نظر ڈالتے ہیں۔ ڈیوٹی سائیکل سیٹ کرنے کے لیے `set_led_luminance()` پر ہر کال کے بعد، یہ فوری طور پر 40 ms کا انتظار کیے بغیر `dety_cycle` قدر کو تبدیل کر دیتا ہے۔


اس وقت، ہمیں 40 ایم ایس گزر جانے کے بعد `ڈیوٹی_سائیکل` ویلیو کو اپ ڈیٹ کرنے کے لیے ایک سافٹ ویئر ٹائمر شامل کرنے کی ضرورت ہے۔ ترمیم شدہ پروگرام مندرجہ ذیل ہے:

info-495-656

 

 

نوٹ: ٹائمر کا دورانیہ صرف 40 ms سے زیادہ ہونا ضروری ہے (یعنی `s_breathCounter` کی قدر 255 سے زیادہ ہونی چاہیے)، لیکن اسے سائیکل کے متعدد پر سیٹ کرنا بہتر ہے۔ مثال کے طور پر، اگر ہمارا سائیکل 255 ہے (یعنی، 0 سے 255 تک 256 قدریں)، تو ہم اسے اس قدر دگنی پر سیٹ کر سکتے ہیں: 256 * 2 - 1=511 (یعنی، 0 سے 511 تک 512 اقدار)۔
اور آپ کے پاس یہ ہے-ہماری سانس لینے کی روشنی مکمل ہے! کیا یہ آسان نہیں ہے؟ (* ̄︶ ̄)

 

اگلا آج کا بونس سیکشن ہے۔

اگرچہ ہم نے سانس لینے کی روشنی کا اثر حاصل کر لیا ہے، لیکن کوڈ کافی مختصر یا کافی خوبصورت نہیں ہے-یہ if اور else بیانات کا ایک گروپ استعمال کرتا ہے۔ آئیے دیکھتے ہیں کہ کیا ہم اسے مزید آسان بنا سکتے ہیں۔

پہلے، آئیے set_led_luminance() فنکشن کے اس حصے کو آسان بناتے ہیں، جیسا کہ نیچے دی گئی تصویر میں دکھایا گیا ہے۔
 

图片

 

اس سے پہلے کہ ہم اسے آسان بنائیں، آئیے C کے بارے میں ایک فوری ٹپ کا احاطہ کرتے ہیں: بٹ وائز اور آپریشن۔

info-600-117

 

اس سے، ہم جانتے ہیں کہ یہ 1 ہے یا 0، بٹ وائز اور آپریشن کرنے سے 0 کا نتیجہ 0 میں آتا ہے۔

چاہے یہ 1 ہو یا 0، 1 کے ساتھ بٹ وائز اور آپریشن کرنے سے اصل قدر نکلتی ہے۔

سہولت کے لیے، ہم ہیکساڈیسیمل اشارے استعمال کرتے ہیں ("0x" کے ساتھ سابقہ)؛ مثال کے طور پر، 0xff اعشاریہ میں 255 کے مساوی ہے۔ لہذا،

 

جب 0xff سے کم یا اس کے برابر نمبر کو 0xff کے ساتھ AND کیا جاتا ہے، تو نتیجہ خود نمبر ہوتا ہے، جیسا کہ ذیل میں دکھایا گیا ہے۔

info-534-63

 

 

اگر آپ 0xff اور 0xff سے بڑی تعداد کے درمیان بٹ وائز اور آپریشن کرتے ہیں تو کیا ہوگا؟

info-551-63

نتیجہ بقیہ ہے جب اس نمبر کو (0xff + 1) سے تقسیم کیا جائے (یعنی نتیجہ اب بھی 0 اور 0xff کے درمیان ہے)۔
اس بٹ وائز اور آپریشن کے ساتھ، اوپر کوڈ کو آسان بنایا جا سکتا ہے۔

info-550-64

 

 

اس طرح، s_Counter کی قدر ہمیشہ 0x00 سے 0xff کی حد میں ہوگی۔
اسی طرح، اوپر دیے گئے breath_led فنکشن میں سافٹ ویئر ٹائمر کو بھی اس طرح آسان بنایا جا سکتا ہے:

info-389-353

لائن 3 میں، 0x1ff اعشاریہ میں 511 ہے۔ شرط اس وقت درست ہوتی ہے جب s_breathCounter کی قدر (0x1ff+1)، یا 512 ہو، کیونکہ 512 اور 0x1ff=0. سے پہلے فجائیہ کا نشان بٹ وائز ناٹ آپریشن کی نشاندہی کرتا ہے (صریح طور پر، شرط اس وقت پوری ہوتی ہے جب `s_breathCounter` کی قدر اس 51 کو دوبارہ سیٹ کرنے کی ضرورت ہوتی ہے۔ `s_breathCounter` مجھے امید ہے کہ یہ وضاحت واضح ہے{{18} براہ کرم اس پر غور کریں)۔ شرط پوری ہو جائے تو ڈیوٹی کا چکر بڑھنا یا کم ہونا شروع ہو جاتا ہے۔


لیکن کیا ڈیوٹی سائیکل کی حد 0 سے 255 تک نہیں ہے؟ لائن 5 بھی 0x1ff (511) کیوں بن جاتی ہے؟ پریشان نہ ہوں-لائن 8 کو دیکھیں۔ ہم دوبارہ 0xff کو گھٹاتے ہیں، لہذا ڈیوٹی سائیکل کی حد 0 سے 255 تک رہتی ہے۔


لائنز 7–10 کا مطلب ہے: جب `duty_cycle > (0xff)`، یعنی 256–511، 0xff کو گھٹانا 1 سے 255 تک بڑھنے کے مترادف ہے، تو چمک بتدریج بڑھ جاتی ہے۔


جب ڈیوٹی_سائیکل<= 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.


ہاہاہا، کیا آپ نے سوچا کہ ہماری سادگی ختم ہوگئی؟

 

نہیں، نہیں، نہیں

درحقیقت، 7 سے 10 تک لائنوں کو مزید آسان بنایا جا سکتا ہے۔ یہ وہ جگہ ہے جہاں مطلق قدر کا فنکشن کام آتا ہے۔

کیا؟ مطلق قدر فنکشن کیوں استعمال کریں؟

 

لائن 10 دیکھیں: 0xff - duty_cycle duty_cycle - 0xff کے برابر ہے اور پھر مطلق قدر لینا۔ ٹھیک ہے، یہاں آسان کوڈ ہے:

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

 

 

مطلق قدر لینے کے لیے میکرو فنکشن مندرجہ ذیل ہے۔

# کی وضاحت کریں ABS(N) ((N) < 0 ? -(N) : (N))

 

آخر میں، میں نے نیچے پورا آسان کوڈ شامل کر دیا ہے۔

 

info-562-684

آپ کا کیا خیال ہے؟ کیا یہ آسان نہیں ہے؟ (* ̄︶ ̄)

انکوائری بھیجنے

whatsapp

ٹیلی فون

ای میل

تحقیقات