مجموعه دستورات و ثبات ها در 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