Visits: 648
قبل از همه چيز چرا 8051 ؟
ميكرولنترلر 8051 پايه و اساسي است براي يادگيري ديگر ميكروكنترلر ها دستورات اسمبلي اين ميكرو نسبت به AVR خيلي كمتر هست و داراي امكانات كمتري نسبت به ديگر ميكرو ها است به همين دليل يادگيري و فهم آن خيلي راحت و آسان مي باشد كه براي شروع ابتدا بايد مفاهيم منطق و ديجيتال را خوب فهميده باشيد و بعد از آن بايد سخت افرار 8051 و RAM و ROM داخلي آن را درك كرده باشيد تا بتوانيد يك برنامه كاربردي بنويسيد تا يك پروسه را كنترل كند. خيلي ها براي يادگيري ميگن كه ما كه مي خواهيم برنامه نويسي ميكرو را ياد بگيرم پس بهتر بالاترين ميكرو يعني AVR يا PIC ياد بگيريم در صورتي كه به نظر من كاملا اشتاه بوده و كار غلطي است كه اگه بخواهيد تا آخر ادامه دهيد كاري طاقت فرسا خواهد بود. مثل اين خواهد بود كه سقف طبقه اول يك ساختمان را درست نكرده باشيم و بخواهيم طبقه دوم را درست كنيم. در اين وبلاگ من تا بتوانم به زبان ساده و روان مطالب را بيان خواهم كرد كه البته اگه يكم علاقه و پشتكار داشته باشد مطمئن باشيد به ميكرو مسلط خواهيد شد و مي توانيد آن را به راحتي برنامه ريزي كنيد. قيمت اين ميكرو خيلي ارزان مي باشد در حدود 1000 تومان و حافظه ROM آن قابل پاك كردن و استفاده مجدد مي باشد پس شما به راحتي مي توانيد در خانه يا محل كار براي راحتي خود و افراد خانواده چيزهايي با آن بسازيد كه آدم باورش نشه كه اينو خودش ساخته و طراحي كرده.
تشريح پايه هاي 8051 و RAM و ROM داخلي آن
8051 داراي 4 پورت ورودي يا خروجي مي باشد يعني اينكه هر كدام از اين پورت ها را مي توان در يك لحظه به عنوان ورودي استفاده كرد و همان پورت را دوباره در يك لحظه ديگر به عنوان خروجي از آن استفاده كرد. منظور از پورت چيست؟ پورت در ميكرو يعني 8 عدد پين يا 8 خط ديتا يا ذر اصطلاح 8بيتي، كه 8051 داراي 4 پورت 8 بتي يعني 32 پايه مي باشد.
ميكرو كنترلر AT89C51 داراي 128 بايت RAM و 4KB حافظه برنامه ROM مي باشد. و AT89C52 داراي 256 بايت RAM و 8KB حافظه برنامه ROM مي باشد. و AT89C55 داراي 256 بايت RAM و 20KB حافظه برنامه ROM مي باشد. كه بستگي به حجم برنامه ما دارد كه از كدام ميكرو استفاده كنيم.
كاربرد RAM چست؟ اصلا به چه دردي مي خوره؟
RAM يعني random access memory حافظه با دستيابي تصادفي. از اين حافظه براي ذخيره اطلاعات موقت استفاده مي شود يعني اينكه تا زماني كه تغذيه ميكرو وصل باشد اين اطلاعات از بين نمي روند و با قطع كردن تغذيه اين اطلاعات از بين مي روند. ما در ميكرو 8 ثبات 8 بتي براي ذخيره كردن داده ها داريم در بعضي از مواقع پيش مي آيد كه اين 8 ثبات در كل برنامه استفاده شوند و ما به يك ثبات 8 بيتي براي ذخيره سازي داده ها داريم مثلا يك شمارنده طراحي كرديم و همه ثبات ها هم استفاده شده و ما مثلا به دو ثبات احتياج داريم كه مي توانيم از هر كدام از خانه هاي RAM استفاده كنيم. منظور از اطلاعات همان داده هاي 8 بيتي مي باشند يعني همون 0 يا 1 ها كه به 8 تا از آنها يك بايت يا يك داده 8 بيتي مي گويند.
حال به تقسيم بندي RAM توجه كنيد. براي برنامه نويسي خيلي مهم است كه ما از چه خانه هاي RAM مجاز هستيم استفاده كنيم آيا مي توانيم در فلان خانه RAM داده را به صورت بيتي دستكاري كنيم يا داده را 8 بيتي دستكاري كنيم. اصلا در چه محدوده اي از RAM قادر هستيم داده ذخيره كنيم يا بانك هاي ثباتي در كجاي RAM واقع شده اند و ديگر ثبات ها… به جدول زير كه مربوط به RAM خوب توجه كنيد:
عملكرد
|
ثبات
|
خانه هاي 8 بتي RAM
|
آدرس
|
|||||||
|
|
|
|
|
|
|
|
|
|
FF
|
ثبات B
|
B
|
F0
|
F1
|
F2
|
F3
|
F4
|
F5
|
F6
|
F7
|
F0
|
ثبات A يا انباره
|
ACC
|
E0
|
E1
|
E2
|
E3
|
E4
|
E5
|
E6
|
E7
|
E0
|
كلمه وضعيت
|
PSW
|
D0
|
D1
|
D2
|
D3
|
D4
|
D5
|
D6
|
D7
|
D0
|
|
IP
|
B8
|
B9
|
BA
|
BB
|
BC
|
—
|
—
|
—
|
B8
|
پورت 3
|
P3
|
B0
|
B1
|
B2
|
B3
|
B4
|
B5
|
B6
|
B7
|
B0
|
كنترل وقفه ها
|
IE
|
A8
|
A9
|
AA
|
AB
|
AC
|
—
|
—
|
AF
|
A8
|
پورت 2
|
P2
|
A0
|
A1
|
A2
|
A3
|
A4
|
A5
|
A6
|
A7
|
A0
|
ارتباط سريال
|
SBUF
|
قابل آدرس دهي نيست
|
99
|
|||||||
|
SCON
|
98
|
99
|
9A
|
9B
|
9C
|
9D
|
9E
|
9F
|
98
|
پورت 1
|
P1
|
90
|
91
|
92
|
93
|
94
|
95
|
96
|
97
|
90
|
بايت سنگين تايمر 1
|
TH1
|
قابل آدرس دهي نيست
|
8D
|
|||||||
بايت سنگين تايمر 0
|
TH0
|
قابل آدرس دهي نيست
|
8C
|
|||||||
بايت سبك تايمر 1
|
TL1
|
قابل آدرس دهي نيست
|
8B
|
|||||||
بايت سبك تايمر 0
|
TL0
|
قابل آدرس دهي نيست
|
8A
|
|||||||
مد تايمر
|
TMOD
|
قابل آدرس دهي نيست
|
89
|
|||||||
مد شمارنده
|
TCON
|
88
|
89
|
8A
|
8B
|
8C
|
8D
|
8E
|
8F
|
88
|
|
PCON
|
قابل آدرس دهي نيست
|
87
|
|||||||
بايت سنگين ثبات DPTR
|
DPH
|
قابل آدرس دهي نيست
|
83
|
|||||||
بايت سبك ثبات DPTR
|
DPL
|
قابل آدرس دهي نيست
|
82
|
|||||||
اشاره گر پشته
|
SP
|
قابل آدرس دهي نيست
|
81
|
|||||||
پورت 0
|
P0
|
80
|
81
|
82
|
83
|
84
|
85
|
86
|
87
|
80
|
فقط بايتي
|
|
80 بايت براي خواندن و نوشتن موقت
|
30تا7F
|
|||||||
بيتي و بايتي
|
|
16 بايت براي خواندن و نوشتن موقت
|
20تا2F
|
|||||||
بانك هاي ثباتي شامل R0-R7
|
R0-R7
|
بانك 3
|
18تا1F
|
|||||||
R0-R7
|
بانك 2
|
10تا17
|
||||||||
R0-R7
|
بانك 1
|
08تا0F
|
||||||||
R0-R7
|
بانك 0
|
00تا07
|
||||||||
SMGH
|
SMGH
|
SMGH
|
SMGH
|
1) 32 بايت از مكان هاي 00 تا 1F براي بانك هاي ثباتي و پشته كنار گذاشته شده.
2) 16 بايت از 20 تا2F براي خواندن و نوشتن آدرس پذير بيتي كنار گذاشته شده.
3) 80 بايت از مكان هاي 30 تا7F براي خواندن و نوشتن بايتي و يا آنچه كه عموما داده موقت گفته مي شو به كار مي رود.
نكته: جلوي خانه هايي كه نوشته شده قابل آدرس دهي نيست يعني اينكه نمي توان با آدرس هگز آن از اين ثبات استفاده كرده به عنوان مثال براي SBUF در برنامه نويسي حتما بايد خود SBUF را نوشت يعني از آدرس هگز آن نمي توان استفاده كرد. ولي در بقه موارد مجاز هستيم. با يك مثال اين قضيه را روشن مي كنيم:
MOV A,#60H يعني عدد 60 در مبناي هگز را در انباره كپي كن. حال اين دستور را اين طوري هم مي توان نوشت يعني از آدرس A استفاده كرد. MOV E0,#60H
در RAM /8051 ما چهار بانك ثباتي داريم كه هر بانك داري 8 بايت(R0تاR7) 8بيتي مي باشد يعني:
|
بانك صفر
|
|||||||
R7
|
D0
|
D1
|
D2
|
D3
|
D4
|
D5
|
D6
|
D7
|
R6
|
D0
|
D1
|
D2
|
D3
|
D4
|
D5
|
D6
|
D7
|
R5
|
D0
|
D1
|
D2
|
D3
|
D4
|
D5
|
D6
|
D7
|
R4
|
D0
|
D1
|
D2
|
D3
|
D4
|
D5
|
D6
|
D7
|
R3
|
D0
|
D1
|
D2
|
D3
|
D4
|
D5
|
D6
|
D7
|
R2
|
D0
|
D1
|
D2
|
D3
|
D4
|
D5
|
D6
|
D7
|
R1
|
D0
|
D1
|
D2
|
D3
|
D4
|
D5
|
D6
|
D7
|
R0
|
D0
|
D1
|
D2
|
D3
|
D4
|
D5
|
D6
|
D7
|
بقيه بانك ها نيز مانند جدول بانك صفر مي باشد از اين ثبات ها در برنامه نويسي خيلي زياد استفاده مي شودند.نحوي انتخاب بانك يا تغيير دادن آن به صورت زير مي باشد:
8051 هنگامي روشن مي شود بانك صفر به صورت پيش فرض براي بانك ثباتي خود انتخاب مي كند كه براي تغيير دادن آن مي توانيم به صورت زير عمل كنيم.
RS0(PSW.3)
|
RS1(PSW.4)
|
|
0
|
0
|
بانك صفر
|
1
|
0
|
بانك يك
|
0
|
1
|
بانك دو
|
1
|
1
|
بانك سه
|
به كمك دستورات بيتي مي توان اين بانك را تغيير داد به مثال زير توجه كنيد مي خواهيم بانك 3 را به عنوان بانك ثباتي ميكرو تغيير دهيم؟
SETB PSW.4
SETB PSW.3
مي خواهيم بانك دو را انتخاب كنيم؟
SETB PSW.4
CLR PSW.3
پشته:
هنگامي كه 8051 روشن مي شود اشارگر پشته به صورت پيش فرض عدد 07 را در خود دارد كه نهايت با عث انتخاب بانك 1 براي پشته خود مي شود. SP=07H
براي تغيير پشته به مكان ديگري ازRAM يا بانك ديگري مي توان به كمك دستور زير پشته را تغيير داد: MOV SP,#XX كه XX آدرس آن مكان از RAM مي باشد.
حال كاربرد پشته چيست؟ پشته كاربرد زيادي دارد شايد ما زياد با آن سرو كار نداشته باشيم ولي CPU با آن خيلي كار دارد به عنوان مثال براي اجراي يك زير برنامه(برنامه فرعي) مثلا CALL LABEL پردازنده آدرس اين مكاني را كه در آن به اين دستور برخورد كرده، را در پشته خود ذخيره مي كند و بعد از اجراي پشته به كمك اين آدرس بر مي گردد تا ادامه برنامه اصلي را انجام دهد.
براي درج داده رد پشته از دستور PUSH استفاده مي كنيم و براي بازيافت داده از پشته از دستور POP استفاده مي كنيم. با هر بار درج در پشته اشارگز پشته يك واحد به آن اضافه مي شود. و با هر بار بازيافت از پشته اشارگر پشته يك واحد از آن كم مي شود.
ROM چيست؟
اين حافظه از دست ما خارج است يعني اينكه فقط توسط كامپيوتر مي توان برنامه اصلي را توي اين حافظه كپي كرد و ما بعدا توسط خود ميكرو نمي توانيم محتواي آن را تغيير دهيم بلكه فقط مي توانيم اطلاعات را اين حافظه به حافظه RAM انتقال داده و بعد از پردازش مي توان آنها را به خروجي فرستاد.
پايه RST(9) ريست
با فعال شدن اين پايه يعني يك شدن به مدت حداقل 2 سيكل ماشين ميكرو ريست شده و به خانه 0000H پرش كرده و ار آنجا شروع به خواندن برنامه مي كند.
پايه EA
اگر اين پايه را يك كنيم ميكرو برنامه را از ROM داخلي خودش شروع به خواندن مي كند و اگر اين پايه را صفر كنيم ميكرو از ROM داخلي خودش هيچ اطلاعاتي نمي خواند و با برنامه ريزي كه شده از ROM بيروني شروع به خواندن اطلاعات مي كند.
پايه PSE
اين پايه براي زماني است كه بخواهيم از RAM يا ROM بيروني استفاده كنيم كه بسته به شرايط يا صف مي شود يا يك.
پايه ALE
اگر از RAM يا ROM بيروني استفاده كنيم اين پايه پورت صفر را به عنوان خطوط آدرس معرفي مي كند.
در قسمت دوم به معرفي دستورات مي پردازيم
8051 در كل 128 بايت RAM دارد كه به صورت جدول بالا تقسيم بندي مي شود: