در این پست از سایت اِمیک, یک پروژه جالب و آموزشی به نام پروژه AVR چینش اعداد از بزرگ به کوچک قرار داده شده است. در این پروژه ما توسط یک کیپد تعدادی عدد وارد کرده و میکروکنترلر این اعداد را از بزرگ به کوچک مرتب می کند و روی یک LCD کاراکتری نمایش می دهد. این پروژه با استفاده از میکروکنترلر AVR انجام شده و در ادامه در مورد پروژه بیشتر توضیح خواهم داد. در زیر شماتیک این پروژه بسیار جالب و آموزنده را مشاهده می کنید:

همانطور که مشاهده می کنید, ما در این پروژه از میکروکنترلر ATmega16 استفاده کرده ایم. از یک LCD کاراکتری 2 در 16 نیز استفاده کرده ایم که این LCD به پورت D میکروکنترلر متصل شده است. پتانسیومتر RV1 برای تنظیم کنتراست یا میزان روشنایی LCD کاراکتری استفاده شده است. همچنین از یک کیپد 3 در 4 نیز استفاده کرده ایم که این کیپد به پورت A میکروکنترلر متصل شده است.
عملکرد پروژه به این صورت است که ما توسط کیپد می توانیم تا حداکثر 5 عدد تک رقمی (0 تا 9) را وارد کنیم. میکروکنترلر این اعداد را از بزرگ به کوچک مرتب می کند و در نهایت روی LCD کاراکتری نمایش می دهد. اعدادی که وارد می کنیم در سطر اول LCD نمایش داده می شوند. پس از وارد کردن اعداد با فشار دادن کلید # از کیپد, اعداد وارد شده به ترتیب از بزرگ به کوچک در سطر دوم LCD نمایش داده می شوند. برای پاک کردن LCD و وارد کردن اعداد جدید می توانید کلید * از کیپد را فشار دهید.
توجه کنید که پایه های تغذیه میکروکنترلر (پایه 10 و 11) را که در شماتیک بالا نیست, فراموش نکنید که به تغذیه 5 ولت متصل کنید.
برنامه کدویژن:
در این پروژه فرکانس میکروکنترلر 1 مگاهرتز تنظیم شده است. در زیر برنامه نوشته شده به زبان C و کامپایلر کدویژن را مشاهده می کنید:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
////////// WWW.EMIC.IR ////////// #include <mega16a.h> //ATmega16A فراخواني کتابخانه ميکروکنترلر// #include <alcd.h> //کاراکتري LCD فراخواني کتابخانه// #include <delay.h> //delay فراخواني کتابخانه// #include <stdio.h> //sprintf براي استفاده از تابع stdio فراخواني کتابخانه// int key_pad(void) //از خط 7 تا 26 يک تابع تعريف شده است. با فراخواني تابع روبرو در برنامه اصلي کي پد اسکن مي شود و عدد کليد فشار داده شده را بر مي گرداند// { PORTA.0=1;PORTA.1=1;PORTA.2=1;PORTA.3=0; if(!PINA.4) return 1; if(!PINA.5) return 2; if(!PINA.6) return 3; PORTA.0=1;PORTA.1=1;PORTA.2=0;PORTA.3=1; if(!PINA.4) return 4; if(!PINA.5) return 5; if(!PINA.6) return 6; PORTA.0=1;PORTA.1=0;PORTA.2=1;PORTA.3=1; if(!PINA.4) return 7; if(!PINA.5) return 8; if(!PINA.6) return 9; PORTA.0=0;PORTA.1=1;PORTA.2=1;PORTA.3=1; if(!PINA.4) return 10; if(!PINA.5) return 0; if(!PINA.6) return 11; return 12; } void main(void) { int key, c=0, i=9, a=0, N[5]; //در خط 30 و 31 تعدادي متغير براي استفاده در برنامه تعريف شده است// unsigned char lcd[16]; //به کيپد متصل مي شود A ورودي شده اند. پورت A خروجي و پين هاي 4 تا 7 از پورت A در زير پين هاي 0 تا 3 از پورت// DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (1<<DDA3) | (1<<DDA2) | (1<<DDA1) | (1<<DDA0); PORTA=(0<<PORTA7) | (1<<PORTA6) | (1<<PORTA5) | (1<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0); //ميکرو براي اتصال به ال سي دي کاراکتري خروجي شده است D در زير پورت// DDRD=(1<<DDD7) | (1<<DDD6) | (1<<DDD5) | (1<<DDD4) | (1<<DDD3) | (1<<DDD2) | (1<<DDD1) | (1<<DDD0); PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0); lcd_init(16); //پيکره بندي ال سي دي کاراکتري// lcd_clear(); //پاک کردن ال سي دي کاراکتري// lcd_gotoxy(2,0); //رفتن به سطر 0 و ستون 2 از ال سي دي// lcd_putsf("WWW.EMIC.IR"); //WWW.EMIC.IR نوشتن متن// delay_ms(2000); //ايجاد تاخير به مدت 2000 ميلي ثانيه يا 2 ثانيه// lcd_clear(); //پاک کردن ال سي دي کاراکتري// lcd_gotoxy(0,0); //رفتن به سطر 0 و ستون 0 از ال سي دي// while (1) { key=key_pad(); if((key<=9)&(key!=12)&(c<=4)&(a==0)){ //ذخيره مي کند و ان عدد را نير روي ال سي دي نمايش مي دهد N روبرو و دستورات درون ان عدد فشار داده شده را در ارايه if شرط// N[c]=key; c++; sprintf(lcd,"%d",key); lcd_puts(lcd); delay_ms(300); } if((key==11)&(key!=12)&(a==0)) { //روبرو و دستورات درون ان با فشار دادن کليد # از کيپد اعداد وارد شده را به ترتيب از بزرگ به کوچک ميچيند و روي ال سي دي نمايش مي دهد if شرط// lcd_gotoxy(0,1); for(i=9;i>=0;i--) { if((N[0]==i)|(N[1]==i)|(N[2]==i)|(N[3]==i)|(N[4]==i)) { sprintf(lcd,"%d",i); lcd_puts(lcd); } } a=1; } if(key==10) { //با فشار دادن کليد * از کيپد ال سي دي پاک مي شود و تمام متغيرها مقدار دهي اوليه مي شوند و دوباره مي توان اعداد جديد وارد کرد// lcd_clear(); key=0; c=0; i=9; a=0; N[0]=0; N[1]=0; N[2]=0; N[3]=0; N[4]=0; } } } |
توضیحات قسمت های مهم برنامه نوشته شده, اگر سوالی داشتید می توانید در قسمت نظرات مطرح کنید. فایل های کدویژن و شبیه سازی پروتئوس را هم می تونید از انتهای مطلب دانلود کنید.
پسورد فایل زیپ : www.emic.ir
نظر یادتون نره…





سلام.اگه امکانش هست همین پروژه رو با آردوینو uno انجام بدید. ممنون از سایت خوبتون🙏🌹
سلام
“پروژه آردوینو چینش اعداد از بزرگ به کوچک“