سلام دوستان
من فضای این انجمن رو مناسب دیدم و یک تایپیک پیرامون رفع اشکلات برنامه نویسی 8051 در اینجا باز کردم امیدوارم دوستان همکاری لازم را بکنند
و اما اولین سوال من خوب همتون میدونید که وقتی منبع تغذیه به 8051 وصل میشه و 8051 روشن میشه تمامی چهار تا پورت خودش رو به صورت خروجی پیکربندی میکنه و همه 32 تا پین چهار پورت در سطح یک منطقی قرار میگیرند و همچنین برای اینکه پورتی رو به صورت ورودی پیکربندی کنیم باید در اون پورت یک بنویسیم مثلاً دستور MOV P1,#0FFH تمامی 8 پین پورت یک رو بصورت ورودی پیکربندی میکنه حالا مشکل من چیه ؟ مشکل من با همین یک بودن پین ها هستش بذارید واضحتر بگم من میخوام برنامه ای بنویسم که مثلاً یک شدن و صفر شدن P1.1 رو ردیابی کنه و به محضل اینکه این پایه یک شد مثلاً عدد 24H رو در P2 بنویسه و به محض صفر شدن P1.1 عدد 56H رو در P2 بنویسه و این کار رو تکرار کنه من این برنامه رو بصورت زیر مینویسم
ORG 0H
SETB P1.1
MOV A,#24H
MOV R0,#56H
FIRST:
JB P1.1,LOOP
MOV P2,R0
LOOP:
MOV P2,A
SJMP FIRST
END
خوب تو این برنامه من اول P1.1 رو بصورت ورودی پیکربندی کردمش سپس عدد 24H رو تو رجیستر A ریختم و عدد 56H رو تو رجیستر R0 و با یه دستور شرطی یک شدن P1.1 رو ردیابی میکنم به این صورت که اگه P1.1 یک شد در این صورت شرط برقرار بوده و به حلقه LOOP پرش کرده و عدد 24H موجود تو رجیستر A رو در P2 مینویسه و دوباره به اول بر میگرده ولی اگه شرط برقرار نباشه یعنی P1.1 صفر باشه شرط اجرا نشده و در دستور بعدی عدد56H موجود تو رجیستر R0 رو تو P2 مینویسه و دوباره به اول برمیگرده من این برنامه رو تو پروتیوس هم شبیه سازی کردم و در اینجا اتچ میکنم تا ببینید حالا مشکل اینه که 8051 به محض روشن شدن عدد 24H رو تو P2 مینوسه چون P1.1 از ابتدا یک هستش به همون دلیلی که تو اول پستم گفتم و وقتی هم که P1.1 صفر میشه 8051 به طور متناوب اعداد 24H و 56H رو تو P2 مینویسه و یه جورایی قاطی میکنه ببینید این مشکل جایی خودش رو نشون میده که مثلاً شما P1.1 رو به یکی از پین های یک کلید وصل کردین و پین دوم کلید هم یا میتونه به زمین وصل بشه و یا میتونه به تغذیه وصل بشهآ ولی اون پینی که به P1.1 وصل کردین در حقیق هیچ یک از دو حالت صفر بودن یا یک بودن رو نباید داشته باشه چون به جایی وصل نیست و وضعیتش تابع پین اول کلید
هستش ولی چون به P1.1 وصله و P1.1 هم در اولین لحظه روشن شدن 8051 وضعیت یک منطقی به خودش میگیره بنابراین 8051 فوری و در همان ابتدای شروع به کار عدد 24H رو تو خروجی مینوسه در حالی که اصلاً نباید هیچ عددی رو در خروجی بنویسه چون هنوز فرمانی از سمت کلید بهش داده نشده ( من برای ایجاد همچین حالتی از دو شستی استفاده کردم که پینهای دومشون به هم وصل شده و مشترک هستش و به P1.1 رفته و پینهای دوم هر کدوم آزاد هستند بنابراین این کلید در لحضه شروع به کار مدار هیچ فرمان صفر یا یکی رو صادر نمیکنه )
حالا من چطوری باید این مشکل رو حل کنم ؟
ممنون
لینک دانلود فایل پروتیوس : http://rapidshare.de/files/10065720/8051_BUG.zip.html
من فضای این انجمن رو مناسب دیدم و یک تایپیک پیرامون رفع اشکلات برنامه نویسی 8051 در اینجا باز کردم امیدوارم دوستان همکاری لازم را بکنند
و اما اولین سوال من خوب همتون میدونید که وقتی منبع تغذیه به 8051 وصل میشه و 8051 روشن میشه تمامی چهار تا پورت خودش رو به صورت خروجی پیکربندی میکنه و همه 32 تا پین چهار پورت در سطح یک منطقی قرار میگیرند و همچنین برای اینکه پورتی رو به صورت ورودی پیکربندی کنیم باید در اون پورت یک بنویسیم مثلاً دستور MOV P1,#0FFH تمامی 8 پین پورت یک رو بصورت ورودی پیکربندی میکنه حالا مشکل من چیه ؟ مشکل من با همین یک بودن پین ها هستش بذارید واضحتر بگم من میخوام برنامه ای بنویسم که مثلاً یک شدن و صفر شدن P1.1 رو ردیابی کنه و به محضل اینکه این پایه یک شد مثلاً عدد 24H رو در P2 بنویسه و به محض صفر شدن P1.1 عدد 56H رو در P2 بنویسه و این کار رو تکرار کنه من این برنامه رو بصورت زیر مینویسم
ORG 0H
SETB P1.1
MOV A,#24H
MOV R0,#56H
FIRST:
JB P1.1,LOOP
MOV P2,R0
LOOP:
MOV P2,A
SJMP FIRST
END
خوب تو این برنامه من اول P1.1 رو بصورت ورودی پیکربندی کردمش سپس عدد 24H رو تو رجیستر A ریختم و عدد 56H رو تو رجیستر R0 و با یه دستور شرطی یک شدن P1.1 رو ردیابی میکنم به این صورت که اگه P1.1 یک شد در این صورت شرط برقرار بوده و به حلقه LOOP پرش کرده و عدد 24H موجود تو رجیستر A رو در P2 مینویسه و دوباره به اول بر میگرده ولی اگه شرط برقرار نباشه یعنی P1.1 صفر باشه شرط اجرا نشده و در دستور بعدی عدد56H موجود تو رجیستر R0 رو تو P2 مینویسه و دوباره به اول برمیگرده من این برنامه رو تو پروتیوس هم شبیه سازی کردم و در اینجا اتچ میکنم تا ببینید حالا مشکل اینه که 8051 به محض روشن شدن عدد 24H رو تو P2 مینوسه چون P1.1 از ابتدا یک هستش به همون دلیلی که تو اول پستم گفتم و وقتی هم که P1.1 صفر میشه 8051 به طور متناوب اعداد 24H و 56H رو تو P2 مینویسه و یه جورایی قاطی میکنه ببینید این مشکل جایی خودش رو نشون میده که مثلاً شما P1.1 رو به یکی از پین های یک کلید وصل کردین و پین دوم کلید هم یا میتونه به زمین وصل بشه و یا میتونه به تغذیه وصل بشهآ ولی اون پینی که به P1.1 وصل کردین در حقیق هیچ یک از دو حالت صفر بودن یا یک بودن رو نباید داشته باشه چون به جایی وصل نیست و وضعیتش تابع پین اول کلید
هستش ولی چون به P1.1 وصله و P1.1 هم در اولین لحظه روشن شدن 8051 وضعیت یک منطقی به خودش میگیره بنابراین 8051 فوری و در همان ابتدای شروع به کار عدد 24H رو تو خروجی مینوسه در حالی که اصلاً نباید هیچ عددی رو در خروجی بنویسه چون هنوز فرمانی از سمت کلید بهش داده نشده ( من برای ایجاد همچین حالتی از دو شستی استفاده کردم که پینهای دومشون به هم وصل شده و مشترک هستش و به P1.1 رفته و پینهای دوم هر کدوم آزاد هستند بنابراین این کلید در لحضه شروع به کار مدار هیچ فرمان صفر یا یکی رو صادر نمیکنه )
حالا من چطوری باید این مشکل رو حل کنم ؟
ممنون
لینک دانلود فایل پروتیوس : http://rapidshare.de/files/10065720/8051_BUG.zip.html
دیدگاه