Logo 150Logo 150Logo 150Logo 150
  • صفحه اصلی
  • میکروکنترلرها
    • میکروکنترلرهای AVR
      • آموزش AVR در CodeVision
      • آموزش Atmel Studio
      • AVR بیسیک
    • میکروکنترلرهای PIC
    • میکروکنترلرهای ARM
      • خانواده STM32
    • میکروکنترلر 8051
    • برنامه نویسی گرافیکی
      • LabView
  • مقالات
    • قطعات و نکات فنی
    • خواندنی ها
    • کتاب-جزوه-مجله
  • نرم افزار
    • کتابخانه آلتیوم
      • Microchip
  • پروژه های آماده
  • خرید پروژه
  • حل تمرینات
  • تماس با ما
  • کانال ها
    • کانال تلگرام
    • اینستاگرام
    • آپارات
    • یوتیوب

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

  • صفحه نخست
  • مطالب سایت میکروکنترلرها میکروکنترلرهای AVR آموزش AVR در CodeVision
  • ماشین حساب ساده به زبان سی با میکروکنترلر AVR
آموزش نرم افزار قدرتمند LabView به زبان ساده (مقدمه)
19 بهمن, 1389
دانلود نرم افزار vrt dvd 2009
دانلود نرم افزار vrt dvd 2009 (دیتاشیت 350 هزار قطعه)
19 بهمن, 1389
منتشر شده توسط مدیر در 19 بهمن, 1389
موضوعات
  • آموزش AVR در CodeVision
برچسب ها
  • avr
  • C
  • calculator
  • Download
  • free
  • micro
  • microcontroler
  • picpars
  • picpars.com
  • Proteus
  • schematic
  • source
  • اعشاری
  • برنامه
  • برنامه-نویسی-میکروکنترلرها
  • پروژه
  • تابع دریافت عددتابع گرفتن عدد در سی
  • تفریق
  • تقسیم
  • جذر
  • جمع
  • حافظه
  • حساب
  • دانلود
  • درصد
  • رایگان
  • زبان
  • ساده
  • سی
  • ضرب
  • فایل
  • ماشین
  • ماشین حساب
  • ماشین حساب با AVR
  • ماشین حساب به زبان سی
  • میکرو
  • میکروکنترلر
  • میکروکنترولر
ماشین حساب ساده به زبان سی با میکروکنترلر AVR

بازدیدها: 3661

همانطور که قول داده بودم یه ماشین حساب ساده به زبان سی C با میکروکنترلر AVR و کامپایلر CodeVisionAVR V2.04.4a نوشتم نسبت به زبان بیسیک کمی پیچیده و بیشتر شده اما من طوری نوشتم که اگر از خط اول شروع به خوندن کنید تا آخر متوجه خواهید شد که من چه کردم.

این ماشین حساب قادر است است تا عملیات های (OP) جمع، ضرب، تقسیم، تفریق، جذر و درصد را انجام دهید همچنین دارای یک حافظه برای ذخیره کردن جواب می باشد و یک کلید برای پاک کردن این حافظه و کلید On/c برای صفر کردن ماشین حساب.

من برای برنامه را به سه قسمت تقسیم کردم و هر کدام در داخل یک فایل جداگانه نوشته شده است که این کار باعث می شود شما دچار سردرگمی نشوید و به راحتی به تحلیل برنامه بپردازید. نکته: برنامه به گونه ای نوشته شده که به راحتی می توانید توابع عملیاتی دیگری مانند 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

Icon

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

1 file(s) 80.29 KB
Download
Share
83
مدیر
مدیر

مطالب مرتبط

22 مرداد, 1395

آموزش گام به گام برنامه نویسی AVR به زبان C


اطلاعات بیشتر
پروژه آموزشی تابلون روان 8.8 به زبان سی همراه با سورس C
29 تیر, 1391

پروژه آموزشی تابلون روان 8.8 به زبان سی همراه با سورس C


اطلاعات بیشتر
کار با LED ماتریسی 8.8 (LED Displays 8.8 LED Matrix)
14 تیر, 1391

کار با LED ماتریسی 8.8 (LED Displays 8.8 LED Matrix)


اطلاعات بیشتر

2 Comments

  1. فرزانه گفت:
    17 فروردین, 1400 در 19:00

    سلام وقت بخیر رمز فایل چیه؟

    پاسخ
    • مدیر گفت:
      28 فروردین, 1400 در 13:16

      www.picpars.com

      پاسخ

دیدگاهتان را بنویسید لغو پاسخ

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

تمامی حقوق مادی و معنوی برای PicPars.com محفوظ است. شماره همراه 09335751032 جهت ارتباط با خرید پروژها در تلگرام و واتساپ