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

   

الصورة الرمزية assed
assed
:: عضو فضي ::
تاريخ التسجيل: Jul 2014
الدولة: العراق - بغداد
المشاركات: 1,034
نشاط [ assed ]
قوة السمعة:
قديم 10-06-2017, 12:17 AM المشاركة 81   
افتراضي



السلام عليكم
ألاستاذ الفاضل فتح الله عبد العزيز
في micro c
كود:
while(1)
كود:
for(;;)
كود:
start
goto start
هذه الاوامر كلها حلقات لا نهائية
وتقريباً موجودة نفسها في Proton Basic

وجميعها بالامكان ان تكون حلقة غير منتهية أو نستطيع ان ننهيها بجملة شرطية فلما هذا التنوع ؟؟؟؟

اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 10-06-2017, 02:39 AM المشاركة 82   
افتراضي


السلام عليكم
ألاستاذ الفاضل فتح الله عبد العزيز
في micro c
كود:
while(1)
كود:
for(;;)
كود:
start
goto start
هذه الاوامر كلها حلقات لا نهائية
وتقريباً موجودة نفسها في Proton Basic

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

لماذا هذا التنوع ؟؟؟؟
لا أعرف بالتحديد لكن while تشبه for ، فى حين أن goto لها استخدامات مختلفة ، على سبيل المثال يمكن أن تقوم مقام break أو continue . هذا علاوة على أنها ميراث برمجى قديم .
مع تمنياتى بدوام التوفيق


التعديل الأخير تم بواسطة : F.Abdelaziz بتاريخ 10-06-2017 الساعة 02:42 AM
اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )

الصورة الرمزية assed
assed
:: عضو فضي ::
تاريخ التسجيل: Jul 2014
الدولة: العراق - بغداد
المشاركات: 1,034
نشاط [ assed ]
قوة السمعة:
قديم 12-06-2017, 10:56 AM المشاركة 83   
افتراضي


السلام عليكم ورحمة الله وبركاته
هذا ملف لتكملة الدورة التي تقدم بها الاستاذ فتح الله عبد العزيز مشكوراً وموفقاً بأذن الله.... وهي تكملة لما رفعته سابقاً من شروحات .

رابط التنزيل
هنــــــــــا


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


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


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


تطبيق رقم 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,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 12-06-2017, 04:15 PM المشاركة 86   
افتراضي


تطبيق رقم 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,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 12-06-2017, 04:22 PM المشاركة 87   
افتراضي


تطبيق رقم 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"
   //==============================
  
   }
}


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


تدريب تمهيدى رقم 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
}
}



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