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

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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 24-03-2013, 12:41 PM المشاركة 1   
افتراضي شرح البرمجة مع السفن سيجمنت ومفسر الشفرة 7447 بلغة السى والمترجم ميكروسى برو : Twitter FaceBook Google+



شرح البرمجة مع السفن سيجمنت ومفسر الشفرة 7447 بلغة السى والمترجم ميكروسى برو :
مقدمة :
وحدة العرض السفن سيجمنت هى واحدة من أجهزة العرض الشائعة الاستخدم فى عالم الإلكترونيات . سهول التشغيل والرؤية الجيدة جعلتها تستخدم فى الكثير من التطبيقات . كما هو واضح من الاسم , فإن بها سبع ليدات LEDs مقسمة إلى سبع شرائح segments . هذه الشرائح تستخدم عادة لعرض الأرقام من 0 إلى 9 والحروف من A إلى F ,كما أن بها أيضا نقطة عشرية DP .







أنواع وحدات السفن سيجمنت :
يوجد 8 ليدات , لذلك من المفترض وجود 16 طرف , لكن من ذلك يوجد 10 أطراف (كما فى الشكل أعلاه) . لذك , يجب وجود بعض التوصيلات الداخلية والتى تحتاج لمعرفتها .
بناء على التوصيلات الداخلية يوجد نوعين من السفن سيجمنت :
1- السفن سيجمنت نوع الأنود المشترك Common anode 7-segment .
2- السفن سيجمنت نوع الكاثود المشترك Common cathode 7-segment .







من الشكل المبين أعلاه يمكنك أن ترى أنه فى "الأنود المشترك" يتم توصيل جميع أنودات الليدات معا لتشكيل طرف أنود مشترك ولإضاءة ليد , يجب عليك توصيل الجهد الموجب للمصدر ( VCC على سبيل المثال ) بهذا الطرف المشترك والأرضى بكاثود الليد المناسب ( a,b,c..g على سبيل المثال ) . والعكس بالعكس فى "الكاثود المشترك" . لاحظ وجود طرفين للطرف المشترك وهما متصلان معا داخليا ليكون المجموع 10 أطراف .
عرض العدد





الشرائح لها 7 أسماء مختلفة (مبينة بالشكل أدناه) وطرف مناظر (مبين بالشكل أعلاه) . الآن إذا أردت عرض العدد "4" يجب عليك إضاءة شرائح الليدات "f,g,b,c" كما فى الشكل التالى :









وعلى فرض أنك تستخدم السفن سجمنت نوع "الأنود المشترك" ( هذا يعنى "0" لإضاءة الليد) وأن الثمانى أطراف نتصلة بالمنفذ PORTB للميكروكونترولر , عندئذ يجب أن تكتب :
PORTB = 0b10011001; or PORTB = 0x99;
سوف تشاعد العدد "4" على السفن سيحمنت . والآن يمكنك عرض أى عدد تريده كما فى الشكل التالى :










مترجم الميكروسى برو يمتلك العديد من الأدوات والمكتبات , من أدواته "محرر السفن سيجمنت"
7-segment editor لتوفير الراحة لك فهو يقوم نيابة عنك بجميع الحسابات .







مفسر الشفرة من ثنائى مكود عشرى BCD إلى سفن سيجمنت

اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 24-03-2013, 12:52 PM المشاركة 2   
افتراضي


مفسر الشفرة من ثنائى مكود عشرى BCD إلى سفن سيجمنت
قد يشكل حساب كود السفن سيجمنت فى كل مرة شىىء من الإزعاج للبعض .
هل هناك طريقة لاستخدام القيمة العشرية فقط لتعرضها السفن سيجمنت ؟
نعم , الدائرة المتكاملة المسماة مفسر الشفرة من BCD إلى سفن سيجمنت ( 7447 للأنود المشترك و 7448 للكاثود المشترك ) تقوم بذلك نيابة عنك .




هذه الدائرة المتكاملة تقبل دخل ثنائى مكود عشرى BCD وتقوم بتحويله إلى النموذج المناسب اللازم لإضاءة وحدة السفن سيجمنت . فى حالة الأنود المشترك (7447) , الحالة المنخفضة للخرج تؤدى إلى إضاءة ليد الشريحة . هذه الدائرة المتكاملة لها 4 مداخل هى A,B,C,D . هذه المداخل يمكن أن تبدء من 0000 إلى 1001 ( أى من 0 إلى 9 ) .
الوضع العادى , عندما تكون حالة الأطراف LT,RBI,BI مرتفعة فإن الدائرة المتكاملة ستقوم بتحويل أى عدد عشرى مكود ثنائى BCD على المداخل A,B,C,C إلى ما ئؤدى إلى ظهور العدد العشرى المكافىء على وحدة العرض السفن سيجمنت , عدا أنه لإذا ذات العدد العشرى المكود ثنائى عن 9 فإنه يظهر رمز معين مع كل رقم . يجب استخدام مقاومات لتحديد التيار قيمتها 330 ohms عند استخدام هذه الدائرة المتكاملة .





ملاحظات :
1- فى العمل العادى , دخل الإطفاء BI (الطرف 4"BI/RBO" ) يجب أن يكون "مفتوح" open أو محفوظ عند الحالة المرتفعة (غير فعال) عند الرغبة فى عرض الخرج من 0 إلى 15 . دخل الإطفاء المتموج RBI ( الطرف 5 "RBI" ) يجب أن يكون مفتوحا أو مرتفعا (غير فعال) عند عدم الرغبة فى إطفاء الصفر العشرى .
2- عند تطبيق الحالة المنطقية المنخفضة low (تفعيل) مباشرة على دخل الإطفاء BI (الطرف 4"BI/RBO" ) , يصبح جميع مخارج الشرائح مفصولة off بغض النظر عن أى مدخل آخر .
3- عندما يكون مدخل الإطفاء المتموج RBI ( الطرف 5 "RBI" ) والمداخل A,B,C,D (الأطراف 7,1,2,6 ) عند الحالة المنخفضة , مع وجود دخل اختبار اللمبات LT مرتفعا (عدم تفعيل),فإن جميع مخارج الشرائح تصبح مفصولة off ويصبح مخرج الإطفاء المتموج RBO فى الحالة المنخفضة ( حالة الاستجابة) .
4- عندما يكون دخل الأطفاء / خرج الأطفاء المتموج B1/RBO مفتوح open أو محفوظ عند الحالة المرتفعة وتم تطبيق حالة منخفضة على دخل اختبار اللمبات , فإن جميع مخارج الشرائح تكون موصلة on .







الطرف BI/RBO موصل فى شكل منطق AND ليساعد كدخل إطفاء BI و / أو كخرج إطفاء متموج RBO.
الآن سوف نستخدم مترجم الميكروسى برو لكتابة برنامج من أجل السفن سيجمنت , هذا البرنامج سوف يقوم بالعد من الصفر إلى تسعة ويبدأ ويتكرر من جديد .
البرنامج :

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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 24-03-2013, 12:57 PM المشاركة 3   
افتراضي


البرنامج :


كود:
void main() { int i = 0 ; //Take a variable for "for" loop TRISB = 0 ; // PORTB set as outputs PORTB = 0xFF; // All LEDs off while (1) { for(i=0; i<=9 ; i++) { PORTB = i ; // show counting Delay_ms(1000) ; // Wait } } }

النتيجة :


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 24-03-2013, 01:02 PM المشاركة 4   
افتراضي


أما إذا أرت الاستغناء عن مفسر الشفرة من BCD إلى سفن سيجمنت !! فيجب عليك إنشاء ما يحل محله , وهو هنا سوف يكون "جدول بحث أو تفتيش" ممثل فى عبارة switch…case لتفسر الحالات المختلفة للأعداد من 0 إلى 9 . عند استخدام سفن سيجمنت نوع الأنود المشترك (وبمساعدة محرر السفن سيجمنت المدمج بالمترجم ميكروسى برو) تكون بشكل الدالة التالية :


كود:
unsigned short mask(unsigned short num) { switch (num) { case 0 : return 0xC0; // Decode "0" => 0xC0 case 1 : return 0xF9; // ……… case 2 : return 0xA4; case 3 : return 0xB0; case 4 : return 0x99; case 5 : return 0x92; case 6 : return 0x82; case 7 : return 0xF8; case 8 : return 0x80; case 9 : return 0x90;// Decode "9" => 0x90 } //case end }


ويصبح البرنامج بالشكل التالى :



كود:
//------ Function to Return mask for common anode 7-seg. display unsigned short mask(unsigned short num) { switch (num) { case 0 : return 0xC0; // Decode "0" => 0xC0 case 1 : return 0xF9; // ……… case 2 : return 0xA4; case 3 : return 0xB0; case 4 : return 0x99; case 5 : return 0x92; case 6 : return 0x82; case 7 : return 0xF8; case 8 : return 0x80; case 9 : return 0x90;// Decode "9" => 0x90 } //case end
} void main() { int i = 0 ; //Take a variable for "for" loop CMCON |= 7; // Disable Comparators TRISB = 0 ; // PORTB set as outputs PORTB = 0xFF; // All LEDs off while (1) { for(i=0; i<=9 ; i++) { PORTB =mask( i) ; // show counting Delay_ms(1000) ; // Wait } } }



الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 24-03-2013, 10:57 PM المشاركة 5   
افتراضي


السفن سجمنت نوع الكاثود المشترك ومفسر الشفرة 7448 والميكروكونترولر PIC16F628 وعداد تصاعدى تنازلى من 00 إلى 99 :
الغرض :
إنشاء عداد تصاعدى / تنازلى من 00 إلى 99 يمكن أن يستخدم فى الكثير من التطبيقات مثل عد السيارت فى موقف السيارات أو عدد الأشخاص فى مكان ما .

الدائرة الكهربية :

[/url][/IMG]

سوف نستخدم الدائرة المتكاملة 7448 كمفسر للشفرة من BCD إلى سفن سيمنت , ومن ثم يجب أن نستخدم وحدتين سفن سيجمنت نوع "الكاثود المشترك" , ويتم توصيل الخطوط A,B,C,D,E,F,G على التوازى مع استخدام طريقة الانتخاب بين كاثودى الوحدتين .
البرنامج عبارة عن عداد تصاعدى / تنازلى من 00 إلى 99 باستخدام 2 مفتاح ضاغط ( تمثل أى نوع من حساسات الدخل الرقمى المناسبة ) أحدهما للتزايد والآخر للتناقص .
شرح خطوات البرنامج :
1- فى البداية يتم استخدام الموجه #define فى تعريف وإنشاء مسميات سهلة ومتعارف عليها بدلا من مسميات خاصة . على سبيل المثال تسمية طرف توصيل مفتاح التزايد PORTA.F0 باسم Up وطرف توصيل مفتاح التناقص PORTA.F1 باسم Down وهكذا كما يلى :

كود:
#defineUpPORTA.F0 // We can write Up instead of PORTA.F0 ... #defineDownPORTA.F1 #definedisp_unit1PORTA.F2 // We can write disp_uinit1 instead of PORTA.F2 ... #definedisp_unit2PORTA.F3
2- إعلان (تعريف) المتغيرات وتخصيص قيم لها عند الرغبة . هنا يتم إعلان متغير العدد الكلى المراد عرضه Number ( يقع بين 00 و 99 ) ومتغير قيمة خانة آحاده Ones ومتغير قيمة خانة عشراته Tens ( تقع بين 0 و 9) من نوع char والتى تعنى ضمنيا (unsigned) char ( بين 0 و 255 ) , مع تخصيص صفر للعدد Number=0 كحالة ابتدائية كما يلى :

كود:
charNumber=0,Ones,Tens ; // Variables
3- من المفضل تقسيم البرنامج إلى دوال منفصلة قدر المستطاع , لتسهيل فهم وتتبع البرنامج . هنا سوف نقوم بإنشاء الدوال التالية :
أ‌- دالة العرض Display() : وهى دالة فارغة void لا تعود بقيمة وليس لها بارامترات مرتبطة بها بل يتم تنفيذ العبارات التى تحتوى عليها فقط , وتكون بالصيغة التالية :

كود:
void Display() // Display function { ….. }
هذه الدالة بدورها تنقسم إلى قسمين هما :
· قسم استخراج خانة العشرات Tens وخانة الآحاد Ones من العدد الكلى Number , وذلك عن طريق استخدام عامل القسمة "/" وعامل باقى القسمة "%" . نتيجة "قسمة عدد صحيح على عدد صحيح أخر" (كما هو الحال هنا) تكون العدد الصحيح ويتم تجاهل الكسر أو باقى القسمة (على سبيل المثال نتيجة قسمة 5 على 3 تكون 5/3 = 1 ) فى حين أن نتيجة " خارج قسمة عدد على عدد صحيح آخر " تكون عدد صحيح هو باقى القسمة ( مثال :نتيجة باقى قسمة 5 على 3 هو 5%3 = 2 ) . وبناء على ذلك نتيجة "قسمة العدد الصحيح Number (المكون من آحاد وعشرات) على العدد الصحيح "10 تكون العدد الصحيح المناظر لخانة العشرات لهذا العدد أى Tens=Number/10 . فى حين أن نتيجة "باقى قسمة العدد الصحيح Number (المكون من آحاد وعشرات) على العدد الصحيح "10 تكون العدد الصحيح المناظر لخانة الآحاد لهذا العدد أى Ones=Number%10 .


كود:
Tens=Number/10; // Extracr : Tens & Ones from Number Ones=Number%10;
· قسم الانتخاب وإرسال (تحميل) البيانات والخاص بوحدات السفن سيجمنت . حيث يتم تفعيل أحد وحدتى السفن سيجمت , (وحدة العشرات disp_unit1=0 , على سبيل المثال " كاثود مشترك" ) وفصل الوحدة الأخرى ( تكون وحدة الآحاد disp_unit2=1 ) مع تحميل بيانات الوحدة الفعالة (العشرات PORTB=Tens ) , ثم يتم العكس . كما يتم إجراء تأخير بسيط للسماح بعدم ظهور تداخل أو ظلال (أشباح) أثناء العرض كما يلى :

كود:
disp_unit2=1; // Ones unit disp_unit2 => off PORTB=Tens; // Load Tens Data disp_unit1=0; // Tens unit disp_unit1 => on delay_ms(3); // Delay
disp_unit1=1; // Tens unit disp_unit1 => off PORTB=Ones; // Load Ones Data disp_unit2=0; // Ones unit disp_unit2 => on delay_ms(3); // Delay
وتكون دالة العرض كما يلى :

كود:
void Display() // Display function { Tens=Number/10; // Extracr : Tens & Ones from Number Ones=Number%10;
disp_unit2=1; //off => ones PORTB=Tens; disp_unit1=0; //on => tens delay_ms(3);
disp_unit1=1; //off => tens PORTB=Ones; disp_unit2=0; //on => ons delay_ms(3); }
ب‌- دالة تهيئة وإعداد أجهزة الميكروكونترولر المستهدف Setup() وهو هنا PIC16F628 كما يلى :

كود:
void Setup() { CMCON=7; //All pins digital I/O TRISA.f0=1; TRISA.f1=1; TRISA.f2=0; TRISA.f3=0;//PORTA setup TRISB=0; //PORTB=0; //PORTB setup //disp_unit1=1; disp_unit2=1; //Initial => off }


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 24-03-2013, 10:58 PM المشاركة 6   
افتراضي


4- فى النهاية يتبقى الدالة الرئيسية للبرنامج main() , وفيها نبدأ باستدعاء دالة التهيئة Setup() ثم الدخول فى حلقة غير منتهية while(1) , وفيها ننتظر تحقق شرط الضغط على أى من مفتاح التزايد if(Up) أو مفتاح التناقص if(Down) لتنفيذ تزايد Number++ أو تناقص Number— العدد Number بواحد . فى كل حالة يتم وضع بعض الشروط لتتنفيذ السليم للبرنامج . على سبيل المثال لتجنب تغيير العدد أثناء الضغط يتم وضع شرط استمرار العرض حتى إزالة الضغط بحلقة while(Up) و حلقة while(Down) . كما أنه فى حالة التزايد ووصول العدد الكلى Number إلى القيمة 100 يتم استبدالها بالقيمة 0 بالعبارة if(Number==100)Number=0 , وفى حالة التناقص وصول العدد الكلى Number إلى القيمة 0 يتم استبدالها بالقيمة 100 بالعبارة if(Number==0)Number=100 .


البرنامج :


كود:
#define disp_unit1 PORTA.F2 // We can write disp_uinit1 instead of PORTA.F2 ... #define disp_unit2 PORTA.F3 #define Up PORTA.F0 #define Down PORTA.F1
char Number=0,Ones,Tens; // Variables
void Display() // Display function { Tens=Number/10; // Extracr : Tens & Ones from Number Ones=Number%10;
disp_unit2=1; //off => ones PORTB=Tens; disp_unit1=0; //on => tens delay_ms(3);
disp_unit1=1; //off => tens PORTB=Ones; disp_unit2=0; //on => ons delay_ms(3);
}
//*****************************************************************
void Setup() { CMCON=7; //All pins digital I/O TRISA.f0=1; TRISA.f1=1; TRISA.f2=0; TRISA.f3=0;//PORTA setup TRISB=0; //PORTB=0; //PORTB setup //disp_unit1=1; disp_unit2=1; //Initial => off }
//*****************************************************************
void main() { Setup(); while(1) { if(Up) // Press Up => PORTA.f0 high { Number++; if(Number==100)Number=0; while(Up) // To avoid an increase in number wait until release => PORTA.f0 low. { Display(); } }
if(Down) //Press Up => PORTA.f1 high { if(Number==0)Number=100; Number--; while(Down) // To avoid an increase in number wait until release => PORTA.f1 low. { Display(); } }
Display(); } }
void Display() // Display function { Tens=Number/10; // Extract : Tens & Ones from Number Ones=Number%10;
disp_unit2=1; // Active => Tens unit PORTB=Tens;//Load Tens Data disp_unit1=0;// delay_ms(3); disp_unit1=1;//Active => Ones unit PORTB=Ones;//Load Ones Data disp_unit2=0; delay_ms(3); }

النتائج :

[/url][/IMG]


عداد تصاعدى / تنازلى من 0000 إلى 9999 بأربع وحدات سفن سيحمنت ومفسر شفرة 7448 :


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 24-03-2013, 10:59 PM المشاركة 7   
افتراضي


عداد تصاعدى / تنازلى من 0000 إلى 9999 بأربع وحدات سفن سيحمنت ومفسر شفرة 7448 :
البرنامج :

كود:
#define disp_unit1 PORTA.F2 // Thousands Digit #define disp_unit2 PORTA.F3 //Hundreds Digit #define disp_unit3 PORTA.F6 //Tens Digit #define disp_unit4 PORTA.F7 //Ones Digit #define Up PORTA.F0 #define Down PORTA.F1
unsigned Number=0,Ones,Tens,Hundreds,Thousands ,rem ; // Variables void Display() // Display function { Thousands = Number/1000; // Thousands rem = Number%1000 ; // reminder Hundreds = rem/100; // Hundreds rem = rem%100 ; // reminder Tens = rem/10; // Tens Ones = rem%10; //Ones disp_unit2=1; // off disp_unit3=1; // off disp_unit4=1; // off PORTB=Thousands ; //Load Thousands Data disp_unit1=0; // Thousands => on delay_ms(3); disp_unit1=1; // off disp_unit3=1; // off disp_unit4=1; // off PORTB=Hundreds ; //Load Hundreds Data disp_unit2=0; // Hundreds => on delay_ms(3); disp_unit1=1; // off disp_unit2=1; // off disp_unit4=1; // off PORTB=Tens ; //Load Tens Data disp_unit3=0; // Tens => on delay_ms(3);
disp_unit1=1; // off disp_unit2=1; // off disp_unit3=1; // off PORTB=Ones ; //Load Ones Data disp_unit4=0; // Ones => on delay_ms(3); } //***************************************************************** void Setup() { CMCON=7; //All pind digital I/O TRISA.f0=1; TRISA.f1=1; TRISA.f2=0; TRISA.f3=0;TRISA.f6=0;TRISA.f7=0; //PORTA setup TRISB=0; PORTB=0; //PORTB setup disp_unit1=1; disp_unit2=1;disp_unit3=1;disp_unit4=1;//Initial => off } //***************************************************************** void main() { Setup(); while(1) { if(Up) // Press Up => PORTA.f0 high { Number++; if(Number==10000)Number=0; while(Up) // To avoid an increase in number wait until release => PORTA.f0 low. { Display(); } }
if(Down) //Press Up => PORTA.f1 high { if(Number==0)Number=10000; Number--; while(Down) // To avoid an increase in number wait until release => PORTA.f1 low. { Display(); } }
Display(); } }

النتيجة :



[/url][/IMG]

إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


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

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2025