معماری

جلسه CV,1.6 : نمایشگر ۷-Segment تک رقمی توسط میکروکنترلر

همانطور که از نام سون سگمنت پیداست از هفت دیود LED که همان دیودهای نوری هستند ، تشکیل شده است. این دیود ها به صورت کاملا منظم دور تا دور هم جای گرفته اند که به هنگام روشن شدن همه آنها می توانیم عدد ۸ لاتین را مشاهده کنیم. در این آموزش سون سگمنت را به کمک نرم افزار های  Proteus و Codevision AVR راه اندازی می کنیم.

ساختمان داخلی سون سگمنت

نکته قابل ذکر این است که این دیودها در دو نوع ساخته میشوند یا تمامی پایه های آند (قطب مثبت) دیود ها را به هم متصل می کنند که به آن آند مشترک می گویند یا بلعکس تمامی پایه های کاتد (قطب منفی) دیودها را به هم وصل می کنند که به آن سون سگمنت کاتد مشترک می گویند.

موارد استفاده

موارد استفاده این دیودها به طور مشخص برای نمایش اعداد انگلیسی کاربرد دارند و البته می توان از آنها برای نمایش حروف معدود انگلیسی نیز استفاده کرد.

پایه های سون سگمنت ۱۰ عدد هستند که تعداد ۷ پایه آن که با حروف کوچک (a-b-c-d-e-f-g) مشخص می شوند و یکی برای نشان دادن نقطه یا ممیز برای نوشته های انگلیسی و نهایتا دو پایه نیز برای قطب مشترک در نظر گرفته شده است.

با این وجود حتما دریافته ایید که مثلا برای روشن کردن عدد یک باید دیودهای b و c روشن شوند و بقیه خاموش باشند.و به همین ترتیب برای اعداد دیگر باید استفاده کنیم.

و اما نکته دیگر اگر بخواهیم اعداد ۰ تا ۹ را توسط سون سگمنت و با آی سی میکرو نمایش دهیم چه کار باید بکنیم؟

خوب هر دیود از سون سگمنت را به یک پایه از پورت های آی سی وصل میکنیم . البته  بهتر است همه پایه ها  به پایه های یک پورت از آی سی وصل شده باشند.

فرض کنید عدد ۲ انگلیسی را با استفاده از پورت B   بخواهیم  نمایش دهیم. به این صورت عمل میکنیم:

ابتدا باید بدانیم که برای نمایش عدد ۲ کدام دیود ها باید روشن باشند : دیود های a-b-d-e-g

حال باید بدانیم که سون سگمنت ما از چه نوعی است اگر از نوع کاتد مشترک باشد ، پس باید برای روشن شدن دیود مورد نظر به آن یک دهیم و اگر نه که باید صفر دهیم.

در این آموزش ما از سون سگمنت کاتد مشترک (منفی مشترک) استفاده می کنیم.

راه اندازی

ابتدا نرم افزار پروتئوس را باز کرده و پروژه خود را ایجاد میکنیم. سپس قطعه سون سگمنت کاتد مشترک قرمز را از کتابخانه برنامه به لیست قطعات اضافه میکنیم.

به همین صورت آی سی ATmega8 را به لیست قطعات اضافه می کنیم.

برای اتصال پایه های سون سگمنت بهتر است از یک پورت استفاده شود تا در کد نویسی با کنترل یک پورت به راحتی عدد مورد نظرمان را در نمایشگر نشان دهیم.

کدنویسی

حال برنامه کدویژن را باز کرده و از قسمت file گزینه New Project را انتخاب کنید و با انتخاب گزینه yes وارد محیط CodeWizard (تولید کننده کد) شوید.

در قسمت chip آی سی Atmega8 را انتخاب کنید.

در قسمت Ports تمامی پایه های میکروکنترلر را به صورت خروجی out تنظیم کنید.

حال پروژه را توسط گزینه Generate Program, Save and Exit در محل دلخواه ذخیره کنید.

پس از <include <mega8.h# کتابخانه delay(تاخیر زمانی) را فراخوانی و متغیر x را از نوع int تعریف کنید.

<include <mega8.h#

<include <delay.h#
;int x

در قسمت چرخه بینهایت (while(1  کدهای اصلی را مینویسیم.

برای مثال جهت نشان دادن عدد ۳ باید دستور زیر را بنویسیم:

while (1)
{
PORTD.0=1;
PORTD.1=1;
PORTD.2=1;
PORTD.3=1;
PORTD.4=0;
PORTD.5=0;
PORTD.6=1;
}

 بعد از نوشتن کدها برنامه را توسط راهنمای زیر کامپایل می کنیم تا فایل هگز در محل سیو برنامه داخل فولدر Debug/exe ایجاد شود.

اجرا در برنامه پروتئوس

حال در برنامه پروتئوس با دابل کلیک کردن روی میکروکنترلر وارد تنظیمات میکرو شده و از قسمت مشخص شده آدرس فایل هگز تولید شده هنگام کامپایل کردن  برنامه را به میکروکنترلر می دهیم.

سپس برنامه پروتئوس را اجرا RUN کنید تا کد های نوشته شده در میکروکنترلر اجرا و حاصل کار را ببینید.

سون سگمنت

همانطور که مشاهده کردید عدد ۳ به نمایش در آمد. حال با روشن و خاموش کردن پایه های میکروکنترلر می توانید اعداد یا حروف دلخواه خود را در نمایشگر ایجاد کنید. برای مثال برای نمایش عدد ۱ باید پایه های D.1 , D.2 روشن و بقیه پین هارا خاموش می کنیم.

حال بجای اینک هر پایه میکروکنترلر را به صورت جداگانه روشن و خاموش کنیم می توانید از کد زیر برای کنترل پایه های میکروکنترلر استفاده کنید:

PORTD=0b01001111;

*** نکته:در مثال بالا اعداد به ترتیب از راست به چپ روی بیت های ۰ تا ۷ قرار می گیرد .یعنی کم ارزش ترین عدد عدد سمت راست و پر ارزشترین عدد عدد سمت چپ است . یعنی اگر  پایه های سون سگمنت را به ترتیب از  A تا G به بیتهای ۰ تا ۷ وصل کنیم عدد منطقی ۱ روی پایه A  قرار میگیرد و led a روشن می شود.

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

حال می خواهیم مقدار متغیر X را که در ابتدای برنامه تعریف کرده بودیم در نمایشگر نشان دهد.

برای این منظور برنامه باید با توجه به عدد ذخیره شده در X پایه ها را طوری روشن کند تا عدد مورد نظر به نمایش در آید.

برای این منظور از کد زیر استفاده می کنیم.

کدهای اصلی

while (1)
{
x=5;
if(x==0) PORTD=0b00111111;
if(x==1) PORTD=0b00000110;
if(x==2) PORTD=0b01011011;
if(x==3) PORTD=0b01001111;
if(x==4) PORTD=0b01110010;
if(x==5) PORTD=0b01101101;
if(x==6) PORTD=0b01111101;
if(x==7) PORTD=0b00000111;
if(x==8) PORTD=0b01111111;
if(x==9) PORTD=0b01101111;
}

برای بهتر شدن برنامه می توانید از دستور switch استفاده کنید.تا به حال با ساختارهاى تك انتخابى if و دو انتخابى if/else آشنا شديم،گاهى اوقات الگوريتمى ممكن است داراى تعدادى تصميم گيرى باشد كه در آنها متغير يا عبارتى با مقادير صحيح ثابتى كه اين متغير يا عبارت مى تواند به خود بگيرد به طور جدا مقايسه ميشود و براى هر مقدار اعمال مختلفى انجام ميشوند،براى انجام چنين تصميم گيرى هايي از دستور switch استفاده ميشود.ساختار switch شامل تعدادى بر چسب caseاست.در دستور switch لازم نيست عبارت هاى مقابل case را در داخل دو علامت آكلاد قرار دهيم.اما هدف ما از ايجاد ساختار switch انتخاب يكى از دستورات (case) ميباشد يعنى ما بعد از انتخاب يكى از case ها، بايد از ساختار switch خارج شويم براى اينكار از دستور break استفاده ميكنيم. برنامه با دستور break از ساختار switch خارج ميشود.

(عبارت کنترلی)switch

;Break            ;مجموعه دستورات اول      :مقدار اولcase}

;Break           ;مجموعه دستورات دوم      :مقدار دوم case

….

{;Break         ;مجموعه دستورات سوم    :مقدار سوم case

حال میتوانیم از دستورswitchبرای بهتر شدن برنامه استفاده کنیم:

while (1)
{ x=5; 
switch (x) 
{
 case 0:PORTD=0b00111111;break; 
 case 1:PORTD=0b00000110;break; 
 case 2:PORTD=0b01011011;break; 
 case 3:PORTD=0b01001111;break; 
 case 4:PORTD=0b01100110;break; 
 case 5:PORTD=0b01101101;break; 
 case 6:PORTD=0b01111101;break; 
 case 7:PORTD=0b00000111;break; 
 case 8:PORTD=0b01111111;break; 
 case 9:PORTD=0b01101111;break;
 }
}

در کدهای بالا بجای X=5 هر عدد دیگری را در X ذخیره کنیم آن عدد را در سون سگمنت نمایش خواهد داد.

همچنین برای شمارش اعداد از ۰ تا ۹ به صورت خودکار با فاصله زمانی ۱۰۰ میلی ثانیه میتوانیم از کدهای زیر استفاده کنیم.

while (1)
{
for(x=0;x=9;x++)
{switch (x){
case 0:PORTD=0b00111111;break;
case 1:PORTD=0b00000110;break;
case 2:PORTD=0b01011011;break;
case 3:PORTD=0b01001111;break;
case 4:PORTD=0b01100110;break;
case 5:PORTD=0b01101101;break;
case 6:PORTD=0b01111101;break;
case 7:PORTD=0b00000111;break;
case 8:PORTD=0b01111111;break;
case 9:PORTD=0b01101111;break;
} delay_ms(100);
}
}

با تغییر تاخیر زمانی ۱۰۰ میلی ثانیه در کد DELAY می توانید سرعت شمارش را تغییر دهید.

نظر یادتون نره.

5 دیدگاه

  1. آموزنده و خیلی مفید بود یاد گرفتم و از کسی که این آموزش را نوشته است نهایت تشکر را دارم .@–))–

  2. بسیار بسیار عالی
    خیلی روان و آسان آموزش دادید
    ممنون
    کل مطالب آموزشی جدید و قدیمتون رو به امیلم بفرستید

  3. با سلام وخسته نباشی خدمت شما .راهنمایی خوبی کردید فقط من چون طیاد به برنامه نویسی آشنایی ندارم نتونستم ازاین اموزشتون استفاده کامل ببرم .یه سوالی ازتون دارم و اون اینه که تو این قسمت نمیدونم باید چیکارکنم (پس از <include <mega8.h# کتابخانه delay(تاخیر زمانی) را فراخوانی و متغیر x را از نوع int تعریف کنید.

    <include <mega8.h#

    <include <delay.h#
    ;int x

  4. اگه یه کد ساخته شده خودتون از همین پروژه رو میزاشتید راحتتر متوجه میشدم .بازم ممنون از راهنمایی خوبتون

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

قالب وردپرس