در این پست از سایت اِمیک, ما یک سون سگمنت تکی را با استفاده از میکروکنترلر AVR راه اندازی خواهیم کرد. قطعات اصلی این پروژه علاوه بر میکروکنترلر ATmega16 و سون سگمنت, شامل دو کلید هم می باشد که به صورت افزایشی و کاهشی عمل می کنند. عملکرد پروژه به این صورت است که در ابتدا با اتصال منبع تغذیه, روی سون سگمنت عدد 0 نمایش داده می شود و با فشار دادن کلید افزایشی (++) عدد روی سون سگمنت یکی اضافه می شود و با فشار دادن کلید کاهشی (–) عدد یکی کاهش می یابد.
قبلا راه اندازی سون سگمنت با میکروکنترلر AVR را اموزش داده بودیم که در اون پست به طور کامل در مورد سون سگمنت ها و پایه های انها و همچنین نحوه راه اندازی انها توضیح داده شد, که توصیه می کنم مطالعه کنید. در ادامه شماتیک این پروژه را مشاهده می کنید.
پروژه AVR شمارنده سون سگمنت با کلید افزایشی و کاهشی :
همانطور که در بالا گفته شد این پروژه دارای دو کلید افزایشی و کاهشی می باشد که با فشار داده هر کدام از انها عدد روی سون سگمنت افزایش یا کاهش می یابد. از انجایی که ما از سون سگمنت تکی استفاده می کنیم, فقط امکان نمایش عدد 0 تا 9 را داریم بنابراین در این پروژه زمانی که عدد در حال افزایش از 9 بیشتر شد, به طور خودکار عدد دوباره 0 می شود و زمانی هم که در حال کاهش عدد هستیم عدد از 0 کمتر نمی شود.
نکات :
- دو مقاومت R1 و R2 برای پول اپ (Pull-up) کردن کلید ها استفاده شده اند. از انجایی که پین های 39 و 40 میکرو به کلیدها متصل هستند و به صورت ورودی تنظیم شده اند لازم است انها را پول اپ کنیم.
- توجه کنید که در این پروژه ما از سون سگمنت کاتد مشترک استفاده کرده ایم. در صورتی که با پین های سون سگمنت اشنا نیستید یا می خواهید از سون سگمنت اند مشترک استفاده کنید, حتما پست معرفی شده در ابتدای مطلب را مطالعه کنید.
- در پروتئوس, سون سگمنت به صورت بالا می باشد که پایه های ان از سمت چپ به ترتیب a تا g می باشند و پایه اخر که بجایی وصل نشده همان DP می باشد که در این پروژه از ان استفاده نکرده ایم.
- پایه های تغذیه میکروکنترلر (پایه های 10 و 11) که در تصویر بالا وجود ندارند را فراموش نکنید به تغذیه 5 ولت متصل کنید.
برنامه :
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 40 |
/* WWW.EMIC.IR */ #include <mega16.h> // معرفي کتابخانه مگا 16 // #include <delay.h> // delay معرفي کتابخانه // #define key1 PINA.0 //A با پين 0 از پورت key1 برابر قرار دادن// #define key2 PINA.1 //A با پين 1 از پورت key2 برابر قرار دادن// void main(void) { int a=0 ; // با مقدار اوليه صفر int معرفي يک متغير از نوع // unsigned char seg[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //معرفي يک ارايه داراي 10 عضو که شامل معادل هگز اعداد 0 تا 9 براي سون سگمنت مي باشد// DDRC=(1<<DDC7) | (1<<DDC6) | (1<<DDC5) | (1<<DDC4) | (1<<DDC3) | (1<<DDC2) | (1<<DDC1) | (1<<DDC0); //خروجي شوند C تمام پين هاي پورت // PORTC=(0<<PORTC7) | (0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0); //مقاومت بالاکش براي تمام پين ها غيرفعال باشد// DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0); //را ورودي مي کنيم A پورت// PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0); //مقاومت بالاکش براي تمام پين ها غيرفعال باشد// while (1) { PORTC=seg[a]; //را روي سون سگمنت نمايش مي دهد a دستور روبرو در زماني که هيچ کليدي زده نشده باشد مقدار متغير// if (key1 == 0) //مي شود if در صورتي که کليد 1 فشار داده شود وارد شرط// { a = a+1; //يکي اضافه مي شود a به متغير// if (a>9) { a=0; } //از 9 بيشتر شد ان را 0 مي کند a در صورتي که// PORTC=seg[a]; //روي سون سگمنت a نمايش مقدار متغير// delay_ms(1000); //تاخير به مدت 1 ثاتيه// } if (key2 == 0) //مي شود if در صورتي که کليد 2 فشار داده شود وارد شرط// { a = a-1; //يکي کم مي کند a از متغير// if (a<0) { a=0; } //از 0 کمتر شود a دستور روبرو نمي گذارد متغير// PORTC=seg[a]; //روي سون سگمنت a نمايش مقدار متغير// delay_ms(1000); //تاخير به مدت 1 ثاتيه// } } } |
توضیحات کامل برنامه نوشته شده, اگر سوالی داشتید می تونید در قسمت نظرات مطرح کنید.
کلیپ شبیه سازی در پروتئوس :
پسورد فایل زیپ : www.emic.ir
نظر یادتون نره …
سلام وقت بخیر امکانش هست وقتی سوئیچ افزاینده را فشار میدهیم عدد به صورت خودکار از صفر تا نه برود یعنی آنرا پشت سر هم فشار ندهیم برای سوئیچ کاهنده هم همینطور ممنون
سلام, بله باید برنامه تغییر داده شود
خوب چگونه میشه برنامه؟ میشه آموزشش رو بزارید
ببخشبد همین دو رقمی چطوری میشه بجای یک رقم دوتا باشه
سلام
چطور میشه با استفاده از سون سگمنت(4 رقمی برای شمارش دور موتور و همینطور دو رقمه برای نمایش دما) یه کانتر دور موتور dc برای فن کامپیوتر بدون سنسور مادون قرمز و همینطور نمایش دمای محیط داخل کیس رو داشت با سنسور دما
با تشکر
سلام لطفا برنامه بسکامش رو هم بارگذاری کنید .
با سلام و عرض ادب من هم مثل آقای علیرضا می خوام دو تا سون سگمنت روی دو برد جداگانه داشته باشم که توسط یک ریموت کنترل بتونم سون سگمنت ها رو افزایش و یا کاهش بدم لطفا راهنماییم کنید از کجا شروع کنم واقعتش من نرم افزار خوندم و کمی هم نسبت به علاقه خودم فقط الترونیک رو مطالعه کردم و لی واقعیتش رو بخواید می خوام هر جوری شده با کمک شما این برد رو بسازم لطفا کمکم کنید
سلام استاد
میخوام با استفاده از ریموت کنترل اعداد روی سون سگمنت افزایش یا کاهش پیدا کنه
به عبارتی میخوام فرستنده و گیرنده مادون قرمز بهش وصل بشه
ممنون میشم راهنماییم کنید
عالی بود ممنون.درست همون چیزی بود که استاد میخواست😂
سلام اگه از یه دونه کلید استفاده کنیم یعنی اگه کلید بسته باشه صعودی اگه باز باشه نزولی (از صفر تا نه)
سلام وقت بخیر امکان داره از اتمگا 8 به جای 16 استفاده کرد ؟؟
سلام, باید در برنامه و شماتیک پین ها را مطابق با میکروکنترلر مورد نظرتون تنظیم کنید. مثلا Atmega8 پورت A ندارد که شما باید از یک پورت دیگر ان بجای پورت A استفاده کنید
با عرض سلام و خسته نباشید ، بنده مبتدی هستم ولی علاقمند به الکترونیک و برنامه نویسی ممکنه بیشتر توضیح بدین و اینکه اگه بخواهیم به این مدار یک عدد سون سگمنت دیگه اضافه کنیم چه باید کرد و اینکه چطوری میشه این مدار رو تو یه مدار دیگه گذاشت تا با افزایش و گاهش مثلا سرعت دور موتور dc عددی رو هم بشه دید !!!
سلام جناب مهندس خسته نباشید چرا در دستور #include define key 2 پین کلید دو را مثل کلید اول برابر صفر قرار ندادید؟
سلام, توسط define های اول برنامه ما دو عبارت key1 و key2 را برابر دو پین PINA.0 و PINA.1 قرار داده ایم
سلام
مطلب خیلی مفید بود.
یه خواهشی دارم…
اگر میشه همین کد رو برای دوتا سون سگمنت هم بزارین.
با دو کلید شمارش از 0 تا 99.
واقعا لازم دارم کارم گیره. هرچی تو نت گشتم پیدا نکردم.
سلام
وقت شما بخیر
برای فیوز بیت ها کدام باید فعال باشد ؟
سلام, پورت C را خروجی کنید و پورت A را ورودی و فرکانس را هم 1 مگ تنظیم کنید
سلام مهندس
میخاستم ببینم در پروژه هایی که اپلود کردین پروزه ای به این منظور هست که:
یک شمارنده برای شمارش محصولات تولید شده داشته باشیم که مقدار محصولات تولید شده و بسته بندی ان را روی ledنمایش دهد و با یک کیبورد بتوان مقدار محصول در هر بسته رو تغییر بدیم و یک سونسگمنت هم برای نمایش عدد کیبود داشته باشیم
سلام, خیر پروژه های خاص را باید بدید براتون طراحی کنند
با سلام . اگر بخوایم یه کلید برای ریست و رصفر کردن نمایشگر نشون داد چطور میشه؟
سلام, یک کلید دیگه اضافه کنید و در برنامه نیز یک شرط if دیگر اضافه کنید و با فشار دادن کلید شرط if برقرار شده و درون if متغیر a را صفر کنید و روی سون سگمنت نمایش دهید. همچنین می توانید مدار ریست میکروکنترلر را ببندید, با ریست کردن میکرو سون سگمنت 0 را نمایش می دهد
سلام
در این حالت اگر کلید ++ وصل بماند عدد دائم افزایش می یابد.اگر بخواهیم با هر بار فشرده شدن(بدون در نظر گرفتن مقدار زمان وصل بودن) یکی به a اضافه شود باید چگونه بنویسیم؟
سلام, یک متغیر جدید از نوع int دارای مقدار اولیه 0 تعریف کنید و درون شرط if با key اند (&) کنید. با هر بار اجرای هر کدام از if ها این متغیر 1 شود و ان if دیگر اجرا نشود و در انتها با برداشتن دست از روی کلید ان متغیر دوباره 0 شود. برای اینکه بهتر متوجه بشید به برنامه زیر دقت کنید(متغیر جدیدی که تعریف کردیم x می باشد)
int x=0;
if((key==0)&(x==0))
{
دستورات مورد نظر
x=1;
}
if(key1 == 1) {x=0;}
با سپاس از شما مهندس عزیز
عرض سلام و درود
ممنون از آموزش عالیتون چنتا سوال داشتن
۱راهی هست بجای اینکه رقم تک تک افزایش پیدا کنه سه تا یا چهارتا افزایش پیدا کنه
۲ اگر بخواهیم وقتی به عدد نه رسیدیم عدد به صورت خودکار روی صفر نیاد باید چکار کنیم
۳ اگر بخواهیم میکرو در حالت عدم استفاده کلا خاموش بشه مثلا بعد از چند ثانیه راهش چیه
سلام اگه بخوایم از دوتا سون سگمنت استفاده کنیم که اعداد ۰تا ۹۹ رو بتونیم نمایش بدیم باید چجوری سون سگمنت دوم رو به پروژه وصل کنیم و برنامه چه تغییراتی میکنه؟
سلام, برنامه باید به کلی تغییر کند در اینده حتما پروژه مورد نظر شما را قرار خواهم داد