قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

مشاهدة نتائج الإستفتاء: هل ترى أهمية لدورة تشرح لغة (mikroBasic) لبرمجة البيك ؟
موضوع فى غاية الأهمية و ضرورى جدا ... ... 1 23 95.83%
موضوع هام ولكن يوجد ما يكفى ... ... 2 1 4.17%
موضوع مكرر ولا داع لبذل المزيد من الجهد ... 3 0 0%
المصوتون: 24. أنت لم تصوت في هذا الإستفتاء

   

صهيب البلال
:: مهندس متواجد ::
تاريخ التسجيل: Dec 2009
المشاركات: 85
نشاط [ صهيب البلال ]
قوة السمعة:
قديم 23-11-2010, 05:08 PM المشاركة 153   
افتراضي



السلام عليكم ورحمة الله وبركاته
أشكر الاستاذ وليد على دروسه الماتعة وأشكر جميع الإخوة المتابعين

ونبدأ في درس جديد قد يكون درس نظري لكنه أساسي وهام جدا

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

أ-الدوال الحسابية : من خصائص هذه الدوال أنها :-
- تتعامل مع الأعداد والأرقام
- تتعامل مع المتغيرات التي يخزن بداخلها أرقام أو أعداد
( Byte , long , word, float ….)

ملاحظة : الفرق بين الرقم والعدد
الرقم : يتكون من مرتبة واحدة يعني من (صفر الى تسعة )
العدد : يتكوم من عدة مراتب ( آحاد وعشرت أو آحاد وعشرات ومئات)

- يجب أن نضع ناتج هذه الدوال في متغير نوعه يناسب القيمة التي تخزن فيه ( وهذا الأمر سيتضح فيما بعد)

- لا تتعامل مع الحروف والسلاسل النصية ..
وهذه الدوال مشهورة جدا وهي :-

1-دالة الجمع (+) :
تستخدم لجمع عددين أو رقمين أو قيمة متغيرين ويجب أن نضع ناتج هذه العملية في متغير يناسب القيمة التي نحصل عليها
يعني لو أدرت جمع عددين كلاهما أقل من 100 فيفضل أن أضع الناتج في متغير من النوع (byte)
أما لو أردت جمع عددين ناتجهما أكبر من 300 مثلا فلا يصح وضع الناتج في متغير من النوع (byte) لأنه لا يخزن رقم أكبر من 255 وإنما يجب وضعها في متغير (word)
إذن المبرمج هو الذي يحدد نوع المتغير الذي يحتاجه من خلال تخمينه للناتج الذي يتوقع الحصول عليه

كود:
Dim sum,x,y,z as byte
Main
x=150
y=200
z=20
sum=X+3       '  ممكن
sum=Y+Z      ' ممكن
sum=X+Y     ' غير ممكن لآن الناتج سيكون أكبر من 255 
     =x+y       ' غير ممكن لأننا لم نسند الناتج الى متغير
end.

قد يقول قائل " عملية الجمع واضحة جدا ولا تحتاج الى شرح أو توضيح فلماذا تتعب نفسك ؟ "
صحيح هي واضحة لكن الغرض هو التنبيه على ضرورة استخدام المتغير المناسب للقيمة التي نتوقع الحصول عليها.. وهذا الكلام ينطبق على بقية الدوال الحسابية الأخرى ( الطرح , الضرب , القسمة )


2-دالة الطرح (- ) :
لا تحتاج الى توضيح لكن يفضل استخدام متغير من (short , longint , integer) خصوصا اذا كنت تتوقع الحصول على نتائج بقيمة سالبة (أقل من الصفر)
3[COLOR="Blue"]- دالة الضرب (*)[/
COLOR]

4- دالة القسمة ( / ) :
تعطي الناتج بصيغة (floating point) الفاررزة العائمة لذا يفضل استخدام متغير من نوع (float) عند التعامل مع هذه الدالة للحصول على نواتج دقيقة
للتوضيح أكثر . كلنا يعرف أن ناتج قسمة 5 على 2 هو 2.5
لنحاول تنفيذ البرنامج التالي ونرى الفرق

كود:
dim x as byte
         y as float
Main
x=5/2
y=5/2
end.
بعد التنفيذ سنرى أن x=2 بينما y=2.5 لماذا ؟؟؟
X لا يتعامل مع الفارزة العائمة
Y يتعامل مع الفارزة العائمة

5-دالة القسمة (div) :
تقرب ناتج القسمة الى أقل عدد صحيح يعني أنها تحذف الكسر المتبقي بعد عملية القسمة أي أنها لاتتعامل مع الفارزة العائمة
لو نفذنا البرنامج التالي :


كود:
Dim x as byte
         y as float
Main
x=5/2
y=5 div 2
End.
سنجد أن y=2
إذن الفرق بين ( / ) و ( div ) أن الأولى تعطي ناتج القسمة كاملا من غير تقريب بينما الدالة (div) تلغى الرقم الذي بعد الفارزة وتقرب الناتج الى أقل عدد صحيح

ملاحظة : نعلم أن ناتج قسمة أي عدد على صفر يكون مالانهاية (infinity) .... يعني لو كتبنا البرنامج التالي
كود:
Dim X as byte
Main
X= 5 / 0
End.
لن يتنفذ هذا البرنامج وسيعطينا رسالة خطأ
لكن ماذا لو كتبنا البرنامج التالي

كود:
Dim x,y as byte
Main
Y=0
X= 5 / y
End.
نجد ان البرنامج يتنفذ لكن كم ستصبح قيمة x ؟
قيمة x ستكون أكبر ما يمكن يعني لو كانت x من النوع byte فستكون قيمتها 255 ( أكبر قيمة ضمن هذا النوع )
ولو كانت x من النوع word فستكون قيمتها 65535



6-دالة ( mod ) :
تعطي باقي القسمة
لو نفذنا البرنامج التالي :
كود:
dim X as byte
Main
X= 5 mod 2
end.
نجد أن x=1



ملاحظة هامة : لو كان عندنا عدد مكون من مرتبتين ( آحاد وعشرات ) وأردنا فصل مرتبة الآحاد عن العشرات فسنحتاج الى دالة ( mod ) ودالة (div) كيف ؟
نفرض أننا نريد فصل مرتبة الاحاد عن العشرات للعدد (35 ) يعني نجعل x=5 , y=3 يكون الجواب
X=35 mod 10
Y=35 div 10
نحتاج الى هذه الملاحظة كثيرا خصوصا في المشاريع التي تتعلق بالـ
(7 segment)


7-دالة (inc) : صيغتها
كود:
Inc(parameter)
وظيفتها أنها تقوم بإضافة واحد للبراميتر الذي بداخلها عند كل تنفيذ
يعني بدل أن نكتب x=x+1 يمكن أن نكتب inc(x)


8- دالة ( dec) :
عكس الدالة السابقة يعني تنقص واحد عند كل تنفيذ
ماذا تتوقع نتيجة البرنامج التالي ؟

كود:
dim x,i as byte
Main
x= 5
For i=0 To 2
Inc(x)
Next i
For i=3 To 0 step -1
Inc(x)
Next i
end.
X= ??
أترك الإجابة لك


9-دالة (ceil) : تقرب القيمة الى أكبر عدد صحيح
لو كتبنا

كود:
x = ceil(0.5)
نجد أن x=1
ولو كتبنا

كود:
x = ceil(0.3)
نجد أن x= 0

10-دالة (floor) : تقرب القيمة الى أقل عدد صحيح
لو كتبنا

كود:
x = floor(3.5)
نجد أن x=3

11-دالة ( fabs) : تعطي القيمة المطلقة للعدد ( تحذف الإشارة السالبة)
لو كتبنا

كود:
x = fabs(-1.3)
نجد أن x=1.3

نكمل بقية الدوال في الدرس القادم إن شاء الله تعالى
كلمة أخيرة : تخيل كم تنفعك هذه الدوال لو فكرت بتنفيذ مشروع الآلة الحاسبة (calculator)
وسنتعرف في الدروس القادمة على الدوال التي نحتاجها في تنفيذ مشروع الحاسبة العلمية (Scientific Calculator)

اعلانات

فيصل72
:: مهندس جيد ::
تاريخ التسجيل: Nov 2010
المشاركات: 245
نشاط [ فيصل72 ]
قوة السمعة:
قديم 24-11-2010, 01:12 AM المشاركة 154   
افتراضي


شكرا أخي الفاضل صهيب على المتابعة.
لدي سؤال من فضلك
كيف يمكن أن نقسم البورت الى قسمين مثلا ولكل قسم نعطي قيمة متغير
كمثال portb.0 حتى portb.3 نعطيها قيمة متغير و portb.4 حتى portb.7 متغير آخر.

اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )

صهيب البلال
:: مهندس متواجد ::
تاريخ التسجيل: Dec 2009
المشاركات: 85
نشاط [ صهيب البلال ]
قوة السمعة:
قديم 24-11-2010, 08:16 PM المشاركة 155   
افتراضي


شكرا أخي الفاضل صهيب على المتابعة.
لدي سؤال من فضلك
كيف يمكن أن نقسم البورت الى قسمين مثلا ولكل قسم نعطي قيمة متغير
كمثال portb.0 حتى portb.3 نعطيها قيمة متغير و portb.4 حتى portb.7 متغير آخر.
أهلا أخي فيصل
لغة المايكروبيسك تتيح التعامل مع كل طرف من أطراف البورت على حدة يعني أنك تستطيع الوصول الى portb.0 وتغير حالته من 0 الى 1 وبالعكس وهذا يعطي مرونة في التعامل مع البورت
أما تقسيم البورت الى قسمين فيمكن أن أجزم بأن هذا غير ممكن وذلك لعدة أسباب أهمها أن البورت يتكون من 8bits فلو قسمناه الى قسمين يصبح لكل قسم 4bits
وإن أصغر متغير والذي هو (char أو byte) يأخذ 8bits . فكيف نعطي 8bits الى قسم من البورت الذي هو 4bits ....
أرى أن توضح السبب الذي دعاك للتفكير في هذه الطريقة لعلي أساعدك بفكرة أخرى
وشكرا


فيصل72
:: مهندس جيد ::
تاريخ التسجيل: Nov 2010
المشاركات: 245
نشاط [ فيصل72 ]
قوة السمعة:
قديم 26-11-2010, 02:18 AM المشاركة 156   
افتراضي


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


فيصل72
:: مهندس جيد ::
تاريخ التسجيل: Nov 2010
المشاركات: 245
نشاط [ فيصل72 ]
قوة السمعة:
قديم 26-11-2010, 01:40 PM المشاركة 157   
افتراضي


شكرا أخي الغالي على الرد وفقك الله وزادك من علمه.
سؤالي يا أخي كان خطأ فالمفروض أن أسأل ان كان هناك دالة للتحويل
الى النظام العشري فقد احتجت ذلك في أحد التمارين .وعدت فاستخدمت
كود لهذا الأمر.
للتوضيح في احد التمارين على الدرس الأخير كتبت هذا البرنامج:

dim x,y as byte
main:
trisb=0
portb=0
aaa:
x=0
for y=0 to 99
portb=x
inc(x)
delay_ms (500)
next y
goto aaa
end.

واضح اننا هنا سنقوم بالعد من 0 حتى 99 واظهار النتيجة على البورت b.
ولكن اذا استخدمنا 7 segment سيظهر العدد بنظام الهيكس.
هنا استخدمت div و mod
فأصبح البرنامج:

dim x,y,m,n as byte
main:
trisa=0
trisb=0
porta=0
portb=0
aaa:
x=0
for y=0 to 99
m=x mod 10
n=x div 10
porta=m
portb=n
inc(x)
delay_ms (500)
next y
goto aaa
end.

طبعا نجح الأمر ولكن اصبح لدينا متغيرين القيمة القصوى لكل واحد 4 بيت ونعبر
عته ب 8 بيت ولذلك استخدمنا 2 بورت لأظهار النتيجة. (من هنا كان سؤالي السخيف الأول).
حسنا ماذا لو جعلنا قيمة البورت تظهر بالنظام العشري؟
هنا أصبح البرنامج كالتالي:

dim x,y,m,n as byte
main:
trisb=0
portb=0
aaa:
x=0
for y=0 to 99

m=x div 10
m=m*6
n=x+m
portb=n

inc(x)
delay_ms (500)
next y
goto aaa
end.

وهنا ظهرت النتيجة بشكل صحيح واستخدمنا فقط بورت واحد مع 2 7 segment

وهنا سؤالي هل هناك دالة للتحويل الى النظام العشري دون استخدام الكود؟
(ملاحظة الكود الذي استخدمته يعمل فقط مع الأعداد الأقل من 100 واستخدمته بداعي التبسيط).


فيصل72
:: مهندس جيد ::
تاريخ التسجيل: Nov 2010
المشاركات: 245
نشاط [ فيصل72 ]
قوة السمعة:
قديم 26-11-2010, 02:13 PM المشاركة 158   
افتراضي


8- دالة ( dec) :
عكس الدالة السابقة يعني تنقص واحد عند كل تنفيذ
ماذا تتوقع نتيجة البرنامج التالي ؟


كود:
dim x,i as byte
Main
x= 5
For i=0 To 2
Inc(x)
Next i
For i=3 To 0 step -1
Inc(x)
Next i
end.X= ??
أترك الإجابة لك
هنا x=12
ولكن ما علاقة ذلك بالدالة dec ?

كود:
x = ceil(0.3)
نجد أن x= 0
ألا يجب أن تكون x=1

بالمناسبة لم استطع استخدام الدوال: ceil,floor,fabs
البرنامج يقبلها ولكن عند الأمر compiled يعطيني دائما
error out of memory

آسف اعرف انني اتعبكم معي فألف شكر.


صهيب البلال
:: مهندس متواجد ::
تاريخ التسجيل: Dec 2009
المشاركات: 85
نشاط [ صهيب البلال ]
قوة السمعة:
قديم 27-11-2010, 12:18 PM المشاركة 159   
افتراضي


وهنا سؤالي هل هناك دالة للتحويل الى النظام العشري دون استخدام الكود؟
(ملاحظة الكود الذي استخدمته يعمل فقط مع الأعداد الأقل من 100 واستخدمته بداعي التبسيط).
أهلا بك اخي وأشكرك على المتابعة وبصراحة فكرتك التي نفذتها جميلة جدة وتمكنت من استخدام الحيل البرمجية للحصول على ما تريد وهذه أهم صفة في المبرمج
بالنسبة لسؤالك
نعم توجد دالة تحول من العشري الى صيغة BCD وهي تخدمك في مشروعك هذا
لو استخدمتها يكون برنامجك كالتالي :
كود:
dim i as  byte
main:
'   Main program
trisb=0
for i=0 to 99
portb=Dec2Bcd(i)
delay_ms(1000)
next i
end.
كما أشكرك على تنبيهك لي حول الأخطاء الإملائية التي حصلت أثناء الشرح
x = ceil(0.3)
نجد أن x=0
ألا يجب أن تكون x=1
نعم يجب أن تكون x=1 واعتذر لهذا الخطأ الذي وقع سهوا

دالة ( dec) :
عكس الدالة السابقة يعني تنقص واحد عند كل تنفيذ
ماذا تتوقع نتيجة البرنامج التالي ؟
x=??
أترك الإجابة لك
هنا x=12
ولكن ما علاقة ذلك بالدالة dec ?
صدقت أخي المفروض يكون البرنامج كالتالي :
كود:
dim x,i as byte
Main
x= 5
For i=0 To 2
Inc(x)
Next i
For i=3 To 0 step -1
dec(x)
Next i
end.
لكن حتى في الحالة الأولى فإن x لاتساوي 12 .. راجع البرنامج بانتباه لطفا

أخيرا
بالمناسبة لم استطع استخدام الدوال: ceil,floor,fabs
البرنامج يقبلها ولكن عند الأمر compiled يعطيني دائما
error out of memory
هذه الدوال تتعامل مع الفارزة العائمة لذلك تستهلك قدرا كبيرا من ذاكرة البك
جرب استخدام pic بذاكرة أكبر وليكن 16f877a ستجد أنها تعمل دون مشاكل
أكرر شكري لك على هذا التفاعل
والى اللقاء في درس جديد قريب إن شاء الله تعالى


فيصل72
:: مهندس جيد ::
تاريخ التسجيل: Nov 2010
المشاركات: 245
نشاط [ فيصل72 ]
قوة السمعة:
قديم 29-11-2010, 12:38 AM المشاركة 160   
افتراضي


شكرا أخي الغالي
الآن كل شيء تمام
عدا أنه هنا:

كود:
dim x,i as byte 
Main 
x= 5
 For i=0 To 2
 Inc(x) 
Next i 
For i=3 To 0 step -1 
Inc(x) 
Next i 
end.
ما زالت x=12

وهنا:

كود:
dim x,i as byte 
Main 
x= 5 
For i=0 To 2 
Inc(x) 
Next i 
For i=3 To 0 step -1 
dec(x) 
Next i 
end.
x=4

وبأنتظار الدرس القادم باذن الله.



الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 05:13 PM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)