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

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

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



تدريبات وتمارين ومشاريع على السفن سيجمنت والمفاتيح :
فى هذا الجزء سوف نتناول تصميم المشاريع باستخدام السفن سيجمنت مع المفاتيح .
فى البداية سوف نتناول تدريب بسيط لشاشة عرض مكونة من وحدة سفن سيجمنت واحدة حتى نتعود على توصيل واستخدام السفن سيجمنت . بعد ذلك ، يتم استخدام وحدتين وأربع وحدات سفن سيجمنت بنظام الانتخاب فى مشاريع لتطبيقات عملية وأكثر فائدة .
تدريب تمهيدى رقم 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 لعرض العدد على وحدة السفن سيجمنت .

احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 1 اعجاب
شكراً عريبى محمود ( شكر العضو على هذه المشاركة )
اعجاب عريبى محمود ( أعجبته المشاركة )
اعلانات

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


تطبيق رقم 1 : التعامل مع المفتاح (الدخل) والسفن سيجمنت :




• وحدة السفن سيجمنت المستخدمة من نوع "الكاثود المشترك" ويتم توصيلها إلى المنفذ PORTB بحيث تتصل الشريحة a بالطرف RB0 والشريحة b بالطرف RB1 وهكذا حتى الشريحة g بالطرف RB6 .
• لعرض الرقم “0” يلزم وضع العدد السداسى عشر 0x3F فى المنفذ PORTB ، ولعرض الرقم “1” يلزم وضع العدد العشرى 0x06 فى المنفذ PORTB وهكذا حتى الرقم “9” .

البرنامج :

كود:
/*Project name: 7-Segment */
#define SW1 PORTD.F0

char Display_Segment(char Number)
{
char SevenSegment[] = 
{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
char Disp;
Disp = SevenSegment[Number]; 		// Get bits of the number to be displayed
return (Disp);					 // Return bits to main program
}


char Count = 0;

void main() 
{
  TRISB  = 0;           //Configure PORTB as Outputs
  PORTB = 0;
  TRISD.F0 = 1;      //Configure RD0 as intput
  
  while(1){

      if (SW1==0)          //Check if switch SW1 is closed
      {
         delay_ms(100);  //wait for 100ms  (switch debouncing)
         if (SW1==0)       //Check if switch SW1 is still closed
         {
			Count ++;
PORTB = Display_Segment(Count);
	if (Count >9) Count =0;
         }
while (SW1 ==0); // Wait for release of the button

      }
      else
      {
        PORTB = Display_Segment(Count);
      }
    }
}

جرب إزالة العبارة while (SW1 ==0) ولاحظ الفرق .


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

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


تطبيق رقم 2 : عداد تصاعدى تنازلى مع عرض قيمة العد على وحدة سفن سيجمنت مع استخدام مفتاحين للتزايد وللتناقص .
يتم توصيل السفن سيجمنت إلى المنفذ PORTB ، وتوصيل المفاتيح إلى الأطراف RD0 , RD1 بالمنفذ PORTD .

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



البرنامج :
فى هذا البرنامج سوف يتم استخدام عبارة switch…case ، بدلا من المصفوفة ، داخل دالة العرض .


كود:
/*
 * Project name:
     UP/DOWN Decimal Counter with Push Button and 7-Segment Interface
* Description:
     This code is an example of Seven Segment Display and Push Button interface.
     A decimal counter value will be displayed on the seven segment display.
     The value of the counter can be incremented or decremented through push
     buttons.
     MCU:             PIC16F877A
     The two push buttons are connected to RD0(Increment) and RD1(Decrement)
     and the seven segment display connected to PORTB (Segment a to PB.0,
     Segment b to PB.1 and so on)
*/
//-------------- Function to Return mask for common cathode 7-seg. display
char SevenSegment(char num) {
  switch (num) {
    case 0 : return 0x3F;
    case 1 : return 0x06;
    case 2 : return 0x5B;
    case 3 : return 0x4F;
    case 4 : return 0x66;
    case 5 : return 0x6D;
    case 6 : return 0x7D;
    case 7 : return 0x07;
    case 8 : return 0x7F;
    case 9 : return 0x6F;
  } //case end
}

char   digit;      			// To Hold Decimal Value
char number;     			// To Hold Equivalent Seven Segment Value

void main() {
  TRISB = 0x00;        			// Set PORTB direction to be output
  PORTB = 0x00;        		// Turn OFF LEDs on PORTB
  TRISD0_bit = 1;      		// RD0 Input for Increment
  TRISD1_bit = 1;      		// RD1 Input for Decrement

  digit   =    0; 				 // Initial Value of Counter , Decimal Value
  number  = SevenSegment (digit)   ;//Get 7-segment pattern
  PORTB   = number;		//Display 

  do {
    if (PORTD.F0 == 0 ) {  		// Detect logical zero
      Delay_ms(200);
      digit ++;                 		// Increase Counter
      number  = SevenSegment (digit)   ;
      PORTB   = number;

    }
    if (PORTD.F1 == 0) {  		// Detect logical zero
      Delay_ms(200) ;
      digit = digit--;                 		// Decrease Counter
      number  = SevenSegment (digit)   ;
      PORTB   = number;                
    }
  } while(1);                             	// endless loop
}


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


تطبيق رقم 3 : مشروع نظام استدعاء وبيان رقم الغرفة على وحدة عرض سفن سيجمنت 7-Segment
يتم تنفيذ المشروع باستخدام الميكروكونترولر PIC16F877A والبرمجة بلغة السى مع المترجم ميكروسى برو :
الدائرة الكهربية :



البرنامج :


كود:
//Call System

#define SW1 PORTD.F0
#define SW2 PORTD.F1
#define SW3 PORTD.F2
#define SW4 PORTD.F3
#define SW5 PORTD.F4
#define SW6 PORTD.F5
//======================
void main()
{
TRISB = 0; 				//PORTB as outouts
PORTB = 0;													
TRISD = 0xFF;			//PORTD as inputs 
PORTB = 0x3F; 			// Display "0"

 while(1)
 {
   
  //==========First SWITCH ========
	if(SW1==0) 			// Test for LOW state 
	{
	PORTB = 0x06; 		// Display "1"
	PORTB.F7 = 1 ; delay_ms(500); PORTB.F7 = 0 ;// Buzzer Operation 
	delay_ms(10000); 		// Wait 10 sec 
	}
      
	else if(SW2==0) 		// Test for LOW state 
    	{
	PORTB = 0x5B ;		// Display "2"
	PORTB.F7 = 1 ; delay_ms(500); PORTB.F7 = 0 ;// Buzzer Operation
	delay_ms(10000);
	}
      
    	else if(SW3==0) 		// Test for LOW state 
	{
    	PORTB = 0x4F; 		// Display "3"
	PORTB.F7 = 1 ; delay_ms(500); PORTB.F7 = 0 ;// Buzzer Operation
	delay_ms(10000);
	}
      
    	else if(SW4==0) 		// Test for LOW state 
	{
    	PORTB = 0x66; 		// Display "4"
	PORTB.F7 = 1 ; delay_ms(500); PORTB.F7 = 0 ;// Buzzer Operation        
	delay_ms(10000);
	}
      
    	else if(SW5==0)     		// Test for LOW state 
	{
	PORTB = 0x6D; 		// Display "5"
	PORTB.F7 = 1 ; delay_ms(500); PORTB.F7 = 0 ;// Buzzer Operation
	delay_ms(10000);
	}
      
    	else if(SW6==0) 		// Test for LOW state 
	{
      
	PORTB = 0x7D; 		// Display "6"
	PORTB.F7 = 1 ; delay_ms(500); PORTB.F7 = 0 ;// Buzzer Operation
	delay_ms(10000);
	}
      
    	else 
    	PORTB = 0x3F;		// Display "0"
   //==============================
  
   }
}

احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 0 اعجاب
شكراً عريبى محمود ( شكر العضو على هذه المشاركة )

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 12-06-2017, 02:23 PM المشاركة 5   
افتراضي


تدريب تمهيدى رقم 2 : عرض عدد على شاشة سفن سيجمنت مكونة من وحدتين 2-Digit :
الغرض :

هذا التدريب يوضح كيفية استخدام أكثر من وحدة سفن سيجمنت بطريقة الانتخاب multiplexed . فى هذا التدريب سوف نعرض العدد “45” على شاشة بوحدتى عرض سفن سيجمنت ، على سبيل المثال .

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



يتم توصيل أطراف شرائح وحدتى العرض على التوازى إلى المنفذ PORTB للميكروكونترولر . يتم "تمكين" enable تشغيل كل وحدة (خانة) digit على حدة عن طريق توصيل ترانزستور كمفتاح إلى طرف الكاثود المشترك لها . تحديد قاعدة الترانزستور بالمنطق المرتفع HIGH(1) يؤدى إلى توصيل ON الترانزستور وتمكين تشغيل وحدة العرض المناظرة . تستخدم الأطراف RD0 و RD1 للمنفذ PORTD للتحكم فى خطوط تمكين الوحدات . مع العرض بالانتخاب من متعدد multiplexing ، يتم تمكين كل وحدة عرض لمدة عدة ميلى ثوانى ، وتعتقد عين الإنسان أن جميع الوحدات فى حالة تشغيل ON كل الوقت . على سبيل المثال ، وحدتى عرض سفن سيجمنت تعمل بالشكل التالى :
• إرسال بيانات رقم خانة الآحاد للعدد Number الخاصة بالوحدة (الخانة)الأولى digit1 إلى المنفذ PORTB .
• تمكين enable تشغيل الوحدة الأولى digit1 .
• الانتظار لعدة ميلى ثوانى .
• عدم تمكين disable الوحدة الأولى digit1 .
• إرسال بيانات رقم خانة العشرات للعدد Number الخاصة بالوحدة (الخانة)الثانية digit2 إلى المنفذ PORTB .
• تمكين تشغيل الوحدة الثانية digit2 .
• الانتظار لعدة ميلى ثوانى .
• عدم تمكين disable الوحدة الثانية digit2 .
• تكرار الخطوات السابقة بصفة مستمرة .
ملخص البرنامج :
• تهيئة المتغير Num بالقيمة المطلوب عرضها وهى “45” ، على سبيل المثال .
• تهيئة المنافذ PORTB و PORTD كمخارج .
• عدم تمكين كلا الوحدتين كحالة ابتدائية .
• حلقة غير منتهية ، وفيها يتم :
- استخلاص بيانات قيمة خانة الآحاد Digit1_Data (يساوى باقى خارج قسمة العدد Num على 10 ) ، وبيانات قيمة خانة العشرات Digit2_Data (يساوى خارج قسمة العدد Num على 10 ) .
- استدعاء دالة العرض Display_Segment لعرض قيمة خانة الآحاد “5” .
- تمكين وحدة خانة الآحاد .
- الانتظار لمدة 5 ميلى ثانية .
- عدم تمكين وحدة خانة الآحاد .
- استدعاء دالة العرض لعرض قيمة خانة العشرات “4” .
- تمكين وحدة خانة العشرات .
- الانتظار لمدة 5 ميلى ثانية
- عدم تمكين وحدة خانة العشرات .
البرنامج :

كود:
/*****************************************************************************
2-DIGIT 7-SEGMENT DISPLAY
=======================
In this tutorial 2-digit common cathode 7-segment display 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 displays are multiplexed where the a-g segment lines are in parallel, but the common cathode pin (enable) of each display is controlled separately.
Number 45 is displayed on the 2-digit display as an example.
Digit1 (right hand side) is controlled from port RD0 through a transistor switch, and
Digit2 (left hand side) is from port RD1.
This program uses a function to get the bit pattern for a given number. This bit pattern is returned to the calling program.
*******************************************************************/
#define Digit1_Enable RD0_bit
#define Digit2_Enable RD1_bit
//
// 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 Num = 45;
unsigned char Digit1_Data,Digit2_Data;
TRISB = 0; 							// PORT B pins are outputs
TRISD = 0; 							// PORT D output
Digit1_Enable = 0; 						// Disable Digit 1 to start with
Digit2_Enable = 0;						 // Disable Digit 2 to start with
for(;;) // DO FOREVER
{
Digit2_Data = Num / 10; 				// Extract Digit 2 data ,(4)
Digit1_Data = Num % 10; 				// Extract Digit 1 data , (5)

PORTB = Display_Segment(Digit1_Data); 	// Send LSD number (5) to port
Digit1_Enable = 1; 					// Enable Digit 1
Delay_Ms(5);						 // Wait 5ms
Digit1_Enable = 0; 					// Disable Digit 1

PORTB = Display_Segment(Digit2_Data); 	// Send MSD number (4) to port
Digit2_Enable = 1;					 // Enable Digit 2
Delay_Ms(5); 					// Wait 5ms
Digit2_Enable = 0;					 // Disable Digit 2
}
}


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


تدريب تمهيدى رقم 4 : استخدام أربع وحدات سفن سيجمنت بتقنية الانتخاب Multiplexed :
فى هذا التدريب سوف نتعلم كيفية استخدام أربع وحدات سفن سيجمنت متصلة على التوازى مع منفذ الميكروكونترولر عن طريق تقتية الانتخاب . سوف نستخدم أربع وحدات كاثود مشترك ، حيث يتم توصيل الشرائح على التوازى بأطراف المنفذ PORTB ، ويتم توصيل خطوط التحكم فى وحدات الآحاد والعشرات والمئات والآلاف عن طريق المنفذ PORTD ، وسوف يتم عرض العدد “1234” .
الدائرة الكهربية :



البرنامج :

كود:
#define Digit1_Enable RD0_bit
#define Digit2_Enable RD1_bit
#define Digit3_Enable RD2_bit
#define Digit4_Enable RD3_bit

//
// 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 int Num = 1234;
unsigned char Digit1_Data,Digit2_Data, Digit3_Data, Digit4_Data ;
TRISB = 0; 							// PORT B pins are outputs
TRISD = 0; 							// PORT D output
Digit1_Enable = 0; 						// Disable Digit1 to Digit4 as start 
Digit2_Enable = 0;
Digit3_Enable = 0;
Digit4_Enable = 0;						 
for(;;)								 // DO FOREVER
{
Digit4_Data = Num / 1000; 				// Extract Digit4 data ,(1)
Digit3_Data = (Num/100) % 10; 			// Extract Digit3 data ,(2)
Digit2_Data = (Num / 10) % 10; 			// Extract Digit2 data ,(3)
Digit1_Data = Num % 10; 				// Extract Digit4 data ,(4)

PORTB = Display_Segment(Digit1_Data); 	// Send LSD number (4) to port
 Digit1_Enable = 1;
 Digit2_Enable = 0;
Digit3_Enable = 0;					// Enable Digit1
Digit4_Enable = 0;
Delay_Ms(5);						 // Wait 5ms
Digit1_Enable = 0; 					// Disable Digit1

PORTB = Display_Segment(Digit2_Data); 	// Send MSD number (3) to port
Digit2_Enable = 1;					 // Enable Digit2
Digit1_Enable = 0;
Digit3_Enable = 0;
Digit4_Enable = 0;
Delay_Ms(5); 					// Wait 5ms
Digit2_Enable = 0;					 // Disable Digit2

PORTB = Display_Segment(Digit3_Data); 	// Send MSD number (2) to port
Digit3_Enable = 1;					 // Enable Digit3
Digit1_Enable = 0;
Digit2_Enable = 0;
Digit4_Enable = 0;
Delay_Ms(5); 					// Wait 5ms
Digit3_Enable = 0;					 // Disable Digit3

PORTB = Display_Segment(Digit4_Data); 	// Send MSD number (1) to port
Digit4_Enable = 1;					 // Enable Digit4
Digit1_Enable = 0;
Digit2_Enable = 0;
Digit3_Enable = 0;
Delay_Ms(5); 					// Wait 5ms
Digit4_Enable = 0;					 // Disable Digit4

}
}


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


تطبيق : عداد تصاعدى من 0 إلى 9999 والعرض على أربع وحدات سفن سيجمنت :
مرة أخرى مع تقنية الانتخاب multiplexing ، والتى تعتمد على الخداع البصرى لعين الإنسان . فعين الإنسان لا يمكنها كشف التغيرات البصرية عند معدل 25 إطار (صورة) كل ثانية 25 frames/sec (التردد). هذا يعنى أى تغيرات فى فرق زمنى أقل من 1/25 sec (الزمن الدورى) لن تستطيع العين ملاحظتها . يستخدم هذا المفهوم فى تقنية الانتخاب Multiplexing لوحدات السفن سيجمنت المتعددة . فى هذا التدريب سوف نستخدم 4 وحدات سفن سيجمنت ، وحدة واحدة فقط هى التى تكون فى حالة تسغيل ON فى وقت ما ، ولكن يتم تغيير حالة التشغيل والفصل ON/OFF بسرعة كبيرة بين الوحدات لخلق الانطباع بأن جميع الوحدات تكون فى حالة توصيل ON فى نفس الوقت .


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



يتم توصيل شرائح وحدات السفن سيجمنت إلى المنفذ PORTB ، وتوصيل الكاثودات المشتركة عن طريق ترانزستورات (والتى تعمل كمفاتيح) إلى المنفذ PORTD .

البرنامج :
يتم إرسال رقم الآحاد Units إلى وحدات السفن سيجمنت من خلال المنفذ PORTB ، ويتم تشغيل ON الترانزستور الأول فى نفس الوقت ، وبعد وقت قصير يتم فصل OFF هذا الترانزستور . بعد ذلك يتم إرسال رقم العشرات Tens إلى وحدات السفن سيجمنت من خلال المنفذ PORTB ، ويتم تشغيل ON الترانزستور المناظر فى نفس الوقت ، وبعد وقت قصير يتم فصله OFF . يتكرر نفس العمل لكل من رقم المئات hundreds ورقم الآلاف thousands .
تتكرر العملية كلها باستمرار عند سرعة عالية ولجميع الأرقام والترانزستورات المناظرة .

كود:
/**********************************
 Multiplexing of 7 segment display with PIC16F877A
This project demonstrate multiplexing of 4X7 segment display. 
it counts from 0000 - 9999
***********************************/
unsigned char units,tens,hundreds,thousands ;
unsigned int counter = 0;
unsigned int digit = 0;


 unsigned char display(unsigned char digit1) 
 {

   unsigned char my_digit;
   unsigned int array[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; // array holding common cathode 7 segment look up table for 0-9
   my_digit = array[digit1];
   return (my_digit) ;
      
 }
  

 void short_delay()		// delay function to control how digit is incremented
 {    					

     if(counter<100)
	 {
      counter++  ;
      if(counter==100)
	  {
      digit++ ;
      counter = 0;  
	  }
      if(digit==9999)
	  {
      digit = 0;
      }
	}
 }

void main() 
{

  TRISB = 0x00;    // set PORTB as output
  TRISD = 0x00;

   PortD.F0 = 0;  //turn off PORTD bit 0-3
   PortD.F1 = 0;
   PortD.F2 = 0;
   PortD.F3 = 0;

 while(1) {
    
   short_delay();                    		// call delay function
   
   units = digit % 10 ;               	//extract units from digit
   PORTB = display(units);            	// send  units value to PORTD
   PortD.F0 = 1;                    		 // turn ON 1st 7 segment (LSD 7 Segment display)
   PortD.F1 = 0;
   PortD.F2 = 0;
   PortD.F3 = 0;
   delay_ms(1);
   PortD.F0 = 0;

   tens =  (digit / 10) % 10 ;        	//extract tens from digit
   PORTB = display(tens);              	// send tens value to PORTD
   PortD.F0 = 0;
   PortD.F1 = 1;                       	// turn ON 2nd 7 segment
   PortD.F2 = 0;
   PortD.F3 = 0;
   delay_ms(1);
   PortD.F1 = 0;

   hundreds =  (digit / 100) % 10;    //extract hundreds from digit
  PORTB = display(hundreds);          // send hundreds value to PORTD
   PortD.F0 = 0;
   PortD.F1 = 0;
   PortD.F2 = 1;                      	// turn ON 3rd 7 segment
   PortD.F3 = 0;
   delay_ms(1);
   PortD.F2 = 0;

   thousands =  digit / 1000 ;        	//extract thousands from digit
   PORTB = display(thousands);           // send  thousands value to PORTD
   PortD.F0 = 0;
   PortD.F1 = 0;
   PortD.F2 = 0;
   PortD.F3 = 1;                       	// turn ON 4th 7 segment
   delay_ms(1);
   PortD.F3 = 0;
   }
}



الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 13-06-2017, 01:15 PM المشاركة 8   
افتراضي


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

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







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

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

كود:
char Number=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
}
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();
        }
}

احصائية الشكر والاعجاب - 2 شكراً, 0 عدم اعجاب, 2 اعجاب
شكراً عريبى محمود, سعيد قادر ( شكر العضو على هذه المشاركة )
اعجاب عريبى محمود, سعيد قادر ( أعجبته المشاركة )
إضافة رد

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

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

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


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

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