همه چیز از همه جا برای تو

دنیای سرگرمی های خاص خاص

همه چیز از همه جا برای تو

دنیای سرگرمی های خاص خاص

مجموعه دستورات و ثبات ها در 8051


بانک های ثبات:

8051 دارای 8 ثبات با نامهای R0-R7 میباشد دستوراتی که از این ثباتها استفاده می کنند نسبت به دستورات مشابه خود که از انواع دیگر آدرس دهی استفاده می کنند دارای تعداد بیت کمتر و سرعت بیشتری هستند بنابراین در صورتی که از داده ای به طور متناوب در برنامه استفاده می کنیم بهتر است که این ...



برین ادامه مطلب

مجموعه دستورات و ثبات ها در 8051


بانک های ثبات:

8051 دارای 8 ثبات با نامهای R0-R7 میباشد دستوراتی که از این ثباتها استفاده می کنند نسبت به دستورات مشابه خود که از انواع دیگر آدرس دهی استفاده می کنند دارای تعداد بیت کمتر و سرعت بیشتری هستند بنابراین در صورتی که از داده ای به طور متناوب در برنامه استفاده می کنیم بهتر است که این داده در یکی از ثباتهای بانک ثبات قرار گیرد.

در 8051 , 4 بانک ثبات وجود دارد که در هر لحظه از زمان می توان فقط یکی از این بانکها را فعال و از آن استفاده کرد . برای فعال کردن یک بانک ثبات از دو بیت با نامهای PSW.3, PSW.4 استفاده می کنیم این 2 بیت اجزای ثبات PSW هستند.



ثبات PSW:

مخفف Program status word یا کلمه وضعیت سیستم است .این ثبات در هر سیکل ماشین بسته به وضعیت و جواب برنامه تغییر می کند و برنامه نویس می تواند بر اساس این تغییرات منطق برنامه را تغییر دهد. PSW مشابه FLAG های ریزپردازنده های سیستم های میکروکامپیوتری می باشد.

شکل زیر بیتهای ثبات وضعیت (PSW) را نشان می دهد.




C یا CY


AC


F0


RS1


RS0


OV


----


P










شکل 1-3







بیت توازن ((P :

این بیت تنظیم توازن زوج , مقدار آن صفر یا یک می شود . در صورتیکه تعداد یکهای داخل آکومولاتور فرد باشد این بیت یک می شود تا مجموع یکها زوج باشد این یک روش ساده تشخیص تعداد فرد خطا در انتقال اطلاعات می باشد.برای مثال اگر آکومولاتور عدد 00000011 را در مبنای دو در خود داشته باشد چون در این مثال تعداد 1 ها دو عدد می باشد بنابراین بیت توازن صفر می شود تا تعداد یکها ی زوج باقی بماند.این بیت اکثرا در روتین های پورت سری استفاده می شود به طوری که اطلاعات با بیت توازن ارسال می شود و در موقع دریافت اطلاعات بیت توازن تست می گردد.



بیت پرچم سرریز یا OV :

این بیت با نام OVER FLOW یا سرریز نام دارد. اگر هنگام جمع یا تفریق حسابی نتیجه حاصل بزرکتر از 127 + یا کوچکتر از 127- شود سرریز اتفاق می افتد و بیت OV برابر 1 می شود.



بیت های انتخاب بانک ثبات :(RS0,RS1)

این دو بیت به منظور فعال کردن یکی از 4 بانک ثبات مورد استفاده قرار می گیرد.مقدار پیش فرض این 2 بیت 00 است که بانک ثبات 0 را فعال می کند.



بیت :FO

این بیت با نام پرجم صفر هم شناخت هشده است. اگر نتیجه یک عمل حسابی صفر شوداین بیت یک می شود.



بیت :AC

در هنگام انجام عملیات حسابی در صورتی که از بیت شماره 3 به شماره 4 رقن نقلی داشته باشیم در این صورت این بیت یک می شود.



بیت پرچم نقلی یا :CY

این بیت به دو منظور به کار می رود:

1- در مواقع محاسبات یعنی زمانی که عمل جمع انجام می شود اگر از بیت 7 رقم خارج شود بیت C یک می شود.

2- اگر در زمان تفریق از بیت 7 قرض گرفته شود در این صورت بیت C برابر یک می شود.



ثبات A:

این ثبات Accumulator یا انباره نامیده می شود. این ثبات همه منظوره است . بیشتر دستورات میکروکنترولر با این ثبات کار می کنند بنابراین ابتدا باید داده در این ثبات قرار بگیرد سپس عملیات انجام شود.



ثبات :B

ثبات یا آکومولاتور B در آدرس F0H حافظه قرار دارد و معمولا با ثبات A برای محاسبات ضرب و تقسیم استفاده می شود.

ثبات B را می توان به عنوان یک ثبات عمومی برای هر کاربرد دیگری نیز لستفاده نمود. علاوه بر این بیت های ثبات B آدرس پذیر و از آدرس F0H تا F7H می باشند لذا می توان با دستورات روی بیت , عملیات بر روی آنها انجام داد.





ثبات DPTR یا اشاره گر داده:

این ثبات یک ثبات 16 بیتی است که از 2 ثبات 8 بیتی با نامهای DPL,DPH ساخته شده است و به عنوان اشاره گر داده به کار می رود.ای ثبات برای دسترسی به حافظه کد و داده خارجی به کار می رود. به عنوان مثال دستورات زیر عدد 55H را در حافظه داده خارجی RAM می نویسند:

MOV A,#55H

MOV DPTR,#1000H

MOV @DPTR,A



اشاره گر پشته یا :SP

SP یک ثبات 8بیتی می باشد که آدرس اطلاعات بالای حافظه پشته را دارا می باشد . عملیات حافظه پشته شامل قرار دادن اطلاعات در بالای حافظه پشته ( با دستور ( PUSH یا برداشتن اطلاعات (با دستور (POP از بالای حافظه پشته می باشد.

هربار که اطلاعات در حافظه پشته قرار می گیرد ابتدا به محتوای SP یک واحد اضافه می شود و سپس اطلاعات در حافظه پشته نوشته می شود ((PUSH

هربار که اطلاعاتی از حافظه پشته خوانده می شود ( ( POPابتدا اطلاعات خوانده می شود و سپس یک واحد از SP کم می شود.



روش های آدرس دهی:

مبحث مهمی که در برنامه نویسی به زبان اسمبلی وجود دارد شیوه های آدرس دهی است .منظور از آدرس دهی روش دستیابی میکروکنترلر به اطلاعات است . روش های آدرس دهی مبدا و مقصد داده ها را تعیین می کند و اینکه در جریان انتقال داده ها از مقصد به مبدا چه عملیات بیتی انجام می شود .

در 8051 . هشت نوع آدرس دهی وجود دارد که عبارتند از:

1- آدرس دهی ثبات((Rejister Addresing

2- آدرس دهی مستقیم((Direct Addresing

3- آدرس دهی غیر مستقیم((Indirect Addresing

4- آدرس دهی فوری ((Immediate Addresing

5- آدرس دهی نسبی ( (Relative Addresing

6- آدرس دهی مطلق ((Absolute Addresing

7- آدرس دهی بلند ((Long Addresing

8- آدرس دهی اندیس دار ((Index Addresing



1- آدرس دهی ثبات:

در 8051 هشت ثبات با نام بانک ثبات وجود دارد که این ثبات ها به صورت تک تک با نامهای R0-R7 شناخته می شوند تعدادی از دستورالعمل های 8051 بر روی این ثباتها کار می کنند ابن دستورالعملها را دستورهای با آدرس دهی ثبات گویند.در دستورا ت آدرس دهی ثبات , سه بیت کم ارزشتر کد دستور , آدرس ثباتهای مذکور را مشخص می کند بنابراین کد اجرا و آدرس ثبات در یک بایت دستور قرار می گیرد.

زبان اسمبلی میکروکنترولر 8051 , آدرس دهی ثبات را با سمبل RN مشخص می کند که N بین 0 تا 7 می باشد.به عنوان مثال برای اضافه کردن محتوای ثبات R7 به آکومولاتور دستور زیر استفاده می شود:

ADD A,R7



کد اجرای این دستور 00101111 است که 5بیت پر ارزشتر یعنی 00101 دستور جمع ADD و سه بیت کم ارزش تر آن یعنی 111 ثبات R7 را مشخص می نماید.

مثال2: کد اجرای دستور زیر چیست و این دستور چه عملی انجام می دهد؟



MOV A,R7

فرم کلی دستور MOV به صورت زیر است:

منبع , مقصد MOV

اصولا 15 نوع دستور MOV وجود دارد که در اینجا نوع MOV A,Rn را بررسی می کنیم. کد باینری این دستور به صورت 11101rrr است که سه بیت کم ارزش تر , آدرس ثبات منبع را مشخص می کند . با قرار دادن آدرس R7 یعنی 111 در کد باینری به جای rrr خواهیم داشت 11101111 که کد EFH برای دستور مذکور حاصل می شود.دستور مذکور محتوای ثبات R7 را به آکومولاتور منتقل می کند.



آدرس دهی مستقیم:

همانطور که می دانیم هر بیت (8 بیت) از حافظه میکرو به وسیله عددی منحصر به فرد که شماره ردیف آن بیت است مشخص می شود , این عدد منحصر به فرد آدرس نام دارد. از این جهت می گوییم منحصر به فرد زیرا هیچ دو بیت از حافظه میکرو دارای یک آدرس نیستند.

لذا با استفاده از این آدرس می توان به کلیه مکانهای حافظه دسترسی داشت . آدرس دهی مستقیم از این آدرس استفاده می کند. علائه بر آدرس , بیشتر مکانهای حافظه دارای نام نیز هستند. برای مثال پورت یک هم دارای آدرس 90H است و هم نام P1 را دارد. استفاده از هر دو (نام یا آدرس ) در برنامه نویسی مجاز است.

در برنامه نویسی هنگامی که عددی را بدون هیچ پیشوندی می نویسند نشان دهنده استفاده از آدرس دهی مستقیم است.

به عنوان مثال در دستور زیر:

MOV P1,A

که محتوای ثبات آکومولاتور (A) را به پورت P1 انتقال می دهد , از آدرس دهی مستقیم استفاده شده است.



آدرس دهی غیر مستقیم:

آدرس دهی غیر مستقیم از آدرس بایت مورد نظر استفاده می کند. تفائت آن با آدرس دهی مستقیم این است که در آدرس دهی غیر مستقیم آدرس مکان حافظه ابتدا در یکی از ثباتهای بانک ثبات قرار می گیرد و سپس ثبات مذکور به همراه پیشوند @ در دستورالعمل استفاده می شود.

کاربدر این نوع آدرس دهی برای مواقعی است که آدرس یک متغیر بیتی در زمان اجرای برنامه , نه در زمان نوشتن کد , محاسبه شود و نیز هنگام استفاده از مکانهای متوالی حافظه نیز باید از آدرس دهی غیر مستقیم استفاده کنیم . در موارد بالا نمی توانیم از آدرس دهی مستقیم و ثبات استفاده کنیم زیرا این دو آدرس دهی در هنگام کامپایل برنامه به آدرس مکان حافظه نیاز دارند در حالی که ما آدرس مکان حافظه را نمی دانیم.

برای فهم بیشتر مطلب دو دستور زیر را در نظر بگیرید:

MOV R0,#90h

MOV @R0,A

دستور اول عدد 90 در مبنای 16 را در ثبات R0 قرار می دهد. عدد 90h آدرس پورت یک می لاشد.دستور دوم به میکرو دستور می دهد تا محتوای ثبات A را در آدرسی که در R0 است (یا مکانی که R0 به آن اشاره می کند) قرار بده.

جمله بالا در مفاهیم برنامه نویسی به نام اشاره گر معروف است . اشاره گر متغیری است که آدرس مکان حافظه را در خود نگه می دارد.

در این دستور @R0 معادل همان P1 است.



آدرس دهی فوری یا بلافاصله:

در صورتی که بخواهیم یک عدد ثابت نه یک آدرس را در مکانی از حافظه قرار دهیم از آدرس دهی فوری استفاده می کنیم. دستور اول در مثال قبلی نوعی از آدرس دهی فوری بود . مشخصه آدرس دهی فوری استفاده از پیشوند # قبل از عدد است.

در صورتی که در یک دستور از عددی استفاده کنیم اگر عدد بدون پیشوند باشد نوع آدرس دهی مستقیم است و در صورتی که عدد پیشوند # داشته باشد آدرس دهی فوری خواهد بود.به این دو دستور توجه کنید تا این جمله را بهتر متوجه شوید:

MOV A,#90h

MOV A,9h

دستور اول عدد 90 در مبنای 16 را در ثبات A قارا می دهد . بعد از اجرای دستور مطمئن هستیم که محتوای ثبات A , . 90h است.دستور دوم مقداری را که در آدرس 90h حافظه است در ثبات A قرار می دهد یادآوری می کنم که 90h آدرس پورت یک است . بنابراین هر عددی که بر روی پورت یک باشد در درون ثبات A قرار خواهد گرفت و ما از مقدار این عدد هیچ اطلاعی نداریم.





آدرس دهی نسبی:

این نوع آدرس دهی در چند دستورالعمل پرشی به کار رفته است ( مانند ( sjmp با استفاده از این نوع آدرس دهی می توان به 127 بایت بالاتر و 127 بایت پایین تر از مکان فعلی برنامه پرش کرد. هنگامی که کامپایلر به این نوع دستورات پرشی می رسد آدرس مبدا را از آدرس مقصد تفریق می کند و نتیجه را به شمارنده برنامه اضافه می کند( (pc دستور زیر را در نظر بگیرید:



90 sjmp 100

اکنون در مکان 90 حافظه هستیم برنامه می خواهد به مکان 100 پرش کوتاه انجام دهد . آدرس مبدا از مقصد کم می شود (100-90) و به pc , +10 واحد اضافه می شود.

مزیت استفاده از این نوع آدرس دهی این است که کد مستقل از مکان ایجاد می کند.



آدرس دهی مطلق:

آدرس دهی مطلق فقط برای دستورات ACALL (فراخوانی سابروتین) و AJMP (پرش مطلق) به کار برده می شود و دو بایتی هستند . با این دستورات می توان تا 2K بایت در داخل یک صفحه حافظه پرش نمود.به عنوان مثال:

AJMP BACK



آدرس دهی بلند:

این نوع آدرس دهی با دستورات فذاخوانی سابروتین(( LCALL و دستور پرش بلند ((LJMP به کار برده می شود.این دستورات 3 بایتی هستند که در بایت دوم و سوم آنها آدرس 16 بیتی مقصد می باشد.

یکی از مزیتهای این دستورات این است که می توان به تمات فضای حافظه برنامه دسترسی پیدا کرد ولی اشکال آن ها این است که سه بایت طول دارند.به عنوان مثال:

LJMP FAR_AHEAD







آدرس دهی اندیس دار:

این نوع آدرس دهی در دستورات پرش ( ( JMP و انتقال ( (MOVC استفاده می شودکه محتوای ثبات پایه مانند((pc یا اشاره گر داده ((DPTR را با محتوای آکومولاتور جمع می کند تا آدرس مقصد حاصل شود.

هم چنین این نوع آدرس دهی در نوشتن جداول جستجو ((LOOUP TABLE استفاده می شود.به عنوان مثال:

MOVC A,@A+DPTR



انواع دستورات:

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

1- دستورات مربوط به cpuدر میکروکنترلر های 8051

2- دستورات مربوط به assembler

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



شروع برنامه نویسی:

اگرتاکنون بازبان های برنامه نویسی مختلف کارکرده باشید مشاهده کرده اید که تمامی آنها محیط مخصوص به خودرا دارا می باشندولیکن خصوصیت زبان اسمبلی این است که تنها نیاز به محیطی دارد که اصطلاحاً قابلیت(Text Editor) را داشته باشد.

اگر محیط کارشما ویندوزباشد می توانید با اجرا نمودن نرم افزار NOTE PAD وچنانچه در سیستم عامل dosکارمی کنیدمی توانید با اجرای نرم افزارEdit.exe محیط برنامه نویسی خودرافعال نمایید.

هم اکنون شما می توانید دستورات برنامه نویسی رادراین محیط تایپ نمایید.

به طور کلی دستورات میکروکنترولر 8051 به 5 گروه تقسیم شده اند که

عبارتند از:

- دستورات محاسباتی

- دستورات منطقی

- دستورات انتقال اطلاعات

- دستورات روی بیت

- دستورات کنترلی



دستور ORG :

org

دستورفوق که مربوط به Assembler می باشدبه شما امکان می دهد،آدرس شروع برنامه در حافظه برنامهeeprom میکروکنترلر راتعیین نمایید. مثال:

org 0h

این دستور شروع برنامه در حافظه راازخانه صفرآن تعیین می کند



دستورات محاسباتی:

این مجموعه دستورات شامل دستورات جمع و تفریق و کاهش و افزایش و ضرب و تقسیم 8 بیتی می باشند.



دستور :ADD

دستوراالعمل ADD برای جمع کردن یک مقدار 8 بیتی با ثبات A مورد استفاده قرار می گیرد. عملوند اول این دستور ثبات A می باشد این دستورالعمل در 4 مورد آدرس دهی (که قبلا بحث کردیم ) مورد استفاده قرار می گیرد.

دستور دیگری برای جمع وجود دارد با سمبل ADC که مخفف ADD whit carry می باشد و به معنی جمع با رقم نقلی است عملکرد آن بدین صورت است که ابتدا مقدار بیت C (نقلی) با ثبات A جمع شده و سپس عملوند دوم هم به ثبات A اضافه می شود . این دستور هم مانند دستور ADD در 4 مود آدرس دهی گفته شده مورد استفاده قرار می گیرد.



دستورالعمل تقسیم 8 بیتی:

DIV A



این دستورالعمل مقدار موجود در ثبات A را بر مقدار موجود در ثبات B تقسیم می کند . خارج قسمت در ثبات A و باقیمانده عمل تقسیم در ثبات B ذخیره خواهد شد.

فرض کنید که ثبات A حاوی مقدار 11 است و ثبات B حاوی مقدار 4 باشد پس از اجرای عمل تقسیم مقدار 2 در ثبات A و مقدار 3 در ثبات B ذخیره خواهد شد.



دستورالعمل افزایش(:(INC

یک دستورالعمل تک عملوندی است این دستور عملوند خود را یک واحد افزایش می دهد . نکته ای که در مورد این دستورالمل باید به آن توجه کرد اینست که هیچ پرچمی بعد از اجرای دستور تغییر نخواهد کرد برای مثال اگر ثبات A حاوی مقدار #0ffh باشد بعد از اجرای این دستور مقدار A , 00 خواهد شد اما پرچم OVER FLOW تغییر نخواهد کرد.

این دستورالعمل در سه مورد آدرس دهی ثبات . مستقیم و غیر مستقیم عمل می کند.



دستورالعمل کاهش(:(DEC

یک دستورالعمل تک عملوندی است . پس از اجرای این دستور از محتوای عملوند یک واحد کم می شود.به عنوان مثال اگر ثبات A حاوی مقدار 10 باشد پس از اجرای DEC A ثبات A حاوی مقدار 9 خواهد بود.



دستورالعمل ضرب(:(MULL

MULL AB

این دستور محتوای ثبات A را در ثبات B ضرب می کند نتیجه ضرب بدین گونه ذخیره می شود بیت پایین حاصلضرب در ثبات A و بیت بالای حاصلضرب در ثبات B ذخیره می شود.



دستورالعمل تفریق(:(SUBB

دستور SUBB برای تفریق یک مقدار 8 بیتی از ثبات A مورد استفاده قرار می گیرد این دستور مخفف Sub with BARROW است و عملوند دوم را به اضافه Carry از ثبات A کم می کند اگر در جریان تفریق از بیت هشتم نیاز به رقم قرضی باشد Carry یک می شود و در غیر این صورت صفر می شود .



دستورالعمل منطقی:

این دستورالعمل ها بر روی تک تک بیت ها اعمال منطقی AND,OR,XOR را انجام می دهند . دستورات چرخش و شیفت بیتی هم در زمره این دستورات هستند.

در AND کردن نتیجه دو بیت زمانی یک است که هر دو بیت یک باشند . در OR کردن دو بیت نتیجه دو بیت زمانی صفر است که هر دو بیت صفر باشند. در XOR کردن نتیجه هنگامی صفر است که هر دو بیت یا صفر باشند یا یک.

XOR برای مکمل کردن بیت ها هم به کار می رود نتیجه XOR یک بیت با بیت 1 مکمل آن خواهد بودو نتیجه xor یک بیت با بیت 0 خود آن بیت را نتیجه خواهد داد . این دستورات برای مکمل کردن بیت های مشخصی از یک بایت حافظه که بیت آدرس پذیر نیستند مفید است.

دستور اسمبلی که برای AND کردن مورد استفاده قرار می گیرد ANL (And Logic) است.

دستورات OR کردن و XOR کردن هم ساختاری مانند دستور ANL داند فقط برای OR از ORL و برای XOR از XRL استفاده می کنیم.

دستور دیگری هم با نام CPL وجود دارد که کارش مکمل کردن عملوند خود است.



دستورات چرخشی:

چهار دستور RR A,RL A,RLC A,RRC A برای عملیات چرخشی مورد استفاده قرار می گیرد.

RLA بیت های ثبات A را یک واحد به طرف چپ چرخش می دهد بیت شماره هفت از ثبات خارج می سود و دوباره وارد بیت شماره صفر می شود اگر ثبات A حاوی #10000001 b باشد:

10000001--------------> 00000011

RR L ثبات را یک واحد به راست چرخش می دهد در دستورات چرخش بیتی که خارج می شود از طرف دیگر وارد ثبات می شود

10000001-------------------> 11000000

RLC A, RRC A هم مشابه دستورات بالا هستند با این تفاوت که بیتی که از یک طرف خارج می شود وارد بیت Carry می شود و محتوای قبلی Carry از طرف دیگر وارد ثبات می گردد.



دستورات انتقال اطلاعات:

دستورات انتقال داده به دو دسته RAM خارجی و دستورهای RAM داخلی تقسیم می شوند .

MOV

این دستور برای کپی کردن یک خانه از حافظه یا داده ها در بایت ها ی حافظه استفاده می شود.توجه کنیدکه این دستوریک دستوربایتی است.

مثال1:

mov p1,#55h

این دستور مقدارعددی 55 درمبنای شانزده رادر بایتی از حافظه به نام p1می ریزد.

mov p1,#85d

این دستور مقدارعددی 85 درمبنای ده رادر بایتی از حافظه به نام p1می ریزد.

mov p1,#010100011b

این دستور مقدارعددی 01010011 درمبنای دو را در بایتی از حافظه به نام p1 می ریزد.

توجه :همانطورکه در دستور ات بالامشاهده نمودیدعلامت# قبل ازهرکدام ازاعداد قید شده بود.این علامت برای مشخص نمودن این مفهوم است که مقدارعددی عبارت بعدی می بایست دربایت معرفی شده از حافظه ریخته شود.

مثال2:

mov p1,55h

این دستور محتویات داخل بایت 55h حافظه رادرخانه می ریزد.دقت کنیدکه تمام ثبات های موجود را می توان به جای این بایت استفاده کرد.

مثال3:

mov a,p1

mov a,p2

درمثال بالا اگربخواهیم اطلاعات روی p1 راروی p2 بریزیم ابتدا باید دیتا را به آکومولاتورانتقال دهیم وسپس از اکومولاتور به p2انتقال دهیم.

عبارتb,d,hکه بعد از مقدارهای عددی قید شده آمده است مبین مبنای عدد می باشد.


B=Binary
D=Decimal
H=Hexadecimal




دستورات 16 بیتی انتقال اطلاعات:

دستورات انتقال اطلاعات 16 بیتی برای مقدار اولیه دادن به اشاره گر داده((DPTR به صورت زیر است:

MOV DPTR,#DATA16

ثبات اشاره گر داده برای دسترسی به حافظه داده خارجی یا جداول حافظه به کار برده می شود مثال:

MOV DPTR,#1234H

این دستور عدد 1234H را به ثبات اشاره گر داده بار می کند.

دستور :XCH

فرم کلی این دستور به صورت زیر است:

XCH A,آدرس منبع

که باعث می شود تا محتوای ثبات آکومولاتور A با خانه ای که آدرس آن داده شده , جابجا شود. به عنوان مثال :

XCH A,20H

محتوای خانه حافظه 20H را با محتوای آکومولاتور A , جابجا می کند.



دستور حافظه داده خارجی :RAM

دستورات انتقال اطلاعات که داده را با حافظه خارجی مبادله می کند مانند MOVX از آدرس دهی غیر مستقیم استفاده می کند.



آدرس دهی غیر مستقیم:

* یا یک بایت آدرس از طریق @R0 (Ri که برابر R0 یا R1 است) استفاده می کند.

* و یا دو بایت آدرس اشاره گر داده را به صورت @DPTR به کار می برد.

مثال:

دستوراتی بنویسید که محتوای خانه های حافظه به آدرس های 10F4H , 10F5H را بخواند و آن ها را به ترتیب در ثباتهای R6,R7 قرار دهد.

حل: دستورات مذکور مطابق زیر می باشند:

MOV DPTR,#10F4H دستور (1)

دستور (2) MOV A,@DPTR

MOV R6,A دستور (3)

INC DPTR دستور (4)

MOVX A,@DPTR دستور (5)

MOV R7,A دستور (6)

دستور 1 : آدرس 16 بیتی 10F4H را در ثبات اشاره گر قرار می دهد.

دستور 2: محتوای خانه حافظه ای که با اشاره گر داده نشان داده شده یعنی محتئای خانه حافظه 10F4H را می خواند و در آکومولاتور A قرار می دهد.

دستور 3: محتوای آکومولاتور A را در ثبات R6 قرار می دهد به این ترتیب اولین خواسته مسئله انجام شده است.

دستور 4: به ثبات اشاره گر داده یک واحد اضافه می کند یعنی اشاره گر داده برابر 10F5H می شود.

دستور 5: محتوای خانه حافظه ای که با اشاره گر داده نشان داده شده را می خواند و در ثبات آکومولاتور A قرار می دهد.

دستور 6: محتوای آکومولاتور A را در ثبات R7 قرار می دهد یعنی خواست دوم مسئله انجام می پذیرد.

نکته: فقط با دستور MOVX می توان به حافظه داده خارجی RAM دسترسی داشت در این صورت یکی از عملوندها حتما آکومولاتور می باشد.

EQU

این دستورمربوط به اسمبلر بوده وجهت نامگذاری قسمتی از حافظه داخلی میکرو کنترلر استفاده می شود

مثال4: برنامه زیر خانه 20از حافظه رابه memory نامگذاری می کند.

Memory equ 20h



ایجاد حلقه در برنامه نویسی میکروکنترلر :

دستورات کنترل برنامه:

این دستور برای پرش به مکانی از برنامه استفاده می شود که این مکان یک برچسب است که قبلاً نامگذاری شده است.دقت کنیدکه برای پرش های کوتاه می توان ازدستور sjmpوبرای پرش های بلنداز دستور ljmp استفاده کرد.

مثال5:

loop:

.

.

.

jmp loop

دستور فوق به مکانی از برنامه به نام loopپرش می کند.

loop:jmp loop

این خط برنامه باعث می شود cpu دریک حلقه گیرکند.البته می توان به جای برنامه فوق ازدستورjmp$ نیز استفاده کرد.

end

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

نکته:شماباید به گونه ای برنامه نویسی نماییدکه هیچگاه برنامه به دستور end نرسد.

نمونه برنامه(1):

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

org 0

mov p1,#55h

loop:jmp loop

end

باپروگرام نمودن ic وقراردادن آن برروی بردآموزشی این برنامه باعث می شودکه ledهای روی برد به صورت یک درمیان روشن شوند.چرا؟

حال به تحلیل برنامه ونحوه کار آن می پردازیم:

اولین دستور که نمایانگر خانه شروع برنامه است.همانطورکه درمباحث میکرو کنترلر 89c51 مطالعه نموده اید،p1 دقیقاً یک بایت از حافظه ram میکروکنترلر می باشد که به ازای هربیت خودیک پایهi/o برروی میکروکنترلر دارد (پایه یک تاهشت).حال اگرهر بیت ازاین حافظه یک شودشما روی پایه نظیرآن +5vو چنانچه صفر شود شماروی پایه نظیر هر بیت مقدارصفریا gnd خواهیدداشت و بالعکس.

حال عدد55h رابه باینری تبدیل نمایید ودربیت های نظیر حافظه قراردهید.

55H=010101010B

دقیقاً به ازای عددباینری بالا پایه های میکرو فعال می شوند.

نکته :البته توجه نمایید ledهای روی بردآموزشی به صورت آندمشترک بسته شده اند در نتیجه Active Lowهستند،پس به ازای هرصفرledروشن می شود.

دستورات پرش های شرطی:

میکروکنترولر دارای تعدادی دستورات پرش شرطی است که عبارتند از JZ , JNZ , DJNZ , CJNE

دستور :JZ

JZ آدرس مقصد یا برچسب دستور

این دستور یعنی اگر محتوای آکومولاتور A برابر 0 است به آدرس مقصد پرش کن در غیر این صورت دستور بعدی را اجرا کن.

دستور :JNZ

JNZ آدرس مقصد یا برچسب دستور

یعنی اگر محتوای آکومولاتور A برابر 0 نباشد به آدرس مقصد پرش می کند در غیر این صورت دستور بعدی اجرا می گردد.

دستور :CJNE

این دستور برای عملیات حلقه به کار می رود و فرم کلی آن به صورت زیر است:

CJNE اپراند 1 , آدرس نسبی. اپراند 2

این دستور اپراند 1 را با اپراند 2 مقایسه می کند اگر مساوی نباشد به آدرس نسبی مقصد پرش می کند در غیر این صورت دستور بعدی اجرا می شود.



ایجادتأخیرزمانی درروند فعالیت میکرو به وسیله حلقه ها:

DJNZ COUNT,LOOP

این دستور مقدارعددی خانه ای از حافظه راکه قبلاً توسط دستورEQUبه نام countتعریف شده است رایک واحد کاهش می دهدواگرمقدارآن خانه صفرنبودبه آدرسی از خانه حافظه به نام loopپرش می کند

درمثال زیر بایت ها ایجاد یک تأخیر زمانی دو مقدار مختلف رابرروی پورت یک بایت ها فاصله زمانی مشخص رامی توانیم روی اسکوپ ببینیم.

نمونه برنامه(2):

count equ 30h

org 00h

main:

mov count ,#200

mov p1,#01010101b



loop:djnz count,loop

mov p1,#10101010b

mov count,#250



loop1:djnz count,loop

jmp main

برنامه فوق یک بار پورت یک رابا55h فعال کرده وبعداز 400µs پورت یک را با aah بارگذاری می کندوبعداز501µs دوباره پورت رابا 55hبارگذاری می کند وهمین کارادامه خواهدداشت.شایدازخود بپرسیدچگونه متوجه می شویم مقدارپورتها ، بعد از گذشت چه زمانی عوض می شوند؟

خیلی ساده است انجام هر دستور djnzدو سیکل ماشین زمان نیازداردودرحلقه اول ما200باراین دستور رااجرانمودیم پس درمجموع400µsودرحلقه بعدی چون قبل ازآن یک دستورmov وجودداردومی دانیم برای انجام این دستور نیز یک سیکل ماشین زمان نیاز داریم درمجموع1+250*2سیکل ماشین تأخیر ایجادشده است.

نکته:طبق استانداردی که برای سخت افزار میکرو قرارداده شده است ازنوسان ساز 12MHz استفاده می کنیم ودرنتیجه هر سیکل ماشین یک میکروثانیه زمان نیازدارد.

شما می توانید برای تست بصری این تغییرات ازدستگاه اسکوپ استفاده نمایید.زیرابه علت سرعت زیادledها تغییرات آن برای ماشین ملموس نیست .


z= 10* y

برای تنظیم زمان بیشتر می توانیدازچندحلقه متداخل استفاده نماییدکه بایک مثال درزیرنشان داده شده است.

x=loop1=2*255


y= 255 * x

y=loop2=255*x


x=2*255








z=loop3=10*y

درنتیجه

z=10*(255*(2*255))=1300500

پس باتشکیل حلقله های روبرو تقریباً3/1ثانیه تأخیر ایجادنمودیم.

البته توجه نماییدماازمقدارتأخیر مربوط به خودdjnzدرحلقه دوم وسوم صرف نظر کردیم زیرا درمقابل عددبدست آمده مقدارناچیزی است.وماازآن چشم پوشی می کنیم.



نمونه برنامه (3):

برنامه ای بنویسیدکه ledهای متصل به پورت یک ،دربردآموزشی راباسرعت حدودی یک تادوثانیه خاموش وروشن کند.

count1 equ 20h

count2 equ 21h

count3 equ 22h

main:

mov p1,#0ffh

این دستور باعث می شود تمام ledهای متصل به روی پورت p1خاموش شوند

(چون این ledهابه صورت آند مشترک بسته شده اند.)

call delay

حدودیک ثانیه تأخیر

mov p1,#oh

روشن کردن ledها

call delay

یک ثانیه تأخیر

jmp main

پرش به ابتدای main

delay:

mov count2,#255

mov count3,#10

loop3:

mov count2,#255



loop2:

mov count1,#255

loop1:djnz count1,loop1

djnz count2,loop2

djnz count3,loop3

ret

end

دستور call:

در برنامه فوق چون زیرروال delay تکرارشده بودماازتکرارآن خودداری کردیم واز دستورcall استفاده کردیم ودرهنگام انجام این دستور برای زیربرنامه cpu,delay به ابتدای برنامه delayرفته وآن رااجرامی کند تابه دستور ret برسد.پس از انجام کامل این مرحله ورسیدن به دستور retاززیر برنامه delay, برگشته وقفه کارخود را بعد از دستور callادامه می دهد.شما با روش های مشابه می توانید به صورت تقریبی تأخیرمورد نظرخودرا درکنترلرها اعمال نمایید، ولی برای ایجاد تأخیرهای دقیق تر در اجرای برنامه می توانید از timerها (که درادامه به بحث درمورد آنها می پردازیم) استفاده کنید.



استفاده دستورات بیتی در میکروکنترلر :

همان طور که ملاحظه نمودید8051 دستوراتی جهت کارروی بایت های حافظه دارد. توجه داشته باشید شماتوسط دستورات بایتی نمی توانیدروی یک خانه ازبیت حافظه کار کنید.جهت کاربابیت هامی توانید از دستورات بیتی زیر استفاده نمایید.

setb

یک بیت را یک کرده

setb p1.0

بیت صفر از بایت p1 رایک کرده وتأثیری روی بقیه بیت ها ندارد.
P1

X
X
X
X
X
X
X
1

D7
D6
D5
D4
D3
D2
D1
D0




clr

یک بیت راصفر کرده

clr p0,5

بیت پنجم ازبایت p0راصفرکرده وتأثیری روی بقیه بیت هاندارد.
P0

X
X
X
0
X
X
X
X

D7
D6
D5
D4
D3
D2
D1
D0




jnb

پرش درصورت یک نبودن

jnb P1.2,loop

این دستور بیت دوم بایت p1رابررسی می کند،اگراین پایه ازبیرون gndشده بود به loop پرش کرده ودرغیراینصورت برنامه از خط بعدی ادامه خواهدیافت.بیشترین کاربرد این دو دستور برای چک کردن کلید است که درادامه یک مثال برای روشن شدن موضوع آورده شده است.

jb

پرش درصورت یک بودن

jb P1.2,loop

این دستور بیت دوم بایت p1رابررسی می کند،اگراین بیت یک باشد به loop پرش کرده ودرغیراینصورت برنامه از خط بعدی ادامه خواهدیافت .



دستور :JBC

Jbc BIT , آدرس مقصد یا برچسب دستور

یعنی اگر بیت ( (BITمورد نظر برابر 1 است آن را 0 کن و به آدرس مقصد یا برچسب دستور پرش کن در غیر این صورت دستور بعدی را اجرا کن.

دستور :JC

Jc آدرس مقصد یا برچسب دستور

یعنی اگر بیت نقلی ( (Cمورد نظر برابر 1 است به آدرس مقصد یا برچسب دستور پرش کن در غیر این صورت دستور بعدی را اجرا کن.



دستور :JNC

Jnc آدرس مقصد یا برچسب دستور

یعنی اگر بیت نقلی ( (Cمورد نظر برابر 1 نیست به آدرس مقصد یا برچسب دستور پرش کن در غیر این صورت دستور بعدی را اجرا کن.





نمونه برنامه (4):

برنامه ای بنویسید که بازدن کلیدp3.3 عدد 55h روی p1 قراربگیردوبازدن کلیدp3.5 عدد aah روی p1 قراربگیرد.

org 00h

scan:

jnb p3.3,num1

jnb p3.5,num2

jmp scan



num1:

mov p1,#55h

jmp scan

num2:

mov p1,#0aah

jmp scan

end

نظرات 0 + ارسال نظر
برای نمایش آواتار خود در این وبلاگ در سایت Gravatar.com ثبت نام کنید. (راهنما)
ایمیل شما بعد از ثبت نمایش داده نخواهد شد