<CODE>ORG 0H ;0H부터 리셋 벡터 MOV P2,#00000000B ;P2에 00000000B을 전송 ;모터 정지 CALL LCDINIT ;LCDINIT문으로 점프 ;LCD 의 초기화 MOV DPTR,#FORMAT1 ;DPTR에 FORMAT1전송 ;LCD 메세지 CALL LINE1 ;LINE1문으로 점프 MOV DPTR,#FORMAT2 ;DPTR에 FORMAT2전송 ;LCD 메세지 CALL LINE2 ;LINE2문으로 점프 ;모니터 프로그램으로 READY: JB P3.7,$ ;P3.7이 1이면 현주소 P3.7로 점프(조건 점프명령) CLR P3.6 ;빨강 LED 점등 CALL DLY2 CLR P3.5 ;녹색 LED 점등 START: MOV P2,#00000000B ;모터 스톱 JB P0.2,LEFT ;P0.2이 1이면 LEFT로 점프 ;태양이 왼쪽 JB P0.3,RIGHT ;P0.3이 1이면 RIGHT로 점프 ;태양이 오른쪽 JB P0.0,UP ;P0.0이 1이면 UP로 점프 ;태양이 위쪽 JB P0.1,DOWN ;P0.1이 1이면 DOWN로 점프 ;태양이 아래쪽 MOV DPTR,#MSG5 ;DPTR에 MSG5전송 ;Tracking메세지 CALL LINE2 ;LINE2문으로 점프 UP: JB P0.1,START ;P0.1이 1이면 start로 점프 MOV P2,#00001100B ;P2에 00001100B을 전송 CALL DLY2 ;DLY2문으로 점프 MOV P2,#00000110B ;P2에 00000110B을 전송 CALL DLY2 ;DLY2문으로 점프 MOV P2,#00000011B ;P2에 00000011B을 전송 CALL DLY2 MOV P2,#00001001B ;P2에 00001001B을 전송 CALL DLY2 MOV DPTR,#MSG1 ;DPTR에 MSG1전송 CALL LINE2 ;LINE2문으로 점프 JMP START ;START문으로 점프 DOWN: MOV P2,#00000001B ;P2에 00000001B을 전송 CALL DLY2 MOV P2,#00000010B ;P2에 00000010B을 전송 CALL DLY2 MOV P2,#00000100B ;P2에 00000100B을 전송 CALL DLY2 MOV P2,#00001000B ;P2에 00001000B을 전송 CALL DLY2 MOV DPTR,#MSG2 ;DPTR에 MSG2전송 CALL LINE2 ;LINE2문으로 점프 JMP START ;START문으로 점프 LEFT: JB P0.3,START ;P0.3이 1이면 start로 점프 MOV P2,#10000000B ;P2에 10000000B을 전송 CALL DLY2 MOV P2,#01000000B ;P2에 01000000B을 전송 CALL DLY2 MOV P2,#00100000B ;P2에 00100001B을 전송 CALL DLY2 MOV P2,#00010000B ;P2에 00010000B을 전송 CALL DLY2 MOV DPTR,#MSG3 ;DPTR에 MSG3전송 CALL LINE2 ;LINE2문로 점프 JMP START ;START문로 점프 RIGHT: MOV P2,#00010000B ;P2에 00010000B을 전송 CALL DLY2 MOV P2,#00100000B ;P2에 00100000B을 전송 CALL DLY2 MOV P2,#01000000B ;P2에 01000000B을 전송 CALL DLY2 MOV P2,#10000000B ;P2에 10000000B을 전송 CALL DLY2 MOV DPTR,#MSG4 ;DPTR에 MSG4전송 CALL LINE2 ;LINE2문으로 점프 JMP START ;START문으로 점프 DLY2: MOV 40H,#0AH ;40H에 16진 상수 0AH(10)을 전송 GG: MOV 41H,#0FFH ;41H에 16진 상수 FFH 를 전송 DJNZ 41H,$ ;41H을 1씩 감소시키면서 0이 될 때까지 반복 DJNZ 40H,GG ;40H을 1감소시키고 0이 아니면 GG문으로 점프 1이면 다음을 실행 RET ;서브루틴 종료 LCDINIT: CLR P3.1 ;P3.1의 값을 0으로 저장 CALL DLY ;DLY문으로 점프 MOV DPTR,#SETUP ;DPTR에 SETUP전송 LCDLOOP: CLR A ;어큐뮬레이터 A에 0의 값을 저장한다. MOVC A,@A+DPTR ;DPTR로 지정된주소지의 데이터(DB로 명명)값에 A값을 더하여그값을 A에 저장. INC A ;어큐뮬레이터 A의 내용을 1증가시킨다. JZ LCDEND ;A=0이면 LCDEND의 위치로 점프 SETB P3.0 ;P3.0의 값을 1로한다. CALL DLY ;DLY문으로 점프 DEC A ;A의 내용을 1 감소시킨다. MOV P1,A ;A의 내용을 P1에 전송한다. INC DPTR ;DPTR의 값을 1 증가시킨다. CALL DLY ;DLY문으로 점프 CLR P3.0 ;P3.0에 0의 값을 저장한다. CALL DLY ;DLY문으로 점프 JMP LCDLOOP ;LCDLOOP문으로 점프 LCDEND: RET ;서브루틴 종료 LINE2: CLR P3.1 ;P3.1에 0의 값을 저장한다. SETB P3.0 ;P3.0의 값을 1로한다. MOV P1,#0C0H ;P1에 16진 상수 C0H 를 전송 CALL DLY ;DLY문으로 점프 CLR P3.0 ;P3.0에 0의 값을 저장한다. LINE1: SETB P3.1 ;P3.1의 값을 1로한다. CALL DLY ;DLY문으로 점프 CALL LCDLOOP ;LCDLOOP문으로 점프 RET DLY: DJNZ 3FH,$ ;3FH을 1씩 감소시키면서 0이 될 때까지 반복 RET ;서브루틴 종료 ; LCD에 표시하기위한 데이터 베이스 ASCII: DB '0123456789ABCDEF',0FFH SETUP: DB 038H,0CH,02H,01H,0FFH FORMAT1: DB ' SNUT SOLAR ',0FFH FORMAT2: DB ' TRACKING SYSTEM',0FFH MSG1: DB ' [ UP ] ',0FFH MSG2: DB ' [ DOWN ] ',0FFH MSG3: DB ' [ LEFT ] ',0FFH MSG4: DB ' [ RIGHT ] ',0FFH MSG5: DB ' TRACKING.... ',0FFH END 말도안되는 이런질문을 올려도 되는지 모르겠네요ㅠㅠ cds를 이용하여 모터를 제어할 생각입니다.(추적식태양광시스템) 소스를 구해서 8051에 라이팅까지 마쳤는데 구동이 안되네요... 배전은 꼼꼼히 마쳤다 생각되어 프로그램쪽에 문제가 있을까 해서 이렇게 질문드립니다. 어떠한 조언이라도 감사드리겠습니다. 살려주세요 ㅠㅠ </CODE> < type=text/>Skin_LastUpdate('20120503115924')</>* 최종수정일 :<>getDateFormat('20120503115924' , 'xxxx.xx.xx <xx:xx>')</> 2012.05.03 <11:59> |
ARM이면 배우고있는중이라 조금 도움될테지만 8051은 잘;;;
8051 이라면 실제로 포트에 나가고 이런거 테스트 하는 시뮬레이터가 있을텐데 @0@.. keil 이런거 였던가?
걍 C로 짜셈