طراحی کنترلر، مدارت دلخواه، پروژه ها و تمرینات درس میکروکنترلرها
این پروژه قادر خواهد بود که یک ماشین را به صورت بیسیم در جهات جلو و عقب و چپ و راست با سرعت دلخواه کنترل و همچین با کلید استپ ماشین را ثابت (ترمز) نماید.کنترل نور یک لامپ 12 الی 24 ولتی DC توسط دو عدد کلید در بازه روشنایی 1 تا 99 درصد. به همراه نمایشگر جهت نمایش درصد روشنایی.این پروژه در اصل یک قفل امنیتی است که می توان جلوی درب اصلی منزل (در کنار آیفون) آن را نصب کرد. از امکانات آن می توان به موارد زیر اشاره نمود: نمایش دما از 125 تا 55- درجه سانتیگراد، نمایش ساعت دقیق، نمایش تاریخ شمسی همراه با روز هفته به صورت فارسی، نمایش تعداد فرصت های باقیمانده برای وارد کردن رمز صحیح، و قفل شدن سیستم به مدت 15 دقیقه در صورتی که 4 بار رمز اشتباه وارد شود. امکان تغییر رمز و تنظیم کردن ساعت و تاریج و ...یک کنترل کننده موتور با جریان خروجی 2 آمپر شامل کنترل جهت چرخش و سرعت می باشد. این مدار دارای نمایشگر LCD متنی بوده که سرعت و جهت چرخش موتور را نمایش می دهد.اندازه گیری ولتاژ DC از 0 تا 24 ولت با سه رقم دقت (اعشار) و
اندازه گیری دما از منفی 20 تا مثبت 100 درجه سانتی گراد. دارای نمایشگر السیدی
پروژه ماشین کنترلی بی سیم با avr

MCP-20

پروژه ماشین کنترلی بی سیم با avr
دیمر دیجیتال با AVR به زبان سی

MCP-38

دیمر دیجیتال با AVR به زبان سی
پروژه دربازکن الکترونیکی خانه قفل رمز با avr

MCP-5

پروژه دربازکن الکترونیکی خانه قفل رمز با avr
کنترل سرعت و جهت موتور DC

MCP-9

کنترل سرعت و جهت موتور DC
پروژه ولت متر DC و دماسنج با avr

MCP-16

پروژه ولت متر DC و دماسنج با avr

توابع در زبان سی C قسمت 5

هر برنامه به زبان C مجموعه ای از یک یا چندین تابع است که یکی از آنها تابع اصلی بنام ()main است، مابقی توابع از داخل این تابع اصلی فراخوانی می شوند. تابع در واقع یک زیر برنامه است که توسط برنامه نویس برای انجام کارهای خاص نوشته و فراخوانی می شود. به طور کلی توابع به دو دسته تقسیم می شوند:

  1. توابع از پیش تعریف شده که به آنها توابع کتابخانه ای گفته می شود مانند توابع (sin(x و (cos(x و ...
  2. توابعی که توسط خود ما تعریف می شودند که ادامه به آن خواهیم پرداخت.

در اینجا ما نوع دوم را توضیح می د هیم. در کل این گونه توابع دو حالت دارند یکی اینکه مقدار برگشتی دارند و دیگری مقدار برگشتی ندارند. مقدار برگشی یعنی چی؟

از بخش سفارش طراحی هم اکنون درخواست خود را ثبت کنید
حل و تشریح کلیه تمرینات درس میکروکنترلر AVR
طراحی و ساخت مدارات دلخواه شما با میکروکنترلر AVR


هر تابع بک مقدار ورودی دارد و یک مقدار خروجی، یک تابع با قابلیت مقدار برگشتی یعنی اینکه ما یک مقداری به ورودی تابع می دهیم و در این تابع یک سری عملیات بر روی این مقدار ورودی انجام می شود و در نهایت جواب این عملیات برگشت داده می شود. و در نوع دوم تابع می تواند هم مقدار ورودی داشته باشد و هم نداشته باشد که مثلا اگر یک مقدار ورودی داشته باشد با این مقدار ورودی یک سری کارها را انجام می دهد و در نهایت هم برمیگردد و هیچ مقدار برگشتی هم ندارد. در زیر با مثال های زیادی این مطالب را روشن تر می کنیم:

محل نوشتن توابع کجاست؟ شما به دو طریق می توانید تابع ها را در محل های صحیح بنویسید:

1) توابع را ترتیب قبل از تابع اصلی ()main بنویسید.

2) توابع را به ترتیب بعد از تابع اصلی ()main بنویسید که در این روش باید قبل از تابع ()main فقط اسم توابع را معرفی کنیم.

نکته: اگر در پرانتز عبارت (void) نوشته شود یعنی تابع مقدار برگشتی ندارد.

void main(void){ 
دستورات 
} 

به این تابع، تابع اصلی ()main گفته می شود.

 1) نوشتن توابع قبل از main :

  void mohsen(void){
 دستورات زير برنامه
 } 

 void main(void){
   //www.picpars.com دستورات
mohsen();
 }

در اینجا ما یک تابع با اسم mohsen تعریف کردیم و اگر توچه کنید قبل از تابع main تعریف کردیم و حالا آن را در تابع اصلی فراخوانی کردیم.

2) نوشتن تابع بعد از main :

  void mohsen();

 void main(void){
    //دستورات
    mohsen();
 }
  void mohsen(void){
 //دستورات زير برنامه
 }

در این روش ابتدا نام تابع mohsen را تعریف کردیم و در آخر بعد از main آن را نوشتیم.

 یک مثال از تابع که مقدار برگشتی ندارد:

#include  // معرفي ميکر//www.picpars.com
#include  //فراخواني دستورات استاندارد ورودي خروجي
#include  // فراخواني تابع تاخيري
#include  // فراخواني دستورات ال سي دي
#define xtal 8000000
#asm // شروع دستورات اسمبلي
    .equ __lcd_port=0x18; PORTB //معرفي پورت ال سي دي
#endasm // پايان دستورات اسمبلي
 char i;
 void fanction(){ //ايجاد يک تابع
   i=i+2;
 }
 
 void main(void){ // تابع اصلي
    char buffer[10]; // در اين متغيير اطلاعات به صورت رشته قرار ميگيرند
    lcd_init(16); // ال سي دي با 16 ستون

   while(1){
    fanction(); // فراخواني تابع فانکشن
    lcd_clear(); // پاک کردن ال سي دي
    sprintf(buffer,"MGH=%d",i); //آماده کردن اطلاعات به صورت رشته
    lcd_puts (buffer); // ارسال اطلاعات به ال سي دي
    delay_ms(100); // تاخير 100 ميلي ثانيه
   }
 }

در این مثال تابع function به صورت مدوام در اول حلقه بی نهایت فراخوانی می شود، بنابراین میکرو ابتدا به آدرس این تابع می رود و دستورات داخل آن را اجرا می کند و به { که رسید به آدرس قبلی برمیگردد و دستور lcd_clear را اجرا می کند. در کل اصول کار برنامه به این صورت می باشد که در هر بار اجرای تابع عدد 2 به متغیر سراسری i اضافه می شود و در نهایت روی ال سی دی نمایش داده می شود.

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

 یک مثال از تابع با مقدار برگشتی:

#include  // معرفي ميکر//www.picpars.com
#include  //فراخواني دستورات استاندارد ورودي خروجي
#include  // فراخواني تابع تاخيري
#include  // فراخواني دستورات ال سي دي
#define xtal 8000000
#asm // شروع دستورات اسمبلي
    .equ __lcd_port=0x18; PORTB //معرفي پورت ال سي دي
#endasm // پايان دستورات اسمبلي
 char i;
 char fanction(unsigned char a){ //ايجاد يک تابع
   a=a*2;
   return a; // برگرداندن مقدار a
 }
 
 void main(void){ // تابع اصلي
    char buffer[10]; // در اين متغيير اطلاعات به صورت رشته قرار ميگيرند
    lcd_init(16); // ال سي دي با 16 ستون

   while(1){
    i=fanction(5); // فراخواني تابع فانکشن
    lcd_clear(); // پاک کردن ال سي دي
    sprintf(buffer,"MGH=%d",i); //آماده کردن اطلاعات به صورت رشته
    lcd_puts (buffer); // ارسال اطلاعات به ال سي دي
    delay_ms(100); // تاخير 100 ميلي ثانيه
   }
 }

 این مثال مانند مثال قبلی است با این تفاوت که تابع ما مقدار برگشتی دارد. تابع را این گونه فراخوانی کردیم (i=fanction(5 یعنی اینکه عدد 5 را وارد تابع کن و در متغیر a ذخیره کن و بعد متغیر a را در 2 ضرب کن و در a قرار بده و بعد نوشتیم return a یعنی هر چه در متغیر a هست را به fanction نسبت بده و در نهایت هم مقدار عدد 10 که در fanction هست در متغیر i قرار می گیرد.

نکات: char fanction یعنی اینکه مقدار برگشتی ما از نوع char می باشد (max). می توان متغیر های ورودی مختلف و زیادی داشته باشیم به این صورت که مثلا اگر 3 متغیر ورودی داشته باشیم باید در پرانتز تابع fanction نام 3 متغیر دلخواه را بنویسیم و بعد در دستور (i=fanction(10,20,30 بنویسیم به ترتیب عدد 10 در متغیر اولی و عدد 20 در متغیر دومی و عدد 30 در متغیر سومی قرار می گیرد.
 char fanction(unsigned char a,unsigned char b,unsigned char c){ //ايجاد يک تابع
 unsigned char d;
   d=a+b+c;
   return d; // برگرداندن مقدار a
 }
 
 void main(void){ // تابع اصلي//www.picpars.com
   while(1){
    i=fanction(10,20,30); // فراخواني تابع فانکشن
   }
 }

 

  منبع: www.picpars.com

  لطفا مقالات، آموزش‌ها و پروژه های خود را به آدرس ایمیل ارتباطی ایمیل نمائید تا آن را با نام خودتان در سایت منتشر کنیم.

به این مطلب امتیاز دهید

برچسب ها:
تاریخ ارسال دوشنبه، 30 فروردين ماه، 1389    نویسندهنویسنده: مدیریت    نظرات 4 نظر    بازدید بازدید [ 37680 ]   پرینتنسخه چاپی
فایل پی دی اف فایل پی دی اف   ارسال به دوستان ارسال به دوستان