الحلقة الثالثة للميكروكونتروللر 8051

السلام عليكم و رحمة الله و بركاته
السادة رواد المنتدى الكرام نبدأ اليوم بأمر الله تعالى مع الحلقة الثالثة فى دورة الميكروكونتروللر 8051
إعجاب واحد (1)
قبل البداية فى كتابة الاكواد يجب ان انوه عن الوسيط البرمجى المستخدم و هو برنامج KEIL و الرابط التالى يقودنا الى موقع الشركة المنتجة و التى تتيح تحميل نسخة تجريبية

[RIGHT]البرنامج ببساطة يتيح كتابة الاكواد بلغة الاسمبلى او السى ثم يترجمها الى لغة الــ HEXADECIMAL مع توفير محاكى بسيط لمن يرغب فى التجربة عبر البرنامج دون التركيب العملى .


بالنسبة لمن يريد ان يجرب البرامج بصفة عملية فعليه ان يوفر المكونات التالية :-

أولاً :- دائرة امداد بالطاقة 5 فولت Power Supply

و يمكن الحصول عليها جاهزة من خلال استخدام وحدة تغذية الحاسب الشخصى (( وحدة قديمة مثل التى تغذى جهازكم حالياً و ليست الوحدة التى تعمل بالفعل تجنباً لحدوث مشاكل مع الحاسب )) و يكون الطرف ذو اللون الاسود هو الطرف السالب بينما الطرف الاحمر هو مصدر التغذية بجهد 5 فولت , و يجب الحذر من استخدام الطرف الاصفر لانه يغذى بجهد 12 فولت مما يتسبب فى تلف الميكرو و ملحقاته .

و لمن يرغب فى تركيب دائرة التغذية يدوياً فليراجع الحلقة الثانية حيث سبق شرح هذه الدائرة بالتفصيل .

ثانياً :-الميكروكونتروللر و ملحقاتـــه

سنستخدم الميكروكونتروللر الذى يحمل الرقم ِ89C52 و ليس 8051 لان الاول له سعة تخزين ضعف الثانى , و لمن يسكن بالقاهرة الكبرى يمكنهم شراؤه من محل بيع المكونات الاليكترونية والذى يسمى RAM فى باب اللوق

كذلك سنحتاج الى المكونات التالية :-

عدد (1 ) مذبذب Crystal 12 MHz

عدد ( 2 ) مكثف سعة 33p.f أو 22p.f أو 27 p.f

عدد ( 1 ) مكثف سعة 1 micro f.

عدد ( 1 ) مكثف سعة micro f. 10

عدد ( 1 ) مقاومة 8.2 كيلو اوم

عدد ( 8 ) مقاومات 330 اوم

عدد ( 8 ) ثنائى ضوئى LED ألوان مختلفة

عدد ( 8 ) مقاومة 1 كيلو اوم

عدد ( 1 ) لوحة اختبار Bread Board

مجموعة اسلاك توصيل خاصة بلوحة الاختبار (( اسلاك مفردة بسمك نصف مللى تقريباً , تشبه تلك الخاصة بوصلة الهاتف ))

الصورة التالية توضح دائرة الميكروكونتروللر بعد توصيلها بمصدر التغذية و الملحقات [/right]

[RIGHT]بعد الاطلاع على نتيجة الاستفتاء الخاص بأنسب لغات البرمجة للميكروكونتروللر تبين ان معظم المشاركين يرغبون فى تعلم برمجة الميكروكونتروللر بلغة Assembly و كان ذلك من خلال الاستفتاء الذى اجريته فى الثلاث منتديات التى اكتب فيها هذه الدورة و كانت النتيجة الاجمالية 38 يفضلون لغة السى بينما 44 يفضلون لغة الاسمبلى


لذلك سأضم صوتى مع الاغلبية و ابدأ فى الشرح بلغة الاسمبلى و اذا قدر الله تعالى و احيانا يمكن تخصيص حلقة اخرى لشرح البرمجة بلغة السى و الله المستعان … لكن دعونا نبدأ مع لغة الاسمبلى و نتقنها و من ثم فسنبدأ سوياً الحلقة الثالثة مع كتابة اكواد بسيطة و سهلة .[/right]

[RIGHT]بعد إعداد البرنامج و تجهيزه للعمل على حاسبك الشخصى يتم عمل الخطوات التالية :-


1-إنشاء مشروع جديد و نعطيه اسم , ليكن project 1 … على اساس ان هذا اول مشروع سنتعامل معه و ليس له وظيه و محددة

2-يتم إختيار نوع الميكروكونتروللر المستخدم (( 8952 ))

3-يتم إضافة الخيارات للمشروع

4-يتم فتح ملف جديد

5-يتم حفظ الملف باسم Project1.asm و

6-يتم إضافة الملف الى المشروع Project1 و[/right]

الخطوات السابقة خطوات اساسية لكل مشروع سيتم انشائه مستقبلياً و سيتم انشاؤها بشكل تلقائى مع تغيير اسم المشروع و اسم الملفات المدرجة فيه و من ثم سنتناول كيفية اجراء هذه الخطوات بالتفصيل ليتسنى للجميع التأكد من امكانية تكرارها لاحقاً دونما اعادة شرحها مع امثلة اخرى

[RIGHT]الخطوة رقم ( 1 )


نذهب الى قائمة الاوامر Project و نختار New Project [/right]

[CENTER]Project --------> New Project


[/center]

نقوم باختيار اسم للمشروع و ليكن Project1 و نحدد مسار مجلد الحفظ

[RIGHT]الخطوة رقم ( 2 )


نحدد نوع الميكروكونتروللر المستخدم

طبعاً نذهب الى كلمة Atmel

ثم نختار AT89C52 [/right]

[CENTER]





[/center]
إعجاب واحد (1)

[RIGHT]الخطوة رقم ( 3 )


بالضغط على الزر الايمن عند مربع شجرة الملفات و تحديداً على كلمة Target1

نختار الامر Option for target ‘Target1’
[/right]

يظهر مربع حوار , له قائمة target نكتب فيها تردد الكريستال المستخدم و هو 12MHz و نضع علامة على مربع الاختيار الخاص بنوع الذاكرة المستخدمة " حتى هذه اللحظة سنتعامل مع الذاكرة الداخلية " Use On_Chip ROM

[RIGHT]تذهب الى قائمة OUTPUT على نفس صندوق الحوار و نتأكد من اختيار كل مما يلى


Brows information

Create HEX File [/right]

[RIGHT]ثم نضغط


OK

الخطوة رقم ( 4 )

لاضافة ملف جديد نذهب الى القائمة File و نختار الامر New

File ---------> New[/right]

سيفتح امامنا ملف نصى باسم TEXT1 او TEXT2 حسب عدد الملفات السابق فتحها

[RIGHT]الخطوة رقم ( 5 )


يتم حفظ الملف بالامر Save As

File ----------> Save As[/right]

نختار اسم للملف " عادة نعطيه اسم يدل على محتوى البرنامج , هنا سنسميه باسم المشروع " مع الاخذ فى الاعتبار كتابة امتداد الملف asm فيكون الاسم المكتوب هو Project1.asm

الان نراقب اسم الملف و قد تغير من TEXT الى Project1.asm و ظهر امامنا الصفحة البيضاء الجاهزة لتحرير الكود

[RIGHT]الخطوة رقم ( 6 )


لاضافة الملف الى المشروع

بالضغط على الزر الايمن لــ Source Group1 نختار Add Files To Group

يظهر مربع حوار للبحث عن الملف المراد اضافته للمشروع , و عادة يبحث عن ملف بامتداد C لان هذا البرنامج يسمح بكتابة الاكواد بلغة السى ايضاً [/right]

فى الخانة الخاصة بـنوع الملفات Files Of Type نختار . لاظهار كافة الملفات و من ثم يظهر لنا الملف المحفوظ مسبقاً باسم project1.asm و الذى نقوم باختياره ثم نضغط على Add

[CENTER]



[/center]

الان اصبح الملف جاهز تماماً لكتابة الكود

[RIGHT]اليوم نكتب اول كود و نشاهد التطبيق المباشر له

اول امر نتعرض له هو الامر MOV

يستخدم هذا الامر فى نقل بيانات من موضع المصدر Source الى موضع الهدف Destination

الصيغة العامة للامر تكون كالتالى :-

[/right]

MOV Dest. , Source

مثال

MOV P2 ,#10101010b
END

P2 تعبر عن ان الخرج سيتم ارساله على ميناء التوصيل رقم 2 = Port2

العلامة # تدل على ان القيمة التى تم كتابتها بعدها " 10101010 " تعبر عن رقم و الحرف b يعبر عن نوع الرقم “ b = Binary “ اى انه رقم ثنائى .

يمكن كتابة التالى

MOV P2 ,#AAh

هنا حرف h يدل على ان الرقم يخضع للنظام السادس عشرى “h = Hexadecimal “

[LEFT]MOV P2 ,#170


[/left]

هنا عدم كتابة اى حروف بعد الرقم تدل على ان الرقم فى النظام العشرى Decimal

نلاحظ ان اكبر رقم يمكن استخدامه فى النظام العشرى هو 255 حيث ان الارقام المستخدمة تتراوح بين 0 الى 255 باجمالى 256 رقم و هو ما يعبر عنه نوع الميكروكونتروللر , فقد سبق و قلنا انه 8 Bit و من ثم 2 مرفوعة للقوى 8 تعطى 256

256=8^2

بما فيهم الصفر و بالتالى اكبر رقم يمكن استخدامه هو 255

بالتالى نلاحظ ان العدد 255 فى النظام العشرى يكافئه العدد FF فى النظام السادس عشرى و العدد 11111111 فى النظام الثنائى .

و من ثم فان القيمة 10101010 بالثنائى تتساوى مع AA فى السادس عشرى و تتياوى مع 170 فى النظام العشرى

إذن اى صيغة سنستخدمها يجب ان تعطى نفس النتيجة و يجب ان نتجنب استخدام ارقام اكبر من 11111111 فى الثنائى او اكبر من FF فى السادس عشرى او اكبر من 255 فى النظام العشرى و الا سيظهر لنا المترجم Compiler رسالة تحذيرية Truncated Value و التى تفيد استخدام رقم اعلى مما يمكن ان يتعامل معه الميكروكونتروللر المستخدم و الذى يتعامل مع 8 بت فقط .

الامر END لن يتم إدخاله على الميكروكونتروللر و لكنه مجرد مؤشر الى المترجم Compiler بأن الكود قد انتهى , و ذلك حتى نعلم ان الميكروكونتروللر يظل ينفذ الاوامر دون توقف الا اذا اعطيناه امراً بالتوقف .

و الان و بعد تحرير الكود السابق يأتى الدور على ترجمة هذا الكود و يتم ذلك باستخدام القائمة Project و اختيار الامر Build Target او الضغط على مفتاح الوظائف “ F7 “ او اختيار علامة انشاء الهدف من قائمة الاختصارات الموجودة بالبرنامج

هنا نتأكد من أنه لا توجد رسائل خطأ او رسائل تحذيرية , و بالتالى الكود الذى تم ادخاله صحيح

و الان جاء الدور على مشاهدة نتيجة هذا الكود

اولاً باستخدام البرنامج KEIL نقوم بعمل الخطوات التالية :-

اولاً :- الذهاب الى القائمة Debug و اختيار الامر Start/Stop Debug Session

او الضغط على مفتاحى Ctrl + F5 مباشرة

او اختيار العلامة المكتوب عليها حرف d باللون الاحمر من شريط الاوامر المختصرة بالبرنامج

ثانياً :- الذهاب الى القائمة peripherals و اختيار الامر I/O-Ports و منها اختيار Port 2 حيث انها الهدف الذى سبق اختياره فى الامر لاخراج بيانات المصدر عليه

سيظهر لنا جدول يعبر عن شكل الميناء رقم 2 “ Prot 2 “ و الوضع الابتدائى للبيانات الخاجة عليها قبل التنفيذ , نجد انه يعطى 1 على الاطراف كقيمة ابتدائية

ثالثاً :- الذهاب الى القائمة Debug و اختيار الامر Go

او الضغط مباشرة على المفتاح F5

هنا نشاهد نتائج تنفيذ البرنامج تماماً كما اردناها

لانهاء عرض تنفيذ البرنامج نقوم بايقاف البرنامج من خلال تنفيذ الخطوة فى أولاً … الذهاب الى القائمة Debug و اختيار الامر Start/Stop Debug Session

او الضغط على مفتاحى Ctrl + F5 مباشرة

او اختيار العلامة المكتوب عليها حرف d باللون الاحمر من شريط الاوامر المختصرة بالبرنامج

و الان حان الدور على نقل البرنامج من على الكمبيوتر الى الميكرومونتروللر

نحن الآن نحتاج الى الملف بصيغة الاسمبلى و يتم الحصول عليه من خلال الذهاب الى القائمة Project ثم اختيار الامر Build All Target Files او استخدام الامر من شريط الاختصارات بالبرنامج

بالذهاب الى المجلد الذى تم حفظ المشروع فيه سنجد الملف Project1.asm و اخر بنفس الاسم و لكن ذو امتداد hex ==== Project1.hex

نأخذ هذا الملف و نقوم بتحميله على الميكروكونتروللر من خلال المبرمجة الخاصة بالميكروكونتروللر 8051 و البرنامج الخاص بها .

و لقد سبق و ذكرت الى ان هناك مفاجأة الى الزملاء المشاركين بايجابية فى الدورة و ذكرت اسمائهم … و اليوم حان وقت اظهار المفاجأة .

سأقوم بأمر الله تعالى بتوفير بعض الوقت لهؤلاء الزملاء لتفعيل التطبيق العملى من خلال برمجة الميكروكونتروللر بالمبرمجة الخاصة بى و تنفيذ الدوائر كاملة معهم حيثما تسنى لنا الالتقاء و عليهم ارسال رسائل خاصة لى على المنتدى و فيها البريد الاليكترونى الخاص بهم حتى نتمكن من تحديد مواعيد مناسبة للمضى قدماً فى تنفيذ الشق العملى سوياً بامر الله .

و من ثم لن يكونوا فى حاجة الى شراء او تنفيذ مبرمجة فى الوقت الحالى او الاضطرار الى الذهاب الى الاماكن التى توفر برمجة الميكروكونتروللر بمقابل مادى معروف لدينا جميعاً …

اتمنى ان اكون قد وفيت بوعدى تجاه هؤلاء الزملاء و ان تكون المفاجأة سارة لهم

نعود الى حيث كنا

بعد ان نقوم بنقل الملف Project1.hex الى الميكروكونتروللر نقوم بتوصيل الدائرة


[RIGHT] و يجب ملاحظة ان الحمل يتم توصيله بين خرج الميكرو و مصدر التغذية 5 فولت و ليس الارضى على اعتبار ان شرط العمل هو اخراج 0 من الميكرو و ليس 1 و هو ما يعرف بـــ Active Low تجنباً لسحب تيار عالى من الميكرو .

[RIGHT]و نراقب الثنائيات الضوئية و ترتيب قيم الــ 1 و الــ 0 على الخرج


إذا عكسنا اطراف التوصيل و كانت بين الميكرو و الارضى [/right]

[RIGHT]سنلاحظ ان الثنائيات الضوئية التى خرج عليها القيمة 1 ستضئ و الثنائيات الضوئية التى خرج عليها القيمة 0 لن تضئ , و كذلك قد نلاحظ ان الثنائيات التى اضائت خافته بعض الشئ


لذلك سنقوم بعمل Buffer بين اطراف الخرج للميكروكونتروللر و الاحمال من خلال استخدام احد هذه المتكاملات 7432 == OR Gate او AND Gate ==== 7408 او اى نظام لعمل الـــ Buffer مثل الترانزيستورات مثلاً او اى نوع من انواع الـــ Buffer المشهورة و الشائعة الاستخدام [/right]

و هنا اترك المجال مفتوحاً للزملاء … كل من يعرف وسيلة لعمل الــ Buffer يقوم بعرضها لتعم الفائدة .


[/right]

[COLOR=Blue][SIZE=4][CENTER]السلام عليكم
الرابط التالى يوصلنا الى نسخة جاهزة للعمل من البرنامج KEIL على ان يتم نسخ المجلد الى المسار C:\


و من ثم يكون مسار االبرنامج كالتالى
C:\Keil\UV2\uv2.exe
و يجب عمل Short Cut لملف التشغيل هذا على سطح المكتب


[/center]

[/size][/color]

[RIGHT][RIGHT]


الآن علينا أن نعرف أن كل مجموعة أوامر تؤدى وظيفة محددة يمكن درجها تحت مسمى خاص و نطلق عليها حينئذ اسم procedure المثال التالى يوضح هذه الفكرة


[/right][/right]

[LEFT]:Loop


Move p1,#01010101b


Sjmp loop


End[/left]

[RIGHT]

اسم الــ procedure هنا هو Loop

الامر sjmp هو امر يستخدم للقفز الى مكان معين , و يستخدم مع الصيغ التالية :-[/right]
sjmp $ 1 هنا يتم عمل قفز الى نفس المكان
sjmp $-1 هنا يتم عمل قفز الى المكان السابق
sjmp $+1 هنا يتم عمل قفز الى المكان التالى

Sjmp loop


هنا سيتم استدعاء الــ procedure المسمى loop من خلال الامر sjmp


بالتالى تنفيذ الـ procedure المسمى loop سيتسبب فى عمل تكرار لا نهائى لمجموعة الاوامر الموجودة داخله بلا توقف .

سبق و أن ذكرنا أن الذاكرة الداخلية للميكروكونتروللر 8051 لا تتسع الا 64 كيلوبايت اما 8052 فتتسع لكود حجمه 128 كيلوبايت لذلك سنراعى دائماً حجم او سعة الكود التى سيتم كتابتها لاننا فى البداية سنتعامل فقط مع الذاكرة الداخلية للميكروكونتروللر .

On-Chip Memory

[RIGHT][RIGHT]كما اوضحنا سالفاً أن الميكروكونتروللر له ذاكرة داخلية RAM 128 بايت تم تقسيمهم الى توعين ذاكرة داخلية Internal RAM و ذاكرة السجلات ذات الوظائف الخاصة Special Function Register (SFR) memory


هذه الــ 128 بايت مقسمة كالتالى :- ( من 00 الى 7F ) فى 8051


من العنوان h00 الى العنوان 07h يتواجد سجل المصفوفة رقم 0 == “register bank 0”


من العنوان 8h0 الى العنوان 0Fh يتواجد سجل المصفوفة رقم 1 == “register bank 1”


من العنوان 10h الى العنوان 17h يتواجد سجل المصفوفة رقم 2 == “register bank 2”


من العنوان 18h الى العنوان 1Fh يتواجد سجل المصفوفة رقم 3 == “register bank 3”


من العنوان 20h الى العنوان 2Fh يتواجد Bit Memory و هى المنطقة التى نتمكن فيها من التعامل مع كل بت على حدا


من العنوان 30h الى العنوان 7Fh يتواجد منطقة التداول العام General purpose و هى بسعة 80 بايت 80 bytes has to be shared between the stack and user variables و يتم تقسيمها بين المبرمج و الميكرو فيما يسمى بـ stack [/right]
[/right]

[CENTER]Register Banks


سجل المصفوفات [/center]

[RIGHT][RIGHT]لكل مصفوفة عدد 8 سجلات تأخذ الرمز R و ترقم من 0 الى 7 كالتالى


(R0, R1, R2, R3, R4, R5, R6, and R7) و عادة ما تستخدم هذه السجلات فى نقل البيانات من مكان الى اخر و المثال التالى يبين استخدام السجل R4 فى عملية اضافة او جمع تتم مع الــ Accumulator [/right]
[/right]

ADD A,R4

[RIGHT]لاجراء هذا التطبيق تعالوا نفترض افتراضات و نطبقها


سنقوم بادخال القيمة 6 الى الــ Accumulator و القيمة 3 الى R4 [/right]

[LEFT]

MOV A,#6

MOV R4,#3

ADD A,R4

[RIGHT]الامر ADD سيقوم باضافة الرقم الموجود فى R4 الى القيمة المخزنة فى الــ Accumulator و يخزن الناتج فى الــ Accumulator


بالتالى القيمة فى الــ Accumulator ستكون 9


لدينا طريقة اخرى للتعامل مع السجل رقم 4 و هو التعامل مع العنوان الخاص به ألا و هو 04h … حيث اننا نتعامل مع المصفوفة رقم 0 [/right]
[/left]

ADD A,04h

[RIGHT][RIGHT]اذا ستخدمنا هذا الامر بهذه الصيغة سنحصل على نفس النتائج


يجب الانتباه الى الميكرو بمجرد ان يعمل فهو يعتبر ان bank 0 المحجوز على العنوان 00h الى 07h هو الذى سيستخدم فهو الــ default لكن على كل حال ممكن جداً ان البرنامج يغير مسار bank 0 و يوصفه فى مكان اخر و من ثم فان العناوسن السابق الاشارة اليها سيتغير موضعها


معنى ذلك انه يجب ان نكون حذرين عند التعامل مع البت فاذا استخدمنا المصفوة 0 == bank 0 فمن الممكن تداول بيانات على المنطقة من العنوان 08h الى العنوان 1Fh و لن يحدث مشاكل .


لكن اذا قرننا ان نتعامل مع المصفوافات 1 او 2 او 3 و سبق ان استخدمنا اماكن فى تداول البيانات تحت العنوان 20h فبكل تأكيد ستقوم هذه المصفوفات بمحو البيانات التى تداولناها تحت ذلك العنوان و الكتابة عليها [/right]


[/right]

Bit Memory

[RIGHT][RIGHT]كما ذكرنا آنفاً اننا من الممكن التعامل مع البت bit variables و نكتب عليها احدى القيمتين 0 او 1 و عددها 128 بت و تحتل العناوين من 00h الى 7Fh و نستخدم معهم الاوامر التالية


يستخدم لكتابة 1 داخل البت SETB


يستخدم لكتابة 0 داخل البت CLR


المثال التالى يوضح كيفية كتابة 1 على البت رقم 24h [/right]
[/right]

SETB 24h

[RIGHT]يجب الانتباه الى ان الــ 128 بت bit variables هى جزء من الذاكرة RAM و يتحلوا مواقع الذاكرة من 20h الى 2Fh بسعة 16 بايت


و من ثم إذا قمنا بادخال القيمة FFh الى الذاكرة عند العنوان 20h يا ترى ما معنى ذلك ؟؟؟؟؟؟


القيمة FFh تكافى 11111111b و بالتالى فلكى نكتبها على الذاكرة سنحتاج الى 8 خانات و حيث اننا اخترنا العنوان 20h للتخزين فهى ستأخد اول قيمة و السبع الباقين سيخزنوا فى السبع عناوين التالية .


معنى ذلك ان الأمر :-

[/right]

MOV 20h,#0FFh

مكافئ لهذه الاوامر مجتمعة

SETB 00h
SETB 01h
SETB 02h
SETB 03h
SETB 04h
SETB 05h
SETB 06h
SETB 07h

[RIGHT]يجب ملاحظة التالى … إذا لم تكن تضع فى اعتبارك اثناء البرمجة استخدام bit variables بالتالى يمكنك بسهولة جداً استخدام المنطقة من 20h الى 2Fh كجزء تقليدى من الذاكرة RAM و لكن اذا نويت استخدامها للتعامل على مستوى البت فكن حذر جداً فى الحفاظ على تلك المنطقة و ان تحترس ان يتم الكتابة عليها بغير قصد فتمحو البيانات التى سبق و خزنتها فيها .


خلاصة ما سبق انا المنطقة بين العناوين 00h و 7Fh هى منطقة خاصة جداً و فيها الوظائف التى يحددها المبرمج و من ثم فان باقى البرنامج سبدأ من العنوان 80 h و الذى يشير الى الميناء رقم 0 … فى الطبيعى تكون قيمة الخرج على كل الموانى مساوية للصفر بمعنى ان P0.0 --------- P0.7 تحمل القيمة 00000000


و اذا اردنا ان نكتب الرقم 00000001 على الميناء رقم 0 و هذه القيمة تكافئ 01h فإننا نكتب الامر التالى [/right]

MOV P0,#01h

و الذى يكافئه الامر التالى

SETB 80h

[RIGHT]الامر الاول سيدخل 8 قيم الى الميناء رقم 0 احدهما هو الواحد و الذى سيدخل على P0.0


بينما الامر الثانى سيرسل قيمه واحدة فقط الى P0.0 دون التأثير على باقى قيم الميناء .


نلاحظ اننا قد نحتاج فعلاً للتعامل مع طرف واحد فقط فى ميناء التوصيل رقم 0 و من ثم لن يصلح معنا الامر MOV .


لاحظ ان الميكرو عادة ما يحدد مؤشر Stack Pointer (SP) يشير الى العنوان 08h مباشرة و من ثم اذا كنا ننوى التعامل مع المصفوفات 1 او 2 او 3 فيجب ان نحدد عنوان الــ Stack Pointer (SP) الى عنوان اعلى من أعلى اى عنوان سيستخدم مع احد تلك المصفوفات و الا سنفاجأ بان الــ Stack Pointer (SP) قام بمسح بياناتنا و الكتابة عليه لذلك من المفضل استخدام bit variables لتحديد عنوان مبدئى للــ Stack Pointer (SP) عند عنوان اكبر من 2Fh لضمان حماية متغيراتنا من اعادة الكتابة عليها بواسطة Stack Pointer (SP)[/right]

ما شاء الله
مجهود عظيم جدا ربنا يوفقك ويكرمك وان شاء الله سأقرا الدورة وان شاء الله ستكون مفيدة

بارك الله فيك وجعله في ميزان حسناتك

السلام عليكم
اولا : مشكور جزيلا على هذا الشرح الرئع
اود المشاركة معكم وعمل بعض الدوئر باستخدام 8051 او 8052
والمشاروع الذى انفذة حاليا هو الساعة الرقمية تستخدم ال 8051
وبعد استكمالة سوف اضعة على المنتدى
وشكر للجميع من ساهم فى هذا الموضوع ولو برئية

السلام عليكم و رحمة الله
شكراً للزميل odaa على مشاركته و لتوفير الوقت بالمرفقات نجد الملفات الخاصة بعمل ساعة رقمية مبرمجة

الدائرة و البرنامج ليسوا من صنع يدى

كنت اود ان اتناول هذه الدائرة بالشرح لكن الوقت لا يسمح
و كذلك انتظر من يطبقها و يطلعنا على النتائج

هل يوجد الميكروكنترول في السعودية ؟؟
وكم سعرة ؟؟
وما افضل انواعة واسهلها برمجة

ما شاء الله مجهود مشكور جدا عليه، ودعائي بتوفيق الله لك

may allah bless u
good work
first, second and third course
go on
thnx

[CENTER]مرحباااا اخوووي

انا عندي بروجكت عنه يا ريت تساااعدني

وكل الصور اللي في الحلقات السابقه لا تعمل

شكرا [/center]

شكرا جزيلا على هذا المجهود الرائع

اللة عليك تسلم ايديك

بجد ما لقيت شرح اوع من ذلك جزاك الله كل خير ويريت تجدد الصور علشان بقالها فترة كبيرة

اولا السلام عليكم

اخوني البحث عن مخطط لهدا السركوي كيف يعمل ومخطط التنغدية