You are on page 1of 66

‫‪ 53‬رپوژه كارربدي با‬

‫ل‬ ‫ت‬ ‫ن‬


‫رو ر راهي‬‫ك‬ ‫ك‬ ‫ي‬‫م‬

‫‪AVR‬‬

‫مولف‪ :‬دکتر حامد سقايي‬

‫أ‬
‫ب‬
‫نهال را باران باید‬
‫تا بشوید غبار نشسته بر برگهایش‬
‫و سیرابش کند از آب حیات‬
‫و آفتاب باید‬
‫تا بتاباند‬
‫نیرو را‬
‫و محکم کند‬
‫شاخههای تازه روییده را‬
‫بر نام مادر‬
‫بوسهای باید زد‬
‫دستهایی که‬
‫میشویند غبار خستگی روزگار را‬
‫و سیراب میکنند روح تشنه را‬
‫بر نام پدر‬
‫بوسهای باید زد‬
‫دست هایی را‬
‫که میتابانند‬
‫نیرو را‬
‫و محکم میکنند‬
‫استواری پایههای زیستن را‬

‫ت‬
‫مقدمه‪:‬‬

‫امروزه استفاده از تراشههاي مختلف ميکروکنترلر در ساخت و کنترل پروژههاي‬


‫مختلف آزمايشگاهي و صنعتي به عنوان ابزاري قدرتمند در خدمت طراحان قرار‬
‫گرفته است و با ظهور اين تراشههاي منطقي برنامهپذير‪ ،‬مدارات ديجيتال پيچيده‪،‬‬
‫جاي خود را به اين تراشهها دادهاند‪.‬‬
‫اگرچه قابليتها و سرعت اجراي برنامههاي نوشته شده به زبان اسمبلي غير‬
‫قابل انکار است ولي استفاده از زبان ‪ C‬در برنامهنويسي ميکروکنترلرها به دليل‬
‫نزديکي زياد به سختافزار (سطح مياني بودن زبان)‪ ،‬ساختار يافتگي و امکان استفاده‬
‫از توابع نوشته شده آن در ساير پروژهها مورد توجه بسياري از کاربران قرار گرفته‬
‫است‪ .‬زبان ديگري که جذابيت زيادي را در برنامهنويسي ميکروکنترلرهاي ‪AVR‬‬
‫ايجاد کرده است‪ Basic ،‬ميباشد‪ .‬اين زبان سادهترين زبان برنامهنويسي‬
‫ميکروکنترلرهاي ‪ AVR‬است‪.‬‬
‫در اين کتاب سعي شده‪ ،‬قابليتهاي ميکروکنترلرهاي سري ‪ Mega‬در قالب‬
‫مثالهاي متنوع و کاربردي تشريح شوند‪ .‬همچنين فرض شده است که خوانندگان‬
‫اين کتاب از آشنايي مقدماتي با ميکروکنترلرهاي ‪ AVR‬برخوردار هستند‪ .‬مثالهاي‬
‫کاربردي مطرح شده در اين کتاب غالباً به گونهاي است که در کمتر کتابي يافت‬
‫ميشوند و کاربردهاي اين ميکروکنترلرها را در مباحث مختلف الکترونيك‪،‬‬
‫مخابرات‪ ،‬الکترونيك قدرت‪ ،‬رباتيك و نظاير آن نشان ميدهند‪.‬‬
‫در هر فصل سعي شده است ضمن معرفي رجيسترهاي مربوط به هر يك از‬
‫قسمتهاي ميکروکنترلر‪ ،‬تنظيمات مورد نياز آن در محيط ‪ Wizard‬مربوط به‬
‫نرمافزار ‪ CodeVision‬توضيح داده شوند و سپس مثالهاي متنوعي از کاربردهاي‬
‫آن بخش به زبان ‪ C‬ذکر گردند و نکات مهم آن برنامهها در متن کتاب تشريح شوند‪.‬‬
‫مثال هاي مطرح شده در آن براي انواع ميکروکنترلرهاي سري ‪ Mega‬صادق‬
‫هستند ولي به دليل تنوع محصوالت‪ ،‬قابليتهاي موجود در تراشه ‪ ATmega16‬به‬
‫عنوان مبناي اصلي مطالب در اين کتاب در نظر گرفته شده است‪ .‬هر چند که در‬
‫برخي از مثالها از تراشه هاي ديگري استفاده شده است‪ .‬به دليل تنوع زياد کامپايلرها‬
‫در اين کتاب‪ ،‬بيشترين تاکيد بر کامپايلرهاي زبان ‪ C‬و مخصوصاً ‪CodeVision‬‬
‫است ‪ .‬هر چند در فصل آخر کتاب‪ ،‬کامپايلر زبان ‪ Basic‬يعني ‪ Bascom‬و کامپايلر‬
‫قدرتمند ديگر زبان ‪ C‬يعني ‪ WinAVR‬آموزش داده و پروژههاي کاربردي مرتبط با‬
‫آنها ارائه ميشوند‪.‬‬

‫ث‬
‫به لطف ايزد منان‪ ،‬اين مجموعه که حاصل تجربيات و مطالعات چندين ساله‬
‫مولف بر روي سيستمهاي ديجيتال برنامهپذير است‪ ،‬تکميل شده است‪ .‬الزم به ذکر‬
‫است که‪ :‬تماني برنامههاي نوشته شده در کتاب‪ ،‬در ‪ CD‬همراه کتاب نيز قرار داده‬
‫شده و به طور کامل در آزمايشگاه ريزپردازنده آزمايش و بررسي شدهاند‪ .‬در ‪CD‬‬
‫همراه کتاب‪ ،‬عالوه بر برنامههاي کتاب‪ ،‬تمامي فايلهاي مرتبط و فايلهاي اجرايي‬
‫توسط نرمافزار شبيهساز ‪ Proteus‬نيز وجود دارند تا خواننده کتاب‪ ،‬تنها به تحليل‪،‬‬
‫بررسي و اجراي آنها بپردازد‪ .‬همچنين متناسب با نياز خوانندگان کتاب‪ :‬آموزش‬
‫نرمافزارهاي مرتبط با کتاب نيز در ‪ CD‬قرار داده شده تا خواننده در ميان دنياي‬
‫تراشههاي برنامهپذير احساس تنهايي نکند‪ .‬شايان ذکر است که پروژههاي اين کتاب‬
‫به سادگي قابل ترکيب و استفاده در پروژههاي بزرگتر ميباشند‪ .‬اميد است به لطف‬
‫خداوند يکتا‪ ،‬اين کتاب‪ ،‬راه را براي يادگيري‪ ،‬طراحي و پيادهسازي رهيافتهاي‬
‫نوين علمي و عملي براي شما هموار سازد‪.‬‬
‫در پايان بر خود الزم ميدانم‪ ،‬از اساتيد بزرگواري که در دانشگاه صنعتي اميرکبير‬
‫(پليتکنيك تهران)‪ ،‬از آنان بسيار آموختم‪ ،‬تقدير به عمل آورم و اين کتاب را نتيجه‬
‫زحمات بسيار آن عزيزان بدانيم‪.‬‬
‫با توجه به اين مهم که اين کتابي عاري از اشکال نيست‪ ،‬در صورتي که اشکال يا‬
‫اشکاالتي را در کتاب مشاهده فرموديد‪ ،‬ما را بخشيده و نظرات اصالحي خود را به‬
‫آدرس الکترونيکي ‪ h.saghaei@gmail.com‬يا از طريق وب سايت زير براي ما‬
‫ارسال نمائيد تا در چاپهاي بعدي اصالح شوند‪ .‬پيشاپيش از شما سپاسگزاريم‪.‬‬

‫ج‬
‫فهرست‬
‫مقدمه ‪ ..................................................................................................‬ث‬
‫فصل اول‪ :‬ميکروکنترلر و واسطهاي جانبي ‪1 .......................................................‬‬
‫‪ -1-1‬معرفي ميکروکنترلرهاي ‪1 .............................................................. AVR‬‬
‫‪ -1-1-1‬مقدمه ‪1 ........................................................................................‬‬
‫‪ -2-1-1‬طراحي براي زبانهاي ‪ BASIC‬و ‪2 .................................................... C‬‬
‫‪ -3-1-1‬خصوصيات ‪ ATMEGA16‬و ‪3 ....................................... ATMEGA16L‬‬
‫‪ -2-1‬برنامهريزي ميکروکنترلرهاي ‪5 ........................................................ AVR‬‬
‫‪ -3-1‬آشنايي با روش نصب و کار با نرمافزار ‪6 ........................ CODEVISIONAVR‬‬
‫‪ -1-3-1‬مقدمه ‪6 ........................................................................................‬‬
‫‪ -2-3-1‬آشنايي با محيط ‪7 ................................................ CODEVISIONAVR‬‬
‫‪ -3-3-1‬روش نصب نرمافزار‪8 ........................................... CODEVISIONAVR‬‬
‫‪ -4-3-1‬ايجاد يك پروژه جديد ‪10...................................................................‬‬
‫‪ -4-1‬آشنايي با زبان ‪14............................................................................. C‬‬
‫‪ -1-4-1‬ساختار برنامهنويسي ‪14......................................................................‬‬
‫‪ -2-4-1‬متغيرها ‪16.....................................................................................‬‬
‫‪ -3-4-1‬دستور ‪20.................................................................................. IF‬‬
‫‪ -4-4-1‬ساختار دستور ‪22............................................................... SWITCH‬‬
‫‪ -5-4-1‬دستورات حلقه ‪23............................................................................‬‬
‫‪ -6-4-1‬اشارهگرها ‪26..................................................................................‬‬
‫‪ -7-4-1‬آرايهها ‪27......................................................................................‬‬
‫‪ -8-4-1‬رشته ‪28........................................................................................‬‬
‫‪ -9-4-1‬توابع ‪30........................................................................................‬‬
‫‪ -10-4-1‬متغيرهاي سراسري و محلي ‪31...........................................................‬‬
‫فصل دوم‪ :‬آشنايي با پورتها ‪33.......................................................................‬‬

‫ح‬
‫پروژه اول‪ :‬چراغ چشمكزن ‪33....................................................................‬‬
‫پروژه دوم‪ :‬کنترل چراغ راهنمايي با نمايش مدت انتظار‪38......................................‬‬
‫پروژه سوم‪ :‬نمايش کاراکترها بر روي نمايشگرهاي ماتريسي ‪44..............................‬‬
‫پروژه چهارم‪ :‬کنترل موتورهاي پلهاي ‪53.........................................................‬‬
‫فصل سوم‪ :‬نمايشگرهاي کاراکتري و گرافيکي ‪57.................................................‬‬
‫‪ LCD -1-3‬هاي کاراکتري ‪57.........................................................................‬‬
‫‪ -1-1-3‬برنامهريزي ‪ LCD‬توسط ‪60......................................... CODEWIZARD‬‬
‫‪ -2-1-3‬دستورات مربوط به کار با ‪60.......................................................LCD‬‬
‫پروژه پنجم‪ :‬نمايش گردشي يك عبارت بر روي ‪61...................................... LCD‬‬
‫پروژه ششم‪ :‬نمايش حرف به حرف روي ‪63.............................................. LCD‬‬
‫‪ -2-1-3‬کاراکترهاي تعريف شده‪65................................................................ :‬‬
‫‪ -3-1-3‬نمايش کاراکتر جديد بر روي ‪ LCD‬کاراکتري‪66....................................... :‬‬
‫پروژه هفتم‪ :‬فارسي نويسي بر روي ‪ LCD‬کاراکتري ‪67..........................................‬‬
‫پروژه هشتم‪ :‬منو نويسي در ‪69.............................................................. LCD‬‬
‫‪ -2-3‬آشنايي و برنامهنويسي با ‪ LCD‬هاي گرافيکي‪73............................................‬‬
‫‪ -1-2-3‬معرفي پايههاي ‪74................................................LCD – 128 GO64A‬‬
‫‪ -2-2-3‬شبيه سازي ‪ LCD‬گرافيکي ‪78..............................................................‬‬
‫‪ -3-2-3‬نرم افزار مبدل فرمت عکس ‪78.............................................................‬‬
‫پروژه نهم‪ :‬نمايش تصوير بر روي ‪ LCD‬گرافيکي ‪80........................ KS108 12864‬‬
‫پروژه دهم‪ :‬نمايش تصوير بر روي ‪ LCD‬گرافيکي ‪83.................. TOSHIBA 240128‬‬
‫فصل چهارم‪ :‬کاربرد وقفههاي خارجي ‪93............................................................‬‬
‫‪ -1-4‬اسکن صفحه کليد ماتريسي ‪ 44‬با وقفه ‪93.................................................‬‬
‫پروژه يازدهم‪ :‬اسکن صفحه کليد ماتريسي ‪94.............................................. 44‬‬
‫‪ -2-4‬اسکن صفحه کليد ‪ 44‬با انکدر ‪96......................................... MM74C922‬‬
‫پروژه دوازدهم‪ :‬اسکن صفحه کليد ماتريسي ‪ 44‬توسط انکدر ‪97........... MM74C922‬‬
‫‪ -3-4‬اسکن صفحه کليد کامپيوتر ‪98.................................................................‬‬

‫خ‬
‫پروژه سيزدهم‪ :‬اسکن صفحه کليد کامپيوتر توسط ميکروکنترلر‪101 ...........................‬‬
‫فصل پنجم‪ :‬کاربرد تايمرها‪107 ........................................................................‬‬
‫پروژه چهاردهم‪ :‬فرکانس متر ديجيتال ‪107 ........................................................‬‬
‫پروژه پانزدهم‪ :‬اندازهگيري درصد وظيفه و فرکانس سيگنال ورودي ‪110............................‬‬
‫پروژه شدهم‪ :‬ساخت نوسانساز کنترل شونده با ولتاژ (‪107..................................... )VCO‬‬
‫پروژه هفدهم‪ :‬تنظيم و کنترل فرکانس و درصد وظيفه خروجي توسط کاربر ‪117 ...........‬‬
‫پروژه هجدهم‪ :‬مدار کنترل موتور ‪122 ........................................................ DC‬‬
‫پروژه نوزدهم‪ :‬محاسبهي ‪ RPM‬موتور ‪127 .......................................................‬‬
‫پروژه بيستم‪ :‬اسکن نمايشگر هفت پارچه ‪128 ..................................................‬‬
‫پروژه بيستمويکم‪ :‬کسينوس ‪ ‬متر ‪131 ..........................................................‬‬
‫پروژه بيستمودوم‪ :‬ربات مسيرياب ‪135 ............................................................‬‬
‫فصل ششم‪ :‬مبدل آنالوگ به ديجيتال ‪145 ............................................................‬‬
‫پروژه بيستموسوم‪ :‬ولتمتر ديجيتال ‪145 .........................................................‬‬
‫پروژه بيستوچهارم‪ :‬اندازهگيري دما با استفاده از سنسور ‪148 ........................ LM35‬‬
‫فصل هفتم‪ :‬پورت سريال ‪153 .........................................................................‬‬
‫‪ -1-7‬ارتباط سريال ‪153 .................................................................... USART‬‬
‫‪ -2-7‬سازگاري ‪ USART‬با ‪154 ............................................................ UART‬‬
‫‪ -3-7‬توليد کنندهي نرخ ارسال داخلي ‪154 .........................................................‬‬
‫‪ -4-7‬قاب داده ‪155 .....................................................................................‬‬
‫‪ -5-7‬توابع پورت سريال ‪156 .........................................................................‬‬
‫پروژه بيستوپنجم‪ :‬نمايش کارکترهاي دريافتي از پورت سريال بر روي ‪158 ......... LCD‬‬
‫پروژه بيستوششم‪ :‬راهاندازي ماژول فرستنده‪ -‬گيرنده بي سيم توسط ‪163 ...... USART‬‬
‫پروژه بيستوهفتم‪ :‬روش ساخت ‪ CALLER ID‬تلفن بر اساس استاندارد ‪172 ......... FSK‬‬
‫پروژه بيستوهشتم‪ :‬مد چند پردازنده ارتباط سريال ‪185 ............................ USART‬‬
‫‪ -6-7‬اتصال ميکروکنترلر ‪ AVR‬به پورت سريال کامپيوتر با ساختار ‪193 ............ RS232‬‬
‫پروژه بيستونهم‪ :‬ارتباط ميکروکنترلر ‪ AVR‬و کامپيوتر ‪193 ...................................‬‬

‫د‬
‫‪ -7-7‬اتصال ميکروکنترلر ‪ AVR‬به پورت سريال با استفاده از پروتکل ‪198 .......... RS485‬‬
‫پروژه سيام‪ :‬مد چند پردازنده ‪200 ........................................................... SPI‬‬
‫‪ -8-7‬ارتباط سريال يك سيمه )‪203 ................................................ (ONE WIRE‬‬
‫‪ -1-8-7‬پيکربندي ‪ 1WIRE‬با ‪205 ........................................... CODEWIZARD‬‬
‫پروژه سيويکم‪ :‬اندازهگيري دما به کمك سنسور ‪206 ............................... DS1820‬‬
‫‪ -9-7‬ارتباط ميکروکنترلر با پورت ‪ USB‬از طريق تراشه ‪209 .......................... FT232‬‬
‫پروژه سيودوم‪ :‬ارتباط با پورت موازي کامپيوتر ‪211 ............................................‬‬
‫فصل هشتم‪ :‬حافظههاي جانبي ‪219 ...................................................................‬‬
‫پروژه سيوسوم‪ :‬ارتباط با حافظه سريال ‪ AT24C256‬توسط ‪219 ....................... I2C‬‬
‫پروژه سيوچهارم‪ :‬ارتباط با حافظه سريال ‪ AT25256‬توسط‪222 ........................ SPI‬‬
‫پروژه سيوپنجم‪ :‬ارتباط ميکروکنترلر با حافظه ‪229 ..................................... MMC‬‬
‫فصل نهم‪ :‬پروژههاي الکترونيك قدرت ‪235 .........................................................‬‬
‫پروژه سيوششم‪ :‬ساخت مبدل ‪235 ..................................................... BUCK‬‬
‫پروژه سيوهفتم‪ :‬مولد موج ‪ PWM‬سينوسي ‪241 ................................................‬‬
‫پروژه سيوهشتم‪ :‬مولد پالسهاي اينورتر سهفاز ‪244 ................................. SPWM‬‬
‫پروژه سيونهم‪ :‬طراحي يك ديمر ‪247 ............................................................‬‬
‫فصل دهم‪ :‬پروژههاي کاربردي ديگر ‪252 ............................................................‬‬
‫پروژه چهلم‪ :‬اسيلوسکوپ ديجيتال با استفاده از ميکروکنترلر ‪252 .............................‬‬
‫پروژه چهلويکم‪ :‬ارتباط ميکروکنترلر و ‪ TFT‬موبايل (‪ LCD‬موبايل) ‪268 ....................‬‬
‫پروژه چهلودوم‪ :‬طراحي و ساخت ‪296 ....................................... WAV PLAYER‬‬
‫پروژه چهلوسوم‪ :‬ماشين حساب ‪304 ............................................................‬‬
‫پروژه چهلوچهارم‪ :‬ساعت با استفاده از تراشه ‪307 .................................. DS1307‬‬
‫پروژه چهلوپنجم‪ :‬اجراي موزيك با ميکرو ‪320 ..................................................‬‬
‫پروژه چهلوششم‪ :‬اندازهگيري فاصله توسط سنسورهاي فراصوت (‪323 .. )ULTRASONIC‬‬
‫پروژه چهلوهفتم‪ :‬مدار ترکيبي ترموستات وساعت ‪327 ........................................‬‬
‫پروژه چهلوهشتم‪ :‬مودم ‪332 ............................................................... GSM‬‬

‫ذ‬
‫پروژه چهلونهم‪ :‬کنترل کننده ‪ LCD‬گرافيکي با قابليت فايل خواني از ‪341 .......... MMC‬‬
‫پروژه پنجاهم‪ :‬صفحه لمسي (‪359 .......................................... )TOUCH SCREEN‬‬
‫پروژه پنجاهويکم‪ :‬تابلو روان ‪374 ..................................................................‬‬
‫پروژه پنجاهودوم‪ :‬منبع تغذيه ديجيتالي ‪398 ..................................................DC‬‬
‫پروژه پنجاهوسوم‪ :‬راهاندازي ‪ LCD‬کاراکتري موازي به روش سريال ‪399 ....................‬‬
‫مراجع ‪413 ................................................................................................‬‬

‫ر‬
‫ميكروكنترلر و واسطهاي جانبي‬ ‫فصل اول‬

‫در اين فصل ابتدا به اختصار بهه معرفهي ميکروکنترلهر ‪ AVR‬مهورد اسهتفاده در ايهن‬
‫کتاب پرداخته ميشود‪ .‬سپس انهواع روشههاي برنامههريزي ميکروکنترلرههاي ‪AVR‬‬
‫بيان ميشوند‪ .‬همچنين روش نصب و کهار بها نرمافهزار ‪ CodeVision‬آمهوزش داده‬
‫ميشود و در پايان‪ ،‬به منظور آشنايي مقدماتي خوانندگان کتاب‪ ،‬دستورات الزم زبهان‬
‫برنامهنويسي ‪ C‬براي کار با ميکروکنترلرها به اختصار توضيح داده خواهند شد‪.‬‬

‫‪ -1-1‬معرفی میکروکنترلرهای ‪AVR‬‬

‫‪ -1-1-1‬مقدمه‬
‫‪1‬‬
‫«زبآنهاي سطح باال» به سرعت در حال تبديل شدن به زبان برنامهنويسي استاندارد‬
‫براي ميکروکنترلرها (‪ )MCU‬هستند‪ .‬زبان برنامهنويسي ‪ Basic‬و ‪ C‬بيشترين استفاده‬
‫را در برنامهنويسي ميکروکنترلرها دارند ولي در اکثر کاربردها‪ ،‬کدهاي بيشتري را‬
‫نسبت به زبان برنامهنويسي اسمبلي توليد ميکنند‪ .‬شرکت ‪ ATMEL‬با ايجاد تحولي‬
‫در معماري ساخت تراشههاي برنامهپذير‪ ،‬از معماري ‪ RISC2‬براي ساخت‬
‫ميکروکنترلرهاي ‪ AVR‬استفاده ميکند که اين معماري در مقايسه با معماري ‪CISC‬‬
‫داراي دستورات با اندازه (سايز) ثابت‪ ،‬رجيسترهاي (ثباتهاي) همه منظوره بيشتر‬
‫و دستورات سادهتر و قابل اجرا تنها در يك يا دو پالس ساعت هستند‪ ،‬ميباشد که‬
‫در نهايت منجر به افزايش سرعت اجراي دستورات توسط ميکروکنترلر ميشود‪.‬‬
‫سرعت اجراي دستورات در ميکروکنترلرهاي ‪ AVR‬در مقايسه با ميکروکنترلرهاي‬
‫‪ 8051‬و ‪ PIC‬به ترتيب ‪ 12‬و ‪ 4‬برابر ميباشند‪.‬‬
‫تکنولوژي حافظه کم مصرف غير فرار براي برنامهريزي ‪ AVR‬مورد استفاده قرار‬
‫گرفته است‪ .‬در نتيجه حافظههاي ‪ FLASH‬و ‪ EEPROM‬در داخل مدار قابل‬

‫‪1‬‬ ‫‪High Level Languages (HLL).‬‬


‫‪2‬‬ ‫‪Reduced Instruction Set Computer (RISC).‬‬

‫‪1‬‬
‫برنامهريزي هستند‪ .‬ميکروکنترلرهاي اوليه ‪ AVR‬داراي ‪ 2 ، 1‬و ‪ 8‬کيلوبايت حافظه‬
‫‪ FLASH‬و به صورت کلمههاي ‪ 16‬بيتي سازماندهي شده بودند‪ AVR .‬ها به عنوان‬
‫ميکروکنترلرهاي ‪ RISC‬با دستورات فراوان طراحي شدهاند که باعث ميشود حجم‬
‫کد توليد شده کم و سرعت باالتري حاصل شود‪ .‬با انجام دستورات تك سيکلي‪،‬‬
‫اسيالتور با کال داخلي سيستم يکي ميشود‪ .‬هيچ تقسيمکنندهاي در داخل ‪AVR‬‬
‫قرار ندارد که منجر به اختالف فاز کال سيستم با سرعت اجراي دستورات شود‪.‬‬
‫بيشتر ميکروکنترلرها‪ ،‬فرکانس کال اسيالتور سيستم را بر ‪ 4‬يا ‪ 12‬تقسيم ميکنند‬
‫که اين امر منجر به کاهش سرعت اجراي دستورات ميشود‪ .‬بنابراين ‪ AVR‬ها ‪ 4‬تا‬
‫‪ 12‬بار سريعتر و توان مصرفي آنها نيز ‪ 4‬تا ‪ 12‬بار نسبت به ميکروکنترلرهاي کنوني‬
‫کمتر است‪ .‬زيرا در تکنولوژي ‪ CMOS‬استفاده شده در ميکروکنترلر هاي ‪،AVR‬‬
‫مصرف توان سطح منطقي متناسب با فرکانس است‪ .‬شکل (‪ ،)1-1‬افزايش ‪ MIPS1‬را‬
‫به علت انجام عمليات تك سيکلي ‪ AVR‬در مقايسه با ‪ PIC‬و ‪ 8051‬نشان ميدهد‪.‬‬

‫شکل (‪ :)1-1‬نمودار توان مصرفی برحسب اجرای میلیون دستور بر ثانیه‬


‫برای میکروکنترلرهای ‪ PIC ،AVR‬و ‪8051‬‬

‫‪ -2-1-1‬طراحی برای زبانهای ‪ Basic‬و ‪:C‬‬


‫زبآنهاي ‪ Basic‬و ‪ C‬بيشترين استفاده را در دنياي امروز به عنوان زبآنهاي ‪HLL‬‬
‫دارند‪ .‬پيش از طراحي چنين معماري‪ ،‬بيشتر ميکروکنترلرها براي زبان اسمبلي‬
‫طراحي شده و کمتر از زبآنهاي ‪ HLL‬حمايت ميکردند‪ .‬هدف شرکت ‪ATMEL‬‬
‫طراحي معماري بود که هم براي زبان اسمبلي و هم براي زبآنهاي ‪ HLL‬مفيد باشد‪.‬‬
‫به عنوان مثال در زبآنهاي ‪ Basic‬و ‪ C‬ميتوان يك متغير محلي به جاي متغير‬
‫سراسري در داخل زيربرنامه تعريف کرد‪ .‬بنابراين تنها در زمان اجراي زيربرنامه‬

‫‪1‬‬ ‫‪Million Instruction Per Seconds (MIPS).‬‬

‫‪2‬‬
‫مکاني از حافظه ‪ SRAM‬براي متغير اشغال ميشود‪ .‬در صورتي که اگر متغير به‬
‫عنوان متغير سراسري تعريف گردد‪ ،‬در تمام زمان اجراي برنامه مکاني از حافظه‬
‫‪ SRAM‬را اشغال کرده است‪ .‬براي دسترسي سريعتر به متغيرهاي محلي و کاهش‬
‫کد‪ ،‬نياز به افزايش رجيسترهاي همه منظوره است‪ AVR .‬ها داراي ‪ 32‬رجيستر همه‬
‫منظوره هستند که مستقيما به «واحد محاسبه و منطق»‪ 1‬متصل شدهاند و تنها در يك‬
‫پالس ساعت به اين واحد دسترسي پيدا ميکنند‪ .‬سه جفت از اين رجيسترها‬
‫ميتوانند به عنوان رجيسترهاي ‪ 16‬بيتي استفاده شوند‪ .‬نتيجه تمام موارد بيان شده‪،‬‬
‫اين است که ميکروکنترلرهاي ‪ AVR‬با سرعت باال و سازماندهي ‪ RISC‬هستند‪.‬‬
‫ميکروکنترلرهاي ‪ AVR‬به سه خانواده اصلي ‪ Tiny AVR ،AT90S AVR‬و‬
‫‪ Mega AVR‬تقسيمبندي ميشوند‪ .‬البته خانواده ‪ XMega‬نيز توسط شرکت سازنده‪،‬‬
‫به صنعت معرفي شده است‪ .‬در اين کتاب براي پيادهسازي بسياري از پروژهها از‬
‫ميکروکنترلر ‪ ATmega16‬استفاده شده است و همانطور که از نامش مشخص است‬
‫از خانواده ‪ Mega AVR‬ميباشد‪ .‬در ادامه به خالصهاي از خصوصيات و پيکربندي‬
‫اين ميکروکنترلر ميپردازيم‪.‬‬

‫‪ -3-1-1‬خصوصیات ‪ ATmega16‬و ‪ATmega16L‬‬


‫با استفاده از معماري ‪ RISC‬طراحي و ساخته شدهاند‪.‬‬ ‫‪‬‬
‫کارايي باال و توان مصرفي کم‪.‬‬
‫داراي ‪ 131‬دستورالعمل‪ ،‬با کارايي باال که بيشتر دستورات‪ ،‬تنها در يك سيکل‬
‫ساعت اجرا ميشوند‪.‬‬
‫داراي ‪ 32‬رجيستر همهمنظوره هشت بيتي‪.‬‬
‫داراي بيشينه سرعت تا ‪ 16 MIPS‬در فرکانس ‪.16 MHz‬‬
‫حافظه برنامه و داده غيرفرار‬ ‫‪‬‬
‫‪ 16‬کيلوبايت حافظه ‪ FLASH‬داخلي قابل برنامهريزي‪.‬‬
‫پايداري حافظه ‪ FLASH‬با قابليت ‪ 10000‬بار نوشتن و پا کردن‪.‬‬
‫‪ 1024‬بايت حافظه داخلي ‪. SRAM‬‬
‫‪ 512‬بايت حافظه ‪ EEPROM‬داخلي قابل برنامهريزي‪.‬‬
‫پايداري حافظه ‪ EEPROM‬با قابليت ‪ 100000‬بار نوشتن و پا کردن‪.‬‬
‫قفل برنامه ‪ FLASH‬و ‪. EEPROM‬‬
‫خصوصيات جانبي‬ ‫‪‬‬
‫دو تايمر‪/‬کانتر ‪ 8‬بيتي با مقسم مجزا‪.‬‬

‫‪1‬‬ ‫‪Arithmetic Logic Unit (ALU).‬‬

‫‪3‬‬
‫يك تايمر‪/‬کانتر ‪ 16‬بيتي با مقسم مجزا و داراي حالتهاي تسخير و‬
‫مقايسه‪.‬‬
‫‪ 4‬کانال مدوالسيون عرض پالس (‪.)PWM‬‬
‫‪ 8‬کانال مبدل آنالوگ به ديجيتال ‪ 10‬بيتي‪.‬‬
‫يك مقايسه کننده آنالوگ داخلي‪.‬‬
‫‪ Watchdog‬قابل برنامهريزي با اسيالتور داخلي‪.‬‬
‫قابليت ارتباط با پروتکل «سريال دو سيمه»‪ 1‬و ‪.I2C‬‬
‫قابليت ارتباط سريال ‪ SPI2‬به صورت ‪ Master‬يا ‪.Slave‬‬
‫‪ USART‬سريال قابل برنامهريزي‪.‬‬
‫خصوصيات ويژه ميکروکنترلر‬ ‫‪‬‬
‫داراي اسيالتور ‪ RC‬داخلي کاليبره شده‪.‬‬
‫منابع وقفه‪ 3‬داخلي و خارجي‪.‬‬
‫توان مصرفي پايين و سرعت باال توسط تکنولوژي ‪. CMOS‬‬
‫ولتاژ کاري ‪ 2.7‬تا ‪ 5.5‬ولت براي ‪ Atmega16L‬و ‪ 4.5‬تا ‪ 5.5‬ولت براي‬
‫‪. Atmega16‬‬
‫فرکانسهاي کاري ‪ 0‬تا ‪ 8MHz‬براي ‪ Atmega16L‬و ‪ 0‬تا ‪16MHz‬‬
‫براي ‪. Atmega16‬‬
‫‪ 32‬خط ورودي خروجي قابل برنامه ريزي‪.‬‬
‫شکل (‪ )2-1‬شماي پايههاي ميکروکنترلر ‪ Atmega16‬را نشان ميدهد‪ .‬همانطور که‬
‫در شکل (‪ )2-1‬مشاهده ميشود ‪ ATmega16‬داراي چهار پورت ‪ C ،B ،A‬و ‪D‬‬
‫ميباشد که افزون بر اينکه به عنوان ورودي خروجي مورد استفاده قرار ميگيرند‪،‬‬
‫کاربردهاي جانبي ديگري نيز دارند‪ .‬که در فصلهاي بعد به آنها خواهيم پرداخت‪.‬‬

‫‪1‬‬ ‫‪TWO-WIRE‬‬
‫‪2‬‬ ‫‪Serial Peripheral Interface (SPI).‬‬
‫‪3 Interrupt‬‬

‫‪4‬‬
‫‪ATmega16‬‬ ‫شکل (‪ :)2-1‬شمای پایههای میکروکنترلر‬

‫‪ -2-1‬برنامهریزی میکروکنترلرهای ‪AVR‬‬


‫به طور کلي‪ ،‬چهار روش براي برنامهريزي ميکروکنترلرهاي ‪ AVR‬وجود دارد که به‬
‫ترتيب‪ :‬برنامهريزي موازي‪ ،‬برنامهريزي توسط پروتکل ‪ ،JTAG‬خود برنامهريز‪ 1‬و‬
‫‪ ISP2‬ميباشند‪.‬‬
‫براي برنامهريزي ميکروکنترلر ‪ ،AVR‬از روش ‪ ISP‬استفاده ميکنيم‪ .‬در اين روش‪:‬‬
‫بدون برداشتن تراشه ميکروکنترلر ‪ AVR‬از روي برد مربوطه‪ ،‬اقدام به پروگرم نمودن‬
‫آن مينمائي م‪ .‬انتقال کدهاي برنامه از کامپيوتر به ميکروکنترولر‪ ،‬مطابق شکل (‪)3-1‬‬
‫به روش سريال ميباشد‪ .‬در روش ‪ ،ISP‬با استفاده از ارتباط ‪( SPI‬که در فصلهاي‬
‫بعد توضيح داده ميشود) ميتوانيم عالوه بر برنامهريزى ميکروکنترولر‬
‫(‪ ،)Programming‬صحت برنامهريزي را نيز تشخيص دهيم )‪ .(Verify‬در اين روش‬
‫با استفاده از سه خط سيگنال‪ ،‬برنامهريزي ميکروکنترلر انجام ميشود (يك خط‬
‫ورودى‪ ،‬يك خط خروجى و يك خط پالس ساعت (‪ .(Clock‬البته‪ :‬پايه ‪Reset‬‬
‫ميکروکنترلر ميبايست در زمان برنامهريزى پايين (صفر منطقى) نگه داشته شود‪ ،‬يعني‬
‫به صفر ولت متصل شود)‪.‬‬

‫شکل (‪ :)3-1‬ساختار برنامهریزی میکروکنترولر‪.‬‬

‫ساخت پروگرمر ‪ ISP‬با استفاده از کانکتور ‪ DB25‬بسيار ساده است‪ .‬اتصال مستقيم‬
‫ميکروکنترلر به کامپيوتر‪ ،‬ممکن است باعث ايجاد مشکالت ناشي از جريان کشي‬
‫توسط ميکروکنترلر و کامپيوتر شود که در نهايت منجر به سوختن ميکروکنترلر‬
‫ميشود‪ .‬بنابراين‪ ،‬با استفاده از يك تراشه راهانداز‪ 3‬به منظور تامين جريان الزم در‬
‫هنگام برنامهريزي ميکروکنترلر‪ ،‬مشکل مذکور برطرف خواهد شد‪ .‬همچنين به اين‬
‫دليل که پورت‪ 4‬موازى در مقابل اتصال کوتاه و يا اضافه بار چندان مقاوم نيست و‬
‫ممکن است با قطع و وصل تغذيهي بورد‪ ،‬آسيب ببيند‪ .‬بنابراين‪ ،‬استفاده از يك بافر‬

‫‪1‬‬ ‫‪Self-Programming‬‬
‫‪2‬‬ ‫‪In System Programming‬‬
‫‪3 Driver‬‬
‫‪4 Port‬‬

‫‪5‬‬
‫جريان ضروري است‪ .‬در اين روش‪ ،‬نميتوان به طور قاطع از برنامهريزي کامالً‬
‫مطمئن ميکرو صحبت کرد‪.‬‬
‫مدار واسط ‪ STK200/300‬به منظور برنامهريزي ميکروکنترولر به روش ‪ISP‬‬
‫استفاده شده است که مطابق شکل (‪ )4-1‬ميباشد‪ .‬تراشه ‪ 74ALS244‬به عنوان بافر‬
‫جريان‪ ،‬جهت حفاظت از پورتهاي ميکروکنترلر و کامپيوتر استفاده شده است‪ .‬شما‬
‫ميتوانيد مطابق نقشه شکل (‪ )4-1‬مدار پروگرمر را بسازيد و يا آن را از‬
‫فروشگاههاي الکترونيکي تهيه نمائيد‪ .‬شايان ذکر است که صحت عملکرد صحيح‬
‫مدار زير تائيد ميشود‪.‬‬
‫‪VCC‬‬
‫‪1‬‬
‫‪1‬‬
‫‪4‬‬
‫‪2‬‬
‫‪7‬‬
‫‪2‬‬
‫‪R‬‬
‫‪1‬‬
‫‪ATmega32‬‬
‫‪1‬‬
‫‪5‬‬
‫‪1‬‬
‫‪0‬‬
‫‪0‬‬
‫‪K‬‬
‫‪2‬‬
‫‪6‬‬
‫‪3‬‬
‫‪1‬‬
‫‪4‬‬
‫‪0‬‬
‫)‪(XCK/T0‬‬
‫‪PB0‬‬
‫)‪(ADC0‬‬
‫‪PA0‬‬
‫‪1‬‬
‫‪6‬‬
‫‪2‬‬
‫‪3‬‬
‫‪9‬‬
‫)‪(T1‬‬
‫‪PB1‬‬
‫)‪(ADC1‬‬
‫‪PA1‬‬
‫‪4‬‬
‫‪3‬‬
‫‪3‬‬
‫‪8‬‬
‫)‪(AIN0/INT2‬‬
‫‪PB2‬‬
‫)‪(ADC2‬‬
‫‪PA2‬‬
‫‪1‬‬
‫‪7‬‬
‫‪74ALS244‬‬
‫‪VCC‬‬
‫‪4‬‬
‫‪3‬‬
‫‪7‬‬
‫)‪(AIN1/OC0‬‬
‫‪PB3‬‬
‫)‪(ADC3‬‬
‫‪PA3‬‬
‫‪5‬‬
‫‪1‬‬
‫‪2‬‬
‫‪0‬‬
‫‪5‬‬
‫‪3‬‬
‫‪6‬‬
‫‪OE1‬‬
‫‪VCC‬‬
‫)‪(SS‬‬
‫‪PB4‬‬
‫)‪(ADC4‬‬
‫‪PA4‬‬
‫‪1‬‬
‫‪8‬‬
‫‪1‬‬
‫‪9‬‬
‫‪6‬‬
‫‪3‬‬
‫‪5‬‬
‫‪OE2‬‬
‫)‪(MOSI‬‬
‫‪PB5‬‬
‫)‪(ADC5‬‬
‫‪PA5‬‬
‫‪6‬‬
‫‪7‬‬
‫‪3‬‬
‫‪4‬‬
‫)‪(MISO‬‬
‫‪PB6‬‬
‫)‪(ADC6‬‬
‫‪PA6‬‬
‫‪1‬‬
‫‪9‬‬
‫‪2‬‬
‫‪1‬‬
‫‪8‬‬
‫‪8‬‬
‫‪3‬‬
‫‪3‬‬
‫‪A‬‬
‫‪1‬‬
‫‪Y‬‬
‫‪1‬‬
‫)‪(SCK‬‬
‫‪PB7‬‬
‫)‪(ADC7‬‬
‫‪PA7‬‬
‫‪7‬‬
‫‪4‬‬
‫‪1‬‬
‫‪6‬‬
‫‪A‬‬
‫‪2‬‬
‫‪Y‬‬
‫‪2‬‬
‫‪2‬‬
‫‪0‬‬
‫‪6‬‬
‫‪1‬‬
‫‪4‬‬
‫‪1‬‬
‫‪4‬‬
‫‪2‬‬
‫‪2‬‬
‫‪A‬‬
‫‪3‬‬
‫‪Y‬‬
‫‪3‬‬
‫)‪(RXD‬‬
‫‪PD0‬‬
‫)‪(SCL‬‬
‫‪PC0‬‬
‫‪8‬‬
‫‪8‬‬
‫‪1‬‬
‫‪2‬‬
‫‪1‬‬
‫‪5‬‬
‫‪2‬‬
‫‪3‬‬
‫‪A‬‬
‫‪4‬‬
‫‪Y‬‬
‫‪4‬‬
‫)‪(TXD‬‬
‫‪PD1‬‬
‫)‪(SDA‬‬
‫‪PC1‬‬
‫‪2‬‬
‫‪1‬‬
‫‪1‬‬
‫‪1‬‬
‫‪9‬‬
‫‪1‬‬
‫‪6‬‬
‫‪2‬‬
‫‪4‬‬
‫‪A‬‬
‫‪5‬‬
‫‪Y‬‬
‫‪5‬‬
‫)‪(INT0‬‬
‫‪PD2‬‬
‫)‪(TCK‬‬
‫‪PC2‬‬
‫‪9‬‬
‫‪1‬‬
‫‪3‬‬
‫‪7‬‬
‫‪1‬‬
‫‪7‬‬
‫‪2‬‬
‫‪5‬‬
‫‪A‬‬
‫‪6‬‬
‫‪Y‬‬
‫‪6‬‬
‫)‪(INT1‬‬
‫‪PD3‬‬
‫)‪(TMS‬‬
‫‪PC3‬‬
‫‪2‬‬
‫‪2‬‬
‫‪1‬‬
‫‪5‬‬
‫‪5‬‬
‫‪1‬‬
‫‪8‬‬
‫‪2‬‬
‫‪6‬‬
‫‪A‬‬
‫‪7‬‬
‫‪Y‬‬
‫‪7‬‬
‫)‪(OC1B‬‬
‫‪PD4‬‬
‫)‪(TDO‬‬
‫‪PC4‬‬
‫‪1‬‬
‫‪0‬‬
‫‪1‬‬
‫‪7‬‬
‫‪3‬‬
‫‪1‬‬
‫‪9‬‬
‫‪2‬‬
‫‪7‬‬
‫‪A‬‬
‫‪8‬‬
‫‪Y‬‬
‫‪8‬‬
‫)‪(OC1A‬‬
‫‪PD5‬‬
‫)‪(TDI‬‬
‫‪PC5‬‬
‫‪2‬‬
‫‪3‬‬
‫‪2‬‬
‫‪0‬‬
‫‪2‬‬
‫‪8‬‬
‫)‪(ICP‬‬
‫‪PD6‬‬
‫)‪(TOSC1‬‬
‫‪PC6‬‬
‫‪1‬‬
‫‪1‬‬
‫‪1‬‬
‫‪0‬‬
‫‪2‬‬
‫‪1‬‬
‫‪2‬‬
‫‪9‬‬
‫‪G‬‬
‫‪N‬‬
‫‪D‬‬
‫‪G‬‬
‫‪N‬‬
‫‪D‬‬
‫)‪(OC2‬‬
‫‪PD7‬‬
‫)‪(TOSC2‬‬
‫‪PC7‬‬
‫‪2‬‬
‫‪4‬‬
‫‪1‬‬
‫‪2‬‬
‫‪9‬‬
‫‪1‬‬
‫‪0‬‬
‫‪RESET‬‬
‫‪VCC‬‬
‫‪VCC‬‬
‫‪2‬‬
‫‪5‬‬
‫‪3‬‬
‫‪0‬‬
‫‪AVCC‬‬
‫‪1‬‬
‫‪3‬‬
‫‪3‬‬
‫‪2‬‬
‫‪C‬‬
‫‪1‬‬
‫‪AREF‬‬
‫‪1‬‬
‫‪2‬‬
‫‪XTAL2‬‬
‫‪G‬‬
‫‪N‬‬
‫‪D‬‬
‫‪1‬‬
‫‪3‬‬
‫‪3‬‬
‫‪1‬‬
‫‪25‬‬
‫‪Connector‬‬
‫‪DB‬‬
‫‪XTAL1‬‬
‫‪G‬‬
‫‪N‬‬
‫‪D‬‬
‫‪2‬‬
‫‪2‬‬
‫‪p‬‬
‫‪F‬‬
‫‪1‬‬
‫‪1‬‬
‫‪G‬‬
‫‪N‬‬
‫‪D‬‬
‫‪2‬‬
‫‪G‬‬
‫‪N‬‬
‫‪D‬‬
‫‪XTAL‬‬
‫‪G‬‬
‫‪N‬‬
‫‪D‬‬
‫‪C‬‬
‫‪2‬‬
‫‪2‬‬
‫‪2‬‬
‫‪p‬‬
‫‪F‬‬
‫‪1‬‬
‫‪STK200/300‬‬ ‫شکل (‪ :)4-1‬پروگرامر‬

‫‪ -3-1‬آشنایی با روش نصب و کار با نرمافزار ‪CodeVisionAVR‬‬

‫‪ -1-3-1‬مقدمه‬
‫براي کار با ميکروکنترلرهاي ‪ AVR‬بايد برنامهاي به يکي از زبآنهاي ‪C ،Assembly‬‬
‫يا ‪ Basic‬در محيط نرم افزار مربوط به آن نوشت‪ .‬سپس آن را کامپايل نمود‪ .‬کامپايل‬
‫نمودن برنامه‪ :‬عملي است که در آن‪ ،‬برنامه از زبان نوشتاري به زبان صفر و يك که‬
‫توسط ميکروکنترلر قابل فهم باشد‪ ،‬تبديل ميشود‪ .‬در صورتي که برنامه هيچ‬

‫‪6‬‬
‫خطايي‪ ،‬شامل‪ :‬خطاي اماليي‪ ،‬ساختاري و نظاير آن را نداشته باشد به درستي‬
‫کامپايل شده و يك فايل به زبان صفر و يك (زبان ماشين) توسط کامپايلر توليد‬
‫ميشود‪ .‬پسوند فايلهايي که حاوي برنامه به زبان ماشين هستند‪ HEX ،‬ميباشد‪.‬‬
‫اکنون براي انتقال فايل ‪ HEX‬ايجاد شده به درون آيسي‪ ،‬نيازمند يك دستگاه جانبي‬
‫يا واسط سخت افزاري هستيم که کامپيوتر را به تراشه ميکروکنترلر متصل کند و‬
‫فايل ‪ HEX‬مربوطه را از کامپيوتر بر روي ميکروکنترلر بارگذاري نمايد‪ .‬اين واسط‬
‫سخت افزاري‪ ،‬اصطالحاً پروگرمر ناميده ميشود‪ .‬پس از برنامهريزي کردن (پروگرم‬
‫کردن)‪ ،‬ميکروکنترلر را از پروگرمر جدا کرده و در مدار مورد نظر قرار داده (و يا اگر‬
‫پروگرمر ساخته شده مطابق شکل (‪ )4-1‬باشد بدون جدا نمون ميکروکنترلر از مدار‬
‫به برنامهريزي آن اقدام ميکنيم)‪ .‬پس از آن‪ ،‬عملکرد سخت افزاري آنرا بررسي‬
‫ميکنيم‪.‬‬
‫در اين قسمت‪ ،‬نرم افزار ‪ CodeVisionAVR‬که يکي از کامپايلرهاي قوي براي‬
‫برنامهنويسي به زبان ‪ C‬ميباشد‪ ،‬معرفي ميشود‪ .‬افزون بر اين‪ ،‬روش نصب و‬
‫قسمتهاي مختلف آن نيز آموزش داده ميشود‪.‬‬

‫‪ -2-3-1‬آشنایی با محیط ‪CodeVisionAVR‬‬


‫نرم افزار ‪ CodeVisionAVR‬داراي محيطي براي برنامهنويسي به زبان ‪ C‬است‪ .‬که‬
‫در اين محيط‪ ،‬کاربر با تسلط نسبي بر زبان ‪ C‬قادر به نوشتن برنامههاي بسيار‬
‫کاربردي ميشود‪ .‬يکي از داليل انتخاب اين نرمافزار‪ ،‬قابليت ‪ Wizard‬يا محيط‬
‫راهنماي گام به گام است‪ .‬محيط راهنماي گام به گام که به آن به اختصار ويزارد‬
‫گفته ميشود‪ .‬اين قابليت در مقدار دهي اوليه رجيسترهاي مختلف ميکروکنترلر‪،‬‬
‫همچنين فراخواني برخي کتابخانههاي موجود‪ ،‬کمك بسيار زيادي به کاربران ميکند‪.‬‬
‫بنابراين‪ ،‬به کاربران مبتدي‪ ،‬برنامهريزي ميکروکنترلرهاي ‪ AVR‬با استفاده از اين‬
‫محيط توصيه ميشود‪ .‬اين نرمافزار داراي يك کامپايلر بوده که توسط آن کدهاي‬
‫برنامه با پسوند ‪ Hex‬جهت برنامهريزي ميکروکنترلر توليد ميشوند‪ .‬توسط اين نرم‬
‫افزار و يك پروگرمر از نوع ‪ ISP‬ميتوان کليهي ميکروکنترلرهاي ‪ AVR‬را‬
‫برنامهريزي نمود‪ .‬نرمافزار ‪ CodevisionAVR‬عالوه بر حمايت از کتابخانههاي‬
‫استاندارد زبان ‪ ،C‬داراي کتابخانههاي دقيقي براي کار با ‪ LCD‬هاي کارکتري‪ ،‬توليد‬
‫وقفه‪ ،‬تنظيمات توان مصرفي و نظاير آن ميباشد‪.‬‬

‫‪7‬‬
‫‪ -3-3-1‬روش نصب نرمافزار ‪CodevisionAVR‬‬
‫ابتدا با مراجعه به ‪( CD‬که همراه با کتاب عرضه ميشود) فايل مربوط به نرم افزار‬
‫‪ CodeVisionAVR‬را باز کنيد و با اجراي فايل ‪ setup.exe‬مراحل نصب را مطابق‬
‫شکلهاي زير تا پايان ادامه دهيد‪.‬‬

‫‪ -1‬بر روي گزينه ‪ Next‬کليك نمائيد‪.‬‬

‫‪ -2‬با انتخاب مسير مناسب جهت نصب نرمافزار بر روي گزينه ‪ Next‬کليك نمائيد‪.‬‬

‫‪8‬‬
‫‪ -3‬بر روي گزينه ‪ Next‬کليك نمائيد‪.‬‬

‫‪ -4‬بر روي گزينه ‪ Install‬کليك نمائيد‪ .‬در صورتي که نرمافزار ‪CodeVision‬‬


‫نسخه ‪ V2.03.4‬را نصب ميکنيد‪ ،‬اين نسخه داراي قفل نرمافزاري نبوده و‬
‫در اين مرحله عمليات نصب پايان‬
‫ميپذيرد‪ .‬در غير اين صورت مراحل زير‬
‫را دنبال کنيد‪.‬‬
‫‪ -5‬پس از نصب برنامه‪ ،‬براي اجراي صحيح‬
‫آن ضروري است که قفل برنامه باز شود‪.‬‬
‫براي اين کار‪ ،‬ابتدا برنامه را اجرا نمائيد‪.‬‬

‫‪9‬‬
‫از پنجره ظاهر شده شماره سريال را يادداشت نمائيد و در مرحله بعد وارد‬
‫نمائيد‪.‬‬
‫‪ -6‬فايل ‪ License Generator.exe‬را از مسير دايرکتوري اصلي برنامه‪ ،‬اجرا‬
‫نمائيد‪ .‬اکنون با وارد کردن يك نام دلخواه در قسمت ‪ ،User name‬و در‬
‫قسمت ‪ ،Serial number‬شماره سريال مرحلهي ‪ 5‬را وارد کرده و دکمهي‬
‫‪ Generate‬را فشار دهيد و فايل توليد شده با پسوند ‪ .dat‬را در مسير‬
‫دلخواه ذخيره نمائيد‪.‬‬

‫‪ -7‬اکنون با استفاده از پنجره ظاهر شده در مرحلهي ‪ ،5‬بر روي ‪ Import‬کليك‬


‫کرده و آدرس فايل توليد شده در مرحلهي ‪ 6‬را وارد کنيد‪ .‬اکنون‪ ،‬قفل‬
‫برنامه باز شده و برنامه قابل اجرا و استفاده است‪.‬‬

‫‪ -4-3-1‬ایجاد یک پروژه جدید‬


‫براي آشنايي با محيط ‪ CodeVisionAVR‬با ايجاد يك پروژه شروع ميکنيم و‬
‫مراحل زير را مطابق شکلها ادامه ميدهيم‪:‬‬
‫‪ -1‬برنامه ‪ CodeVisionAVR‬را اجرا مي کنيم‪.‬‬
‫‪ -2‬در صفحهي باز شده (صفحه اصلي) پس از‬
‫انتخاب گزينه ‪ ،File‬گزينه ‪ New‬را انتخاب‬
‫کرده تا پنجرهاي مطابق شکل (‪ ،)5-1‬ظاهر‬
‫شود‪.‬‬
‫شکل (‪ :)5-1‬ایجاد پروژه جدید‬

‫‪ -3‬از پنجره ظاهر شده در شکل (‪ )5-1‬گزينه ‪ Project‬را که مربوط به‬


‫انتخاب پروژه است انتخاب نموده و بر روي ‪ OK‬کليك نمائيد‪ .‬اکنون‪،‬‬
‫پنجرهي ديگري باز ميشود و از شما سوال ميشود که‪ :‬آيا ميخواهيد‬
‫پروژه جديد را توسط محيط ويزارد ايجاد کنيد؟ با فشردن کليد ‪ Yes‬اين‬
‫عمل انتخاب ميشود و با فشردن کليد ‪ No‬جهت ايجاد پروژه از ويزارد‬
‫استفاده نميشود‪.‬‬

‫‪10‬‬
‫‪CodeWizardAVR‬‬ ‫شکل (‪ :)6-1‬انتخاب‬
‫‪ -1-3‬با کليك بر روي گزينه ‪ ،Yes‬مطابق شکل (‪ )6-1‬محيط ويزارد مطابق شکل‬
‫(‪ )7-1‬باز ميشود و توسط اين محيط ميتوان با استفاده از سربرگهاي موجود‪ ،‬با‬
‫انتخاب ميکروکنترلر مورد نظر‪ ،‬رجيسترهاي آن را بهصورت اوليه مقداردهي نمود‪.‬‬
‫پس از اتمام مقدار دهي اوليه‪ ،‬با انتخاب گزينه ‪ File‬از منوي مربوطه‪ ،‬مطابق شکل‬
‫(‪ ،)8-1‬بر روي گزينه ‪ Generate, Save and Exit‬کليك کرده و با انتخاب يك نام‬
‫براي آن‪ ،‬پروژه مورد نظر را ايجاد نمائيد تا شکل (‪ )9-1‬ظاهر شود‪ .‬اکنون برنامه‬
‫شما به صورت اوليه مقدار دهي شده است‪.‬‬

‫‪.AVR‬‬ ‫شکل (‪ :)7-1‬محیط ‪ CodeWizardAVR‬برای مقداردهی اولیه میکروکنترلرهای‬

‫‪11‬‬
‫شکل (‪ :)8-1‬ذخیرهسازی و تولید کد‪.‬‬

‫‪CodevisionAVR‬‬ ‫شکل (‪ :)9-1‬کدهای ایجاد شده توسط ویزارد در محیط‬

‫‪ -2-3‬با کليك بر روي گزينه ‪ No‬در شکل (‪ )6-1‬پنجره زير جهت ذخيره پروژه‬
‫ظاهر ميشود‪ .‬پس از انتخاب يك نام براي پروژه مورد نظر‪ ،‬بر روي گزينه ‪Save‬‬
‫کليك نمائيد‪.‬‬

‫‪12‬‬
‫شکل (‪ :)10-1‬انتخاب یک نام جهت ذخیره پروژه‬
‫‪ -1-2-3‬پس از ذخيره پروژه‪ ،‬شکل (‪ )11-1‬ظاهر ميشود که داراي سه سربرگ‬
‫‪ C Compiler ،File‬و ‪ After Make‬ميباشد‪ .‬با انتخاب سربرگ ‪C Compiler‬‬
‫ميکروکنترلر و فرکانس کريستال آن را انتخاب نمائيد‪ .‬به عنوان مثال‪ ،‬در شکل (‪-1‬‬
‫‪ )12‬ميکروکنترلر ‪ ATmega32‬و کريستال ‪ 4‬مگاهرتز انتخاب شده است (ساير‬
‫سربرگها در قسمتهاي مربوطه به تفصيل توضيح داده ميشوند)‪ .‬حال‪ ،‬بر روي‬
‫گزينه ‪ OK‬کليك نمائيد تا پروژه ايجاد شود‪.‬‬

‫شکل (‪ :)12-1‬پیکربندی میکروکنترلر‬ ‫شکل (‪ :)11-1‬پیکربندی پروژه‬

‫‪ -2-2-3‬در صفحهي باز شده (صفحه اصلي) پس از انتخاب گزينه ‪ ،File‬گزينه‬


‫‪ New‬را انتخاب کرده تا پنجرهاي ظاهر شود‪ .‬از پنجره ظاهر شده‪ ،‬گزينه ‪ Source‬را‬
‫انتخاب و سپس فايل مورد نظر را با نام دلخواه ذخيره نمائيد‪ .‬دقت شود که پسوند‬

‫‪13‬‬
‫اين فايل ‪ .c‬است‪ .‬يعني محيطي جهت برنامهنويسي به زبان ‪ C‬ايجاد شده است‪.‬‬
‫اکنون‪ ،‬از منوي باالي صفحه‪ ،‬بر روي گزينه ‪ Project‬و سپس بر روي ‪Configure‬‬
‫کليك نمائيد تا مجدداً شکل (‪ )11-1‬ظاهر شود‪ .‬سپس از سربرگ ‪ Files‬بر روي‬
‫گزينه ‪ Add‬کليك نمائيد و فايل ايجاد شده با پسوند ‪ .c‬را به پروژه اضافه نمائيد و بر‬
‫روي گزينه ‪ OK‬کليك نمائيد‪ .‬اکنون پروژه مورد نظر‪ ،‬ايجاد شده است‪.‬‬

‫‪ -4-1‬آشنایی با زبان ‪C‬‬

‫‪ -1-4-1‬ساختار برنامهنویسی‬
‫به منظور برنامهنويسي به زبان ‪ ،C‬آشنايي اوليه با دستورات آن الزامي است‪ .‬براي اين‬
‫منظور‪ :‬با معرفي مختصر ساختارها و دستورات مرتبط‪ ،‬مطابق زير با يك برنامه ساده‬
‫شروع ميکنيم‪.‬‬
‫>‪#include <stdio.h‬‬
‫{ )(‪int main‬‬
‫;)"‪printf("Hello World\n‬‬
‫;‪return 0‬‬
‫}‬

‫‪ ‬شرح برنامه‪:‬‬
‫>‪ : #include <stdio.h‬فايلي به اسم ‪ stdio.h‬را ضميمه ميکند که اين فايل به ما‬
‫اجازه استفاده از توابع خاصي را ميدهد‪ stdio .‬کوتاه شدهي عبارت ‪Standard‬‬
‫‪ Input/Output‬است‪ .‬اين فايل شامل توابع ورودي‪ :‬مانند خواندن از صفحه کليد و‬
‫توابع خروجي‪ :‬مانند نمايش دادن بر روي صفحه نمايش است‪.‬‬

‫)(‪: int main‬‬


‫‪ : int‬عبارتي است که يك مقدار را بر ميگرداند (‪ )return‬و در ادامه بيشتر به‬
‫توضيح آن ميپردازيم‪.‬‬

‫‪ : main‬نام نقطهاي است که برنامه از آن نقطه شروع ميشود‪ .‬پرانتزها در جلوي‬


‫عبارت ‪ main‬به اين معني است که اين تابع آرگومان ورودي ندارد‪.‬‬
‫{ )(‪int main‬‬
‫دستورها‬
‫}‬

‫‪14‬‬
‫} { (آکالدها) براي اين است که تمام نوشتهها را در يك گروه خاص قرار دهد‪ .‬در‬
‫مثال باال‪ ،‬آکالد مشخص ميکند که نوشتهها متعلق به تابع ‪ main‬است‪ .‬شايان ذکر‬
‫است که آکالدها در زبان ‪ C‬کاربرد زيادي دارند‪.‬‬

‫;)"‪printf ("Hello World \n‬‬


‫تابع ‪ : printf‬يك متن را در صفحه نمايش ميدهد‪ .‬اطالعاتي که بايد اين تابع‬
‫نمايش دهد بين دو پرانتز قرار ميگيرد‪ .‬دقت شود که‪ :‬کلمهها بين دو ‪double‬‬
‫‪ ) " ( contention‬قرار گيرند‪ ،‬زيرا آنها در واقع يك رشته هستند‪ .‬هر يك از‬
‫حروف يك کاراکتر ميباشد و مجموعهي آنها يك گروه با نام رشته (‪ )string‬را‬
‫تشکيل ميدهند‪ .‬رشتهها هميشه بايد بين دو " قرار ميگيرند‪.‬‬
‫‪ : \n‬به کامپايلر دستور مي دهد به خط جديد برود‪ ،‬وقتي شما در متن خود ‪enter‬‬
‫بزنيد به خط جديد نميرود براي همين ما مجبور هستيم از اين دستور استفاده کنيم‪.‬‬
‫بايد بعد از هر دستوري يك ‪ ) ; ( semicolon‬قرار دهيد براي اين که نشان دهد آن‬
‫دستور تمام شده است‪.‬‬

‫‪printf‬‬ ‫جدول (‪ :)1-1‬دستورات برای‬


‫‪\a‬‬ ‫‪Audible signal‬‬
‫‪\b‬‬ ‫‪Backspace‬‬
‫‪\t‬‬ ‫رفتن به يك ‪ tab‬جلوتر‬
‫‪\n‬‬ ‫رفتن به يك خط جديد‬
‫‪\v‬‬ ‫‪Vertical tab‬‬
‫‪\f‬‬ ‫پا کردن صفحه ‪ /‬رفتن به صفحه جديد‬
‫‪\r‬‬ ‫‪Carriage return‬‬

‫‪ : return 0‬مقدار آرگومان برگشتي توسط دستور ‪ return‬مشخص ميشود و‪return 0‬‬
‫به معني آن است که تابع ما مقدار صفر را باز ميگرداند‪.‬‬
‫پس از کامپايل نمودن برنامه‪ ،‬اگر کدهاي شما اشتباه باشند‪ ،‬کامپايلر به شما‬
‫ميگويد که اشتباه در کدام خط رخ داده است‪ .‬به منظور اجراي صحيح برنامه‪،‬‬
‫اصالح خطا شامل‪ :‬خطاي اماليي و ساختاري الزامي است‪ .‬پس از کامپايل صحيح‪،‬‬
‫برنامهي شما تبديل به فايل اجرايي ميشود‪ .‬اکنون بايد عبارت "‪ "Hello World‬را‬
‫در صفحه مالحظه کنيد‪.‬‬

‫‪15‬‬
‫استفاده از توضيحات (‪ : )comments‬براي تشخيص بهتر هر يك از خطوط برنامه‪،‬‬
‫استفاده از ‪ comment‬در جلوي خطوط پيشنهاد ميشود‪ .‬توضيحات را بايد بعد از ‪//‬‬
‫يا بين ‪ /*………*/‬بنويسيد‪ .‬توضيحات توسط کامپايلر خوانده نميشوند‪.‬‬
‫توضيحات استفاده شده در اول برنامه عملکرد برنامه را نشان ميدهند‪ .‬شما همچنين‬
‫ميتوانيد‪ :‬بين قسمتهاي مختلف برنامه از توضيحات استفاده کنيد تا آن قسمت را‬
‫توضيح دهيد در ذيل‪ ،‬مثالي از قرار دادن توضيح قرار داده شده است‪:‬‬
‫‪/* Author: Hamed Saghaei‬‬
‫‪Date: 2009/07/15‬‬
‫‪Description:‬‬
‫‪Writes the words "Hello World" on the screen */‬‬

‫>‪#include <stdio.h‬‬

‫)(‪int main‬‬
‫{‬
‫;)"‪printf("Hello World\n‬‬ ‫"‪//prints "Hello World‬‬
‫;‪return 0‬‬
‫}‬
‫‪ -2-4-1‬متغیرها‬
‫متغيرها در زبان برنامهنويسي ‪ ،C‬مکاني از حافظه هستند که نامي به آنها تخصيص‬
‫داده ميشود و ميتوانند مقداري را در بر داشته باشند‪ .‬از متغيرها براي ذخيره کردن‬
‫مقادير در حافظه استفاده ميشود‪ .‬دو نوع متغير اصلي در زبان ‪ C‬وجود دارد که به‬
‫ترتيب (عدد) ‪ Numeric‬و(حروف) ‪ Character‬ميباشند‪.‬‬
‫‪ -‬متغيرهاي عددي‪ :‬اين نوع متغيرها ميتوانند عدد صحيح باشند و اعداد کسري يا‬
‫اعشاري نميتوانند در اين گروه قرار بگيرند‪.‬‬
‫‪ -‬متغيرهاي کاراکتري‪ :‬در اين نوع متغيرها‪ :‬حروف و اعداد ميتوانند قرار بگيرند‪.‬‬
‫البته اعداد در اينجا کمي متفاوت هستند‪.‬‬
‫‪ -‬عبارات عددي و رشتهاي ثابت‪ :‬اين نوع عبارات ثابت هستند و مقدار آنها قابل‬
‫تغيير نيست‪ .‬گاهي براي جلوگيري از اشتباه از آنها استفاده ميشود‪.‬‬
‫تعريف متغيرها‪ :‬براي تعريف متغير در برنامه ابتدا نوع آن را بايد مشخص کنيم در‬
‫جدول (‪ )2-1‬نوع متغيرها و محدودهي آنها مشخص شده است‪ .‬البته متغيرها را به‬
‫هر نحوي که مايل باشيد ميتوانيد نام گذاري کنيد‪ .‬ولي بهتر است کمتر از ‪ 32‬حرف‬
‫داشته باشند و در ابتداي برنامه تعريف شوند‪.‬‬

‫‪16‬‬
‫جدول (‪ :)2-1‬انواع داده‬
‫محدوده‬ ‫نوع‬ ‫نام‬
‫از ‪ 0‬و ‪1‬‬ ‫يك بيت‬ ‫‪bit‬‬
‫از ‪ -128‬تا ‪127‬‬ ‫هشت بيت‬ ‫‪char‬‬
‫از ‪ 0‬تا ‪255‬‬ ‫هشت بيت بدون عالمت‬ ‫‪unsigned char‬‬
‫از ‪ -32767‬تا ‪32768‬‬ ‫اعداد صحيح ‪ 16‬بيتي‬ ‫‪int‬‬
‫از ‪ 0‬تا ‪65535‬‬ ‫اعداد صحيح بدون‬ ‫‪unsigned int‬‬
‫عالمت ‪ 16‬بيتي‬
‫از ‪ -217483648‬تا‬ ‫اعداد صحيح ‪ 32‬بيتي‬ ‫‪long int‬‬
‫‪217483647‬‬

‫از ‪ 0‬تا ‪429467295‬‬ ‫اعداد صحيح بدون‬ ‫‪unsigned long int‬‬


‫عالمت ‪ 32‬بيتي‬
‫و منفي ‪e-38‬‬ ‫از مقادير مثبت‬ ‫اعداد اعشاري‬ ‫‪float‬‬
‫‪ 1.175‬تا مقادير مثبت و منفي‬
‫‪3.402e38‬‬
‫از مقادير مثبت و منفي‬ ‫اعداد اعشاري‬ ‫‪double‬‬
‫‪ 2.2e-308‬تا مقادير مثبت و‬
‫منفي ‪1.8e308‬‬

‫)(‪int main‬‬
‫{‬
‫;‪int a‬‬
‫;‪char b‬‬
‫;‪return 0‬‬
‫}‬

‫در عبارت باال‪ :‬متغير ‪ a‬از نوع ‪ int‬و متغير ‪ b‬از نوع ‪ char‬تعريف شدهاند‪ .‬و مطابق زير‬
‫برنامه ذيل ميتوان در يك مکان‪ ،‬چندين متغير را تعريف کرد‪.‬‬
‫)(‪int main‬‬
‫{‬
‫;‪int a, b, c‬‬
‫;‪return 0‬‬
‫}‬

‫‪17‬‬
‫با توجه به اينکه تابع ‪ ،main‬تابع اصلي برنامه است‪ .‬بنابراين بازگشت مقادير توسط‬
‫اين تابع صحيح نميباشد‪ .‬در ادامه به جاي تعريف آن به روش مثالهاي قبل‪ ،‬به‬
‫صورت زير تعريف ميشود‪ .‬همچنين براي تعريف متغيرهاي ‪( Constant‬ثابت) تنها‬
‫الزم است‪ :‬عبارت ‪ const‬را قبل از نوع متغير قرار داد‪.‬‬
‫)(‪void main‬‬
‫{‬
‫;‪const float pi = 3.1415‬‬
‫}‬
‫‪ -‬متغيرهاي عالمتدار و بدون عالمت‪:‬‬
‫متغيرهاي عالمتدار (‪ )signed‬ميتوانند داراي مقادير مثبت يا منفي باشند ولي‬
‫متغيرهاي بدون عالمت (‪ ،)unsigned‬تنها ميتوانند مقادير مثبت و صفر را اختيار‬
‫کنند‪ .‬اين عبارات‪ ،‬قبل از نوع متغير تعريف ميشوند و نبود آن دليل بر عالمتدار‬
‫بودن (‪ )Signed‬متغير است‪.‬‬
‫)(‪void main‬‬
‫{‬
‫;‪unsigned int a‬‬
‫;‪signed int b‬‬
‫}‬
‫‪ -‬استفاده از متغير در محاسبات‪:‬‬
‫براي دادن مقداري به متغير از عالمت تساوي (=) استفاده ميشود‪.‬‬
‫)(‪void main‬‬
‫{‬
‫‪int a=4; // a=4‬‬
‫‪char b; // b=0‬‬
‫;‪a = 3‬‬ ‫‪// a=3‬‬
‫'‪b = 'H'; // b='H‬‬
‫}‬
‫به منظور انجام محاسبات از عملگرهاي محاسباتي زير استفاده ميشود‪.‬‬

‫‪18‬‬
‫جدول (‪ :)3-1‬عملگرهای محاسباتی‬
‫عمگر‬ ‫عمليات‬
‫‪+‬‬ ‫جمع‬
‫‪-‬‬ ‫تفريق‬
‫*‬ ‫ضرب‬
‫‪/‬‬ ‫تقسيم‬
‫‪%‬‬ ‫باقيمانده‬

‫براي انجام عمليات به متغيري نياز داريم که حاصل عمليات در آن ذخيره شود‪.‬‬
‫)(‪void main‬‬
‫{‬
‫;‪int a, b‬‬
‫;‪a = 5‬‬
‫‪b = a + 3; // b=8‬‬
‫‪a = a % 3; // a=2‬‬
‫}‬
‫در زبان برنامهنويسي ‪ ،C‬ميتوان متغيري از ‪ keyboard‬را با استفاده از دستور ‪scanf‬‬
‫گرفت و توسط ‪ printf‬آن را چاپ کرد‪.‬‬
‫>‪#include <stdio.h‬‬
‫)(‪void main‬‬
‫{‬
‫;‪int a‬‬
‫;)‪scanf("%d", &a‬‬
‫;‪a = a * 2‬‬
‫;)‪printf("The answer is %d", a‬‬
‫}‬
‫‪ d%‬براي خواندن و چاپ کردن متغيرها از نوع ‪ int‬استفاده ميشود و ساير متغيرها‬
‫مطابق جدول زير هستند‪.‬‬
‫جدول (‪ :)4-1‬خواندن و چاپ متغیرها‬
‫‪%d or %i‬‬ ‫‪int‬‬

‫‪%c‬‬ ‫‪char‬‬

‫‪%f‬‬ ‫‪float‬‬

‫‪%lf‬‬ ‫‪double‬‬

‫‪%s‬‬ ‫‪string‬‬

‫‪19‬‬
‫‪ -3-4-1‬دستور ‪If‬‬
‫در بيشتر مواقع الزم است که مقدار متغيري در برنامه کنترل شود‪ .‬براي اين منظور‬
‫استفاده از حلقه ‪ If‬به حل مساله کمك ميکند‪.‬‬
‫‪ -‬ساختار کلي دستور ‪If‬‬
‫)شرط( ‪if‬‬
‫{‬
‫;دستورات‬
‫}‬
‫)شرط( ‪else if‬‬
‫{‬
‫;دستورات‬
‫}‬
‫‪else‬‬
‫{‬
‫;دستورات‬
‫}‬

‫>‪#include <stdio.h‬‬
‫)(‪void main‬‬
‫{‬
‫;‪int mark‬‬
‫;‪char pass‬‬
‫;)‪scanf("%d", &mark‬‬
‫)‪if (mark > 40‬‬
‫;'‪pass = 'y‬‬
‫}‬

‫در برنامه باال ابتدا متغيري از ورودي گرفته ميشود و سپس شرط ‪40 > mark‬‬
‫امتحان ميشود‪ .‬اگر پاسخ مثبت بود‪ ،‬حرف ‪ Y‬در متغير ‪ pass‬قرار داده ميشود‪.‬‬

‫>‪#include <stdio.h‬‬
‫)(‪void main‬‬
‫{‬
‫;‪int mark‬‬
‫;‪char pass‬‬
‫;)‪scanf("%d", &mark‬‬
‫)‪if (mark > 40‬‬

‫‪20‬‬
‫;'‪pass = 'y‬‬
‫‪else‬‬
‫;'‪pass = 'n‬‬
‫}‬

‫در برنامه باال ابتدا متغيري از ورودي گرفته ميشود و سپس شرط ‪40 > mark‬‬
‫امتحان ميشود‪ .‬اگر پاسخ مثبت بود‪ ،‬حرف ‪ Y‬در متغير ‪ pass‬قرار ميگيرد‪ ،‬در غير‬
‫اين صورت حرف ‪ n‬در ‪ pass‬قرار داده ميشود‪.‬‬
‫در صورتي که در برنامه‪ ،‬اجراي چند دستور پس از امتحان شرط نياز داشت‪ ،‬ميبايد‬
‫مطابق زير برنامه ذيل‪ ،‬دستورات را درون { } قرار دهيم‪.‬‬
‫>‪#include <stdio.h‬‬
‫)(‪void main‬‬
‫{‬
‫;‪int mark‬‬
‫;‪char pass‬‬
‫;)‪scanf("%d", &mark‬‬
‫)‪if (mark > 40‬‬
‫{‬
‫;'‪pass = 'y‬‬
‫;)"‪printf("You passed‬‬
‫}‬
‫‪else‬‬
‫{‬
‫;'‪pass = 'n‬‬
‫;)"‪printf("You failed‬‬
‫}‬
‫}‬
‫همچنين ميتوان در هر دستور ‪ if‬چند شرط را امتحان نمود‪:‬‬
‫>‪#include<stdio.h‬‬
‫)(‪void main‬‬
‫{‬
‫;‪int a, b‬‬
‫;)‪scanf("%d", &a‬‬
‫;)‪scanf("%d", &b‬‬
‫)‪if (a > 0 && b > 0‬‬
‫;)"‪printf("Both numbers are positive\n‬‬
‫)‪if (a = 0 || b = 0‬‬
‫{‬
‫;)"‪printf("At least one of the numbers = 0\n‬‬

‫‪21‬‬
‫;‪a++‬‬
‫}‬
‫))‪if (!(a > 0) && !(b > 0‬‬
‫;)"‪printf("Both numbers are negative\n‬‬
‫}‬
‫‪ -‬عملگرهاي منطقي‪:‬‬
‫جدول (‪ :)5-1‬عملگرهای منطقی‬
‫==‬ ‫مساوي‬
‫!=‬ ‫نا مساوي‬
‫>‬ ‫بزرگتر از‬
‫>=‬ ‫بزرگتر يا مساوي‬
‫<‬ ‫کوچکتر از‬
‫<=‬ ‫کوچکتر يا مساوي‬
‫&&‬ ‫و‬
‫||‬ ‫يا‬
‫!‬ ‫نقيض‬

‫و‪ :‬هر دو شرط درست باشند حاصل درست‪.‬‬


‫يا‪ :‬يکي يا هر دو شرط درست باشند حاصل درست است‪.‬‬

‫‪ -4-4-1‬ساختار دستور ‪switch‬‬


‫)‪switch(variable‬‬
‫{‬
‫‪case var 1:‬‬
‫;دستور‬
‫;‪break‬‬
‫‪case var 2:‬‬
‫;دستور‬
‫;‪break‬‬
‫‪.‬‬
‫‪.‬‬
‫‪.‬‬

‫‪22‬‬
default:
‫;دستور‬
}

#include <stdio.h>
void main()
{
char fruit;
printf("Which one is your favourite fruit:\n");
printf("a) Apples\n");
printf("b) Bananas\n");
printf("c) Cherries\n");
scanf("%c", &fruit);
switch (fruit) {
case 'a':
printf("You like apples\n");
break;
case 'b':
printf("You like bananas\n");
break;
case 'c':
printf("You like cherries\n");
break;
default:
printf("You entered an invalid choice\n");
}
}
‫ کنترل ميکنيم اگر‬case ‫ متغير برنامه است که آن را با استفاده از‬fruit :‫در برنامه باال‬
beak ‫ در خروجي چاپ ميشود سپس از دستور‬You like apples ‫ متن‬،‫ بود‬a ‫برابر‬
‫استفاده شده است که باعث خروج از حلقه ميشود در نهايت اگر با هيچيك از‬
‫ چاپ‬You entered an invalid choice ‫ متن‬default ‫متغيرها برابر نبود با استفاده از‬
.‫ميشود‬

‫ دستورات حلقه‬-5-4-1
‫ براي اين کار از‬.‫در برخي مواقع الزم است دستوري به صورت متوالي اجرا شود‬
:‫دستورات حلقه استفاده ميشود که به سه دسته تقسيم ميشوند‬
for, do while, while:

23
‫‪ -‬ساختار ‪for‬‬
‫)عدد شروع ;شرط ;اضافه شدن متغير( ‪for‬‬
‫{‬
‫; دستورات‬
‫}‬

‫‪ for‬اجازه ميدهد از عددي تا عدد ديگر تکرار داشته باشيم‪ .‬در برنامه زير اعدد ‪ 1‬تا‬
‫‪ 24‬در خروجي چاپ ميشوند‪.‬‬
‫)(‪void main‬‬
‫{‬
‫;‪int i‬‬
‫)‪for (i = 1; i == 24; i++‬‬
‫;)"‪printf("H\n‬‬
‫;‪return 0‬‬
‫}‬
‫در مثال باال از ‪ i++‬استفاده کرديم که برابر است با ‪ i=i+1‬يعني در هر بار اجرا‪ ،‬يك‬
‫واحد به ‪ i‬اضافه ميشود يا ميتوان از ‪ i--‬استفاده کرد که هر بار اجرا‪ ،‬يك واحد از ‪i‬‬
‫کم ميشود‪.‬‬
‫‪ -‬ساختار ‪while‬‬
‫)‪while(condition‬‬
‫{‬
‫; دستورات‬
‫}‬
‫تفاوت اين حلقه با قبلي در اين است که ما نميدانيم قرار است چند بار حلقه اجرا‬
‫شود در مثال زير تعداد اجرا شدن حلقه از ورودي گرفته ميشود در ‪ times‬ذخيره و‬
‫در هر بار اجرا شدن حلقه يك واحد به ‪ i‬افزوده ميشود تا زماني که به تعداد ‪times‬‬
‫برسد از حلقه خارج شده و برنامه تمام ميشود‪.‬‬
‫>‪include <stdio.h‬‬
‫)(‪void main‬‬
‫{‬
‫;‪int i, times‬‬
‫;)‪scanf("%d", &times‬‬
‫;‪i = 0‬‬
‫)‪while (i <= times‬‬
‫{‬

‫‪24‬‬
i++;
printf("%d\n", i);
}
}
do while ‫ساختار‬ -
‫ است با اين تفاوت که شرط آن در آخر امتحان‬while ‫ مانند‬do while ‫ساختار‬
.‫ميشود‬
do {
‫; دستورات‬
}
while(Condition)

#include <stdio.h>
void main()
{
int i, times;
scanf("%d", &times);
i = 0;
do
{
i++;
printf("%d\n", i);
}
while (i <= times);

:Break and continue


.‫ استفاده ميشود‬Break ‫ از ابتدا و براي خاتمه دادن از‬Loop ‫ براي شروع‬Continue
.‫ چاپ نميشود‬Hello ‫در مثال زير هرگز‬
#include <stdio.h>
int main()
{
int i;
while (i < 10)
{
i++;
continue;
printf("Hello\n");
}
}

25
‫‪ -6-4-1‬اشارهگرها‬
‫اشارهگر‪ 1‬متغيرهايي هستند که درون خود آدرسي از حافظه را نگهداري ميکنند و به‬
‫متغير درون آن آدرس‪ ،‬اشاره ميکنند به اين دليل به آنها اشارهگر ميگويند‪ .‬شما‬
‫ميتوانيد از اشارهگرها براي کارهاي خاصي استفاده کنيد‪ .‬مثالً براي گرفتن مقدار‬
‫آدرسي که به آن اشاره ميکند‪ .‬اشارهگرها ميتوانند مشخص يا نامشخص باشند‪.‬‬
‫اشارهگرهاي مشخص به يك متغير مشخص مثالً ‪ int‬اشاره ميکنند‪ ،‬و اشارهگرهاي‬
‫نامشخص ميتوانند به انواع اطالعات اشاره کنند‪ .‬براي اينکه شما عبارت يا‬
‫کاراکتري را به عنوان اشارهگر مشخص کنيد بايد يك * قبل از اسم آن بگذاريد‪ ،‬در‬
‫اينجا مثالي از اشارهگر آورده شده است‪.‬‬
‫)(‪void main‬‬
‫{‬
‫;‪int *p‬‬
‫;‪void *up‬‬
‫}‬
‫شما ميتوانيد آدرس يك ‪ int‬را درون يك اشارهگر قرار دهيد و اشارهگر با استفاده‬
‫از عالمت & آدرس ‪ int‬را ميگيرد‪.‬‬
‫)(‪void main‬‬
‫{‬
‫;‪int i‬‬
‫;‪int *p‬‬
‫;‪i = 5‬‬
‫;‪p = &i‬‬
‫;‪return 0‬‬
‫}‬
‫شما ميتوانيد به مقدار ‪ int‬که اشارهگر به آن اشاره کرده دسترسي داشته باشيد‪.‬‬
‫* باعث ميشود که اشارهگر دوباره بازگشت داده شود‪ ،‬يعني در واقع همان متغير‬
‫ميشود و تغيير در آن به منزلهي تغيير در متغير است‪.‬‬
‫)(‪void main‬‬
‫{‬
‫;‪int i, j‬‬
‫;‪int *p‬‬
‫;‪i = 5‬‬
‫;‪p = &i‬‬
‫‪j = *p; //j = i‬‬
‫‪*p = 7; //i = 7‬‬

‫‪1‬‬ ‫‪Pointer‬‬

‫‪26‬‬
‫;‪return 0‬‬
‫}‬
‫استفاده از اشارهگر براي بيان ‪ i=j‬در باال راهي طوالني است‪ .‬شما در ادامه با‬
‫کاربردهاي بيشتر اشارهگرها آشنا خواهيد شد ولي در اين قسمت‪ ،‬هدف آشنايي‬
‫مقدماتي با اين مبحث است‪.‬‬

‫‪ -7-4-1‬آرایهها‬
‫اگر شما ميخواستيد ‪ 5‬متغير داشته باشيد‪ ،‬مانند زير عمل ميکرديد‪:‬‬
‫;‪int i1, i2, i3, i4, i5‬‬
‫حال اگر ‪ 1000‬متغير بود چه ميکرديد؟ مسلم ًا فرايند باال زمان زيادي ميبرد‪ ،‬ولي با‬
‫استفاده از آرايه ميتوانيد‪ :‬با نام يك متغير‪ ،‬هر تعداد که بخواهيد متغير بسازيد‪ .‬آرايه‬
‫مانند متغير معمولي است و براي تعريف آن کافي است فقط بعد از نام آن يك جفت‬
‫براکت بياوريد و درون آن تعداد متغير مورد نظر را بنويسيد‪ .‬مثال‪:‬‬
‫]‪int a[5‬‬
‫براي اينکه به مق دار متغيرهاي هر خانه دست يابيد شما بايد نام آرايه و سپس‬
‫شمارهي خانهي مورد نظر را بياوريد‪ .‬فقط به ياد داشته باشيد که شمارهي خانههاي‬
‫آرايه از صفر شروع ميشود‪ .‬براي مثال يك آرايه به طول ‪ 5‬داراي خانههايي از‬
‫شمارهي ‪ 0‬تا ‪ 4‬است‪.‬‬
‫;]‪int a[5‬‬
‫;‪a[0] = 12; a[1] = 23‬‬
‫;‪a[2] = 34; a[3] = 45‬‬
‫;‪a[4] = 56‬‬
‫;)]‪printf("%d",a[0‬‬
‫‪ -‬استفاده از آرایه با حلقه‬
‫استفاده از آرايه در حلقه کاربرد زيادي دارد‪ .‬زيرا خانههاي آرايه يك دنباله را طي‬
‫ميکنند که اين فرايند مشابه حلقهها است‪ .‬براي مثال‪ :‬وقتي خانههاي آرايه صفر‬
‫نشدهاند و شما ني از داريد که مقدار آن ها را صفر کنيد بايد مانند زير از حلقه استفاده‬
‫کنيد‪:‬‬
‫;]‪int a[10‬‬
‫;‪for (i = 0;i < 10;i++) a[i] = 0‬‬
‫‪ -‬آرایههای چند بعدی‬
‫آرايههايي که ما قبالً استفاده کرديم آرايههاي يك بعدي نام دارند زيرا تنها از يك‬
‫سطر تشکيل شدهاند‪ .‬آرايههاي ‪ 2‬بعدي از چند سطر و ستون تشکيل شدهاند‪ ،‬در‬
‫براي تسلط بيشتر بر موضوع شکل (‪ )13-1‬را مالحظه نمائيد‪.‬‬

‫‪27‬‬
‫آرایههای یک بعدی‬
‫مقدار شماره سطر‬
‫‪0‬‬ ‫‪4‬‬
‫‪1‬‬ ‫‪3‬‬
‫‪2‬‬ ‫‪-1‬‬

‫آرایه ی دو بعدی‬
‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬
‫‪0 1‬‬ ‫‪2‬‬ ‫‪3‬‬
‫‪1 4‬‬ ‫‪5‬‬ ‫‪6‬‬
‫‪2 7‬‬ ‫‪8‬‬ ‫‪9‬‬
‫شکل (‪ :)13-1‬آرایههای چند بعدی‬

‫شما ميتوانيد از آرايههاي سه بعدي يا بيشتر نيز استفاده کنيد ولي اغلب کاربردي‬
‫ندارند‪ .‬در ادامه برنامهاي آورده شده که شما را با روش تعريف يك آرايهي دو‬
‫بعدي و چگونه کار کردن آن آشنا ميکند‪ .‬توجه داشته باشيد که مثال داراي ‪ 2‬حلقه‬
‫است زيرا مي خواهيم مقدار متغيرهاي درون سطر و ستون هاي مختلف را تغيير‬
‫دهيم‪.‬‬

‫;‪int a[3][3], i, j‬‬


‫)‪for (i = 0; i < 3; i++‬‬
‫)‪for (j = 0; j < 3; j++‬‬
‫;‪a[i][j] = 0‬‬
‫‪ -8-4-1‬رشته‬
‫رشته آرايهاي از کاراکترهاست که به يك ‪ 0‬يا يك کاراکتر خالي (‪ )null‬ختم شود تا‬
‫نشان دهد که رشته کجا تمام شده است‪ .‬توجه کنيد که کاراکتر ‪ null‬جزو رشته به‬
‫حساب نميآيد‪ .‬براي استفاده از رشته دو راه وجود دارد‪:‬‬
‫‪ -1‬استفاده از آرايهاي از کاراکترها‬
‫‪ -2‬استفاده از اشارهگر رشته‬
‫آرايه کاراکتري مانند آرايه زير تعريف مي شود‪:‬‬
‫;]‪char ca[10‬‬

‫‪28‬‬
‫شما بايد مقدار هر خانهي آرايه را به کاراکتر مورد نظر خود اختصاص‪ ،‬و کاراکتر‬
‫پاياني خود را ‪ 0‬قرار دهيد‪ .‬به ياد داشته باشيد که براي اشاره کردن به يك رشته بايد‬
‫از ‪ %s‬استفاده کنيد‪.‬‬
‫;]‪char ca[10‬‬
‫;'‪ca[0] = 'H'; ca[1] = 'e‬‬
‫;'‪ca[2] = 'l'; ca[3] = 'l‬‬
‫;‪ca[4] = 'o'; ca[5] = 0‬‬
‫;)‪printf("%s", ca‬‬

‫وقتي که شما يك مقدار خاص را به يك اشارهگر رشته نسبت ميدهيد کامپايلر يك‬
‫صفر در انتهاي آن قرار ميدهد و ديگر نيازي نيست تا مانند آرايه کاراکتري‪ 0 ،‬را در‬
‫انتهاي آن قرار دهيد‪.‬‬
‫;‪char ca[10], *sp‬‬
‫;)‪scanf("%s", ca‬‬
‫;‪sp = ca‬‬
‫;)‪scanf("%s", sp‬‬

‫شما ميتوان يد يك رشته را در يك آرايه کاراکتري با استفاده از ‪ scanf‬بخوانيد ولي‬


‫براي خواندن يك اشارهگر رشته‪ ،‬کامپايلر بايد آن را به يك آرايه کاراکتري برگرداند‪.‬‬
‫فايل سرآمد ‪ string.h‬داراي توابع پرکاربردي براي کار با رشتههاست‪ .‬در اينجا به‬
‫شرح تعدادي از آنها ميپردازيم‪:‬‬
‫)منبع ‪ ،‬مقصد ( ‪strcpy‬‬
‫شما نميتوانيد در زبان ‪ C‬از چنين دستوري استفاده کنيد‪ .string1 = string2 :‬بلکه‬
‫شما بايد از تابع ‪ strcpy‬براي کپي کردن يك رشته درون يك رشتهي ديگر استفاده‬
‫کنيد‪ .‬تابع ‪ strcpy‬رشتهي منبع را در رشتهي مقصد کپي ميکند‪.‬‬
‫;"‪s1 = "abc‬‬
‫;"‪s2 = "xyz‬‬
‫"‪strcpy(s1, s2); // s1 = "xyz‬‬
‫)منبع‪ ،‬مقصد( ‪: strcat‬‬
‫رشتهي منبع و مقصد را با هم ترکيب نموده و در رشتهي مقصد قرار ميدهد‪.‬‬
‫;"‪s1 = "abc‬‬
‫;"‪s2 = "xyz‬‬
‫"‪strcat(s1, s2); // s1 = "abcxyz‬‬
‫)دوم‪ ،‬اول(‪: strcmp‬‬
‫اين تابع رشتهي اول را با رشتهي دوم مقايسه ميکند‪ ،‬اگر رشتهي اول بزرگتر از‬
‫رشتهي دوم بود‪ ،‬تابع عددي مثبت را برگشت ميدهد‪ ،‬اگر هر دو رشته مساوي‬

‫‪29‬‬
‫بودند تابع مقدار عددي صفر را برگشت ميدهد و اگر رشته اول کوچکتر از رشتهي‬
‫دوم بود تابع عددي منفي را برگشت ميدهد‪.‬‬
‫;"‪s1 = "abc‬‬
‫;"‪s2 = "abc‬‬
‫‪i = strcmp(s1, s2); // i = 0‬‬
‫)رشته(‪strlen‬‬
‫اين تابع تعداد کاراکترهاي رشته را بازگشت ميدهد‪.‬‬

‫;"‪s = "abcde‬‬
‫‪i = strlen(s); // i = 5‬‬
‫‪ -9-4-1‬توابع‬
‫توابع‪ 1‬در واقع‪ ،‬زير برنامه ميباشند‪ .‬شما قبال از توابع استفاده کرديد‪ ،‬منظور همان‬
‫تابع ‪ main‬است‪ .‬شما قبل از اينکه يك تابع را فراخواني کنيد بايد آن را در ابتداي‬
‫برنامه و قبل از ‪ main‬تعريف کنيد‪ .‬در مورد هر تابع ميبايد نوع ‪ return‬مشخص‬
‫شود (يعني نوع آرگومان برگشتي تابع مشخص شود مثال از نوع ‪ int‬است يا از نوع‬
‫‪ char‬يا نظاير آن)‪ .‬در صورتي که نميخواهيد مقدار خاصي را ‪ return‬کنيد از ‪void‬‬
‫استفا ده کنيد‪ .‬بعد اسم منحصر به فرد تابع را بنويسيد و پس از آن يك جفت پرانتز‬
‫قرار دهيد‪ .‬در صورتي که تابع شما آرگومان ورودي دارد با مشخص کردن نوع و‬
‫تعداد آرگومآنها‪ ،‬آنها را درون پرانتز جلوي اسم تابع قرار دهيد و در صورتي که‬
‫تابع شما آرگومان ورودي ندارد درون پرانتز عبارت ‪ void‬را نوشته يا آن را خالي‬
‫باقي بگذاريد‪ .‬در آخر نيز دو عدد } { بگذاريد و برنامه ي خود درون آن بنويسيد‪.‬‬
‫تابع تعريف شده در مثال زير را بررسي نمائيد‪:‬‬
‫>‪#include <stdio.h‬‬
‫)(‪void Hello‬‬
‫{‬
‫;)"‪printf("Hello\n‬‬
‫}‬

‫)(‪void main‬‬
‫{‬
‫;)(‪Hello‬‬
‫}‬
‫پارامتر هاي تابع‪ ،‬مقاديري هستند که ما به يك تابع ميدهيم تا بتواند آنها را محاسبه‬
‫کند‪ .‬شما بايد در داخل پرانتز هاي پارامتر‪ ،‬متغيرها را بياوريد تا مقدار پارامتر را که‬

‫‪1‬‬ ‫‪Functions‬‬

‫‪30‬‬
‫قابل قبول است در تابع قرار دهد‪ .‬دراينجا ما ‪ Function Add‬که دو پارامتر را با هم‬
‫جمع مي کند آورده شده است‪:‬‬
‫>‪#include<stdio.h‬‬
‫)‪int Add(int a, int b‬‬
‫{‬
‫;‪return a+ b‬‬
‫}‬

‫)(‪void main‬‬
‫{‬
‫;‪int answer‬‬
‫;)‪answer = Add(5, 7‬‬
‫}‬
‫شما ميتوانيد آدرس متغير را در يك تابع قرار دهيد‪ ،‬در اينجا کپي صورت نميگيرد‬
‫و شما نياز به اشارهگر داريد‪.‬‬
‫>‪#include<stdio.h‬‬

‫)‪int Add(int *a, int *b‬‬


‫{‬
‫;‪return *a + *b‬‬
‫}‬

‫)(‪int main‬‬
‫{‬
‫;‪int answer‬‬
‫;‪int num1 = 5‬‬
‫;‪int num2 = 7‬‬
‫;)‪answer = Add(&num1, &num2‬‬
‫;)‪printf("%d\n", answer‬‬
‫;‪return 0‬‬
‫}‬
‫‪ -10-4-1‬متغیرهای سراسری و محلی‬
‫متغيرهاي محلي‪ 1‬فقط در داخل يك تابع قابل استفاده هستند و بيرون از آن نميشود‬
‫از اين نوع متغيرها استفاده کرد‪ .‬اگر شما نياز داريد که بتوانيد از يك متغير در تمامي‬
‫قسمتهاي برنامه استفاده کنيد‪ ،‬بايد آن را سراسري‪ 2‬تعريف کنيد‪.‬‬
‫>‪#include<stdio.h‬‬
‫‪1‬‬ ‫‪Local‬‬
‫‪2‬‬ ‫‪Global‬‬

‫‪31‬‬
int a; // Global variables
int b; // Global variables

int Add()
{
return a + b;
}

int main() {
int answer; // Local variable
a = 5;
b = 7;
answer = Add();
printf("%d\n", answer);
return 0;
}

32
‫آشنايي با پورتها‬ ‫فصل دوم‬

‫با توجه به اينکه اين کتاب با عنوان پروژههاي کاربردي با استفاده از ميکروکنترلر‬
‫‪ AVR‬است‪ ،‬فرض بر آن است که خوانندگان کتاب از آشنايي مقدماتي با‬
‫ميکروکنترلرهاي ‪ AVR‬برخوردار هستند‪ .‬بر مبناي اين فرض‪ ،‬جزئيات بيشتر در‬
‫رابطه با معماري ساخت اين تراشهها و انواع خانوادههاي آنها بحث نخواهند شد‪.‬‬
‫در صورت تمايل به يادگيري بيشتر ميتوانيد به مراجع آخر کتاب مراجعه نمائيد‪.‬‬
‫در اين فصل‪ ،‬کار با پورتهاي موازي ميکروکنترلر ‪ AVR‬به صورت پروژههاي‬
‫کاربردي آموزش داده ميشود‪ .‬دقت شود‪ :‬کليه برنامهها به زبان برنامهنويسي ‪ C‬و در‬
‫محيط نرمافزار ‪ CodeVisionAVR‬نوشته و کامپايل ميشوند‪ .‬سپس توسط نرم افزار‬
‫‪ Proteus‬شبيهسازي شده و با اجراي آنها‪ ،‬صحت برنامههاي نوشته شده‪ ،‬آزمايش و‬
‫تائيد ميشود‪.‬‬

‫‪ ‬پروژه اول‪ :‬چراغ چشمکزن‬


‫‪ ‬برنامهاي بنويسيد که يك ‪ LED‬متصل به يکي از پايههاي ميکروکنترلر را به‬
‫صورت متوالي روشن و خاموش کند (بدون استفاده از محيط ويزارد برنامه‬
‫نوشته شود)؟‬

‫‪ ‬فرضيات پروژه‪ :‬ميکروکنترلر مورد استفاده ‪ ATmega16‬است و از کريستال‬


‫داخلي ‪ 4‬مگاهرتز استفاده شده است‪ LED .‬به پين صفرم از پورت ‪ B‬متصل‬
‫شده است و ‪ LED‬به صورت متوالي يك ثانيه روشن و يك ثانيه خاموش‬
‫ميشود‪.‬‬
‫‪ ‬حل‪ :‬توضيحات الزم براي نوشتن برنامه‪ :‬ميکروکنترلر ‪ ATmega16‬داراي چهار‬
‫پورت است که به ترتيب آنها را ‪ C ،B ،A‬و ‪ D‬ميناميم‪ .‬هر يك از آنها داراي‬
‫هشت پايه (پين) هستند که به صورت صفر تا هفت شمارهگذاري ميشوند‪ .‬به‬
‫عنوان مثال‪ :‬پين صفرم پورت ‪ B‬با ‪ PB.0‬نشان داده ميشود‪.‬‬
‫‪ ‬يادآوري‪ :‬رجيسترهاي مورد استفاده براي تنظيم پورتها مطابق زير هستند‪:‬‬
‫رجيسترهاي پورتهاي ورودي خروجي (‪:)I/O‬‬

‫‪33‬‬
‫‪ -1‬رجيستر ‪ : DDRX‬اين رجيستر براي تنظيم جهت ورودي يا خروجي پايه‬
‫استفاده ميشود‪ .‬به اين ترتيب که‪ :‬اگر بيتي در رجيستر ‪ DDRX‬يك شده باشد‪،‬‬
‫پين متناظر با آن در حالت خروجي و با مقدار صفر در حالت ورودي قرار‬
‫ميگيرد‪ .‬که مطابق جدول (‪ )1-2‬است‪.‬‬
‫‪ -2‬رجيستر ‪ : PORTX‬اگر ‪ DDRX.pin=1‬باشد (پايه در حالت خرجي باشد) اين‬
‫رجيستر براي نوشتن يك مقدار منطقي در پين استفاده ميشود و اگر‬
‫‪ DDRX.pin=0‬باشد (پايه در حالت ورودي باشد) براي تنظيم امپدانس پايه به‬
‫کار ميرود‪ .‬که مطابق جدول (‪ )1-2‬است‪.‬‬
‫جدول (‪ :)1-2‬وضعیت پایهها بر اساس محتوای رجیسترهای متناظر‬

‫‪DDRX.PIN‬‬ ‫‪PORTX.PIN‬‬ ‫وضعيت يا مقدار پايه‬


‫(پين)‬

‫‪1‬‬ ‫‪0‬‬ ‫"‪"0‬‬

‫‪1‬‬ ‫"‪"1‬‬
‫‪0‬‬ ‫‪0‬‬ ‫‪Tri State‬‬
‫‪1‬‬ ‫‪( Pull-up‬باالکش)‬

‫‪ ‬در حالت ‪ ،Tristate‬امپدانس پايهي مورد نظر بي نهايت شده و ارتباط بين‬
‫پايه و مدار داخلي پورت قطع ميگردد‪.‬‬
‫‪ ‬در حالت ‪ ،Pull-up‬پين مورد نظر با يك مقاومت باالکش داخلي به ‪Vcc‬‬
‫متصل ميگردد‪ .‬اين حالت ورودي براي اتصال مدارهايي که خروجي سه‬
‫حالته دارند به پايه ورودي ميکروکنترلر مناسب است‪.‬‬
‫‪ -3‬رجيستر ‪ : PINX‬اين رجيستر‪ ،‬تنها يك رجيستر خواندني است که مقدار منطقي‬
‫روي پايهها را مستقل از اين که در حالت ورودي يا خروجي پيکربندي شده‬
‫باشند‪ ،‬نشان ميدهد‪.‬‬
‫‪ ‬حداکثر جرياني که هر پين در حالت خروجي تامين ميکند به اندازهي‬
‫است که بتواند يك ‪ LED‬را روشن نمايد‪ .‬به همين دليل‪ ،‬ميتوان ‪ LED‬ها‬
‫را مستقيماً به پايههاي مورد نظر از ميکروکنترلر متصل نمود (جرياني به‬
‫اندازهي ‪ 40mA‬در ولتاژ تغذيهي پنج ولتي و جريان ‪ 20mA‬در ولتاژ‬
‫تغذيهي سه ولتي)‪.‬‬

‫‪34‬‬
‫‪ ‬با فعالسازي بيت ‪( PUD‬يعني نوشتن يك در بيت ‪ )PUD‬در رجيستر‬
‫‪ SFIOR‬ميتوان مقاومتهاي باالکش کليه پورتها را غير فعال نمود‪.‬‬
‫‪ ‬در نرمافزار ‪ CodevisionAVR‬بايد رجيستر ها با حروف بزرگ نوشته‬
‫شوند‪.‬‬

‫ابتدا کليه مراحل الزم را به منظور ايجاد يك پروژه بدون استفاده از ويزارد انجام‬
‫دهيد‪ ،‬سپس درمحيط ايجاد شده‪ ،‬برنامهاي مطابق زير بنويسيد‪:‬‬
‫‪ ‬برنامه‪:‬‬
‫>‪#include <mega16.h‬‬
‫>‪#include <delay.h‬‬
‫)‪void main(void‬‬
‫;‪{DDRB.0=1‬‬
‫;‪PORTB.0=0‬‬
‫)‪while (1‬‬
‫{‬
‫;‪PORTB.0=1‬‬
‫;)‪delay_ms(1000‬‬
‫;‪PORTB.0=0‬‬
‫;)‪delay_ms(1000‬‬
‫};}‬
‫‪ ‬شرح برنامه‪ :‬همانطور که مشاهده ميشود ابتدا کتابخانه مربوط به ميکروکنترلر‬
‫‪) AVR‬که در اينجا ‪ ATmega16‬است( و کتابخانه تاخير‪ ،‬در ابتداي برنامه قرار‬
‫داده شدهاند‪ .‬با استفاده از ‪ DDRB.0=1‬پين صفرم از پورت ‪ B‬به عنوان خروجي‬
‫و توسط ‪ PORTB.0=0‬با مقدار صفر مقداردهي اوليه شده است‪ .‬پس از اجراي‬
‫برنامه‪ ،‬دستورات درون حلقه ‪ while‬براي هميشه تکرار ميشوند‪ .‬به اين صورت‬
‫که‪ :‬ابتدا ‪ PORTB.0‬يك و پس از يك ثانيه صفر ميشود و دوباره پس از يك‬
‫ثانيه يك ميشود‪ .‬در صورتي که پايه مثبت (آند) يك ‪ LED‬به ‪PORTB.0‬‬
‫ميکرو متصل و پايه منفي (کاتد) ‪ LED‬به زمين وصل شود اين ‪ LED‬بهصورت‬
‫متناوب و با تاخير يك ثانيه روشن و خاموش ميشود‪.‬‬
‫‪ ‬کامپايل و برنامهريزي تراشه‪ :‬پس از اتمام نوشتن برنامه بر روي گزينه ‪Compile‬‬
‫‪ and Make‬کليك کرده يا کليدهاي ‪ Shift‬و ‪ F9‬را به صورت همزمان فشار‬
‫داده تا فايل ‪ Hex‬آن توليد شود‪ .‬پنجرهاي مطابق شکل (‪ )1-2‬ظاهر ميشود که‬
‫وضعيت عمل کامپايل و ساخت فايل ‪ Hex‬را نشان ميدهد و در صورتي که‬
‫برنامه اشکالي (اماليي‪ ،‬ساختاري و نظاير آن) نداشته باشد‪ ،‬عبارت ‪No errors‬‬
‫در آن ظاهر ميشود‪ .‬اکنون که برنامه به درستي کامپايل و فايل ‪ Hex‬ساخته‬

‫‪35‬‬
‫شده است‪ ،‬ميبايد فايل ‪ Hex‬به ميکروکنترولر انتقال يابد (ميکروکنترولر پروگرم‬
‫شود)‪ .‬با توجه به پروگرمر ساخته شده در فصل اول‪ ،‬که از نوع ‪STK200/300‬‬
‫است‪ ،‬در محيط ‪ CodeVisionAVR‬از گزينهي ‪ Setting‬بر روي ‪Programmer‬‬
‫کليك کرده تا پنجرهي شکل (‪ )2-2‬ظاهر شود و از ‪AVR programmer‬‬
‫گزينهي ‪ STK 200/300‬را انتخاب کرده و دکمهي ‪ OK‬را فشار داده تا پروگرمر‬
‫مورد نظر انتخاب شود‪.‬‬

‫شکل (‪ :)1-2‬نتیجهی عملیات کامپایل‬

‫شکل (‪ :)2-2‬انتخاب نوع پروگرمر‬

‫‪36‬‬
‫‪ ‬اکنون‪ ،‬نوبت پروگرم نمودن ميکروکنترلر است‪ .‬مطابق شکل (‪ )4-1‬از فصل‬
‫اول‪ ،‬ميکروکنترولر را به پروگرمر متصل نموده و منبع تغذيه را روشن نمائيد‪ .‬با‬
‫فشردن همزمان کليدهاي ‪ Shift‬و ‪ F4‬پنجرهاي مطابق شکل (‪ )3-2‬ظاهر‬
‫ميشود‪ ،‬فيوز بيتها را براي نوسان ساز داخلي ‪ 4‬مگاهرتز و ساير قسمتها را‬
‫مطابق شکل (‪ )3-2‬تنظيم و سپس بر روي ‪ Program All‬کليك نمائيد تا‬
‫ميکروکنترلر مورد نظر‪ ،‬برنامهريزي شود‪ .‬به منظور آشنايي کامل با قسمتهاي‬
‫مختلف نرمافزار‪ ،‬همچنين روش دقيق برنامه ريزي ميکروکنترلر به ‪ CD‬همراه‬
‫کتاب مراجعه شود‪.‬‬

‫شکل (‪ :)3-2‬روش تنظیمات فیوز بیتها و برنامهریزی میکروکنترلر‬

‫‪ ‬تمرين‪ :‬برنامه زير‪ ،‬برنامه يك فالشر است‪ :‬ابتدا آن را تحليل و سپس در محيط‬
‫‪ Codevision‬بنويسيد و اجراي آن را توسط نرمافزار ‪ Proteus‬مشاهده نمائيد؟‬
‫>‪#include <mega16.h‬‬
‫>‪#include <delay.h‬‬
‫‪#define xtal 4000000‬‬
‫;‪int i‬‬
‫)‪void main (void‬‬
‫;‪{DDRD = 0xFF‬‬
‫)‪while(1‬‬

‫‪37‬‬
‫)‪{ for(i = 1; i <= 128; i = i*2‬‬
‫};)‪{PORTD = i;delay_ms(100‬‬
‫)‪for(i = 128; i > 1; i = i/2‬‬
‫};)‪{PORTD = i;delay_ms(100‬‬
‫}‬
‫}‬
‫‪ ‬پروژه دوم‪ :‬كنترل چراغ راهنمايي با نمايش مدت انتظار‬
‫‪ ‬بدون استفاده از وقفهها و تايمرهاي ميکروکنترلر‪ ،‬برنامهاي بنويسيد که چراغهاي‬
‫راهنمايي دو زمانه يك چهار راه را کنترل کند و با پيشنهاد يك روش بهينه به‬
‫منظور استفاده از پايههاي ميکروکنترلر برنامه دو شمارنده معکوس شمار دو‬
‫رقمي را براي دو سمت چهار راه بنويسيد؟‬
‫‪ ‬فرضيات پروژه‪ :‬ميکروکنترلر مورد نظر ‪ ATmega16‬است و از کريستال داخلي‬
‫‪ 4‬مگاهرتز استفاده شده است‪ .‬براي اين منظور ‪ 6‬عدد ‪ LED‬به پايههاي پورت‬
‫‪ D‬ميکروکنترلر مطابق جدول (‪ )2-2‬متصل شدهاند‪ .‬وضعيت رنگ دو چراغ‬
‫نسبت به هم مانند شکل (‪ )4-2‬است‪ .‬يك شستي تغيير وضعيت (‪)Toggle‬‬
‫براي اين چراغ الزم است که مامور راهنمايي و رانندگي بتواند با هر بار فشردن‬
‫آن وضعيت چراغها را به طور همزمان عوض کند‪.‬‬

‫جدول (‪ :)2-2‬نحوه اتصال چراغهای راهنمایی به پورتهای میکروکنترلر‬

‫‪38‬‬
‫شکل (‪ :)4-2‬وضعیت و مدت زمان روشن و خاموش بودن چراغهای راهنما‬

‫براي اين کار‪ ،‬شستي متصل به پايهي ‪ PD3‬درنظر گرفته شده است‪ .‬با فشردن اين‬
‫شستي‪ ،‬تنها در زماني که يکي از چراغها سبز و ديگري قرمز است‪ ،‬بايد باعث شود‬
‫که‪ :‬چراغي که سبز است‪ ،‬سه ثانيه نارنجي و سپس قرمز شود و چراغي که قرمز‬
‫است‪ ،‬چهار ثانيه بعد سبز شود‪.‬‬
‫‪ ‬راهنمايي‪ :‬در هر بار پايان يافتن کوچکترين حلقهاي که براي ساختن زمآنها‬
‫نوشتهايد‪ ،‬وضعيت کليد را چك کنيد‪ .‬دقت کنيد که فاصلهي بين دوبار چك‬
‫کردن اين وضعيت در صورت فشرده نشدن در حدود چند ميلي ثانيه و در‬
‫صورت فشرده شدن در حد چند ثانيه باشد‪ ،‬که اين خود يك نوع ‪Debounce‬‬
‫نرم افزاري است‪.‬‬

‫‪1‬‬
‫‪ ‬يادآوري‪ :‬براي نمايش اطالعات روي چند نمايشگر «هفت قسمتي»‬
‫توسط ميکروکنترلر و براي کاهش تعداد پايههاي به کار رفته‪ ،‬معموالً از روش‬
‫تسهيم «خط ‪ -‬داده»‪ 2‬استفاده ميشود‪ .‬اين نحوه نمايش بر پايه اين مطلب‬
‫استوار است که سيستم بينايي انسان قادر به تشخيص و تفكي‬
‫رويدادهايي که با سرعت بيش از حدود ‪ 17‬بار در ثانيه روي ميدهد‪،‬‬
‫نيست‪ .‬مثالً چشم ما‪ ،‬المپي را که ‪ 100‬بار در ثانيه روشن و خاموش‬
‫ميشود‪ ،‬به طور پيوسته روشن ميبيند‪ ،‬ولي با شدت نور کمتر از‬
‫حالت روشن بودن دائم آن قابل رويت است‪.‬‬

‫‪1‬‬ ‫‪7-Segment‬‬
‫‪2‬‬ ‫‪Line-Data Multiplex‬‬

‫‪39‬‬
‫يك روش معمول در اتصال و بستهبندي‪ 1‬چند نمايشگر هفت قسمتي‪،‬‬
‫قسمتهاي متناظر همهي نمايشگرها به هم و در نهايت خارج کردن ‪ 8‬پايه‬
‫(هفت قسمت به همراه يك نقطه) از بستهبندي‪ ،‬به عنوان پايههاي دادهي‬
‫نمايشگر و خارج کردن جداگانهي خط مشتر هر نمايشگر به عنوان پايهي‬
‫فعالساز (يا همان آدرس) آن نمايشگر‪ ،‬است‪ .‬بنابراين از يك بستهي ‪ 4‬تايي از‬
‫نمايشگرهاي ‪ 7‬قسمتي که به اين روش بستهبندي شده است‪ 12 ،‬پايه شامل ‪8‬‬
‫پايه داده مشتر ميان همه نمايشگرها و ‪ 4‬پايه فعالساز مخصوص هر‬
‫نمايشگر (يا همان پايههاي آدرس) خارج ميشود‪ .‬بنابراين‪ ،‬در اين نوع اتصال‬
‫در هر لحظه از زمان تنها يك دادهي واحد ميتواند روي تعداد دلخواهي از آنها‬
‫به نمايش در آيد‪ .‬مالتي پلکس خط‪-‬داده همان روشي است که براي نمايش يك‬
‫دادهي دلخواه (که لزوم ًا براي همهي نمايشگرها مشابه نيست‪ ).‬روي اين‬
‫نمايشگرها به کار ميرود‪ .‬اگر با سرعت باال و در کسري از ثانيه‪ ،‬دادهي مربوط‬
‫به هر نمايشگر را همزمان با فعال کردن آن‪ ،‬روي خط داده ارسال کنيم‪ ،‬سپس‬
‫دادهي نمايشگر بعد را همزمان با فعال کردن آن و به همين ترتيب تا آخرين‬
‫نمايشگر پيش برويم و مجدد ًا به نمايشگر اول بازگشته و اين کار را به طور‬
‫مداوم ادامه دهيم‪ ،‬با توجه به همان نکتهاي که ذکر شد‪ ،‬کل داده به صورت ثابت‬
‫و در يك زمان‪ ،‬روي مجموعهي نمايشگرها مشاهده ميشوند‪ .‬با اين کار به‬
‫‪2‬‬
‫جاي استفاده از ‪ 32‬پايهي ميکروکنترلر ميتوان از ‪ 12‬پايهي آن براي راه اندازي‬
‫کامل ‪ 4‬نمايشگر هفت قسمتي استفاده کرد‪.‬‬

‫‪ ‬حل‪ :‬به منظور کاهش بيشتر تعداد پايههاي به کار رفته‪ ،‬ميتوان از يك «مبدل کد‬
‫باينري به ‪ 7‬قسمتي»‪( 3‬تراشه ‪ )7447‬به عنوان واسط خط داده و از يك‬
‫«کدگشاي ‪ 2‬به ‪ 4‬خطي»‪ 4‬به عنوان واسط خط آدرس (تراشه ‪ )74139‬استفاده‬
‫کرد که اين امر منجر به استفاده بهينه از پايههاي ميکرو ميشود و در شکل (‪-2‬‬
‫‪ )5‬نشان داده شده است‪ .‬جهت پيادهسازي نرم افزاري‪ ،‬ابتدا کليه مراحل الزم را‬
‫به منظور ايجاد يك پروژه بدون استفاده از ويزارد انجام داده‪ ،‬سپس درمحيط‬
‫ايجاد شده‪ ،‬برنامهاي مطابق زير بنويسيد‪:‬‬

‫‪1‬‬ ‫‪Package‬‬
‫‪2‬‬ ‫‪Drive‬‬
‫‪3 BCD to 7-segment Decoder‬‬
‫‪4 2-to-4-Line Decoder/Demultiplexer‬‬

‫‪40‬‬
:‫ برنامه‬
#include <mega32.h>
#include <delay.h>
int s,x,m,n,q,r,i,b,t,d;
void output(void);
void time(void);
void change(void);
void main()
{ DDRA=0x3F; DDRD=0x77; t=2;
while(1){
if(t==2){s=25;x=29;}
if(t==1){s=14;x=10;}
m=s%10;
n=s/10;
q=x%10;
r=x/10;
time();
}//end of while
}
//*****************************************************
void time(void){
int f=1;
if(t==1)PORTD=0x14;
if(t==2)PORTD=0x41;
while(f){d=25;
while(d){
for(i=0;i<4;i++){
if(PIND.3==1)change();
switch(i){
case 3:b=n; break;
case 2:b=m; break;
case 1:b=r; break;
case 0:b=q; break;}//end of switch
output();
delay_ms(5);}//end of for
d--;}//end of while
if(q==0 & r==3)r=0;
if(m==0 & n!=0){n--;m=9;} else if(n==0 & m!=0){n=0;m--;} else
if(m!=0 & n!=0)m--;
if(q==0 & r!=0){r--;q=9;} else if(r==0 & q!=0){r=0;q--;} else if(q!=0 &
r!=0) q--;

41
if(m==0 & n==0){if(t==1){t=2;f=0; goto exit;}
else if(q<5&q>1)PORTD=0x42; else if(q<2)PORTD=0x44;}
if(q==0 & r==0){if(t==2){t=1;f=0;} else if(m<4 & m>1)PORTD=0x24;
else if(m==1){PORTD=0x44;r=3;q=0;}}
exit:
//end of exit
}//end of while
}
//*****************************************************
void output(void){
int c;
switch(b){
case 0:c=0x03;break;
case 1:c=0x07;break;
case 2:c=0x0B;break;
case 3:c=0x0F;break;
case 4:c=0x13;break;
case 5:c=0x17;break;
case 6:c=0x1B;break;
case 7:c=0x1F;break;
case 8:c=0x23;break;
case 9:c=0x27;break;
}//end of switch
if(i==0) PORTA=c&0xFC;
if(i==1) PORTA=c&0xFD;
if(i==2) PORTA=c&0xFE;
if(i==3) PORTA=c&0xFF;
}//end of output
//*****************************************************
void change(void){
if(t==2 & m>0){PORTD=0x42;m=0;n=0;r=0;q=4;d=25;}
if(t==1 & q>0){PORTD=0x24;m=3;n=0;r=0;q=0;d=25;}
}

42
2
2
2
2

13
12
11
10
9
15
14
U4

QF

QA
QB
QE

QC
QD
QG
7447
U1

1
1
1
1
9 22

43
U2:A RESET PC0/SCL
23
PC1/SDA
7 1 13 24
Y3 E XTAL1 PC2/TCK
6 12 25
Y2 XTAL2 PC3/TMS
5 3 26
Y1 B PC4/TDO

A
B
C
D
BI/RBO
RBI
LT
4 2 40 27
Y0 A PA0/ADC0 PC5/TDI
39 28

7
1
2
6
4
5
3
PA1/ADC1 PC6/TOSC1
74HCT139 38 29
PA2/ADC2 PC7/TOSC2
37
PA3/ADC3
36 14
PA4/ADC4 PD0/RXD
35 15
PA5/ADC5 PD1/TXD
34 16
PA6/ADC6 PD2/INT0
33 17
PA7/ADC7 PD3/INT1
18
PD4/OC1B
1 19
PB0/XCK/T0 PD5/OC1A
2 20
PB1/T1 PD6/ICP
3 21
PB2/INT2/AIN0 PD7/OC2
4
PB3/OC0/AIN1
5 R1
PB4/SS
6 10k
PB5/MOSI
7 30
PB6/MISO AVCC
8 32
PB7/SCK AREF
ATMEGA32

‫ سخت افزارکنترل چراغ راهنمایی و نمایش مدت انتظار با میکروکنترلر‬:)5-2( ‫شکل‬


‫‪ ‬پروژه سوم‪ :‬نمايش كاراكترها بر روي نمايشگرهاي ماتريسي‬
‫‪ ‬برنامهاي بنويسيد که بر روي نمايشگر ماتريسي ‪ 88‬حروف ‪ B ،A‬و ‪ C‬را‬
‫نمايش دهد؟‬
‫‪ ‬فرضيات پروژه‪ :‬ميکروکنترولر مورد نظر ‪ ATmega16‬است و از کريستال داخلي‬
‫‪ 4‬مگاهرتز استفاده شده است‪ .‬براي اين منظور يك نمايشگر ماتريسي ‪ 88‬به‬
‫پايههاي پورت ‪ A‬و ‪ B‬ميکروکنترلر مطابق شکل (‪ )6-2‬متصل شدهاند‪.‬‬

‫‪ ‬حل‪ :‬به منظور نمايش حروف بر روي نمايشگر ماتريسي‪ ،‬از روش جاروب‬
‫نمودن سطرها و ستونها استفاده ميشود و ميبايد مطابق پروژه دوم عمل نمود‪.‬‬
‫‪ ‬برنامه‪:‬‬
‫>‪#include <mega16.h‬‬
‫>‪#include <delay.h‬‬
‫;‪unsigned char k; int l‬‬
‫‪unsigned char arr1[8]={0x18, 0x3C, 0x66, 0x66, 0x7E, 0x66, 0x66,‬‬
‫;}‪0x00‬‬
‫‪unsigned char arr2[8]={0x7E, 0x33, 0x33, 0x3E, 0x33, 0x33, 0x7E,‬‬
‫;}‪0x00‬‬
‫‪unsigned char arr3[8]={0x1E, 0x33, 0x60, 0x60, 0x60, 0x33, 0x1E,‬‬
‫;}‪0x00‬‬
‫)‪void main(void‬‬
‫;‪{PORTA=0xFF; DDRA=0xFF‬‬
‫;‪PORTB=0xFF; DDRB=0xFF‬‬
‫)‪while (1‬‬
‫)‪{for(l=0;l<1000;l++‬‬
‫)‪{for(k=0;k<=7;k++‬‬
‫;]‪{ PORTA=arr1[k‬‬
‫;)‪PORTB&=~(1<<k‬‬
‫;)‪delay_us(100‬‬
‫;‪PORTB=0xFF‬‬
‫}‬
‫}‬
‫)‪for(l=0;l<1000;l++‬‬
‫)‪{for(k=0;k<=7;k++‬‬
‫;]‪{ PORTA=arr2[k‬‬
‫;)‪PORTB&=~(1<<k‬‬
‫;)‪delay_us(100‬‬
‫;‪PORTB=0xFF‬‬
‫}‬

‫‪44‬‬
‫}‬
‫)‪for(l=0;l<1000;l++‬‬
‫)‪{for(k=0;k<=7;k++‬‬
‫;]‪{ PORTA=arr3[k‬‬
‫;)‪PORTB&=~(1<<k‬‬
‫;)‪delay_us(100‬‬
‫;‪PORTB=0xFF‬‬
‫}‬
‫}‬
‫}‬
‫}‬

‫شکل (‪ :)6-2‬نمایشگر ماتریسی برای نمایش حروف‬

‫‪ ‬تمرين‪ :‬برنامه زير را تحليل نمائيد و آن را در توسط نرمافزار ‪CodeVision‬‬


‫بازنويسي کنيد‪ .‬سپس نتايج آن را در محيط نرمافزار ‪ Proteus‬با نتايج شکل (‪-2‬‬
‫‪ )7‬مقايسه نمائيد؟‬

‫‪45‬‬
#include <mega32.h>
#include <delay.h>
unsigned char i,j,k,n,r, lsh, pos,char1,char2,charnum;
unsigned char ar1[17][8]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x1C,0x26,0x03,0xFF,0xFE,0x00,0x00,
0x00,0x1C,0x26,0x03,0xFF,0xFE,0x08,0x00,
0x00,0x14,0x41,0x81,0xFF,0x7E,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

void main(void)
{
charnum=13;
charnum=charnum-4;
PORTA=0x00;DDRA=0xFF;
PORTB=0x00;DDRB=0xFF;
PORTD=0xFF;DDRD=0xFF;

while(1)
{
pos=0;
for(i=0;i<=charnum;i++)
{
lsh=8;
for(r=1;r<=8;r++)
{
lsh--; pos++;
for(n=1;n<=33;n++)
{
for(k=0;k<=7;k++)
{
for(j=0;j<=4;j++)
{

46
char1=ar1[i+j][k]>>r;
char2=ar1[i+j+1][k]<<lsh;
PORTA=char1|char2;
PORTB|=1<<j;PORTB=0x00;
}
PORTD&=~(1<<k);
delay_us(66);
PORTD=0xFF;
}
}
}
}
}
} U7
9 22
RESET PC0/SCL
23
PC1/SDA
13 24
XTAL1 PC2/TCK
12 25
XTAL2 PC3/TMS
26
PC4/TDO
40 27
PA0/ADC0 PC5/TDI
39 28
PA1/ADC1 PC6/TOSC1
38 29
PA2/ADC2 PC7/TOSC2
37
PA3/ADC3
36 14
PA4/ADC4 PD0/RXD
35 15
PA5/ADC5 PD1/TXD
34 16
PA6/ADC6 PD2/INT0
33 17
PA7/ADC7 PD3/INT1
18
PD4/OC1B
1 19
PB0/XCK/T0 PD5/OC1A
2 20
PB1/T1 PD6/ICP
3 21
PB2/INT2/AIN0 PD7/OC2
4
PB3/OC0/AIN1
5
PB4/SS
6
PB5/MOSI
7 30
PB6/MISO AVCC
8 32
PB7/SCK AREF
ATMEGA32
19
16
15
12
9
6
5
2

19
16
15
12

19
16
15
12

19
16
15
12

19
16
15
12
9
6
5
2

9
6
5
2

9
6
5
2

9
6
5
2

U2
Q7
Q6
Q5
Q4
Q3
Q2
Q1
Q0

U3 U4 U5 U6
Q7
Q6
Q5
Q4
Q3
Q2
Q1
Q0

Q7
Q6
Q5
Q4
Q3
Q2
Q1
Q0

Q7
Q6
Q5
Q4
Q3
Q2
Q1
Q0

Q7
Q6
Q5
Q4
Q3
Q2
Q1
Q0

74LS373
74LS373 74LS373 74LS373 74LS373
OE

D7
D6
D5
D4
D3
D2
D1
D0
LE

OE

OE

OE

OE
D7
D6
D5
D4
D3
D2
D1
D0

D7
D6
D5
D4
D3
D2
D1
D0

D7
D6
D5
D4
D3
D2
D1
D0
LE

LE

LE

D7
D6
D5
D4
D3
D2
D1
D0
LE
11
1

18
17
14
13
8
7
4
3

11
1

18
17
14
13
8
7
4
3

11
1

18
17
14
13
8
7
4
3

11
1

18
17
14
13
8
7
4
3

11
1

18
17
14
13
8
7
4
3

‫ پیکربندی تابلوی روان ماتریسی‬:)7-2( ‫شکل‬

‫ عالوه بر مشاهده برنامه بازي‬،‫ همراه کتاب‬CD ‫ با مراجعه به‬:‫ بازي و سرگرمي‬
‫ سرعت‬Proteus ‫ با اجراي آن در محيط‬CodeVision ‫) در محيط‬Snake( ‫مار‬
.‫عمل خود را آزمايش نمائيد و در ساختار برنامه را تحليل کنيد‬

‫ ميزان‬،‫ زيرا‬.‫موتورهاي پلهاي داراي کاربرد زياد به منظور کنترل موقعيت است‬
.‫چرخش شفت موتور متناسب با تعداد پالسهاي اعمال شده به هر فاز آن ميباشد‬

47
‫اين موتورها‪ ،‬در کاربردهايي همچون درايورهاي سخت‪ ،‬پرينترهاي ماتريسي‪ ،‬کنترل‬
‫بازوهاي ربات و نظاير آن استفاده ميشوند‪ .‬هر موتور پلهاي از يك هسته متحر‬
‫مغناطيسي دائمي که به آن روتور (يا شفت) ميگويند و يك بخش ثابت که استاتور‬
‫ناميده ميشود‪ ،‬تشکيل شده است‪ .‬موتورهاي پلهاي عموم ًا داراي چهار سيمپيچ‬
‫استاتور هستند و به موتورهاي چهار فاز معروف ميباشند‪ .‬يك موتور پلهاي عالوه‬
‫بر چهار سيم ذکر شده‪ ،‬ممکن است يك يا دو سيم براي اتصال به ولتاژ تغذيه مثبت‬
‫يا منفي داشته باشد‪ .‬شکل (‪ )8-2‬ارتباط بين سيمپيچهاي استاتور را نشان ميدهد‪.‬‬
‫‪2‬‬
‫براي راهاندازي موتور پلهاي به طور کلي دو روش «گام کامل»‪ 1‬و «نيم گام»‬
‫وجود دارد‪ .‬که روش گام کامل‪ ،‬به دو رهيافت هدايت تكفاز و هدايت دو فاز‬
‫تقسيمبندي ميگردد که در ادامه به توضيح هر يك از اين روشها ميپردازيم‪.‬‬

‫شکل (‪ :)8-2‬نحوهی پیکربندی سیمپیچهای استاتور‬

‫الف‪ -‬راه اندازی موتور به صورت گام کامل‬


‫‪ -1‬راه اندازي موتور به روش هدايت تکفاز‪ :‬در اين روش مطابق شکل (‪،)9-2‬‬
‫در هر لحظه تنها يك جفت از سيمپيچهاي استاتور و روتور همديگر را جذب‬
‫ميکنند‪ .‬در اين صورت با فعالسازي مناسب سيمپيچهاي استاتور چهار حالت‬
‫شکل (‪ ،)9-2‬بوجود ميآيند‪ .‬به منظور راهاندازي موتور به صورت هدايت‬
‫تكفاز‪ ،‬بايد از جدول (‪ )3-2‬استفاده کرد‪ .‬با اجراي هر يك از اين حالتها‬
‫شفت موتور يك پله جابجا ميشود‪.‬‬

‫‪1‬‬ ‫‪Full Step‬‬


‫‪2‬‬ ‫‪Half Step‬‬

‫‪48‬‬
‫شکل (‪ :)9-2‬راهاندازی موتور پلهای به صورت هدایت تکفاز‬

‫جدول (‪ :)3-2‬مراحل راهاندازی موتور پلهای به صورت هدایت تکفاز‬


‫در‬ ‫سيمپيچ ‪ # A‬مرحله‬ ‫سيمپيچ ‪B‬‬ ‫سيمپيچ ‪C‬‬ ‫سيمپيچ ‪D‬‬ ‫خالف‬
‫جهت‬ ‫جهت‬
‫ساعت‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫ساعت‬
‫‪2‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬
‫‪3‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪0‬‬
‫‪4‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬

‫‪ -2‬راهاندازي موتور پلهاي به صورت هدايت دو فاز‪ :‬در اين روش‪ ،‬مطابق شکل‬
‫(‪ )10-2‬در هر لحظه هر دو جفت از سيمپيچهاي استاتور با قطبهاي ناهمنام‬
‫فعال ميشوند که در اين صورت قطبهاي روتور در جهت برايند قطب‬
‫مخالف استاتور قرار ميگيرند‪ .‬در اين حالت نيز با فعالسازي مناسب‬
‫سيمپيچهاي استاتور چهار حالت شکل (‪ )10-2‬بوجود ميآيند‪ .‬تفاوت اين‬
‫روش با روش قبل در اين است که‪ :‬در اين حالت گشتاور ايجاد شده افزايش‬

‫‪49‬‬
‫مييابد و براي کاربردهايي که به قدرت بيشتري نياز دارند مفيد است‪ .‬در اين‬
‫حالت‪ ،‬براي راهاندازي موتور از جدول (‪ )4-2‬استفاده ميشود‪ .‬با اجراي هر‬
‫يك از اين حالتها شفت موتور يك پله جابجا ميشود‪.‬‬

‫شکل (‪ :)10-2‬راهاندازی موتور پلهای به صورت هدایت دو فاز‬

‫جدول (‪ :)4-2‬مراحل راهاندازی موتور پلهای به صورت هدایت دو فاز‬


‫در‬ ‫سيمپيچ ‪ # A‬مرحله‬ ‫سيمپيچ ‪B‬‬ ‫سيمپيچ ‪C‬‬ ‫سيمپيچ ‪D‬‬ ‫خالف‬
‫جهت‬ ‫جهت‬
‫ساعت‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫ساعت‬
‫‪2‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬
‫‪3‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬
‫‪4‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬

‫ب‪ -‬راهاندازی موتور به صورت نیم گام‬


‫در اين حالت در هر بار تغيير وضعيت سيمپيچهاي استاتور‪ ،‬ميزان گردش موتور‬
‫نصف حالتهاي قبل خواهد بود‪ .‬در اين صورت به جاي چهار حالت مختلف‪،‬‬
‫هشت حالت وجود خواهد داشت که با فعال شدن مناسب آنها‪ ،‬ميتوان موتور را‬
‫راهاندازي نمود‪ .‬چگونگي عملکرد موتور در اين روش‪ ،‬مطابق شکل (‪ )11-2‬است‬

‫‪50‬‬
‫شکل (‪ :)11-2‬راهاندازی موتور پلهای به صورت نیم گام‬

‫جدول (‪ :)5-2‬مراحل راهاندازی موتور پلهای به صورت نیم گام‬

‫و از جدول (‪ )5-2‬به منظور راهاندازي موتور استفاده ميشود‪ .‬تفاوت اين روش با‬
‫روش راه اندازي گام کامل هدايت دو فاز اين است که‪ :‬در اين روش دقت موتور به‬

‫‪51‬‬
‫دو برابر افزايش مييابد ولي ميزان گشتاور توليد شده در اين حالت‪ ،‬به اندازهي ‪15‬‬
‫تا ‪ 30‬درصد کاهش مييابد‪.‬‬
‫زاویه پله‪ :‬موتورهاي پله اي مختلف‪ ،‬مشخصات گشتاور‪ ،‬ولتاژ و تعداد پله در دور‬
‫متفاوتي دارند‪ .‬تعداد پله در دور‪ ،‬ميزان دقت موتور را نشان ميدهد‪ .‬براي بدست‬
‫آوردن زاويه هر پله‪ ،‬ميتوان ‪ 360‬درجه را بر تعداد پله در دور تقسيم نمود‪ .‬جدول‬
‫(‪ )6-2‬تعداد پله در دور و زاويه هر پله را در چند موتور مختلف را نشان ميدهد‪.‬‬

‫جدول(‪ :)6-2‬زاویه پله برای انواع موتورهای پلهای‬


‫زاویهی پله‬
‫پله در دور‬
‫(درجه)‬
‫‪0.72‬‬ ‫‪500‬‬
‫‪1.8‬‬ ‫‪200‬‬
‫‪2.0‬‬ ‫‪180‬‬
‫‪2.5‬‬ ‫‪144‬‬
‫‪5‬‬ ‫‪72‬‬
‫‪7.5‬‬ ‫‪48‬‬
‫‪15‬‬ ‫‪24‬‬

‫سختافزار مورد نياز براي اتصال يك موتور پلهاي چهار فاز به ميکروکنترلر در‬
‫شکل(‪ )12-2‬ترسيم شده است‪ .‬از آنجايي که جريان دهي ميکرو براي تحريك‬
‫موتور پلهاي مناسب نيست‪ ،‬از تراشه ‪ ULN2003‬که حاوي بافر جريان ميباشد‪،‬‬
‫استفاده شده است‪ .‬مشخصات تراشههاي خانواده ‪ ULN200xA‬در جدول (‪)7-2‬‬
‫آورده شده است‪.‬‬

‫شکل(‪ :)12-2‬سختافزار مدار کنترل موتور پلهای ‪ 4‬فاز‬

‫‪52‬‬
‫‪ULN200xA‬‬ ‫جدول (‪ :)7-2‬مشخصات تراشههای خانواده‬
‫‪ULN2001A‬‬ ‫‪General Purpose, DTL, TTL, PMOS, CMOS‬‬
‫‪ULN2002A‬‬ ‫‪14-25V, PMOS‬‬
‫‪ULN2003A‬‬ ‫‪5V TTL , CMOS‬‬
‫‪ULN2004A‬‬ ‫‪6-15 V ,CMOS , PMOS‬‬

‫‪ ‬پروژه چهارم‪ :‬كنترل موتورهاي پلهاي‬


‫‪ ‬الف‪ -‬برنامهاي بنويسيد که يك موتور پلهاي ‪ 4‬فاز را با دقت ‪ 1.8‬به صورت‬
‫‪0‬‬

‫گام کامل هدايت تكفازي به اندازهي ‪ 900‬در جهت ساعتگرد بچرخاند؟‬

‫‪ ‬حل‪ :‬از آنجا که در تحريك به صورت پله کامل‪ ،‬هر بار تحريك روتور‪ ،‬منجر به‬
‫چرخش روتور به اندازه ‪ 1.80‬ميشود‪ .‬براي چرخش ‪ 900‬بايد ‪ 90/1.8=50‬بار‬
‫پالس فرمان توليد گردد‪.‬‬
‫‪ ‬برنامه‪:‬‬
‫>‪#include <mega16.h‬‬
‫>‪#include <delay.h‬‬
‫;‪int i=0, k=0,num‬‬
‫)‪void main(void‬‬
‫{‬
‫;‪DDRD=0x0F‬‬
‫;‪ACSR=0x80‬‬
‫;‪SFIOR=0x00‬‬
‫)‪for(i=1;i<=13;i++‬‬
‫{‬
‫;‪PORTD=0b00000001‬‬
‫;)‪delay_ms(30‬‬
‫;‪num++‬‬
‫)‪for(k=1;k<=3;k++‬‬
‫{‬
‫;‪PORTD=PORTD<<1‬‬
‫;)‪delay_ms(30‬‬
‫;‪num++‬‬
‫;‪if (num==51) k=4‬‬
‫}‬
‫}‬
‫}‬

‫‪53‬‬
‫‪ ‬ب‪ -‬برنامهاي بنويسيد که يك موتور پلهاي ‪ 4‬فاز را با دقت ‪ 1.80‬به صورت گام‬
‫کامل‪ ،‬به اندازهي ‪ 900‬در جهت ساعتگرد بچرخاند؟‬
‫‪ ‬حل‪ :‬براي تحريك نيم گام براي چرخش به اندازه ‪ 900‬بايد تعداد تحريكهاي‬
‫هدايت تكفاز ‪ 50‬مرتبه و تعداد تحريكهاي هدايت دو فاز نيز ‪ 50‬مرتبه باشند‬
‫به طوري که تحريك هدايت تكفاز و هدايت دو فاز به صورت يك در ميان به‬
‫طور متوالي صورت پذيرد‪.‬‬
‫‪ ‬برنامه‪:‬‬
‫>‪#include <mega16.h‬‬
‫>‪#include <delay.h‬‬
‫;‪int d,a,i=0,k=0,num‬‬
‫)‪void main(void‬‬
‫{‬
‫;‪DDRD=0x0F‬‬
‫;‪ACSR=0x80‬‬
‫;‪SFIOR=0x00‬‬
‫)‪for(i=1;i<=13;i++‬‬
‫{‬
‫;‪d=0b00000001‬‬
‫;‪a=0b00000011‬‬
‫)‪for(k=1;k<=4;k++‬‬
‫{‬
‫;‪PORTD=d‬‬
‫;‪d=d<<1‬‬
‫;)‪delay_ms(30‬‬
‫;‪PORTD=a‬‬
‫;‪a=a<<1‬‬
‫;‪if(a==24) a=9‬‬
‫;)‪delay_ms(30‬‬
‫;‪num++‬‬
‫;‪if(num==51) k=4‬‬
‫}‬
‫}‬
‫}‬
‫‪ ‬پ‪ -‬برنامهاي بنويسيد که يك موتور پلهاي ‪ 4‬فاز را با دقت ‪ 1.80‬به صورت پله‬
‫کامل‪ ،‬به اندازهي ‪ 3600‬در جهت ساعتگرد با سرعت ‪ 50‬دور در دقيقه‬
‫(‪ )RPM‬بچرخاند؟‬

‫‪54‬‬
‫‪ ‬حل‪ :‬براي اين که بتوان موتور را کنترل نمود‪ ،‬کافي است که تاخيرهاي مناسب‬
‫بين تحريكهاي متوالي فازها وجود داشته باشد‪.‬‬
‫در هر دقيقه‪ ،‬موتور ‪ 50‬دور ميچرخد‪ .‬يعني‪ ،‬هر دور چرخش موتور ‪1200‬‬
‫ميليثانيه زمان ميبرد‪.‬‬
‫در روش گام کامل‪ ،‬هر دور کامل يعني چرخش ‪ 360‬درجه نيازمند ‪ 200‬مرتبه‬
‫تحريك موتور پلهاي است (تعداد تحريكها در حالت هدايت تكفازي و‬
‫هدايت دو فازي يکسان هستند)‪ .‬يعني ميزان تاخير هر تحريك معادل ‪6‬‬
‫ميليثانيه است‪ .‬رابطه کلي در رابطه با زمان تاخير مطابق زير است‪:‬‬
‫(تعداد پله در دور ‪ ‬سرعت برحسب ‪ = 60/ (RPM‬ميزان تاخير در تحريك با گام کامل‬

‫براي مطالعه‪ :‬در روش نيم گام‪ ،‬هر دور کامل يعني چرخش ‪ 360‬درجه نيازمند‬
‫‪ 400‬مرتبه تحريك موتور پلهاي است (تعداد تحريكهاي هدايت تكفاز ‪200‬‬
‫مرتبه و تعداد تحريكهاي هدايت دو فاز نيز ‪ 200‬مرتبه ميباشد)‪ .‬يعني ميزان‬
‫تاخير هر تحريك معادل ‪ 3‬ميليثانيه است‪.‬‬

‫(تعداد پله در دور‪ 2‬سرعت برحسب ‪ = 60/ (RPM‬ميزان تاخير در تحريك نيم گام‬
‫‪ ‬برنامه‪:‬‬

‫>‪#include <mega16.h‬‬
‫>‪#include <delay.h‬‬
‫;‪int i=0, k=0,num‬‬
‫)‪void main(void‬‬
‫{‬
‫;‪DDRD=0x0F‬‬
‫;‪ACSR=0x80‬‬
‫;‪SFIOR=0x00‬‬
‫)‪for(i=1;i<=50;i++‬‬
‫;‪{PORTD=0b00000001‬‬
‫;‪delay_ms(6);num++‬‬
‫)‪for(k=1;k<=3;k++‬‬
‫;‪{ PORTD=PORTD<<1‬‬
‫;)‪delay_ms(6‬‬
‫;‪num++‬‬
‫} ;‪if(num==51) k=4‬‬
‫}‬
‫}‬

‫‪55‬‬
‫‪U3‬‬
‫‪22‬‬ ‫‪9‬‬
‫‪PC0/SCL‬‬ ‫‪RESET‬‬
‫‪23‬‬
‫‪PC1/SDA‬‬
‫‪24‬‬ ‫‪13‬‬
‫‪PC2/TCK‬‬ ‫‪XTAL1‬‬
‫‪25‬‬ ‫‪12‬‬
‫‪PC3/TMS‬‬ ‫‪XTAL2‬‬
‫‪26‬‬
‫‪PC4/TDO‬‬
‫‪27‬‬ ‫‪40‬‬
‫‪PC5/TDI‬‬ ‫‪PA0/ADC0‬‬ ‫‪+5V‬‬ ‫‪+12V‬‬
‫‪28‬‬ ‫‪39‬‬
‫‪PC6/TOSC1‬‬ ‫‪PA1/ADC1‬‬
‫‪29‬‬ ‫‪38‬‬
‫‪PC7/TOSC2‬‬ ‫‪PA2/ADC2‬‬
‫‪37‬‬
‫‪PA3/ADC3‬‬
‫‪14‬‬ ‫‪36‬‬
‫‪PD0/RXD‬‬ ‫‪PA4/ADC4‬‬
‫‪15‬‬ ‫‪35‬‬
‫‪PD1/TXD‬‬ ‫‪PA5/ADC5‬‬
‫‪16‬‬ ‫‪34‬‬ ‫‪Vcc‬‬
‫‪PD2/INT0‬‬ ‫‪PA6/ADC6‬‬ ‫‪U1‬‬
‫‪17‬‬ ‫‪33‬‬ ‫‪9‬‬ ‫‪4‬‬
‫‪PD3/INT1‬‬ ‫‪PA7/ADC7‬‬
‫‪18‬‬
‫‪PD4/OC1B‬‬
‫‪19‬‬ ‫‪1‬‬ ‫‪5‬‬
‫‪PD5/OC1A‬‬ ‫‪PB0/XCK/T0‬‬ ‫‪IN1‬‬ ‫‪VCC‬‬ ‫‪VS‬‬
‫‪20‬‬ ‫‪2‬‬ ‫‪7‬‬ ‫‪2‬‬
‫‪PD6/ICP‬‬ ‫‪PB1/T1‬‬ ‫‪IN2‬‬ ‫‪OUT1‬‬
‫‪21‬‬ ‫‪3‬‬ ‫‪10‬‬
‫‪PD7/OC2‬‬ ‫‪PB2/INT2/AIN0‬‬ ‫‪IN3‬‬
‫‪4‬‬ ‫‪12‬‬ ‫‪3‬‬
‫‪PB3/OC0/AIN1‬‬ ‫‪IN4‬‬ ‫‪OUT2‬‬
‫‪5‬‬ ‫‪6‬‬
‫‪PB4/SS‬‬ ‫‪ENA‬‬
‫‪6‬‬ ‫‪11‬‬ ‫‪13‬‬
‫‪PB5/MOSI‬‬ ‫‪ENB‬‬ ‫‪OUT3‬‬
‫‪30‬‬ ‫‪7‬‬
‫‪AVCC‬‬ ‫‪PB6/MISO‬‬
‫‪32‬‬ ‫‪8‬‬ ‫‪1‬‬ ‫‪14‬‬ ‫‪+72.0‬‬
‫‪AREF‬‬ ‫‪PB7/SCK‬‬ ‫‪SENSA‬‬ ‫‪OUT4‬‬
‫‪15‬‬
‫‪SENSB‬‬ ‫‪GND‬‬
‫‪ATMEGA16‬‬

‫‪L298‬‬ ‫‪8‬‬

‫‪R1‬‬ ‫‪R2‬‬
‫‪1‬‬ ‫‪1‬‬

‫تراشه ‪L298‬‬ ‫شکل(‪ :)13-2‬مدار کنترل موتور پلهای ‪ 4‬فاز با استفاده از‬

‫‪ ‬نكته‪ :‬اگر بخواهيم سرعت موتور را روي مقدار نسبتاً زياد تنظيم نمائيم‪،‬‬
‫نميتوان از لحظه راهاندازي موتور‪ ،‬تاخير بين تحريكهاي متوالي را بر اساس‬
‫سرعت مطلوب نهايي محاسبه کرد چرا که به دليل لختي زياد‪ ،‬آرميچر نميتواند‬
‫ميدان مغناطيسي استاتور را دنبال نمايد بنابراين بايد به تدريج سرعت ميدان‬
‫استاتور (تحريك استاتور) را افزايش دهيم تا روتور بتواند ميدان استاتور را‬
‫دنبال کند و اصطالحاً از حالت سنکرون خارج نشود‪.‬‬

‫‪56‬‬

You might also like