LED چشمک زن با ۸۰۵۱

  • ۴۸ بازدید

نحوه استفاده از پورت های خروجی ورودی 8051 میکروکنترلر با مثال LED چشمک زن

در این آموزش نحوه استفاده از پورت های ورودی و خروجی میکروکنترلر 8051 را یاد می گیریم. این مبکروکنترلر دارای 40 پین است که شامل چهار پورت ورودی/خروجی است. میکروکنترلر از 8 پایه برای اهداف خاص استفاده می کند، در حالی که 32 پایه به عنوان پایه های ورودی و خروجی برای اتصال میکروکنترلر با دستگاه های جانبی قابل تنظیم هستند. هر پورت از 8 بیت تشکیل شده است که می توانیم آن را به عنوان ورودی یا خروجی تعریف کنیم. در این مقاله به نحوه استفاده از پورت های ورودی/خروجی میکروکنترلرهای 8051 می پردازیم تا بتوانیم از آنها برای مقاصد خواندن و نوشتن استفاده کنیم.

قبل از مطالعه بیشتر این مقاله، باید بدانید که چگونه میکروکنترلر 8051 را با KEIL برنامه ریزی کنید .

میکروکنترلر 8051 پین های GPIO

جزئیات پورت های GPIO 8051

یک پورت معمولاً مجموعه ای از هشت پین است و ما آنها را I/O می نامیم زیرا می توانیم آنها را به عنوان ورودی یا خروجی پیکربندی کنیم. 8051s دارای چهار پورت GPIO است و هر پورت دارای هشت پین است. هر پین ممکن است یک یا چند تابع داشته باشد. آنها را یکی یکی خواهیم دید.

میکروکنترلر PORT 0 – 8051

حال بیایید نگاهی به پورت 0 بیندازیم که یک پورت ورودی/خروجی دو جهته است. تخلیه باز به معنای ترانزیستوری است که به زمین متصل می شود، در حالی که دو جهته به این واقعیت اشاره دارد که این پورت به عنوان ورودی یا خروجی قابل تنظیم است. ما می توانیم از ثبات P0 برای دسترسی به PORT 0 استفاده کنیم. این ثبات قابل دسترسی به بیت را دارد. Bit accessible به این معنی است که می توانیم به تک تک بیت های رجیستر دسترسی داشته باشیم. به عنوان مثال، نوشتن 1 به بیتی از ثبات P0 پین مربوطه را به عنوان ورودی پیکربندی می کند، در حالی که نوشتن 0 آن پین را به عنوان خروجی پیکربندی می کند. به طور پیش فرض، میکروکنترلر هر پین را هنگام روشن شدن به عنوان ورودی پیکربندی می کند.

پین های رجیستر P0

P0 شامل پین‌های (32-39) است. این یک پورت I/O با عملکردهای جایگزین است.

  • هنگامی که یک میکروکنترلر از حافظه خارجی استفاده می کند، باید با استفاده از پین های مخصوص با این حافظه ارتباط برقرار کند و بایت آدرس کمتری را با استفاده از پین های P0 به حافظه خارجی ارسال کند. اگر هیچ حافظه خارجی متصل نباشد، میکروکنترلر می‌تواند از تمام پین‌های P0 برای کارهای ورودی/خروجی استفاده کند.
  • پین های P0 مقاومت کششی داخلی ندارند.
    • اگر p0 را به‌عنوان ورودی پیکربندی کنیم، به‌گونه‌ای عمل می‌کند که انگار «شناور» است. این بدان معنی است که مقاومت ورودی آن بسیار بالا است و پتانسیل آن نامشخص می شود زیرا به طور فعال توسط هیچ منبعی هدایت نمی شود.
    • هنگامی که پایه P0 میکروکنترلر را به عنوان خروجی تنظیم می کنیم، مانند یک “درن باز” عمل می کند. اگر منطق را روی 0 قرار دهیم، پین به زمین (0 ولت) متصل می شود. اما اگر پین P0 را با منطق 1 ارائه کنیم، به صورت “شناور” رفتار می کند. برای حفظ ولتاژ منطقی 5 ولت پایدار، باید یک مقاومت کششی خارجی وصل کنیم.

پروژه مثال

بیایید چند کد ساده برای آزمایش پورت 0 بنویسیم. چهار بیت پایینی PORT0 را به عنوان ورودی و چهار بیت بالایی را به عنوان خروجی پیکربندی می کنیم، و هر ورودی که برای چهار بیت پایین اعمال می کنیم باید در چهار بیت بالایی ظاهر شود. برای پیکربندی هر پایه P0 به عنوان ورودی، ما 1 را به بیت مربوطه از ثبات P0 می نویسیم. در این مورد، ما باید چهار بیت پایینی را به عنوان ورودی P0 پیکربندی کنیم، بنابراین برای تغذیه چهار بیت عدد 1 را می نویسیم. اکنون که چهار پایه بالای P0 را به عنوان خروجی پیکربندی کرده ایم، به هر چهار بیت بالای ثبات P0 0 می نویسیم. در هگزادسیمال، 0x0F خواهد شد.

P0=0X0F;

میکروکنترلر پورت 1 – 8051

P1 شامل پین های (1-8) است. این یک پورت I/O بدون عملکرد جایگزین است و فقط برای مقاصد عمومی ورودی/خروجی قابل تنظیم است. P1 حاوی یک مقاومت کششی داخلی است و با مدارهای TTL سازگار است.

میکروکنترلر پورت 2 – 8051 

P2 شامل پین های (21-28) است. این یک پورت I/O با عملکردهای جایگزین مشابه درگاه 0 است. وقتی از حافظه خارجی با میکروکنترلر استفاده می کنیم، بایت آدرس بالاتر (آدرس های A8-A15) را روی P2 اعمال می کنیم. هنگامی که حافظه خارجی وجود ندارد، تمام بیت های P0 برای مقاصد ورودی/خروجی قابل تنظیم هستند.

پورت 1 و پورت 2 هر کدام 8 بیت، دو جهته و دارای مقاومت کششی داخلی هستند. این به این معنی است که برای هر دو درگاه 1 و 2 نیازی به مقاومت های بیرون کش خارجی نیست. نوشتن 1 در هر بیت از یک پورت، آن پورت را به عنوان ورودی پیکربندی می کند در حالی که نوشتن صفر آن پورت را به عنوان خروجی پیکربندی می کند. به طور پیش فرض، میکروکنترلر هنگام روشن شدن، هر دو پورت را به عنوان ورودی پیکربندی می کند.

پورت 1 و 2 8051 را پیکربندی کنید

حال قصد داریم پورت 1 و پورت 2 را با مثال های جالب و ساده ببینیم. ما یک برنامه ساده می زنیم که پورت 1 را به عنوان ورودی و پورت 2 را به عنوان خروجی پیکربندی می کند و هر ورودی که به پورت 1 اعمال می کنیم به پورت 2 ارسال می شود. بیایید سعی کنیم این مثال را کدگذاری کنیم. می‌توانیم ۰xFF را در پورت ۱ بنویسیم تا آن را به‌عنوان ورودی پیکربندی کنیم، و همچنین می‌توانیم از این مرحله بگذریم زیرا میکروکنترلر از قبل با روشن شدن، پورت ۱ را به‌طور پیش‌فرض به عنوان ورودی پیکربندی می‌کند. همچنین می توانیم پورت 2 را به عنوان خروجی با نوشتن 0 روی آن پیکربندی کنیم.

void main()
{
  P1 = 0xFF;
  P2 = 0x00;
  
  while (1) {
    P2 = P1;
  }
}

در این کد پورت 1 را با نوشتن P1 = 0xFF به عنوان ورودی قرار داده ایم و سپس با استفاده از 0x00 پورت 2 را به عنوان خروجی قرار داده ایم. در قسمت آخر می خواهیم ورودی پورت 1 را به پورت 2 ارسال کنیم تا به سادگی پورت 2 را برابر پورت 1 قرار دهیم.

پورت 3 میکروکنترلر 8051

P3 شامل پین‌های (10-17) است. این یک پورت I/O با عملکرد جایگزین است. برای استفاده از توابع جایگزین، منطق یک (1) باید به بیت مناسب ثبت P3 اعمال شود. از نظر سخت افزاری این پورت مشابه P0 است اما دارای مقاومت کششی داخلی است که در P0 وجود ندارد.

تنظیمات پیکربندی پین – پورت های ورودی/خروجی 8051 میکروکنترلر

تنظیمات پین در جدول زیر نشان داده شده است:

پیکربندی پیندر حال کار کردن
ورودیپین باید به عنوان 1 برای ورودی پیکربندی شود.
خروجیپین باید به عنوان 0 برای خروجی پیکربندی شود.
جدول 1: پیکربندی پین ورودی/خروجی

نکته: به طور پیش‌فرض، وقتی میکروکنترلر روشن است، همه پین‌ها به عنوان ورودی پیکربندی می‌شوند.

محدودیت فعلی پین ها

هنگام اختصاص پورت ها یا پین های جداگانه به عنوان ورودی یا خروجی، باید مراقب محدودیت های فعلی آنها باشیم. در غیر این صورت می تواند به میکروکنترلر آسیب برساند. در زیر به این محدودیت ها پرداخته ایم:

  • هنگامی که یک پین را به عنوان خروجی پیکربندی می کنیم، یک پایه می تواند جریان 10 میلی آمپر را دریافت کند. اگر پین را به عنوان ورودی پیکربندی کنیم، مقاومت های کششی داخلی جریان بسیار ضعیفی را ارائه می دهند اما می توانند تا 4 ورودی TTL را اداره کنند.
  • اگر تمام 8 بیت یک پورت فعال باشد، حد مجاز جریان کل باید 15 میلی آمپر باشد. اما برای پورت 0، می تواند تا 26 میلی آمپر باشد (پورت P0: 26 میلی آمپر).
  • اگر هر چهار پورت (32 بیت) فعال باشند، جریان کل باید به 71 میلی آمپر محدود شود.

شبیه سازی پروتئوس

ما شبیه سازی Proteus از مثال چشمک زدن را ارائه کرده ایم. در این شبیه سازی برنامه به زبان C با نرم افزار KEIL IDE نوشته شده است . فایل هگز را از طریق خواص به میکروکنترلر 8051 اضافه می کنیم. ورودی میکروکنترلر از طریق دکمه فشار داده می شود و خروجی را می توان با یک LED درخشان مشاهده کرد.

حال نحوه عملکرد این شماتیک را توضیح خواهیم داد. وقتی اولین دکمه را فشار می دهیم اولین LED (D1) می درخشد. این LED به مدت 1 ثانیه روشن می شود و سپس خاموش می شود. اگر دکمه 2 یا 3 را فشار دهیم، LED D2 یا D3 به ترتیب برای 1 ثانیه روشن می شود.

توجه: فرکانس نوسانگر کریستالی برای عملکرد مناسب باید روی 11.059 مگاهرتز تنظیم شود.

8051 LED به عنوان مثال چشمک زن

در این قسمت کدی که در قسمت قبل برای شبیه سازی پروتئوس استفاده شده بود را ارائه کرده ایم.

#include<reg51.h>

sbit Led1 = P2 ^ 0; //Defining LED Pins
sbit Led2 = P2 ^ 1;
sbit Led3 = P2 ^ 2;
sbit Led4 = P2 ^ 3;

sbit Button1 = P3 ^ 0; //Defining Button Pins
sbit Button2 = P3 ^ 1;
sbit Button3 = P3 ^ 2;
sbit Button4 = P3 ^ 3;

void Delay(int); //Delay function declaration

int main()
{
  P2 = 0x00; //used as output port
  P3 = 0xFF; //used as input port

  do
  {
    if (Button1 == 0) //If 1st switch pressed
    {
      Led1 = 1; //1st LED ON
      Delay(1000);
      Led1 = 0; //LED OFF
    }
    if (Button2 == 0) //If 2nd switch pressed
    {
      Led2 = 1; //2nd LED ON
      Delay(1000);
      Led2 = 0;
    }
    if (Button3 == 0) //If 3rdswitch pressed
    {
      Led3 = 1; //3rd LED ON
      Delay(1000); //Delay
      Led3 = 0; //LED OFF
    }
    if (Button4 == 0) //If 4thswitch pressed
    {
      Led4 = 1; //4th LED ON
      Delay(1000); //Delay
      Led4 = 0; //LED OFF
    }
  }

  while (1);
}

void Delay(int k)
{
  int j;
  int i;

  for (i = 0; i < k; i++)
  {
    for (j = 0; j < 100; j++)
    {

    }
  }
}

توضیح کد

اکنون نحوه عملکرد هر قسمت از کد را به تفصیل توضیح خواهیم داد.

#include<reg51.h>

ابتدا فایل هدر را برای رجیسترها در میکروکنترلر 8051 قرار می دهیم. این به ما در هنگام برخورد با پورت ها و ثبت نام ها کمک می کند.

sbit Led1 = P2 ^ 0; //Defining LED Pins
sbit Led2 = P2 ^ 1;
sbit Led3 = P2 ^ 2;
sbit Led4 = P2 ^ 3;

sbit Button1 = P3 ^ 0; //Defining Button Pins
sbit Button2 = P3 ^ 1;
sbit Button3 = P3 ^ 2;
sbit Button4 = P3 ^ 3;

سپس پایه های LED را برای پورت ۲ و پایه های دکمه را برای پورت ۳ تعریف می کنیم.

void Delay(int); //Delay function declaration

int main()
{
  P2 = 0x00; //used as output port
  P3 = 0xFF; //used as input port

حالا تابعی را با نام تاخیر تعریف می کنیم. این عملکرد 1 ثانیه تاخیر بین حالت های روشن و خاموش LED اضافه می کند. علاوه بر این، نحوه عملکرد این تاخیر را نشان خواهیم داد. پورت 2 را به عنوان خروجی و پورت 3 را به عنوان ورودی تنظیم کرده ایم. این پورت ها را به ترتیب 0 (برای نوشتن) و 1 (برای خواندن) مقداردهی اولیه می کنیم.

do
  {
    if (Button1 == 0) //If 1st switch pressed
    {
      Led1 = 1; //1st LED ON
      Delay(1000);
      Led1 = 0; //LED OFF
    }
    if (Button2 == 0) //If 2nd switch pressed
    {
      Led2 = 1; //2nd LED ON
      Delay(1000);
      Led2 = 0;
    }
    if (Button3 == 0) //If 3rdswitch pressed
    {
      Led3 = 1; //3rd LED ON
      Delay(1000); //Delay
      Led3 = 0; //LED OFF
    }
    if (Button4 == 0) //If 4thswitch pressed
    {
      Led4 = 1; //4th LED ON
      Delay(1000); //Delay
      Led4 = 0; //LED OFF
    }
  }

  while (1);
}

در این قسمت از کد بررسی می کنیم که آیا دکمه ای فشار داده شده است یا خیر. اگر دکمه ای فشار داده شود، کد به کیس مربوطه می رود. به عنوان مثال، اگر دکمه 3 را فشار دهیم، کد به دستور if دکمه 3 منتقل می شود. با استفاده از حلقه while به طور مداوم این موارد را بررسی می کنیم.

void Delay(int k)
{
  int j;
  int i;

  for (i = 0; i < k; i++)
  {
    for (j = 0; j < 100; j++)
    {

    }
  }
}

تابع Delay آرگومان می گیرد که در موارد بالا آن را 1000 قرار داده ایم. برای تأخیرها، ساختار حلقه تو در تو مفید است زیرا میکروکنترلر را تا زمانی که تکرارها کامل شوند، اشغال می کند. به این ترتیب، یک دوم کامل تاخیر بین دستورات روشن و خاموش LED دریافت می کنیم.

نتیجه گیری

در این مقاله به موضوعات زیر پرداخته ایم:

  • پورت های ورودی/خروجی میکروکنترلر 8051 چیست؟
  • کارکرد پورت 0 – پورت 3.
  • نمودار شماتیک.
  • طرح و توضیح.