 |
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
|
|
نشاط [ F.Abdelaziz ]
قوة السمعة:332
|
|
12-06-2017, 12:59 PM
المشاركة 1
|
|
تدريبات وتمارين ومشاريع على السفن سيجمنت والمفاتيح :
فى هذا الجزء سوف نتناول تصميم المشاريع باستخدام السفن سيجمنت مع المفاتيح .
فى البداية سوف نتناول تدريب بسيط لشاشة عرض مكونة من وحدة سفن سيجمنت واحدة حتى نتعود على توصيل واستخدام السفن سيجمنت . بعد ذلك ، يتم استخدام وحدتين وأربع وحدات سفن سيجمنت بنظام الانتخاب فى مشاريع لتطبيقات عملية وأكثر فائدة .
تدريب تمهيدى رقم 1 : عداد تصاعدى والعرض على وحدة سفن سيجمنت.
الغرض :
ربما يكون هذه التدريب أبسط تدريب على السفن سيجمنت .
فى هذا التدريب يتم توصيل شرائح وحدة سفن سيجمنت نوع الكاثود المشترك إلى المنفذ PORTB للميكروكونترولر PIC16F877A ، بحيث يتم توصيل الشريحة “a” بالطرف RB0 ، والشريحة “b” بالطرف RB1 وهكذا حتى الشريحة “g” بالطرف RB6 . السفن سيجمنت سوف تعرض العد التصاعدى للأرقام من “0” إلى “9” وتعود مرة أخرى إلى الصفر وتستمر ، مع تأخير (فاصل) زمنى واحد ثانية بين كل رقم وآخر .
الدائرة الكهربية :
فى الدائرة الكهربية المبينة أدناه ، يتم استخدام وحدة سفن سيجمنت نوع "كاثود مشترك" ، حيث يتم توصيل الكاثود بالأرضى ، ويتم توصيل ON الشرائح عن طريق تحديدها بالمنطق المرتفع HIGH(1) . يتم تشغيل الشرائح من خلال مقاومات لتحديد التيار .

البرنامج :
كود:
/*****************************************************************************
1-DIGIT 7-SEGMENT COUNTER
=============================
In this project a common cathode 7-segmentdisplay is connected to PORT B of a
PIC16F877A type microcontroller (other types can also be used). The microcontroller
is operated from an 8MHz crystal.
The display counts from 0 to 9 and then back to 0 continuously with one second delay
between each count.
**************************************************************************/
void main()
{
unsigned char Disp, Cnt = 0;
unsigned char SevenSegment[] =
{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
TRISB = 0; // PORT D pins are outputs
PORTB = 0 ;
for(;;) // DO FOREVER
{
Disp = SevenSegment[Cnt]; // Get bits of number to be displayed
PORTB = Disp; // Display number
Cnt++; // Incremet count
if(Cnt == 10)Cnt = 0; // Back to zero
Delay_Ms(1000); // Wait 1 second
}
}
فى بداية البرنامج ، يتم إعلان وتهيئة متغير العداد “Cnt” بالصفر (من نوع unsigned char ويكفى char) ، هذا المتغير هو الذى سوف يتم تزايده بواحد عشرى ولكن الأرقام العشرية عند توصيلها مباشرة إلى السفن سيجمنت فإنها لا تعنى شىء ، ولذلك يجب تحويلها إلى ما يعادلها من شفرة السفن سيجمنت ، على سبيل المثال ، لعرض الصفر “0” العشرى يجب إرسال معادل السفن سيجمنت وهو العدد 0x3F(0b000111111) إلى المنفذ PORTB ولعرض الواحد “1” العشرى يجب إرسال معادل السفن سيجمنت وهو العدد 0x06(0b00000110) وهكذا (هذه الأعداد تسمى mask ، أو نماذج بتات الشرائح ) ، كما يتم إعلان متغير التحويل للعرض “Disp” (نوع char). أيضا ، يتم تخزين "نماذج بتات الشرائح" للأرقام من “0” إلى “9” فى المصفوفة “SevenSegment” (نوع char) ، كما يتم تهيئة المنفذ PORTB كمخارج .
كود:
unsigned char Disp, Cnt = 0;
unsigned char SevenSegment[] =
{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
TRISB = 0; // PORT D pins are outputs
PORTB = 0 ;
بعد ذلك ، يتم تشكيل حلقة غير منتهية باستخدام عبارة for . داخل هذه الحلقة يتم :
• تحويل العداد Cnt من عشرى إلى شفرة السفن سيجمنت وذلك عن طريق "فهرسة" المصفوفة SevenSegment باستخدام قيمة متغير العداد Cnt . يتم تخزين "نموذج بتات الشرائح" فى المتغير Disp .
كود:
Disp = SevenSegment[Cnt]; // Get bits of number to be displayed
• بعد ذلك يتم إرسال محتويات المتغير Disp (نموذج بتات الشرائح أو mask ) إلى المنفذ PORTB لعرض العدد الموجود فى المتغير Cnt .
كود:
PORTB = Disp; // Display number
• بعد ذلك يتم تزايد المتغير Cnt بواحد ، وتصفيرة إذا كان يحتوى على 10 للعودة مرة أخرى إلى الصفر .
كود:
Cnt++; // Incremet count
if(Cnt == 10)Cnt = 0; // Back to zero
• ثم يتم إدخال تأخير لمدة واحد ثانية فى الحلقة وبعدها تتكرر الحلقة .
كود:
Delay_Ms(1000); // Wait 1 second
اقتراح بالتعديل :
يمكن جعل البرنامج السابق أكثر قابلية للقراءة ، إذا تم دمج جزء العرض فى البرنامج فى دالة . فيما يلى البرنامج بعد التعديل :
كود:
// this function forms the bit pattern corresponding to a number between 0 and 9. This
// bit pattern is returned to the calling program
//
unsigned char Display_Segment(unsigned char Number)
{
unsigned char SevenSegment[] =
{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned char Disp;
Disp = SevenSegment[Number]; // Get bits of the number to be displayed
return (Disp); // Return bits to main program
}
//
// Start of main program
//
void main()
{
unsigned char Cnt = 0;
TRISB = 0; // PORT B pins are outputs
PORTB = 0 ;
for(;;) // DO FOREVER
{
PORTB = Display_Segment(Cnt); // Display number
Cnt++; // Increment count
if(Cnt== 10)Cnt = 0; // Back to zero
Delay_Ms(1000); // Wait 1 second
}
}
الدالة Display_Segment تستقبل عدد بين 0 و 9 وتعيد returns نموذج بتات الشرائح المقابل لهذا العدد. فى البرنامج الرئيسى يتم إرسال هذا النموذج إلى المنفذ PORTB لعرض العدد على وحدة السفن سيجمنت .
|