PDA

View Full Version : 8051



melody_k
سه شنبه 02 خرداد 1385, 20:24 عصر
سلام دوستان
من در حال حاضر دارم با 8051 کار میکنم.میکرو من AT89C51 است و با پورت سریال کار می کنم قراره در این برنامه دو بایت داده که از PC میرسه در دو خانه متوالی حافظه ذخیره بشه.(برنامه PC با سی نوشته شده) حالا من می خوام ببینم داده درست رسیده یا نه؟توی برنامه زیر سابروتینهای مربوطه رو نوشتم بنظر من باید درست کار کنه ولی وقتی در برنامه اصلی (که قسمتیشو اینجا نوشتم) سابروتین تبدیل هگز به دسیمال و سابروتین display را فراخوانی می کنم مقداری رو که روی lcd نمایش میده درست نیست یعنی با مقداری که از کامپیوتر فرستاده میشه مطابقت نداره و البته یه مقدار ثابته.من خیلی باهاش ور رفتم ولی درست نشد بنظر شما مشکل از کجاست؟
(ارسال به این صورته که کامپیوتر اغاز ارسال را با فرستادن s اطلاع میده و میکرو R0 رو با ادرس 08 بار میکنه بایت بعدی که ارسال میشه 4 بیت پایینش low byte داده است و 4 بیت بالاش 1000 بایت بعدی 4 بیت پایینش high byte داده و 4 بیت بالاش 1000 است و پایان ارسال با فرستادن E اعلام میشه.توی سابروتین وقفه بایت اول داده توی ادرسی که R0 بهش اشاره میکنه ذخیره میشه و مقدار R0 یکی اضافه میشه و بایت بعدی هم به همین صورت.وقتیE ارسال شد سابروتین convert فراخوانی میشه وداده به شکل اولش تبدیل میشه و در R7 از بانک یک ذخیره میشه.حالا مشکل اینجاست که درست نمایش داده نمیشه)
البته سابروتین display درست کار می کنه.
میدونم طولانی شد ولی لطفا وقت بذارید و اگه میتونید راهنمایی کنید (من که خیلی کلافه شدم)

SETB PSW.3
MOV A,R7
CLR PSW.3 قسمتی از برنامه اصلی
ACALL HEXTODEC
ACALL DISPLAY
SJMP AGAIN
******************************************subrouti n 1**************
HEXTODEC:
MOV B,#10
DIV AB
MOV R5,B
MOV B,#10
DIV AB
ORL A,#30H
MOV R7,A
MOV A,B
ORL A,#30H
MOV R6,A
MOV A,R5
ORL A,#30H
MOV R5,A
RET
***************************************** subroutin 2 ********
DISPLAY:

again1:
MOV A,#38H
ACALL COMMAND
MOV A,#0EH
ACALL COMMAND
MOV A,#01H
ACALL COMMAND
MOV A,#06H
ACALL COMMAND
MOV A,#86H
ACALL COMMAND
MOV A,R7
ACALL DATA_DISPLAY
MOV A,R6
ACALL DATA_DISPLAY
MOV A,R5
ACALL DATA_DISPLAY
RET
COMMAND: ACALL READY
MOV P1,A
CLR P3.2
CLR P3.3
SETB P3.6
CLR P3.6
RET
DATA_DISPLAY:
ACALL READY
MOV P1,A
SETB P3.2
CLR P3.3
SETB P3.6
CLR P3.6
RET
READY: SETB P1.7
CLR P3.2
SETB P3.3
BACK1: CLR P3.6
SETB P3.6
JB P1.7,BACK1
RET

******************************************subrouti n 3 ***********
CONVERT:
MOV R0,#08H
MOV A,@R0
ANL A,#0FH
MOV @R0,A
INC R0
MOV A,@R0
ANL A,#0FH
SWAP A
DEC R0
ORL A,@R0
SETB PSW.3
MOV R7,A
CLR PSW.3
ACALL HEXTODEC
ACALL DISPLAY
RET







;******************************************SERIAL ISR**************
SERIAL_ISR:
JB TI,TRANS
MOV A,SBUF
CLR RI
CJNE A,#'S',TEST
MOV R0,#08H
MOV SBUF,#'S'
JMP BACK4
TEST: CJNE A,#'E',BACK2
ACALL CONVERT
JMP BACK4
BACK2: MOV R1,A
ANL A,#0F0H
CJNE A,#80H,BACK4
MOV A,R1
MOV @R0,A
INC R0
BACK4: RETI

TRANS:
CLR TI
SETB P3.7
RETI
END

MM_Mofidi
چهارشنبه 10 خرداد 1385, 13:08 عصر
عددی که از کامپیوتر در یافت میکنی برای نمایش روی lcd باید کد ascii اش را بفرستی نه خودش را :)
بعدم برای چک کردن برنامه ات اول از یک Emoulator استفاده کن مثل proteus از ISIS که قابلیت بار کردن hex فایل به میکرو را هم دارد.
مشکلی بود تماس بگیر(mail)

melody_k
سه شنبه 16 خرداد 1385, 08:13 صبح
سلام
ممنون از راهنماییتون ولی مشکل حل شد. مسایلی که گفتینو رعایت کرده بودم مشکل از برنامه اسمبلی نبود از برنامه ای بود که روی pc اجرا میشد