سلام بر اساتید
عید بر همه مبارک
من یک بر نامه به زبان اسمبلی میکرو8051 برای شمارش تعداد قطع و وصل شدن کلید نوشتم . در این بر نامه از 3 تا سگمنت استفاده کردم که به 3 پورت وصل شدن. (برنامه ان در زیر هست که با اسم برنامه اول نام گذاری شده)
سگمنت1= به پورت 0 وصل شده و نشانگر اعداد یکان است.
سگمنت2= به پورت 2 وصل شده و نشانگر اعداد دهگان است.
سگمنت3= به پورت 3 وصل شده و نشانگر اعداد صدگان است.
پورت1 هم به عنوان ورودی معرفی شده است. که 3کلید به ان وصل است. کلیدی که بهP1.1 وصل است کار START رو (درگار گاه ماشین برای راه اندازی ساده یک موتور ) انجام میده وP1.2 کار STOPور (درگار گاه ماشین برای راه اندازی ساده یک موتور ) انجام میده و P1.0 کار افزایش مقدار سگمنت ها را بر عهده دارد.
اصول کار این طور هست که ابتدا سگمنت ها رو معرفی می کنم بعد شروع به افزایش مقدار سگمنت1 می کنم اگر مقدار سگمنت1 از عدد9 بیشتر شد سگمنت1=0 خواهد شد ولی به سگمنت2 یک واحد افزایش پیدا می کند. این حلقه باز ادامه می یابد تا مقدار سگمنت2 به عدد 9 برسد و مانند شرط قبل اگر مساوی 10شد یعنی بیشتر از 9شد سگمنت 1وسگمنت2 هر دو=0 وبه سگمنت3 یک واحد افزایش داده شود این حلقه باز هم ادامه پیدا می کند تا سگمنت3 به عدد 9 برسد و بعد از 9 چون 10 است مانند شرط های قبل سگمنت1و سگمنت2و سگمنت3 هرسه مساوی 0 می شوند که این بیانگر پایان شمارش است. COMPA هم نقش مقایسه را بر عهده دارد که اعداد 1و2و3 مشخص شده اند.
این برنامه درست کار می کندولی من می خواهم از تکنیک خطای دید برای نشان دادن اعداد استفاده کنم یعنی از یک پورت ویک آی سی 7447و3 عدد سگمنت. برنامه ی خطای دید را هم نوشتم ولی لطفا یک نگاه بیندازید و اشکالاتش را به من به بگید. (برنامه ان در زیر هست که با اسم برنامه دوم نام گذاری شده) متشکرم.
توجه : بر نامه اول بدون خطای دید است ولی برنامه دوم با خطای دید است:
برنامه اول(بدون خطای دید):
میتوانید فایل پورتیوس6.9 ان رو از لینک زیر دریافت کنید:
http://rapidshare.com/files/20943482..._8051.zip.html
SEG1 EQU 15H
SEG2 EQU 16H
SEG3 EQU 17H
ORG 20H
MOV P1,#0FFH
MOV SEG1,#0H
MOV SEG2,#0H
MOV SEG3,#0H
MAIN: JB P1.1,START
JB P1.2,STOP
LJMP MAIN
START: JNB P1.0,INCUP
JB P1.2,STOP
SJMP MAIN
INCUP:
MOV A,#0H
INC SEG1
MOV A,SEG1
SJMP COMPA1
COMPA1: CJNE A,#0AH,SHOW1
MOV SEG1,#0H ;<==
LCALL SHOW
MOV A,#0H
INC SEG2
MOV A,SEG2
SJMP COMPA2
COMPA2: CJNE A,#0AH,SHOW1
MOV SEG1,#0H ;<==
MOV SEG2,#0H ;<==
LCALL SHOW
MOV A,#0
INC SEG3
MOV A,SEG3
SJMP COMPA3
COMPA3: CJNE A,#0AH,SHOW1
MOV SEG1,#0H
MOV SEG2,#0H
MOV SEG3,#0H
LCALL SHOW
SETB P0.6
LOO2: LJMP LOO2
SHOW1: MOV P0,SEG1
MOV P2,SEG2
MOV P3,SEG3
LOO1: JNB P1.0,LOO1
LJMP LOOP
SHOW: MOV P0,SEG1
MOV P2,SEG2
MOV P3,SEG3
RET
STOP: SETB P0.7
JNB P1.0,DANGE
DANGE: JB P1.2,DANGE
LJMP MAIN
END
برنامه دوم(با خطای دید):
نکته : در این روش از ترانزیستور های PNP برای روشن کردن سگمنت ها استفاده کردم .
میتوانید فایل پورتیوس6.9 ان رو از لینک زیر دریافت کنید:
http://rapidshare.com/files/20943579...E_DID.zip.html
SEG1 EQU 15H
SEG2 EQU 16H
SEG3 EQU 17H
ORG 20H
MOV P1,#0FFH
MOV SEG1,#0H
MOV SEG2,#0H
MOV SEG3,#0H
MAIN: LCALL SHOW
JB P1.1,START
JB P1.2,STOP
LJMP MAIN
START: JNB P1.0,INCUP
JB P1.2,STOP
SJMP MAIN
INCUP:
MOV A,#0H
INC SEG3
MOV A,SEG3
SJMP COMPA1
COMPA1: CJNE A,#3AH,SHOW1
MOV SEG3,#30H ;<==
LCALL SHOW
MOV A,#0H
INC SEG2
MOV A,SEG2
SJMP COMPA2
COMPA2: CJNE A,#5AH,SHOW1
MOV SEG3,#30H ;<==
MOV SEG2,#50H ;<==
LCALL SHOW
MOV A,#0
INC SEG1
MOV A,SEG1
SJMP COMPA3
COMPA3: CJNE A,#6AH,SHOW1
MOV SEG2,#50H ;<==
MOV SEG1,#60H ;<==
LCALL SHOW
SETB P2.0
LOO2: LJMP LOO2
SHOW1: MOV P0,SEG3
LCALL DELAY
MOV P0,SEG2
LCALL DELAY
MOV P0,SEG1
LCALL DELAY
LOO1: JNB P1.0,LOO1
LJMP MAIN
SHOW: MOV P0,SEG3
LCALL DELAY
MOV P0,SEG2
LCALL DELAY
MOV P0,SEG1
LCALL DELAY
RET
STOP: SETB P2.1
JNB P1.0,DANGE
DANGE: JB P1.2,DANGE
LJMP MAIN
DELAY: MOV R0,#255
LOOP3: MOV R1,#25
LOOP2: MOV R2,#2
LOOP1: DJNZ R2,LOOP1
DJNZ R1,LOOP2
DJNZ R0,LOOP3
RET
END
عید بر همه مبارک
من یک بر نامه به زبان اسمبلی میکرو8051 برای شمارش تعداد قطع و وصل شدن کلید نوشتم . در این بر نامه از 3 تا سگمنت استفاده کردم که به 3 پورت وصل شدن. (برنامه ان در زیر هست که با اسم برنامه اول نام گذاری شده)
سگمنت1= به پورت 0 وصل شده و نشانگر اعداد یکان است.
سگمنت2= به پورت 2 وصل شده و نشانگر اعداد دهگان است.
سگمنت3= به پورت 3 وصل شده و نشانگر اعداد صدگان است.
پورت1 هم به عنوان ورودی معرفی شده است. که 3کلید به ان وصل است. کلیدی که بهP1.1 وصل است کار START رو (درگار گاه ماشین برای راه اندازی ساده یک موتور ) انجام میده وP1.2 کار STOPور (درگار گاه ماشین برای راه اندازی ساده یک موتور ) انجام میده و P1.0 کار افزایش مقدار سگمنت ها را بر عهده دارد.
اصول کار این طور هست که ابتدا سگمنت ها رو معرفی می کنم بعد شروع به افزایش مقدار سگمنت1 می کنم اگر مقدار سگمنت1 از عدد9 بیشتر شد سگمنت1=0 خواهد شد ولی به سگمنت2 یک واحد افزایش پیدا می کند. این حلقه باز ادامه می یابد تا مقدار سگمنت2 به عدد 9 برسد و مانند شرط قبل اگر مساوی 10شد یعنی بیشتر از 9شد سگمنت 1وسگمنت2 هر دو=0 وبه سگمنت3 یک واحد افزایش داده شود این حلقه باز هم ادامه پیدا می کند تا سگمنت3 به عدد 9 برسد و بعد از 9 چون 10 است مانند شرط های قبل سگمنت1و سگمنت2و سگمنت3 هرسه مساوی 0 می شوند که این بیانگر پایان شمارش است. COMPA هم نقش مقایسه را بر عهده دارد که اعداد 1و2و3 مشخص شده اند.
این برنامه درست کار می کندولی من می خواهم از تکنیک خطای دید برای نشان دادن اعداد استفاده کنم یعنی از یک پورت ویک آی سی 7447و3 عدد سگمنت. برنامه ی خطای دید را هم نوشتم ولی لطفا یک نگاه بیندازید و اشکالاتش را به من به بگید. (برنامه ان در زیر هست که با اسم برنامه دوم نام گذاری شده) متشکرم.
توجه : بر نامه اول بدون خطای دید است ولی برنامه دوم با خطای دید است:
برنامه اول(بدون خطای دید):
میتوانید فایل پورتیوس6.9 ان رو از لینک زیر دریافت کنید:
http://rapidshare.com/files/20943482..._8051.zip.html
SEG1 EQU 15H
SEG2 EQU 16H
SEG3 EQU 17H
ORG 20H
MOV P1,#0FFH
MOV SEG1,#0H
MOV SEG2,#0H
MOV SEG3,#0H
MAIN: JB P1.1,START
JB P1.2,STOP
LJMP MAIN
START: JNB P1.0,INCUP
JB P1.2,STOP
SJMP MAIN
INCUP:
MOV A,#0H
INC SEG1
MOV A,SEG1
SJMP COMPA1
COMPA1: CJNE A,#0AH,SHOW1
MOV SEG1,#0H ;<==
LCALL SHOW
MOV A,#0H
INC SEG2
MOV A,SEG2
SJMP COMPA2
COMPA2: CJNE A,#0AH,SHOW1
MOV SEG1,#0H ;<==
MOV SEG2,#0H ;<==
LCALL SHOW
MOV A,#0
INC SEG3
MOV A,SEG3
SJMP COMPA3
COMPA3: CJNE A,#0AH,SHOW1
MOV SEG1,#0H
MOV SEG2,#0H
MOV SEG3,#0H
LCALL SHOW
SETB P0.6
LOO2: LJMP LOO2
SHOW1: MOV P0,SEG1
MOV P2,SEG2
MOV P3,SEG3
LOO1: JNB P1.0,LOO1
LJMP LOOP
SHOW: MOV P0,SEG1
MOV P2,SEG2
MOV P3,SEG3
RET
STOP: SETB P0.7
JNB P1.0,DANGE
DANGE: JB P1.2,DANGE
LJMP MAIN
END
برنامه دوم(با خطای دید):
نکته : در این روش از ترانزیستور های PNP برای روشن کردن سگمنت ها استفاده کردم .
میتوانید فایل پورتیوس6.9 ان رو از لینک زیر دریافت کنید:
http://rapidshare.com/files/20943579...E_DID.zip.html
SEG1 EQU 15H
SEG2 EQU 16H
SEG3 EQU 17H
ORG 20H
MOV P1,#0FFH
MOV SEG1,#0H
MOV SEG2,#0H
MOV SEG3,#0H
MAIN: LCALL SHOW
JB P1.1,START
JB P1.2,STOP
LJMP MAIN
START: JNB P1.0,INCUP
JB P1.2,STOP
SJMP MAIN
INCUP:
MOV A,#0H
INC SEG3
MOV A,SEG3
SJMP COMPA1
COMPA1: CJNE A,#3AH,SHOW1
MOV SEG3,#30H ;<==
LCALL SHOW
MOV A,#0H
INC SEG2
MOV A,SEG2
SJMP COMPA2
COMPA2: CJNE A,#5AH,SHOW1
MOV SEG3,#30H ;<==
MOV SEG2,#50H ;<==
LCALL SHOW
MOV A,#0
INC SEG1
MOV A,SEG1
SJMP COMPA3
COMPA3: CJNE A,#6AH,SHOW1
MOV SEG2,#50H ;<==
MOV SEG1,#60H ;<==
LCALL SHOW
SETB P2.0
LOO2: LJMP LOO2
SHOW1: MOV P0,SEG3
LCALL DELAY
MOV P0,SEG2
LCALL DELAY
MOV P0,SEG1
LCALL DELAY
LOO1: JNB P1.0,LOO1
LJMP MAIN
SHOW: MOV P0,SEG3
LCALL DELAY
MOV P0,SEG2
LCALL DELAY
MOV P0,SEG1
LCALL DELAY
RET
STOP: SETB P2.1
JNB P1.0,DANGE
DANGE: JB P1.2,DANGE
LJMP MAIN
DELAY: MOV R0,#255
LOOP3: MOV R1,#25
LOOP2: MOV R2,#2
LOOP1: DJNZ R2,LOOP1
DJNZ R1,LOOP2
DJNZ R0,LOOP3
RET
END