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

   

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 22-04-2015, 11:14 PM المشاركة 17   
افتراضي



تطبيق :
برنامج عمل سارينةSiren :

البرنامج أدناه يجمع بعض من الميزات الاساسية السابقة . هذا البرنامج يتم توصيل خرجه إلى جهاز صوتى sounder ، بدلا من الليد ، هذا الجهاز يعمل على تردد مرتفع . لهذا السبب يكون التأخير بالميكروثانية .

كود:

/*Lesson1-EX7 SIREN Program *******************
Program function: Outputs a siren sound
***************************************************************/
#include  <16F877A.h>
#use delay (clock = 4000000)
void main()
{
    Int8 step;

    while(TRUE) // Keep checking switch
    {
         while(!input(PIN_C0)) // Siren while switch ON
           {
               for(step = 0;step < 255;step ++ ) // Loop control
                   {
                        output_high(PIN_D0); // Sound sequence
                       delay_us(step);
                      output_low(PIN_D0);
                      delay_us(step);
                   }
          }
     }
}
يتم توليد الخرج عندما يكون المفتاح مغلق (عندما الدخل C0 منخفض فإن تعبير المعكوس !input(PIN_C0) يكون صواب true ) . تتلقى دالة التأخير القيمة المتزايدة للمتغير "step" (خطوة) ، لتنتج نبضة أطول فى كل مرة يتم فيها تنفيذ حلقة for . هذا يؤدى إلى دفعة من 255 نبضة بطول متزايد (تردد متناقص) ، تتكرر طالما أن الدخل فى حالة توصيل on . لاحظ أن العدد 255 يكون القيمة القصوى المسموح بها للخطوة step لأنه متغير 8 بت . عند تشغيل البرنامج فى برنامج المحاكاة VSM (ضمن برنامج Proteus) يمكنك سماع الخرج عبر محاكاة بطاقة صوت الكمبيوتر كمضيف .
لاحظ انعكاس حالة اختبار الدخل باستخدام "! = not true" .

رابط الملفات :
http://www.mediafire.com/download/d2...esson1-EX7.zip

http://fathallaabdelaziz.forumarabia.com/



التعديل الأخير تم بواسطة : F.Abdelaziz بتاريخ 22-04-2015 الساعة 11:18 PM
اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 22-04-2015, 11:27 PM المشاركة 18   
افتراضي


نموذج لبرنامج فارغ :
البرنامج أدناه يبين برنامج فارغ ، والذى يمكن استخدامه كقالب عام . علينا أن نحاول أن نكون متسقين فى معلومات تعليقات المقدمة ، لذلك نقترح كتلة تعليق قياسية . يتم سبق موجهات المترجم بعلامات الشباك (الهاش) "#" ووضعها قبل الكتلة الرئيسية . عبارات التهيئة الأخرى يجب أن تسبق بداية حلقة التحكم الرئيسية . إدراج خيار حلقة while(1) غير المشروطة تفترض أن النظام سوف يتم تشغيله بشكل مستمر حتى إعادة التعيين reset .

كود:
//Lesson1-EX8 Program Blank
// Source Code Filename :
// Author/Date/Version :
// Program Description :
///////////////////////////////////////////////////////////////
#include <16F877A.h> 		// Specify PIC MCU
#use 					// Include library routines

void main() 				// Start main block
{
int 				// Declare global variables
while(1) 			// Start control loop
{
//Lesson1-EX8 Program Blank
// Source Code Filename :
// Author/Date/Version :
// Program Description :
///////////////////////////////////////////////////////////////
#include <16F877A.h> 		// Specify PIC MCU
#use 					// Include library routines

void main() 				// Start main block
{
int 				// Declare global variables
while(1) 			// Start control loop
{
// Program statements
}
}

// Program statements
}
}
الآن لدينا مفردات كافية لكتابة برامج بسيطة بلغة السى من أجل الميكروكونترولر PIC .

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

احمد شهيد جواد
:: مهندس متميز ::
تاريخ التسجيل: Apr 2015
الدولة: العراق
المشاركات: 322
نشاط [ احمد شهيد جواد ]
قوة السمعة:
قديم 22-04-2015, 11:28 PM المشاركة 19   
افتراضي


سأتواصل معك فور انتهائي من مشكلة النص في الـــ LCD بالمكيروسي
استمر جزاك الله خيراً


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 24-04-2015, 12:45 PM المشاركة 20   
افتراضي دليل ربط شاشة LCD نوع 2X16 بالميكروكونترولر PIC16F877A مع استخدام المترجم CCS C :





دليل ربط شاشة LCD نوع 2X16 بالميكروكونترولر PIC16F877A مع استخدام المترجم CCS C :



المحتويات :
• توصيل الهاردوير .
• الملف LCD.C .
• أمثلة .
أولا : توصيل الهارد وير :
1- الملف LCD.C قائم على توصيل شاشة LCD فى وضع 4-bit ، والذى يستخدم فقط الأربعة أطراف العليا لبيانات وحدة شاشة LCD ( الأطراف DB4,DB5,DB6,DB7) .
2- الملف LCD.C يجعل الوضع الافتراضى لجميع التوصيلات إلى المنفذ Port D . إذا رغبت فى استخدام المنفذ Port B ، عندئذ فإن السطر التالى :
#define use_portb_lcd TRUE
ينبغى أن يكون فى برنامجك قبل أن يتم ضم الملف LCD.C .
3- المخطط التالى يبين كيفية التوصيل :



ثانيا : الملف LCD.C :
• الملف LCD.C يأتى ضمن برمجيات المترجم CCS C فى المسار Program Files/PICC/Drivers .
• بضم هذا الملف فى مقدمة برنامجك يمكنك استخدام الدوال التالية :
1- الدالة lcd_init() . وينبغى أن تكون فى الدالة الرئيسية main() تلى أى إعلانات لمتغيرات . هذه الدالة تقوم بتهيئة وحدة شاشة LCD وبالتالى يجب تشغيلها قبل تشغيل أى دالة أخرى لها علاقة بعمل وحدة LCD .
2- الدالة lcd_putc(c) . والتى تقوم بعرض الحرف ‘c’ فى الموضع التالى بوحدة LCD ، على سبيل المثال lcd_putc(‘H’); تعرض الحرف H (لاحظ وجود الحرف المفرد داخل أقواس مفردة).
• إذا كان الحرف هو ‘\f’ عندئذ يتم مسح الشاشة ،
• وإذا كان الحرف هو ‘\n’ عندئذ يتم الذهاب إلى السطر رقم “2” ،
• وإذا كان الحرف هو ‘\b’ فإن المؤشر يتحرك للخلف لموقع واحد .
• هذه الدالة تعمل أيضا مع السلاسل النصية ، على سبيل المثال lcd_putc(“Hello world”); تطبع سلسلة الحروف Hello world (لاحظ وجود السلسلة النصية أى الحروف المتعددة داخل أقواس مزدوجة).
3- الدالة lcd_gotoxy(x,y) ، والتى تستخدم فى تحريك المؤشر الرأسى إلى أى موقع فى السطر رقم “1” (إذا كان y=1) أو فى السطر رقم “2” (إذا كان y=2) ، على سبيل المثال : lcd_gotoxy(8,2); تنقل المؤشر إلى موضع الحرف “8” بالسطر رقم “2” .
4- الدالة lcd_getc(x,y) ، والتى تعيد الحرف المعروض على السطر “y” والموقع “x” ، على سبيل المثال : digit = lcd_getc(8,2); ، تعين المتغير digit بالقيمة المعروضة على السطر “2” والموضع “8” .

ثالثا : أمثلة :
البرنامج الأساسى : عرض كلمات الترحيب


كود:
#include <16f877A.h>
#use delay (clock = 20000000) 
#include <lcd.c>

void main()
{
   int i=0;
   
   lcd_init();
   Delay_ms(100);
  
   while(TRUE)
   {
     lcd_putc('\f'); //Clear Display
     lcd_putc("Hello World");
     Delay_ms(2000);
     lcd_putc('\f'); //Clear Display
     lcd_putc("Welcome To");
     lcd_gotoxy(1,2);
     lcd_putc("LCD Library");
     Delay_ms(2000);
     lcd_putc('\f');
     printf(lcd_putc,"Count = %d", i);
     Delay_ms(2000);
     i++;
   }
}
النتيجة :



ملاحظة هامة :
1- لتغيير أطراف توصيل وحدة LCD بأطراف الميكروكونترولر يجب إعلان إعادة تعريف الأطراف الجديدة فى بداية البرنامج حتى قبل توجيه الضم #include<16F877A> كما يلى :

كود:
/LCD Module Connections  
#define LCD_RS_PIN      PIN_D1                                   
#define LCD_RW_PIN      PIN_D2 
#define LCD_ENABLE_PIN  PIN_D3 
#define LCD_DATA4       PIN_D4                                    
#define LCD_DATA5       PIN_D5                                    
#define LCD_DATA6       PIN_D6                           
#define LCD_DATA7       PIN_D7
//End LCD Module Connections

#include <16f877a.h>
#use delay (clock = 20000000) 
#include <lcd.c>



void main()
{
   int i=0;
   
   lcd_init();
   Delay_ms(100);
  
   while(TRUE)
   {
     lcd_putc('\f'); //Clear Display
     lcd_putc("Hello World");
     Delay_ms(2000);
     lcd_putc('\f'); //Clear Display
     lcd_putc("Welcome To");
     lcd_gotoxy(1,2);
     lcd_putc("LCD Library");
     Delay_ms(2000);
     lcd_putc('\f');
     printf(lcd_putc,"Count = %d", i);
     Delay_ms(2000);
     i++;
   }
}

2- لتغيير منفذ التوصيل ليكون المنفذ Port B ،على سبيل المثال ، نستخدم الصيغة التالية :


كود:
/*LCD Module Connections  
#define LCD_RS_PIN      PIN_D1                                   
#define LCD_RW_PIN      PIN_D2 
#define LCD_ENABLE_PIN  PIN_D3 
#define LCD_DATA4       PIN_D4                                    
#define LCD_DATA5       PIN_D5                                    
#define LCD_DATA6       PIN_D6                           
#define LCD_DATA7       PIN_D7
//End LCD Module Connections*/

#define use_portb_lcd TRUE

#include <16f877a.h>
#use delay (clock = 20000000) 
#include <lcd.c>
 



void main()
{
   int i=0;
   
   lcd_init();
   Delay_ms(100);
  
   while(TRUE)
   {
     lcd_putc('\f'); //Clear Display
     lcd_putc("Hello World");
     Delay_ms(2000);
     lcd_putc('\f'); //Clear Display
     lcd_putc("Welcome To");
     lcd_gotoxy(1,2);
     lcd_putc("LCD Library");
     Delay_ms(2000);
     lcd_putc('\f');
     printf(lcd_putc,"Count = %d", i);
     Delay_ms(2000);
     i++;
   }
}



http://fathallaabdelaziz.forumarabia.com/t131-topic#335



الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 24-04-2015, 02:52 PM المشاركة 21   
افتراضي تدريب : برنامج إنشاء ساعة بسيطة قابلة للإعداد (الضبط) باستخدام وحدة العرض LCD :


تدريب : برنامج إنشاء ساعة بسيطة قابلة للإعداد (الضبط) باستخدام وحدة العرض LCD :

البرنامج :

كود:
//LCD Module Connections
//#define LCD_ENABLE_PIN  PIN_D0 
//#define LCD_RS_PIN      PIN_D1
//#define LCD_RW_PIN      PIN_D2 
//#define LCD_DATA4       PIN_D4                                    
//#define LCD_DATA5       PIN_D5                                    
//#define LCD_DATA6       PIN_D6                           
//#define LCD_DATA7       PIN_D7
//End LCD Module Connections

#include <16f877a.h>
#use delay (clock = 20000000) 
#include <lcd.c>


void main () // main function
   {
   int HOUR=0, MINUTE = 0, SECOND = 0;
   lcd_init();
   while (TRUE) // to repeat block. Infinite loop.
     {
     SECOND ++;
     if (SECOND> 59 || input (PIN_B0))
        {
        SECOND = 0;
        MINUTE ++;
        }
     if (MINUTE> 59 || input (PIN_B1))
        {
        MINUTE = 0;
        HOUR ++;
        }
     if (HOUR> 23) HOUR = 0;
     printf (lcd_putc, "\f%02u:%02u:%02u", HOUR, MINUTE, SECOND);
     delay_ms (1000);
     }
   }
النتيجة :







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


تدريب : برنامج بسيط لعداد تصاعدى تنازلى باستخدام وحدة العرض LCD :

البرنامج :


كود:
//LCD Module Connections  
#define LCD_RS_PIN      PIN_B1                                   
#define LCD_RW_PIN      PIN_B2 
#define LCD_ENABLE_PIN  PIN_B0 
#define LCD_DATA4       PIN_B4                                    
#define LCD_DATA5       PIN_B5                                    
#define LCD_DATA6       PIN_B6                           
#define LCD_DATA7       PIN_B7
//End LCD Module Connections

#include <16f877.h> // identifies target microcontroller
#use delay (clock = 4000000) // sets crystal to 4Mhz. For other values, change and recompile.
#include <lcd.c> // 

void main () // main function
  {
  long ACCOUNT = 0; //Declare variable ACCOUNT,16-bit,initializing it with zeros.
  
  lcd_init();
  Delay_ms(100);
  
  while (true) // to repeat block. Infinite loop.
    {
    if (input(PIN_D0)) // if D0 is pulsed (high)
          {
           ACCOUNT ++; // Increment variable by one
          }
          
    if (input(PIN_D1)) // if D1 is pulsed
       {
        ACCOUNT --; // Variable decreases by one
       }
       
    printf (lcd_putc, "\f COUNTER :%lu", ACCOUNT); // Display text and variable on the LCD
    delay_ms (1000);
    }
  }
النتيجة :



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


تدريب : عرض وتحريك رسالة نصية على وحدة LCD :
البرنامج :


كود:
#include <16f877.h> // identifies target microcontroller
#use delay (clock = 4000000) // <- sets crystal to 4Mhz. For other values, change and recompile.
#define use_portb_lcd TRUE
#include <lcd.c>

void lcd_shift_left()
    {
    lcd_send_byte(0,0x18);
    }
    
void lcd_shift_right()
    {
    lcd_send_byte(0,0x1C);
    }

void main () // main function
  {
  lcd_init();
  Delay_ms(100);

    while (true) // to repeat block. Infinite loop.
    {
    
    if (input (PIN_D0)) // if key D0 pressed
      {
      lcd_putc ("\f ROLL TEXT LEFT \n PIC PROJECTS");
      
            while (input (PIN_D0)) // while holding down key
            {
               delay_ms (250);
               lcd_shift_left (); // Rotate left
            }
      }
    
    if (input (PIN_D1)) // if key D1 pressed
      {
         lcd_putc ("\f ROLL TEXT RIGHT \n PIC PROJECT");
            while (input (PIN_D1)) // while holding down key
            {
               delay_ms (250);
               lcd_shift_right (); // Rotate right
            }
      }
      
    lcd_putc ("\f PIC PROJECTS");
    lcd_putc ("\n TEST OF LCD");
    delay_ms (1000);
    }
  }
النتيجة :




http://fathallaabdelaziz.forumarabia.com/t134-topic#338


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 25-04-2015, 12:52 PM المشاركة 24   
افتراضي ربط الميكروكونترولر PIC16F877A مع لوحة مفاتيح Keypad ووحدة عرض LCD


ربط الميكروكونترولر PIC16F877A مع لوحة مفاتيح Keypad ووحدة عرض LCD
سوف نستعرض كيفية قراءة مدخلات لوحة مفاتيح نوع 3X4 وكتابة النتيجة على وحدة عرض LCD ، الطريقة سهلة وبسيطة .

لوحة المفاتيح Keypad :
لوحة المفاتيح هى مصفوفة matrix من المفاتيح الضاغطة مرتبة فى صفوف وأعمدة لتوفير مدخلات المستخدم ، الشكل التالى يبين المخطط الأساسى للوحة المفاتيح نوع 3X4 :



كما فى المخطط ، تتكون لوحة المفاتيح من ثلاثة أعمدة columns وأربعة صفوف rows ، ومن هنا جاء الاسم ، عندما يضغط المستخدم على أحد مفاتيح اللوحة يحدث قصر (توصيل) بين العامود والصف المناظر لهذا المفتاح ، على سبيل المثال ، إذا ضغط المستخدم المفتاح “5” يدث قصر بين العامود الثانى col2 والصف الثانى row2 ، وإذا ضغط المستخدم على المفتاح “0” يحدث قصر بين العامود الثانى col2 والصف الرابع row4 ، وهلم جرا .

استخدام المترجم CCS C لقراءة لوحة المفاتيح :
يوفر المترجم CCS C مكتبة لقراءة لوحة المفاتيح تسمى kbd.c ، كل ما عليك القيام به هو ضم هذه المكتبة فى برنامجك (#include <kpd.c>) ، واستخدام الدالة kbd_getc(); لمسح لوحة المفاتيح .
المكتبة kbd.c تستخدم المنفذ Port D أو المنفذ Port B لربط لوحة المفاتيح كما هو مبين بالدائرة المبينة أدناه .
ملحوظة :
الدالة kbd_getc(); تعود بكود أسكى للمفتاح المضغوط ( تعود بحرف character) .

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




البرنامج :

كود:
/* PIC16F877A interface to 3x4 Keypad and 16x2 LCD */
#include <16f877a.h> 
#use delay(clock=4000000)
#define use_portb_lcd TRUE
#include <lcd.c> 
#include <kbd.c> 

void main() 
{ 
   char k=0;                     // Character k to store keypad input
   
   /* Peripherals Configurations */ 
   lcd_init();                   // Turn LCD ON, along with other initialization commands
   kbd_init();                   // Initialize Keypad 
    
   lcd_gotoxy(1,1);              // point LCD cursor to col1 row1
   lcd_putc("Hello World !!");  // print on LCD 
   lcd_gotoxy(1,2);              // point LCD cursor to col1 row2

   while(TRUE) // infinite loop 
   { 
      k = kbd_getc();            // read keypad input (if exists) 
      if(k!=0)                   // if key captured 
      { 
         lcd_putc(k);            // print captured key to lcd
         k=0;                    // reset k for another loop round
         delay_ms(250);          // delay between key presses
      } 
  } 
}



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