منتديات الالكترونيات العصرية  
yoursite.com page title .

استرجاع كلمة المرور طلب كود تفعيل العضوية تفعيل العضوية
العودة   منتديات الالكترونيات العصرية > منتدى الحاكمات الدقيقة Microcontroller > منتدى المتحكمات ميكرو بلغة السي MikroC

  #1  
قديم 09-23-2019, 01:21 AM
الصورة الرمزية F.Abdelaziz
F.Abdelaziz F.Abdelaziz غير متواجد حالياً
استاذ الكترونيان
 
تاريخ التسجيل: May 2009
المشاركات: 2,740
معدل تقييم المستوى: 22
F.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to behold
افتراضي التحويل بين العشري decimal و الثنائى المكود عشري b

التحويل بين العشري decimal و الثنائى المكود عشري binary-coded-decimal (BCD)

عند التعامل مع الميكروكونترولر ، ستصادف عددًا لا بأس به من المكونات التي توفر البيانات - أو تتطلب بيانات ثنائية مكودة عشرى BCD .
إذا كنت معتادًا على التحويل بين الثنائي binary والعشري decimal والست عشري hexadecimal ، فهذا أمر واضح إلى حد ما ... ولكن إذا كنت قد بدأت للتو في التعامل باستخدام المتحكمات الدقيقة ، فقد تجد نفسك في حيرة. آمل أن يجعل هذا الموضوع الأمور أكثر وضوحًا.
فى النظام BCD لا يتم فيه تخزين القيمة في ذاكرة الوصول العشوائي RAM بتنسيق ثنائي بسيط ، ولكن بدلاً من ذلك يتم بطريقة نصف ثنائية ونصف عشرية. ما يحدث بالفعل هو أن كل رقم من العدد في شكله العشري يتم تخزينه في عدد محدد من البتات ... عادة ما تكون أربعة أو ثمانية.
على سبيل المثال ، إذا كنت بحاجة إلى تخزين العدد العشري 37 في شكل BCD ، مع تخصيص أربعة بت لكل خانة ، فسيتم ترميزه على النحو التالي:



لذلك ، إذا كنت تقرأ هذه البايت من ذاكرة الوصول العشوائي (أو من مكون آخر) وكنت تتوقع الحصول على القيمة العشرية 37 ، فستحصل فعليًا على ... 55. ما عليك فعله هو قراءة البايت ، ثم تحويله مرة أخرى من BCD إلى عشري ، قبل استخدامه. ليست صعبة ، مجرد مربكة بعض الشيء.
لماذا هذا النظام ضروري؟
كان هذا النظام شائع جدا فى أنظمة الكمبيوتر الأقدم بكثير التى تعمل بمجموعات التعليمات البدائية ، ولكن الآن لا تستخدم . من حين لآخر قد ترى أن هذا النظام يستخدم حيث تكون الرياضيات التي تتطلب دقة غير محدودة أكثر أهمية من تركيب الأرقام في تنسيقات بيانات ذات عرض ثابت (مثل في التطبيقات المالية والعلمية). ولكن الأماكن التي نراها أكثر في مجال الإلكترونيات الرقمية ؛ التى غالبا ما تنطوي على الساعات ، أو أنواع أخرى من العروض الرقمية. على سبيل المثال: تقوم معظم آلات حاسبة الجيب القديمة بتخزين الأرقام في تظام BCD ، لأنها تجعل دائرة العرض أبسط بكثير.
دعونا نلقي نظرة على كيفية التحويل من وإلى BCD.

التحويل من BCD إلى العشري
لنفترض أنك قرأت بايت من مكون تقول الداتا شيت أنه بنظام BCD ، مع أربعة بت لكل رقم digit. ربما لم تعلن الداتا شيت صراحة أنه "BCD" - ربما تكون قد أعلنت فقط خانة "العشرات"“tens” بشكل منفصل بدلاً من ذلك:



الشكل يبين مقتطف من الداتا شيت لشريحة الوقت الفعلي DS1307 ، التي تصف تنسيق البيانات للدقائق والثواني. على الرغم من أنها لا تشير صراحةً إلى "BCD" ، إلا أنها توضح أن العشرات مخزّنة في وحدات بتات منفصلة (4-6) والآحاد مخزنة فى البتات (0-3) .
لتحويل هذا إلى قيمة عشرية عادية ، نقوم بفصل الأرقام digits ببعض القناع masking الثنائي البسيط ، وضرب قيمة العشرات في 10 ، ثم أضافتهم (جمعهم) معًا:

كود:
bcd_value = read_from_somewhere();      // lets say bcd_value = 55, or 0x37
tens = bcd_value >> 4;                  // tens = 3 (by shifting down the number four places)
units = bcd_value & 0x0F;               // units = 7 (the 0x0F filters-out the high digit)
final_value = (tens * 10) + units;      // final_value = 37

من المفيد الإشارة هنا إلى أن التمثيل السداسي عشري لقيمة BCD يطابق القيمة النهائية. على سبيل المثال: 37 في النظام العشرى يصبح 0x37 في BCD . إذا كنت تستخدم ثوابت في شفرتك والتى تكون قيم BCD ، فمن المستحسن بشدة استخدامها في شكلها السداسي عشر ، حيث إنها ستوضح ما تفعله شفرتك.

التحويل من عشري إلى BCD
للقيام بذلك ، يجب أن نفصل رقم العشرات tens عن رقم الآحاد units ، ونزحزح shift العشرات لأربعة أماكن ، ثم نجرى عملية OR بينهما معا:


كود:
orig_value = 35;                 // original value we want to encode in BCD
tens = orig_value / 10;          // tens = 3 (by integer division)
units = orig_value % 10;         // units = 5 (by modulus)
bcd_value = (tens << 4) | units; // bcd_value = 53, or 0x35
 (by shifting the tens up four places and binary-OR'ing it with the units)
من المعروف أن زحزحة جهة اليسار لمكان واحد تعادل الضرب فى 2 والزحزحة جهة اليسار لأربع أماكن تعادل الضرب فى 16 ، كما أن عملية OR تعادل الجمع (+) ، وبالتالى يكون لدينا الصيغة التالية :


كود:
unsigned int tmp1, tmp2, minute;
tmp1 = minute / 10;               //Write tens of minute
 tmp2 = minute % 10;               //Write unit of minute
 minute = tmp1 * 16 + tmp2;        //Includes all value

يمكن وضع هذه التحويلات على هيئة دوال كما يلى :

كود:
 // turns a standard byte into a BCD equivalent
unsigned int DecToBcd(unsigned int val)
{
   return( ((val/10) << 4) | (val%10) );
}

// turns a BCD-encoded byte back into a standard one
unsigned int BcdToDec(unsigned int bcd)
{
   return( ((bcd >> 4) * 10) + (bcd&0x0F) );
}
رد مع اقتباس
إضافة رد

مواقع النشر (المفضلة)

أدوات الموضوع
انواع عرض الموضوع

تعليمات المشاركة
لا تستطيع إضافة مواضيع جديدة
لا تستطيع الرد على المواضيع
لا تستطيع إرفاق ملفات
لا تستطيع تعديل مشاركاتك

BB code is متاحة
كود [IMG] متاحة
كود HTML معطلة



الساعة الآن 05:55 PM.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
الحقوق محفوظة لمنتديات الاليكترونيات العصرية

Security team

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77