در این پست از سایت اِمیک, یک پروژه بسیار جالب و آموزشی به نام تولید عدد رندوم واقعی با میکروکنترلر AVR قرار داده شده است. همانطور که از نام پروژه مشخص است, ما در این پروژه به وسیله میکروکنترلر AVR یک عدد رندوم یا تصادفی ایجاد می کنیم و این عدد را روی یک LCD کاراکتری نمایش می دهیم. این پروژه با میکروکنترلر ATmega16 انجام شده است. در ادامه در مورد پروژه بیشتر توضیح خواهم داد. در زیر شماتیک این پروژه را مشاهده می کنید:
همانطور که مشاهده می کنید, ما در این پروژه از میکروکنترلر ATmega16 استفاده کرده ایم. از یک LCD کاراکتری 2 در 16 نیز استفاده کرده ایم که این LCD به پورت D میکروکنترلر متصل شده است. پتانسیومتر RV1 برای تنظیم کنتراست یا میزان روشنایی LCD کاراکتری استفاده شده است. یک کلید فشاری نیز به پایه 40 میکروکنترلر (پین 0 از پورت A) متصل شده است.
عملکرد پروژه به این صورت است که با هر بار فشار دادن کلید فشاری SW1 یک عدد رندوم بین 1 تا 32767 روی LCD کاراکتری نمایش داده می شود.
توجه کنید که پایه های تغذیه میکروکنترلر (پایه 10 و 11) را که در شماتیک بالا نیست, فراموش نکنید که به تغذیه 5 ولت متصل کنید.
تابع rand و srand :
برای تولید عدد رندوم در برنامه پروژه, ما از دو تابع rand و srand استفاده کرده ایم. برای استفاده از این دو تابع باید کتابخانه stdlib.h را در ابتدای برنامه فراخوانی کنیم. تابع rand یک عدد تصادفی بین 1 تا 32767 تولید می کند. اگر بخواهیم که تابع rand اعداد کاملاً تصادفی ایجاد کند باید قبل از آن از تابع srand استفاده کنیم. تابع srand یک ورودی از نوع اعداد صحیح بدون علامت می گیرد و باعث تصادفی شدن تابع rand بر اساس مقدار ورودی تابع srand می شود.
به عبارت دیگر برای اینکه عدد تولید شده توسط تابع rand واقعا تصادفی باشد باید قبل از استفاده از این تابع از تابع srand استفاده کنیم. تابع srand نیاز به یک عدد ورودی دارد تا بر اساس آن عدد, عدد رندوم ما تولید شود. ما در برنامه یک متغیر (i) تعریف کرده ایم که با فشار دادن کلید, مقدار این متغیر هر 1 میکروثانیه افزایش می یاید و تغییر می کند. این متغیر را به عنوان عدد ورودی به تابع srand داده ایم. بنابراین با توجه به مدت زمانی که کلید را فشار داده ایم یک عدد بین 0 تا 30000 به عنوان ورودی به تابع srand اعمال می شود که در نتیجه باعث تولید یک عدد رندوم واقعی توسط تابع rand می شود.
برنامه کدویژن:
در این پروژه فرکانس میکروکنترلر 8 مگاهرتز تنظیم شده است. در زیر برنامه نوشته شده به زبان 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 |
////////////// WWW.EMIC.IR ////////////// #include <mega16a.h> //ATmega16 فراخواني کتابخانه ميکروکنترلر// #include <alcd.h> //کاراکتري lcd فراخواني کتابخانه// #include <delay.h> //delay فراخواني کتابخانه// #include <stdlib.h> //srand و rand براي استفاده از تابع stdlib فراخواني کتابخانه// #include <stdio.h> //sprintf براي استفاده از تابع stdio فراخواني کتابخانه// void main(void) { int i=0, R=0; //تعريف متغير// char Buffer_LCD[16]; //ميکروکنترلر براي اتصال به کليد ورودي شده است و مقاومت بالاکش اين پين نيز فعال شده است A در زير پين 0 از پورت// DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0); PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (1<<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); //پيکره بندي ال سي دي کاراکتري// while (1) { if(PINA.0==1) { //روبرو اجرا مي شوند if زماني که کليد فشار داده نشده است دستورات درون شرط// sprintf(Buffer_LCD,"RAN Number:%d",R); //براي نمايش روي ال سي دي کاراکتري Buffer_LCD تبديل عدد رندوم توليد شده به رشته اي از کاراکتر و ذخيره ان در متغير// lcd_clear(); //پاک کردن ال سي دي کاراکتري// lcd_gotoxy(0,0); //رفتن به ستون 0 و سطر 0 از ال سي دي// lcd_puts(Buffer_LCD); //ذخيره شده بود روي ال سي دي کاراکتري Buffer_LCD نمايش عدد رندوم توليد شده که در متغير// lcd_gotoxy(3,1); //رفتن به ستون 3 و سطر 1 از ال سي دي// lcd_putsf("WWW.EMIC.IR"); //روي ال سي دي WWW.EMIC.IR نوشتن عبارت// delay_ms(300); //ايجاد تاخير به مدت 300 ميلي ثانيه// }else { //اجرا خواهند شد else زماني که کليد فشار داده شد دستورات درون// i=i+1; //يکي يکي اضافه مي شود i متغير// srand(i); //به عنوان مقدار اوليه براي توليد عدد رندوم i دادن متغير// R=rand(); //R توليد عدد رندوم و ذخيره ان در متغير// delay_us(1); //ايجاد تاخير به مدت 1 ميکرو ثانيه// if(i>30000) i=0; //از 30000 بيشتر شد دستور روبرو ان را دوباره صفر مي کند i در صورتي که متغير// } } } |
توضیحات قسمت های مهم برنامه نوشته شده, اگر سوالی داشتید می توانید در قسمت نظرات مطرح کنید. فایل های کدویژن و شبیه سازی پروتئوس را هم می تونید از انتهای مطلب دانلود کنید.
پسورد فایل زیپ : www.emic.ir
نظر یادتون نره…