طراحی کنترلر، مدارت دلخواه، پروژه ها و تمرینات درس میکروکنترلرها
در صورتی که برق شهر از حداقل تعریف شده کمتر، یا از حداکثر بیشتر شود رله خروجی قطع خواهد شد و به صورت پیوسته توان مصرفی اندازه گیری و نمایش داده می شود.بر اساس رنج دمایی حداقل و حداکثر که توسط کاربر تعریف می شود می توان سرعت موتور را بین 1 تا 100 درصد به صورت خودکار تنظیم کرد.این پروژه جریان برق مصرفی را اندازه گیری و توسط یک ماژول سیم کارت اطلاعات مورد نظر را به شماره همراه دلخواه ارسال میکند. ولتاژ کاری آن AC220 ولت و حداکثر جریان عبور آن 50 آمپر می باشد.این پروژه یک مدار واسط I/O می باشد که دارای 12 خروجی رله است. توسط نرم افزار کنترلی که قابل نصب بروی ویندوز های XP, Win7, Win8, Win10 می باشد می توان هر 12 رله را به صورت مجزا فعال و غیر فعال کرد.در این پروژه با استفاده از یک ساعت نجومی و محاسبات ریاضی، دو عدد سروو موتور یکی در جهت XY و دیگری در جهت Z پنل خورشیدی را به صورت اتوماتیک در موقیعتی قرار می دهید که بیشترین تابش خورشید را دریافت کند.
پروژه محافظ برق و اندازه گیری توان مصرفی با avr و نمایشگر سون سگمنت

MCP-43

پروژه محافظ برق و اندازه گیری توان مصرفی با avr و نمایشگر سون سگمنت
پروژه کنترل دور فن یا موتور توسط سنسور دما

MCP-41

پروژه کنترل دور فن یا موتور توسط سنسور دما
پروژه کنتور برق با AVR و ارسال اطلاعات توسط سیم کارت

MCP-40

پروژه کنتور برق با AVR و ارسال اطلاعات توسط سیم کارت
پروژه کنترل رله توسط پورت USB با AVR و C شارپ 12 کاناله

MCP-39

پروژه کنترل رله توسط پورت USB با AVR و C شارپ 12 کاناله
پروژه کنترلر پنل خورشیدی با استفاده از ساعت نجومی

MCP-25

پروژه کنترلر پنل خورشیدی با استفاده از ساعت نجومی

آموزش ميكرو كنترلر 8051 قسمت چهارم (معرفي دستورات)

جمع و تفريق بي علامت دستور (ADD)
از اين دستور براي جمع دو داده 8 بيتي استفاده مي شود. براي عمل جمع حتما بايد يكي از داده ها در انباره A باشد و ديگري مي تواند در يكي از ثباتها يا داده فوري باشد.
قالب دستور:  ADD  A,SOURCE
مثال عدد 10H را با E5 جمع كنيد؟
ابتدا يك از اعداد را به طور دلخواه در انباره ريخته و سپيس عدد ديگر را با انباره جمع مي كنيم


MOV    A,#10H                  10H
ADD   A,#0E0H                 +E5H  =F5H        A=F5H


نكته: اگر بعد از علامت پوند # عددي در مبناي هگز باشد كه بايت سنگين آن يكي از حروفهاي A تا  F باشد بايد حتما بين اين حروفها و # صفر قرار دهيم تا كامپايلر آن را يك عدد در مبناي هگز بشناسد نه يك حرف انگليسي.
بعد از عمليات جمع نتيجه حاصل جمع در خود انباره قرار مي گيرد.

از بخش سفارش طراحی هم اکنون درخواست خود را ثبت کنید
حل و تشریح کلیه تمرینات درس میکروکنترلر AVR
طراحی و ساخت مدارات دلخواه شما با میکروکنترلر AVR


جمع اعداد 16 بتي دستور ADDC
از اين دستور براي جمع دو داه 16 بيتي استفاده مي شود البته نه اينكه مستقيما داده 16 بيتي را با هم جمع مي كند بلكه ما ابتدا بايد اين داده 16 بتي را به داده 8 بتي تجزيه كردن و با هم جمهع كنيم براي اين كار اگر با 8 بيتي اول عدد اول را با 8 بيت اول عدد دوم جمع كنيم اگر رقم نقلي توليد شود اين دستور به طور اتوماتيك اين رقم نقلي را با بايت دوم عدد اول و دوم جمع مي كند به مثال زير توجه كند!
مثال مي خواهيم عدد 3CE7+3B8D را در مبناي هگز با هم جمع كنيم. براي جمع ابتدا پرچم كري را صفر مي كنيم چون ممكن است از قبل توسط برنامه اي ديگر يك شده باشد. سپس اين داده 16 بيتي را به داده 8 بيتي تجزيه مي كنيم. مي دانيم كه در ميكر همه چيز 8بتي مي باشد پس از جمع دو داده 16 بيتي مطمئنا يك داده 16 بزرگتر توليد مي شود براي همين ما بايت سبك را در R1 قرار مي دهيم و بايت سنگين  را در R2 قرار مي دهيم البته اين يك فرض دلخواه مي باشد شما مي توانيد اين داده را در هر ثباتي قرار دهيد و از حاصل اين جمه در جايي ديگر استفاده كنيد.


CLR   C 
MOV   A,#0E7H
ADD   A,#8DH
MOV   R1,A
MOV   A,#3CH
ADDC   A,#3BH
MOV    R2,A


اصول كار ADDC در اصل اين است كه دو عمل جمع را انجام مي دهد يعني اينكه ابتدا عدد 3C را با عدد 3B جمع كرده و نتيجه اين محاسبه را دوباره با مقدار كري يعني CY=1 جمع مي كند و نتيجه نهايي را در انباره قرار مي دهد.


   1
  3CE7
+3B8D  =   7874H


در اين مثال از جمع E7+8D يك رقم نقلي توليد مي شود كه در نتيجه پرچم كري برابر با 1 خواهد شد كه نشانگر انشار رقم نقلي از بايت پايين به بايت بالا مي باشد كه در خط بعدي برنامه اين رقم نقلي با حاصل جمع بايت هاي سنگين نيز جمع خواهد شد.


دستور DA  A 
از اين دستور براي جمع BCD استفاده مي شود همانطور كه مي دانيم اعداد ما از 0 تا 9 مي باشد كه در ميكرو بعد از جمع ممكن است اين حاصل جمع BCD نباشد و براي ما قابل فهم نيست يعني اينكه قابل نمايش روي سون سگمنت يا LCD  نيست كه براي حل اين مشكل از دستور DA  A استفاده مي شود قابل ذكر است كه اين دستور تنها بعد از دستور جمع و با انباره مي تواند كار كند يعني اينكه قبل از DA  A بايد از دستور جمع حتما استفاده شود. عددي كه قرار است براي BCD بودن تست شود اول بايد انباره قرار گيرد و سپس از اين دستور استفاده كنيم. اين دستور يك بايت را چك مي كند و در صورت لزوم به نيبل پايين عدد 6 را اضافه مي كند تا اين BCD استاندارد شود و براي نيبل بالا عدد 6 يعني 60 را اضافه مي كند. به مثال هاي زير توجه كنيد!
17H+28H=3FH=00111111B
عدد F يك عدد BCD نمي باشد همانطور كه مي دانيم حداكثر عدد يعني 9 داراي كد 1001 مي باشد كه در نيبل پايين اين عدد 1111 مي باشد براي BCD كردن آن به صورت زير عمل مي كنيم. ابتدا عدد را در انباره قرار داده و سپس از دستور DA  A  استفاده مي كنيم دستور به طور خودكار عدد 6 را به نيبل پايين اضافه مي كند.


MOV   A,#17H     17
ADD   A,#28H    +28
DA     A              3F+06=45H


براي نيبل بالا هم همين مراحل انجام مي گير البته همانطور گفتيم اين دستو خودكار است يعني اينكه اگر خود حاصل جمع BCD بود ديگر عدد 6 را اضافه نمي كند.


تفريق اعداد بي علامت (SUB   SUBB)
البته دستور تفريق دو نوع مي باشد يكي SUB و ديگري SUBB تفريق با قرض. در بسيار از ميكرو پروسسورها اين دو نوع دستور وجود دارد حال در8051 فقط SUBB وجود دارد براي تبديل SUBB به SUB كافي است كه قبل از اجراي اين دستور CY=0 گردد.
SUBB با CY=0
8051 و ديگر  پردازنده هاي مدرن از روش متمم 2 براي تفريق استفاده مي كنند.
براي مثال عدد 3F-23 را انجام م دهيم:


CLR   C                    CY=0
MOV   A,#3FH          A=3F
MOV   R1,#23H        R1=23
SUBB   A,R1             A-R1  =  1C


اگر بعد از اجراي SUBB پرچم CY=1 گردد نتيجه عمليات منفي بوده و اگر CY=0 گردد نتيجه عمليات مثبت بوده. حال اگر نتيجه منفي بود CPU آن را به صورت متمم 2 رها ميكند كه بايد خود برنامه نويس با استفاده از دستوات شرطي نتيجه را به كمك دستور CPL (يعني متمم كردن) و دستور INC (يك واحد اضافه كردن) تغيير دهد.
مثال عدد 6E از 4C كم شود و نتيجه تفريق در ثبات R1 قرا گيرد؟
در اين برنامه اگر نتيجه مثيت باشد كه MGH پرش مي كند و حاصل را د R1 قرار مي هد و اگر نتيجه منفي باشد ابتدا محتوا انباره متمم مي شود و سپس يك واحد به آن اضافه مي شود كه در نهايت نتيجه براير خواهد بود با -22


پرچم كري برابر صفر گردد  CLR   C
عدد 4C در انباه قرار گيرد MOV   A,#4CH
عدد 6E از انباره كم شود  SUBB   A,#6E
اگر پرچم كري صفر است به MGH پرش كن JNC    MGH
محتواي انباره را متمم كن  CPL   A
يك واحد به انباره اضافه كن  INC  A
محتواي انباره را در R1 كپي كن  MGH:   MOV   R1,A
SUBB با CY=1


از اين دستور براي تفريق اعداد 16 بيتي استفاده مي شود كه از قرض عملوند پايين تر مراقبت مي كند. اگر CY=1 باشد بعد از اجراي دستور SUBB عدد 1 از حاصل تفريق كم خواهد شد. به مثال زير توجه كنيد!
مي خواهيم عدد 2762-1296 را از هم كم كنيم؟ بايت سبك در R1و بايت سنگين در R2


كري برابر با صفر شود CLR    C
عدد 62 را در انباره بريز MOV    A,#62H
عدد 96 را از انباره كم كن كه از اين كم كردن پرچم كري 1 خواهد شد SUBB   A,#96H
نتيجه اين دو بايت را در R1 قرار بده MOV    R1,A
عدد 27 را در انباره كپي كن MOV   A,#27H
عدد 12 را از انباره كم كن و اين نتيجه را اگر CY=1 است از 1 هم كم كن SUBB   A,#12H
نتيجه را در R2 قرار بده  MOV    R2,A


توضيح برنامه: ما در اول برنامه پرچم كري را به كمك دستور CLR صفر كرديم حال براي تفريق اين عدد 16 بتي را به دو عدد 8 بتي تجزيه كرده و از هم كم مي كنيم از تفريق عدد 96 از 62 پرچم كري ما يك مي شود و اين نشان دهنده منفي بودن عمليات است و در تفريق دو بايت بعدي ميكرو دو بايت سنگين را از هم كم مي كند و سيپس نتيجه هر چه بود به پرچ كري نگاه مي كند مي بيتد كه CY=1 شده بود از قيل، پس اين نتيجه را از 1 كم مي كند و نتيجه را در R2 قرار مي دهد.


قضيه اعدا مثبت و منفي در ديجيتال
در ديجيتال ما بيت آخر را به عنوان علامت مثبت و منفي اعدد استفاده مي كنيم به اين صورت كه اگر بيت آخر كه با رنگ قرمز نشان داده شده صفر بود نشانگر مثبت بودن عدد مي باشد و اگر يك بود يعني اينكه عدد منفي مي باشد پس ما تنها از 7 بيت براي مقدار عدد مي توانيم استفاده كنيم. به محاسبه عدد زير توجه كنيد؟

0
1
0
0
0
1
1
0
=
62H
0
1
1
0
1
0
0
1
=
-96H


در ميكرو CPU عمل جمع را جمع مي كند و عمل تفريق را هم جمع مي كند چون طراحي مدار تفريق گر در CPU مشكل است از همان جمع كننده استفاده كرده اند اما براي تفريق CPU مراحل زير را انجام مي دهد.
1) ابتدا عدد منفي را متمم كرده (مكمل 1)
2) سپس يك واحد به آن اضافه مي نمايد (مكمل 2)
CPU دو عدد بالا را براي تفريق به صورت زير انجام مي دهد:
با عدد 62 كه خودش مثبت مي باشد كاري ندار و فقط روي عدد منفي به صورت زير كار مي كند.

0
1
0
0
0
1
1
0
=
62H
ثابت مي ماند
0
1
1
0
1
0
0
1
=
-96H
معادل باينري اين عدد
1
0
0
1
0
1
1
0
 
 
متمم كردن فقط عدد 96
1
 
 
 
 
 
 
 
 
+
با عدد 1 جمع مي شود
0
1
0
1
0
1
1
0
=
6AH
نتيجه بعد از جمع با عدد 1
0
1
0
0
0
1
1
0
=
62H
 
0
1
0
1
0
1
1
0
=
6AH
حال اين نتيجه را با عدد 62 جمع مي كنيم
0
0
1
1
0
0
1
1
=
CCH
نتيجه نهايي پايان كار CPU
براي اينكه نتيجه را به دسيمال تبديل كه بفهميم نتيجه عمليات چند بوده به شكل زير عمل مي كنيم
0
0
1
1
0
0
1
1
=
CCH
نتيجه نهايي را دوباره متمم مي كنيم
1
1
0
0
1
1
0
1
 
 
البته در ابن مرحله بيت علامت را متمم نمي كنيم
1
 
 
 
 
 
 
 
+
 
0
0
1
0
1
1
0
1
=
 
دسيمال عدد همرا با بيت علامت آن
4
3
-
=
-34H
كه -34H معادل -52 دسيمال مي باشد

با توجه به جدول بالا كه به وضوحنشان داده شده كه چطوري اعدا منفي از هم تفريق مي شود فهميديم كه اگر عدد ما علامت دار باشد در نتيجه 7 بيت اول مقدار عدد مي شود و بيت آخر علامت عدد مي شود كه اين بيت آخر روي پرچم كري تاثير دارد يعني اينكه اگر اين بيت 1 شود در اصل پرچم كري يك شده و وقتي كري 1 شود CPU متوجه مي شود كه نتجه محاسبه منفي بود.
حال به ادامه حل مثال بر مي گرديم:
عدد 96 از 62 كم شد و پرچم كري هم به علت منفي بودن عمليات 1 شد حال در مرحله بعد CPU عدد 12 را از 27 كم مي كند و نتيجه هر چه CPU به كري نگاه مي كند و متوجه مي شود كه در محاسبه قبلي كري يك شده و الان بايد اين نتيجه (يعني دو عدد آخري) را از يك كم كند و اين كار را انجام مي دهد و در نهايت اين محاسبه را به صوت دقيق انجام داده و نتايج را در ثبات هاي مربوطه قرار مي دهد.
پس 62-96=CCH=R1 و 27-12-1=14H=R2 كه كل نتيجه برابر با 14CCH


دستوررات ضرب و تقسيم
دستور MUL  AB 
اين دستور كه قالب آن به صورت بالا مي باشد دستور ضرب مي باشد اين دستور تنها با ثبات هاي A,B كار مي كند يعني اينكه ما بايد ابتدا دو داده اي قرار است در هم ضرب شوند را در ثبات هاي A و B قرار داده و سپس از اين دستور استفاده كنيم.
مثال دو عدد 40 و 20 را در هم ضرب كنيد؟


MOV   A,#40H
MOV   B,#20H
MUL   AB      
دستور DIV  AB 


اين دستور كه قالب آن به صورت بالا مي باشد دستور تقسيم مي باشد اين دستور تنها با ثبات هاي A,B كار مي كند يعني اينكه ما بايد ابتدا دو داده اي قرار است بر هم تقسيم شوند را در ثبات هاي A و B قرار داده و سپس از اين دستور استفاده كنيم.
مثال عدد 40 را بر 20 تقسيم كنيد؟


MOV   A,#40H
MOV   B,#20H
DIV    AB


كاربرد دستور تقسيم در مبدل هاي آنالوگ به ديجيتال است كه با تقسيم كردن بر 10 مقدار آنالوگ به دهدهي تبديل مي شود. و موارد ديگر...

  منبع: www.picpars.com

  لطفا مقالات، آموزش‌ها و پروژه های خود را به آدرس ایمیل ارتباطی ایمیل نمائید تا آن را با نام خودتان در سایت منتشر کنیم.

به این مطلب امتیاز دهید

برچسب ها:
تاریخ ارسال يكشنبه، 4 بهمن ماه، 1388    نویسندهنویسنده: مدیریت    نظرات 1 نظر    بازدید بازدید [ 12313 ]   پرینتنسخه چاپی
فایل پی دی اف فایل پی دی اف   ارسال به دوستان ارسال به دوستان