طراحی کنترلر، مدارت دلخواه، پروژه ها و تمرینات درس میکروکنترلرها
ماشین حساب مهندسی ساده با قابلیت دریافت اعداد اعشاری و محاسبه توابع مثلثاتی به همراه سایر توابع توسط یک صفحه کلید 4*4این پروژه یک مدار گیرنده رادیویی 433 یا 315 مگاهرتز می باشد که قابلیت تعریف و ذخیره سازی انواع ریموت کنترل هایی از قبیل (ریموت دزدگیر ماشین، پارکینگ، بالابر و ...) را دارد. با نگه داشتن یک میکروسوئیچ و فشار دادن یکی از کلید های ریموت به مدت 1 ثانیه کد شناسایی ریموت مورد نظر آشکار و سپس در حافظه ذخیره می شود و می توان با چهار کلید ریموت (کلیدهای A,B,C,D) چهار رله را روشن و خاموش کرد.این پروژه یک دماسنج ساده می باشد که توانایی اندازه گیری دما از منفی 40 تا مثبت 120 درجه سانتی گراد با دقت دو رقم اعشار را دارد.با استفاده از میکروکنترلر ATMEGA8 و کیبورد 3×4 می توان حروف و اعداد را تایپ کرد و درون یک متغییر ذخیره نمود و محتوای این متغییر بر روی نمایشگر LCD نمایش داده می شود. در صورتی که فضای LCD پر شود کاراکترها به سمت چپ شیفت داده می شوند. تمامی حروف و اعداد کوچک و بزرگ انگلیسی قابل تایپ می باشند.توسط منوی آلارم ساعت زنگ هشدار قابل تنظیم می باشد. و همچنین توسط منوی تایم ساعت و تاریخ دستگاه قابل تنظیم می باشد. قابلیت نمایش ساعت و تاریخ شمسی جاری به همراه روز هفته و همچنین نمایش ساعت آلارم در نمایشگر.
ماشین حساب مهندسی ساده

MCP-28

ماشین حساب مهندسی ساده
پروژه ریموت کنترل 433-315 مگاهرتز 4 کاناله با قابلیت لرنینگ

MCP-27

پروژه ریموت کنترل 433-315 مگاهرتز 4 کاناله با قابلیت لرنینگ
پروژه دماسنج ساده با avr

MCP-29

پروژه دماسنج ساده با avr
پروژه تایپ حروف و اعداد با کیبورد 3.4 به زبان سی با avr

MCP-3

پروژه تایپ حروف و اعداد با کیبورد 3.4 به زبان سی با avr
ساعت دیجیتال دارای تقویم شمسی و زنگ هشدار

MCP-42

ساعت دیجیتال دارای تقویم شمسی و زنگ هشدار

توابع در زبان سی 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 نظر    بازدید بازدید [ 36923 ]   پرینتنسخه چاپی
فایل پی دی اف فایل پی دی اف   ارسال به دوستان ارسال به دوستان