طراحی کنترلر، مدارت دلخواه، پروژه ها و تمرینات درس میکروکنترلرها
این پروژه یک دماسنج ساده می باشد که توانایی اندازه گیری دما از منفی 40 تا مثبت 120 درجه سانتی گراد با دقت دو رقم اعشار را دارد.این پروژه یک مدار گیرنده رادیویی 433 یا 315 مگاهرتز می باشد که قابلیت تعریف و ذخیره سازی انواع ریموت کنترل هایی از قبیل (ریموت دزدگیر ماشین، پارکینگ، بالابر و ...) را دارد. می توان رله مربوطه را روی هر کلید دلخواه تعریف نمود.این پروژه یک فاصله سنج می باشد که می توان در مواردی نیز به عنوان عمق سنج از آن استفاده نمود. حداقل فاصله قابل تشخیص 10cm و حداکثر 80cm تا 100cm می باشد.اندازه گیری ولتاژ DC از 0 تا 24 ولت با سه رقم دقت (اعشار) و
اندازه گیری دما از منفی 20 تا مثبت 100 درجه سانتی گراد. دارای نمایشگر السیدیاین مدار یک کنترلر زمانی و دمایی می باشد، که بر اساس برنامه ریزی دلخواه توسط کاربر یک رله خروجی را کنترل می نمایید. با اتصال لامپ فلورسنت مرغوب به رله دستگاه می توانید لامپ را تحت کنترل داشته باشید.
پروژه دماسنج ساده با avr

MCP-29

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

MCP-30

پروژه ریموت کنترل 433-315 مگاهرتز تک کاناله با قابلیت لرنینگ
پروژه فاصله سنج با سنسور مادون قرمز شارپ Sharp

MCP-37

پروژه فاصله سنج با سنسور مادون قرمز شارپ Sharp
پروژه ولت متر DC و دماسنج با avr

MCP-16

پروژه ولت متر DC و دماسنج با avr
پروژه مدار دستگاه فتوتراپی (پایین آورنده زردی خون نوزادان)

MCP-24

پروژه مدار دستگاه فتوتراپی (پایین آورنده زردی خون نوزادان)

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

www.picpars.com ماشین حساب ساده به زبان سی با میکروکنترلر AVR 197

همانطور که قول داده بودم یه ماشین حساب ساده به زبان سی C با میکروکنترلر AVR و کامپایلر CodeVisionAVR V2.04.4a نوشتم نسبت به زبان بیسیک کمی پیچیده و بیشتر شده اما من طوری نوشتم که اگر از خط اول شروع به خوندن کنید تا آخر متوجه خواهید شد که من چه کردم. این ماشین حساب قادر است است تا عملیات های (OP) جمع، ضرب، تقسیم، تفریق، جذر و درصد را انجام دهید همچنین دارای یک حافظه برای ذخیره کردن جواب می باشد و یک کلید برای پاک کردن این حافظه و کلید On/c برای صفر کردن ماشین حساب.

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


من برای برنامه را به سه قسمت تقسیم کردم و هر کدام در داخل یک فایل جداگانه نوشته شده است که این کار باعث می شود شما دچار سردرگمی نشوید و به راحتی به تحلیل برنامه بپردازید. نکته: برنامه به گونه ای نوشته شده که به راحتی می توانید توابع عملیاتی دیگری مانند sin,cos... به آن اضافه کنید. توضیح فایل ها:

 فایل اصلی برنامه calculator-avr-c.c :

این فایل C که توسط خود کامپایلر ایجاده شده و من برنامه های عملیاتی و پیکره بندی میکرو رو توی اون نوشتم. ابتدا توابع کتابخانه ای و سایر تنظیمات توی اون نوشه شده و دو فایل الحاقی دیگر (هدر) نیز به برنامه اصلی اضافه شده تا کامپایلر متوجه شود که ما سایر دستورات مربوط به پروژه را در این دو فایل دیگر نوشته ایم که در ادامه توضیح خواهیم داد.

#include <keypad.h>
#include <inputNum.h>

در ابتدا یک سری متغیر به صورت سراسری تعریف کردم تا بتوانیم از آنها در سایر توابع نیز استفاده کنیم. متغیر a برای دخیره کردن عدد اولی استفاده شده و متغیر b برای ذخیره کردن عدد دومی و از متغیر ans هم برای ذخیره کردن نتیجه نهایی استفاده شده. توابع display1 تا display4 وظیفه آنها نمایش اطلاعات به گونه های مختلفی روی LCD می باشد.

 تابع equal :

اگر بعد از وارد کردن عدد اولی بلافاصله کلید = را بزنید این تابع اجرا شده و متغیر ans برابر a خواهد شد و روی LCD نمایش داده خواهد شد.

تابع may_error :

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

تابع clear_var :

از این تابع برای صفر کردن متغیر های اصلی و همچنین پاک کردن LCD و آماده کردن آن می باشد. نکته کد 0x0f که در دیتاشیت LCD ها هم موجود می باشد باعث چشمک زدن نویسه می شود.

تابع calculat_add :

در این تابع مجدد یک بار دیگر برای دریافت عدد دوم از کاربر تابع input_digit فراخوانی شده و بعد a,b با هم جمع شده و نتیجه آن روی LCD نمایش داده می شود.

تابع calculat_min و calculat_mul و calculat_div :

این سه تابع عملکردی مشابه تابع جمع دارد که فقط در تابع تقسیم برای زمانی که b=0 می شود یه شرط گذاشتیم تا خطای بی نهایت را نمایش بدهد.

تابع calculat_squ :

این تابع از متغییر a در صورتی که منفی نباشد جذر خواهد گرفت و نتیجه نمایش داده خواهد شد. نکته کد 0xE8 برای نمایش علامت جذر می باشد. (دیتاشیت lcd)

تابع inc_memory و dec_memory:

از این تابع برای ذخیره محاسبه در در متغییر M استفاده شده که متغیر M با مقدار جدید جمع خواهد شد. و تابع dec همین کار را نجام می دهید با این تفاوت که به جای جمع تفریق خواهد شد.

تابع calculat_percent :

از این تابع برای گرفتن درصد استفاده شده به این صورت که با نوشتن 2%50 میکرو 2 درصد عدد 50 را گرفته و روی lcd نمایش می دهد.

تابع memory_clear:

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

تابع main :

تابع اصلی برنامه که در آن lcd به صورت ستون 20 تایی پیکره بندی شده و تابع صفر کردن فراخوانی می شود و در نهایت وارد حلقه بی نهایت شده که در این حلقه ابتدا عدد اولی a همراه با نوع عملیات op از کیبورد دریافت شده و با استفاده از دستور switch نوع عمل تشخیص داده می شود و یکی از توابع بالا فراخوانی می شود. برای محاسبه بعدی در انتها op=0 خواهد شد.

فایل inputNum.h :

وظیفه دستوارت نوشته شده در این فایل الحاقی این است که اعداد را به صورت تک رقمی از کیبورد دریافت نماید و درون آرایه ذخیره کرده و در آخر این ارقام را به صورت یک عدد صحیح integer تبدیل کرده و درون متغییر n قرار دهد و در نهایت این متغییر را برگشت دهد. در این فایل الحاقی تابع input_digit از نوع برگشتی تعریف شده که دستورات آن را در ادامه توضیح می دهیم:

char op,last_op,dis,buffer[40];
float ans;


در این قسمت متغییر های سراسری تعریف شده در فایل C که در این تابع مورد نیاز می باشند دوباره نوشته می شوند. (دلیل این کار این است که تابع در یک فایل هدر می باشد) 

درون تابع یک سری متغییر محلی تعریف تعریف کرده ایم که در زیر وظیفه هر کدام را شرح خواهیم داد:

  • key: مقدار کلید فشار داده شده درون این متغییر قرار میگیرد.
  • k: مقدرا اسکی درون key با and شدن در 0f تبدیل به عدد صحیح شده و در k قرار می گیرد.
  • count و count2: برای شمارش تعداد ارقام وارد شده استفاده شده.
  • i و t: متغییر های موقت هستند برای شمارش و شرط ...
  • indigt: یک آرایه 10 عضوی می باشد که ارقام وارد شده در آن قرار می گیرند.
  • neg: برای اینکه بفهمیم کلید - سمت چپ فشار داده شده یعنی اینکه عدد ورودی منفی می باشد و در مرحله پایانی متغییر n را منفی کنیم.picpars
  • ashar: از این متغییر هم برای اینکه بفهمیم کاربر می خواهد عدد اعشاری وارد کند استفاده شده که در ادامه توضیح می دهیم.
  • n,n2: هم برای ذخیره کردن عدد صحیح نهایی استفاده می شود. (n2 موقت)
  • dis: با یک شدن این متغییر ما مجوز پاک کردن lcd را داده ایم تا بعد از فشار دادن اولین کلید lcd پاک شده و حاصل آخرین محاسبه در سطر دوم نشان داده شود.

از دستور if(op) lcd_putchar(op); برای گرفتن عدد دوم استفاده شده که در صورتی op داشته باشیم آن op روی lcd نمایش داده می شود. در ادامه lable داریم که از این برچسب صرفا برای گرفتن قسمت اعشاری عدد مورد نظر استفاده شده. متغییرهای مورد نیاز برای گرفتن عدد صفر می شود و وارد حلقه بی نهایت شرطی می شویم.

شرط این حلقه مخالت با op است یعنی تا زمانی که ما op=0 داریم در حلقه ماندگاریم و به محضی که یکی از کلید های عملیاتی فشار داده شوند op دراری یک مقدار خواهد شد و شرط این حلقه از بین خواهد رفت و منجر به خروج از آن خواهد شد. ابتدا تابع keypad فراخوانی شده و مقدار کلید فشار داده شده مورد سنجش قرار خواهد گرفت اگر key اعداد 0 تا 9 بود با توجه به مقدار متغییر count رقم مورد نظر درون آریه قرار می گیرد و برای مرحله بعدی یک واحد به count اضافه می شود و مقدار count در count2 برای مراحل پایانی کپی می شود. در صورتی که اعداد 0 تا 9 نباشد مطمئنا یکی از کلید های عملیاتی فشار داده شده است پس این عمل در متغییر مربوطه op قرار می گیرد.

در صورتی که کلید +-  فشرده شده باشد neg=1 می کنیم و op را صفر می کنیم تا همچنان شرط حلقه برقرار باشد و عدد را دریافت کنیم و همچنین علامت - نمایش داده شود. برای کلید اعشاری هم همین وضعیت را داریم.

در پایان بعد از خروج از حلقه از متغییر count در صورتی که صفر نباشد یک واحد کم می شود و یک کپی از آن را هم در t قرار می دهیم. حالا با استفاده از یک حلقه شمارشی for آرایه ارقام را به هم چسبانده و درون متغییر n قرار می دهیم که در آن i از صفر شروع شده و تا t ادامه می یابد با استفاده از قانون ضرب ارقام و جمع آنها با هم ارقام تکی تکی را به یک عدد صحیح تبدیل می کنیم.

در صورتی که ashar=1 شده باشد شرط if برقرار می شود و دوباره عدد 2 را به ashar نسبت می دهیم و به طور موقت مقدار صحیح را در n2 ذخیره کرده و به آدرس lable پرش می کند تا این بار مقدار ارقام اعداد اعشاری را دریافت کند و در آخر چون ما قبلا ashar=2 کردیم این بار شرط if مربوطه برقرا شده و با توجه به آخرین مقدار متغییر i ما n را بر ضریبی که توسط i تعیین می شود تقسیم می کنم و تا قسمت اعشاری بدست آید و حالا با n2 قبلا مقدار صحیح در آن بود جمع می کنیم و تا عدد اعشاری ورودی ما ایجاد شود و در نهایت در n کپی می کنیم تا برگشت داده شود.

 در صورتی که مقدار count2=0 باشد یعنی اینکه تنها یکی از کلید های عملیاتی فشرده شده پس جواب آخرین محاسبه که در ans می باشد به عنوان عدد اولی در a قرار می گیرد و رشته Ans نیز روی نمایشگر نشان داده می شود.

 فایل Keypad.h:

در این فایل دستوراتی نوشته شده که وظیفه آنها اسکن پورت و خواندن کلید فشرده شده می باشد که توضیحات آن را در صفحه کلید 4×4 داده ایم در زیر در قسمت مطالب مرتبط آورده شده که می تواند با مراجعه به این مطلب نحوی کار آن را بخوانید. دراینجا تنها تفاوتی که داریم این است که کیبورد ما از 16 کلید به 24 کلید افزایش داده شده و با اعمال تغییرات کوچک در آن که بیشتر اعداد 4 به 6 جایگزین شده است.

این پروژه همراه با توضیحات آن تنها در وب سایت www.picpars.com به صورت متن باز ارئه شده و کپی برداری از آن تنها با ذکر منبع امکان پذیر می باشد.

با تشکر فراوان سید محسن قاسمیان

ورژن نرم افزار ها: CodeVisionAVR V2.04.4a  و Proteus 7.7 sp2 Professional

  منبع: www.picpars.com

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




فایل های ضمیمه ( ورود - عضويت )

فایل شماره 111 | نسخه 1 | حجم 80 کیلوبایت | دانلود 9488 بار

منبع www.picpars.com  نویسنده: سید محسن قاسمیان

منبع www.picpars.com  دانلود ماشین حساب ساده به زبان سی با میکروکنترلر AVR

منبع www.picpars.com  پسورد: www.picpars.com

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

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