چشمك زن با وقفه 0 بيروني Interrupt
دوست عزيزي گفته بود كه يك برنامه مي خوام كه هر وقت يك وقفه بيروني براي ميكرو صادر شد ميكرو يك LED را روشن و خاموش كند.
نقشه مدار:

براي نمايش تصوير با وضوح بيشتر اينجا كليك كن
دوست عزيزي گفته بود كه يك برنامه مي خوام كه هر وقت يك وقفه بيروني براي ميكرو صادر شد ميكرو يك LED را روشن و خاموش كند.
نقشه مدار:

براي نمايش تصوير با وضوح بيشتر اينجا كليك كن
دستورات حلقه
دستور Do-Loop
اين دستور يه حلقه بينهايت ايجاد مي كند كه شما مي توانيد دستورات خودتان را دراين حلقه بنويسيد تا مدام توسط CPU تكرار شود. به عنوان مثال شما مي خواهيد كه يكي از بيت هاي پورت D به صورت يك چشكا زن عمل كنه و تا بي نهايت اين كار رو انجام بده كه برنامه رو به اين صورت مي نويسيم:
$regfile "m16def.dat"
$crystal=8000000
Config portd.0=output
شروع حلقه DO '
Set portd.0 'portd.0 = 1
يك ثانيه تاخيرWait 1 '
Reset portd.0 'portd.0= 0
Wait 1
پايان حلقه Loop '
End
در مثال بالا ميكرو تا ابد اين چند تا دستور رو انجام ميده و ديگه از اين حلقه هم بيرون نمياد!
البته در همين مثال شما مي توانستيد يك شرط بين دستورات بنويسيد تا ميكرو بتونه از اين حلقه بيرون بياد. مثلا يك ليد به ميكرو وصل كرده باشد و حالا اين كليد رو به صورت شرط درون اين حلقه مي نويسد. كه دستورات شرطي را در ادامه خواهيم گفت.
نوعي ديگري از حلقه loop هم هست كه تنها يك بار حلقه را اجرا مي كند (ولي دستورات داخل اون تا زماني كه شرط برقرار نشه اجرا ميشه) و بعد از اينكه شرط حلقه محقق شد از حلقه بيرون مياد.
امروز مي خوام در مورد STEPER MOTOR و نحوي اتصال اون به ميكرو 8051 رو به شما آموزش بدم همراه با برنامه و مدار اون. استپ موتور با آيسي راه انداز L298 مي باشد.
ابتدا جدول حركت استپ موتور:
|
خلاف جهت ساعت |
سيم پيچ D |
سيم پيچ C |
سيم پيچ B |
سيم پيچ A |
پله |
در جهت ساعت |
|
0 |
0 |
0 |
1 |
1 | ||
|
0 |
0 |
1 |
0 |
2 | ||
|
0 |
1 |
0 |
0 |
3 | ||
|
1 |
0 |
0 |
0 |
4 |
اصول راه اندازي استپ موتور به اينگونه مي باشد:
براي آموزش اين ميكرو از كامپايلر BASCOM و پروتيوس 7.2 استفاده مي كنيم.
زبان بيسك يك زبان راحت و سريع مي باشد يعني اينكه آنچه شما بر زبان مي آوريد رو اگر درقالب دستورات بيسكام بنويسيد اون كاري كه شما از ميكرو مي خواهيد رو براي شما انجام مي دهد. اكثر دستورات بيسكام يك واژه معني دار انگليسي مي باشد كه اگر معني اونا رو بدونيد ديگه دستورات براي همشه تو ذهن شما مي ماند.
ابتدا دستوراتي كه براي شروع يك برنامه لازم است بدانيم را توضيح مي دهيم:
معرفي ميكرو:
اولين دستور مهم و هميشگي كه توي همه برنامه ها بايد بنويسيم دستور $regfile هست كه ما به كمك اين دستور ميكرو خودمون رو به كامپايلر معرفي مي كنم و كامپايلر هم بر اساس اين مدل ميكرو دستورات را به زبان ماشين ترجمه مي كند. (فايل هاي هگز و باينري)
مثلا شما مي خواهيد از ميكروي ATMEGA8 استفاده كنيد كه به اين صورت اونو معرفي مي كنيد:
$regfile= "m8def.dat"
كه m8 معادل atmega8 و def.dat كه اكثرا ثابت هست.
معرفي كريستال:
براي معرفي كريستالي كه به ميكرو وصل مي كنيم از دستور $crystal استفاده مي كنيم به عنوان مثال اگر شما مي خواهيد به ميكرو كريستال 12 مگاهرتزي وصل كنيد اين طوري مي نويسيم:
فركانس را بر حسب هرتز مي نويسيم $crystal= 12000000
یکی از دوستان یه برنامه ماشین حساب خواسته بود به این صورت که فقط عملیات جمع و تفریق رو انجام بده و حداکثر تا دو رقم عدد از ورودی بخونه دو تا اول و بعد از جمع یا تفریق هم دو عدد و نهایتا حاصل جمع یا تفریق روی دو تا سون سگمنت نمایش داده شود.
يكي از دوستان گفته بود كه يه كمي درباره متغييرها و پايه RST توضيح بدم! كه منم يه توضيح مختصر دادم
توضيح برنامه:
در ابتداي برنامه من اومدم چند تا متغيير تعريف كردم يعني مثلا من گفتم مي خوام كه A1 همون خونه 40H باشه به جاي اينكه تو برنامه بيام و بنويسم 40H فقط نام متغيير يعني A1 رو مي نويسم.
حال اين متغير هاي براي چي هستند؟
متغير هاي A1,A2, براي براي نگهداري اولين، دو عدد وردي ما هستند و B1,B2 هم براي نگهداري دومين، دو عدد ورودي ما هستند. از همه مهم تر متغير POL هست كه خونه 20H مي باشد و همتنطور كه مي دانيم از رنج 20 تا 2F محدود بيتي و باتي هستند يعني اينكه ما هم مي تونيم به عنوان بيت و هم بايت ازش استفاده كنيم كه من از بيت دوم آن POL.1=20H.1 استفاده كرده ام. حال وظيفه اين بيت چيست؟ اين برنامه مي تونه تا حداكثر دو عدد از ورودي بخونه براي عمليات قبل از جمع يا تفريق و دو عدد هم بعد از جمع يا تفريق. حالا شايد شما بخواهيد 1 رو بعلاوه 23 كنيد مي بينيم كه عدد 1 يك عدد تك رقمي ميباشد كه نه دو رقمي وظيفه اين بيت POL1 در اينجا اينكه اگه ما يك عدد 1 راوارد كردم و بعد كليد + يا – را زديم اين بيت 1 مي شود و ديگه اجازه نميده كه عدد بعدي در A2 قرار بگيره يعني عدد 2 ميره تو B1 و عدد 3 هم ميره تو B2 . اين از وظيفه POL
متغير هاي TEMP1 , TEMP2 هم متغيير هاي موقت ما هستند كه اعداد ورودي به صورت موقت درونشون نگداري ميشه يعني اينكه شما همون جمع بالا رو در نظر بگيريد مگه اولين دو عدد ما همون 01 نميشه خوب دومين عد ما يعني 23 هست كه 2 با ارزش تر از 3 هست و اولين رقمي هم هست كه ميكرو دريافت ميكنه حالا من اومدم و اين دو عدد كه هر كدوم تو يه ثبات 8 بيتي بود رو تركيب كردم يعني عدد 23 رو تو يه ثبات جاي دادم كه اين كار رو شما مي تونيد به كمك دستور SWAP و دستور ORL انجام دهيد. به اين صورت كه اواين رقم ما 2 هست پس به كمك SWAP اون به سمت چپ يعني نيبل با ارزش انتقال ميديم حالا عدد 3 رو با اون OR مي كنيم و نيجيه اون يك عدد BCD فشرده خواهد شد. كه از TEMP1 ,TEMP2 براي اين كار استفاده كرديم.
يه نكته مهم:
وقتي ما دو عدد BCD فشرده رو با هم جمع مي كنيم ممكنه كه ديگه حاصل جمع ما BCD نباشه كه براي اينكار از دستور DA A استفاده مي كنيم اين دستور به طور اتوماتيك عدد 6 رو به نيبل پايين يا بالا اضافه ميكنه تا عدد به BCD تبديل بشه.
براي تفريق هم همين مشكل ممكنه پيش بياد كه بايد 6 واحد از نيبل پايين يا بالا كم كنيم كه من با گذاشتن يه شرط براي اون اگه BCDنبود به كمك دستور DEC يعني 6 تا از اين دستور مي تونيم اين كار ور انجام بديم.
در ضمن اگر نتيجه حاصل تفريق ما يك عد منفي بود 8051 اين حاصل تفريق رو به صورت متمم 2 رها مي كنه كه ما مي تونيم به كمك پرچم CY=1 به منفي بودن حاصل تفريق پي ببريم. يعني اينكه اگه CY=1 شد CPU اين عدد رو به صورت ممتم 2 رها مي كنه و ما به كمك اين پرچم خودمون بايد درستش كنيم يعني ابتدا ما اين عدد رو متمم مي كنيم كه دستور CPL اين كار رو انجام ميده و بعد از اون هم بايد يك واحد بهش اضافه كنيم كه با دستور INCاين كا رو انجام ميديم ويك LED رو هم روشن مي كنيم كه نشان دهند منفي بودن نتيجه عمليات بوده.
در مورد پايه RST : اين پايه با مدار ريستي كه دورش براي ريست كردن دستي ميكرو هست. مثل همون دكمه ريست كامپيوتر هست.!
براي وضوح بيشتر روي عكس يا اينجا كليك كنيد
دانلود فايلها (حجم ۷۲ كيلو بايت)
پسورد: mc8051.blogfa.com
اين برنامه را به درخواست يكي از دوستان نوشتم:
عملكرد برنامه: با استفاده از يك كيبورد 4*4 و يك نمايشگر ال سي دي و اتصال آن به 8051 مي خواهيم با وارد كردن هر عددي از كيبورد آن عدد روي ال سي دي نمايش داده شود.
براي وضوح بيشتر روي عكس يا اينجا كليك كنيد.
برنامه به زبان اسمبلي و از كامپايلر Keil و پروتيوس 7.2 استفاده شده. ميكرو استفاده شده 89c51 مي باشد.
در ضمن با عرض پوزش از دوستان بايد بگم كه سروري كه من بعضي از فايلها رو روش آپلود كردم فعلا قابل دانلود نيستند چون در حال آپديت سايت شان مي باشند.
با تشكر