어셈블리 언어로 8051 프로그래밍 소개

문제를 제거하기 위해 도구를 사용해보십시오





어셈블리 언어는 니모닉 측면에서 프로그램 코드를 작성하는 데 사용되는 저수준 프로그래밍 언어입니다. 현재 수요가 많은 고급 언어가 많이 있지만 어셈블리 프로그래밍 언어는 많은 응용 프로그램에서 널리 사용되며 직접 하드웨어 조작에 사용할 수 있습니다. 그것은 또한 쓰기 위해 사용됩니다 8051 프로그래밍 코드 다른 고급 언어에 비해 더 적은 메모리를 사용하여 더 적은 수의 클록 사이클로 효율적입니다.

어셈블리 언어로 8051 프로그래밍

8051 프로그래밍



어셈블리 언어로 8051 프로그래밍

어셈블리 언어는 완전한 하드웨어 관련 프로그래밍 언어입니다. 임베디드 설계자는 프로그램을 작성하기 전에 특정 프로세서 또는 컨트롤러의 하드웨어에 대한 충분한 지식이 있어야합니다. 어셈블리 언어는 니모닉에 의해 개발 되었기 때문에 사용자는 프로그램 수정을 쉽게 이해할 수 없습니다.


어셈블리 언어로 8051 프로그래밍

어셈블리 언어로 8051 프로그래밍



어셈블리 프로그래밍 언어는 다양한 컴파일러와 '볼링장' 가장 적합합니다 마이크로 컨트롤러프로그램 작성 개발. 미디엄icrocontrollers또는 프로세서는 '0 또는 1'형식의 이진 언어 만 이해할 수 있습니다. 어셈블러는 어셈블리 언어를 이진 언어로 변환 한 다음마이크로 컨트롤러특정 작업을 수행하는 메모리.

8051 마이크로 컨트롤러 아키텍처

8051마이크로 컨트롤러이다 CISC 기반 Harvard 아키텍처 , 32 I / O, 타이머 / 카운터, 직렬 통신 및 메모리와 같은 주변 장치가 있습니다. 그만큼마이크로 컨트롤러저장하고 기능을 읽기 위해 메모리가 필요한 작업을 수행하는 프로그램이 필요합니다. 8051마이크로 컨트롤러명령을 저장하기위한 RAM과 ROM 메모리로 구성됩니다.

8051 마이크로 컨트롤러 Arctitecuture

8051 마이크로 컨트롤러 아키텍처

레지스터는 프로세서 및마이크로 컨트롤러 데이터를 더 빠르게 수집하고 저장하는 방법을 제공하는 메모리에 포함되어 있습니다. 8051 어셈블리 언어 프로그래밍은 메모리 레지스터를 기반으로합니다. 빼기, 더하기 등을 수행하여 데이터를 프로세서 또는 컨트롤러로 조작하려면 메모리에서 직접 수행 할 수 없지만 데이터를 처리하고 저장하려면 레지스터가 필요합니다.마이크로 컨트롤러명령이나 그 안에서 작동하는 내용에 따라 분류 할 수있는 여러 유형의 레지스터를 포함합니다.

어셈블리 언어로 된 8051 마이크로 컨트롤러 프로그램

어셈블리 언어는 프로그램을 작성하는 데 사용되는 요소로 구성됩니다.순차적 방식. 주어진 규칙에 따라 어셈블리 언어로 프로그래밍을 작성하십시오.


어셈블리 언어 규칙

  • 어셈블리 코드는 대문자로 작성해야합니다.
  • 레이블 뒤에는 콜론 (label :)이 와야합니다.
  • 모든 기호와 레이블은 문자로 시작해야합니다.
  • 모든 주석은 소문자로 입력됩니다.
  • 프로그램의 마지막 줄은 END 지시문이어야합니다.

어셈블리 언어 니모닉은 작업을 수행하는 데 사용되는 MOV, ADD, JMP 등과 같은 연산 코드 형식입니다.

Op 코드 : 연산 코드는 CPU에서 실행할 수있는 단일 명령입니다. 여기서 연산 코드는 MOV 명령어입니다.

피연산자 : 피연산자는 연산 코드로 작동 할 수있는 단일 데이터입니다. 예를 들어, 곱하기 연산은 피연산자가 곱해진 피연산자에 의해 수행됩니다.

구문 : MUL a,

어셈블리 언어 프로그래밍의 요소 :

  • 조립 지침
  • 명령어 세트
  • 주소 지정 모드

조립 지침 :

조립 지시문은 CPU에 대한 지침을 제공합니다. 8051마이크로 컨트롤러제어 장치에 방향을 제공하는 다양한 종류의 조립 지침으로 구성됩니다. 가장 유용한 지시문은 다음과 같은 8051 프로그래밍입니다.

  • ORG
  • DB
  • EQU
  • 종료

ORG(유래): 이 지시문은 프로그램의 시작을 나타냅니다. 조립 중에 레지스터 주소를 설정하는 데 사용됩니다. 예를 들어 ORG 0000h는 주소 0000h에서 시작하는 모든 후속 코드를 컴파일러에 알려줍니다.

통사론: ORG 0000h

DB(바이트 정의) : 정의 바이트는 바이트 문자열을 허용하는 데 사용됩니다. 예를 들어, 각 문자가 주소로 사용되는 'EDGEFX'를 인쇄하고 마지막으로 큰 따옴표를 사용하여 DB에서 '문자열'을 직접 인쇄합니다.

통사론:

ORG 0000h

MOV a, # 00h
————-
————-
DB“EDGEFX”

EQU (동등) : 동등한 지시문은 변수의 주소를 동일시하는 데 사용됩니다.

통사론:

reg 에쿠,09h
—————–
—————–
MOVreg,# 2 시간

종료: END 지시문은 프로그램의 끝을 나타내는 데 사용됩니다.

통사론:

reg 에쿠,09h

—————–
—————–
MOVreg,# 2 시간
종료

주소 지정 모드 :

데이터에 액세스하는 방법을 주소 지정 모드라고합니다. CPU는 주소 지정 모드를 사용하여 다양한 방식으로 데이터에 액세스 할 수 있습니다. 8051마이크로 컨트롤러다음과 같은 5 가지 주소 지정 모드로 구성됩니다.

  • 즉시 주소 지정 모드
  • 주소 지정 모드 등록
  • 직접 주소 지정 모드
  • 간접 주소 지정 모드
  • 기본 인덱스 주소 지정 모드

즉시 주소 지정 모드 :

이 주소 지정 모드에서 소스는 뒤에‘#’이 올 수있는 값이어야하고 대상은 SFR 레지스터, 범용 레지스터 및 주소. 메모리 레지스터에 값을 즉시 저장하는 데 사용됩니다.

통사론:

MOV A, # 20h // A는an누산기 레지스터, 20은 A //
MOV R0,# 15 // R0은 범용 레지스터입니다. 15는 R0 레지스터에 저장됩니다.
MOV P0, # 07h // P0은 SFR 레지스터입니다 .07은 P0 //에 저장됩니다.
MOV 20h,# 05h // 20h는 20h //에 저장된 레지스터 05의 주소입니다.

전자:

MOV R0, # 1
MOV R0, # 20 // R0<—R0[15] +20, 최종 값은 R0 //에 저장됩니다.

주소 지정 모드 등록 :

이 주소 지정 모드에서 소스와 대상은 레지스터 여야하지만 범용 레지스터는 아니어야합니다. 따라서 데이터는 범용 은행 등록기 .

통사론:

MOV A, B // A는 SFR 레지스터, B는 범용 레지스터 //
MOV R0, R1 // 유효하지 않은 명령, GPR에서 GPR로 불가능 //

전자:

MOV R0, # 02h
MOV A, # 30h
R0, A // R0 추가<—R0+A, the final value is stored in the R0 register//

직접 주소 지정 모드

이 주소 지정 모드에서 소스 또는 대상 (또는 소스와 대상 모두)은 주소 여야하지만 값은 아니어야합니다.

통사론:

MOV A,20h // 20h는 주소 A는 레지스터입니다 .//
MOV 00h, 07h // 둘 다 GPS 레지스터 주소 지정됨 //

전자:

MOV 07h,# 01h
MOV A, # 08h
을 추가하다,07 시간 // A<—A+07h the final value is stored in A//

간접 주소 지정 모드 :

이 주소 지정 모드에서 소스 또는 대상 (또는 대상 또는 소스)은...에간접 주소이지만 값은 아닙니다. 이 주소 지정 모드는 포인터 개념을 지원합니다. 포인터는 다른 변수의 주소를 저장하는 데 사용되는 변수입니다. 이 포인터 개념은 R0 및 R1 레지스터에만 사용됩니다.

통사론:

MOVR0, # 01h // 01 값은 R0 레지스터에 저장, R0 주소는 08h //
MOV R1, # 08h // R1은백화점R0의 주소 (08h) //
MOV 20h,@ R1 // 01 값은 GP 레지스터의 20h 주소에 저장됩니다.

간접 주소 지정 모드

간접 주소 지정 모드

기본 인덱스 주소 지정 모드 :

이 주소 지정 모드는 데이터를 읽는 데 사용됩니다. 외부 메모리 또는 ROM 메모리 . 모든 주소 지정 모드는 코드 메모리에서 데이터를 읽을 수 없습니다. 코드는 DPTR 레지스터를 통해 읽어야합니다. DPTR은 코드 또는 외부 메모리의 데이터를 가리키는 데 사용됩니다.

통사론:

MOVC A, @ A + DPTR // C는 코드 메모리를 나타냅니다 .//
MOCX A, @ A + DPTR // X는 외부 메모리를 나타냅니다 .//
예 : MOV A, # 00H // 00H는 A 레지스터에 저장됩니다.
MOV DPTR, # 0500H // DPTR은 메모리의 0500h 주소를 가리 킵니다.
MOVC A, @ A + DPTR // 값 보내기...에A 레지스터 //
MOV P0, A // A의 날짜를 PO 등록자에게 보냅니다 .//

명령어 세트:

명령어 세트는 데이터 처리를 위해 컨트롤러를 안내하기 위해 컨트롤러에 명령을 제공하는 컨트롤러 또는 프로세서의 구조입니다. 명령어 세트는 명령어, 기본 데이터 유형, 주소 지정 모드, 인터럽트 레지스터, 뛰어난 처리 및 메모리 아키텍처로 구성됩니다. 그만큼 8051마이크로 컨트롤러 Harvard 아키텍처에서 CISC 지침을 따를 수 있습니다. 8051 프로그래밍의 경우 다른 유형의 CISC 명령어는 다음과 같습니다.

  • 데이터 전송 지침 세트
  • 순차 명령어 세트
  • 산술 명령어 세트
  • 분기 Instruction세트
  • 루프 명령 세트
  • 조건부 명령어 세트
  • 무조건 명령어 세트
  • 논리적 명령어 세트
  • 부울 명령어 세트

산술 명령어 세트 :

산술 명령어는 다음과 같은 기본 작업을 수행합니다.

  • 부가
  • 곱셈
  • 빼기
  • 분할

부가:

ORG 0000h
MOV R0, # 03H // 값 3을 레지스터 R0 //로 이동
MOV A, # 05H // 값 5를 누산기 A로 이동 //
A, 00H 추가 //을 추가하다R0 값으로 값을 지정하고 결과를 저장합니다.안에//
종료

곱셈:

ORG 0000h
MOV R0, # 03H // 값 3을 레지스터 R0 //로 이동
MOV A, # 05H // 값 5를 누산기 A로 이동 //
MUL A, 03H //곱셈결과는 Accumulator A에 저장됩니다. //
종료

빼기:

ORG 0000h
MOV R0, # 03H // 값 3을 R0 // 레지스터로 이동
MOV A, # 05H // 값 5를 누산기 A로 이동 //
SUBB A, 03H // 결과 값은 Accumulator A에 저장됩니다. //
종료

분할:

ORG 0000h
MOV R0, # 03H // 값 3을 R0 // 레지스터로 이동
MOV A, # 15H // 값 5를 누산기 A로 이동 //
DIV A, 03H // 최종 값은 Accumulator A에 저장됩니다. //
종료

조건부 지침

CPU는 단일 비트 상태 또는 바이트 상태를 확인하여 조건에 따라 명령을 실행합니다. 8051마이크로 컨트롤러다음과 같은 다양한 조건부 명령어로 구성됩니다.

  • JB —> 아래로 점프
  • JNB —> 아래가 아니면 점프
  • JC —> 이동시 점프
  • JNC —> Jump if아니나르다
  • JZ —> 0이면 점프
  • JNZ —> 다음 경우 점프아니제로
조건부 지침

조건부 지침

1. 구문 :

JB P1.0, 라벨
--------
--------
레이블 : – – – – – – – –
--------
종료

2. 구문 :

JNB P1.0, 라벨
--------
--------
레이블 : – – – – – – – –
--------
종료

3. 구문 :

JC, 라벨
--------
--------
레이블 : – – – – – – – –
--------
종료

4. 구문 :

JNC, 라벨
--------
--------
레이블 : – – – – – – – –
--------
종료
5. 구문 :

JZ, 라벨
--------
--------
레이블 : – – – – – – – –
--------
종료

6. 구문 :

JNZ, 라벨
--------
--------
레이블 : – – – – – – – –
--------
종료

전화 및 점프 지침 :

호출 및 점프 명령은 프로그램의 코드 복제를 방지하는 데 사용됩니다. 특정 코드가 프로그램의 다른 위치에서 두 번 이상 사용 된 경우특정 이름...에다음 코드매번 코드를 입력하지 않고도 프로그램 어디에서나 그 이름을 사용할 수 있습니다. 이것은 프로그램의 복잡성을 줄여줍니다. 8051 프로그래밍은 LCALL, SJMP와 같은 호출 및 점프 명령으로 구성됩니다.

  • LCALL
  • 전화
  • SJMP
  • LJMP

1. 구문 :

ORG 0000h
--------
--------
ACALL, 라벨
--------
--------
SJMP 중지
레이블 : – – – – – – – –
--------
--------
권리
중지:NOP

2. 구문 :

ORG 0000h
--------
--------
LCALL, 레이블
--------
--------
SJMP 중지
레이블 : – – – – – – – –
--------
--------
권리
중지:NOP

전화 및 점프 지침

전화 및 점프 지침

루프 지침 :

루프 명령은 증가 및 감소 작업을 수행하는 동안 매번 블록을 반복하는 데 사용됩니다. 8051마이크로 컨트롤러두 가지 유형의 루프 명령어로 구성됩니다.

  • CJNE —> 같지 않으면 비교 및 ​​점프
  • DJNZ —> 0이 아닌 경우 감소 및 점프

1. 구문 :

CJNE
MOV A, # 00H
MOV B, # 10H
상표: INC A
------
------
CJNE A, 라벨

2. 구문 :

DJNE

MOV R0, # 10H
상표: ------
------
DJNE R0, 라벨
------
------
종료

논리적 명령어 세트 :

8051 마이크로 컨트롤러 명령어 세트는 설정을위한 AND, OR, XOR, TEST, NOT 및 Boolean 논리 명령어를 제공하고 프로그램의 필요에 따라 비트를 지 웁니다.

논리적 명령어 세트

논리적 명령어 세트

1. 구문 :

MOV A, # 20H / 00100000 /
MOV R0, # 03H / 00000101 /
ORL A, R0 // 00100000/00000101 = 00000000 //

2. 구문 :

MOV A, # 20H / 00100000 /
MOV R0, # 03H / 00000101 /
ANL A, R0

3. 구문 :

MOV A, # 20H / 00100000 /
MOV R0, # 03H / 00000101 /
XRL A, R0

이동 연산자

시프트 연산자는 데이터를 효율적으로 보내고받는 데 사용됩니다. 8051마이크로 컨트롤러4 개의 시프트 연산자로 구성됩니다.

  • RR —> 오른쪽으로 회전
  • RRC —> 캐리를 통해 오른쪽으로 회전
  • RL —> 왼쪽으로 회전
  • RLC —> 캐리를 통해 왼쪽으로 회전

오른쪽으로 회전 (RR) :

이 시프 팅 동작에서 MSB는 LSB가되고 모든 비트는 비트 단위로 직렬로 오른쪽으로 시프트됩니다.

통사론:

MOV A, # 25h
RR A

왼쪽으로 회전 (RL) :

이 시프트 동작에서 MSB는 LSB가되고 모든 비트는 비트 단위로 직렬로 왼쪽으로 시프트됩니다.

통사론:

MOV A, # 25h
RL A

RRC 캐리를 통해 오른쪽으로 회전 :

이 시프 팅 동작에서 LSB는 캐리로 이동하고 캐리는 MSB가되며 모든 비트는 비트 위치별로 오른쪽으로 시프트됩니다.

통사론:

MOV A, # 27h
RRC A

RLC 캐리를 통해 왼쪽으로 회전 :

이 시프 팅 동작에서 MSB는 캐리로 이동하고 캐리는 LSB가되며 모든 비트는 비트 단위 위치에서 왼쪽으로 시프트됩니다.

통사론:

MOV A, # 27h
RLC A

기본 임베디드 C 프로그램 :

그만큼마이크로 컨트롤러프로그래밍은 각 운영 체제 유형에 따라 다릅니다. 있습니다 많은 운영 체제 Linux, Windows, RTOS 등과 같은. 그러나 RTOS는 임베디드 시스템 개발에 몇 가지 장점이 있습니다. 어셈블리 레벨 프로그래밍 예제 중 일부는 다음과 같습니다.

8051과 함께 사용하는 LED 깜박임마이크로 컨트롤러:

  • 8051 마이크로 컨트롤러를 사용하여 7 세그먼트 디스플레이에 숫자 표시
  • 8051을 사용한 타이머 / 카운터 계산 및 프로그램마이크로 컨트롤러
  • 8051을 사용한 직렬 통신 계산 및 프로그램마이크로 컨트롤러

8051 M의 LED 프로그램icrocontrller

1. PORT1 LED를 토글하는 WAP

ORG 0000H
토글 : MOV P1, # 01 //움직임p1 레지스터에 00000001 //
CALL DELAY // 지연 실행 //
MOV A, P1 // 이동p1 값어큐뮬레이터로 //
CPL A // A 값 보완 //
MOV P1, A // 11111110을 port1 레지스터로 이동 //
CALL DELAY // 지연 실행 //
SJMP 토글
DELAY : MOV R5, # 10H // 레지스터 R5를 10 //로로드
2 : MOV R6, # 200 // 200 //로 레지스터 R6로드
ONE : MOV R7, # 200 // 200 //로 레지스터 R7로드
DJNZ R7, $ // 0이 될 때까지 R7 감소 //
DJNZ R6, ONE // 0이 될 때까지 R7 감소 //
DJNZ R5, TWO // 0이 될 때까지 R7 감소 //
RET // 주 프로그램으로 돌아 가기 //
종료

8051M을 사용한 타이머 / 카운터 계산 및 프로그램icrocontroller:

지연은 애플리케이션 소프트웨어 개발에서 중요한 요소 중 하나입니다. 그만큼 타이머 및 카운터 하드웨어 구성 요소입니다마이크로 컨트롤러, 카운트 펄스로 정확한 시간 지연을 제공하기 위해 많은 애플리케이션에서 사용됩니다.. 비다른 작업은 소프트웨어 기술에 의해 구현됩니다.

1. WAP는 500us 시간 지연을 계산합니다.

MOV TMOD, # 10H // 레지스터로 타이머 모드 선택 //
MOV TH1, # 0FEH // 더 높은 비트에 지연 시간 저장 //
MOV TL1, # 32H // 지연 시간을 하위 비트로 저장 //
JNB TF1, $ // 타이머 값이 0이 될 때까지 감소 //
CLR TF1 // 타이머 플래그 지우기비트//
CLR TR1 // 타이머 끄기 //

2. LED를 토글하는 WAP이랑5비서시간 지연

ORG 0000H
반환 : MOV PO, # 00H
ACALL 지연
MOV P0, # 0FFH
ACALL 지연
점프 리턴
DELAY : MOV R5, # 50H // 레지스터 R5를 50 //로로드
DELAY1 : MOV R6, # 200 // 200 //로 레지스터 R6로드
DELAY2 : MOV R7, # 229 // 200 //로 레지스터 R7로드
DJNZ R7, $ // 0이 될 때까지 R7 감소 //
DJNZ R6, DELAY2 // 0이 될 때까지 R6 감소 //
DJNZ R5, DELAY1 // 0이 될 때까지 R5 감소 //
RET // 주 프로그램으로 돌아 가기 //
종료

3. WAP는 mode0 count0을 사용하여 250 개의 펄스를 계산합니다.

통사론:

ORG 0000H
MOV TMOD, # 50H // 카운터 선택 //
MOV TH0, # 15 // 카운팅 펄스를 더 높은 비트로 이동 //
MOV TH1, # 9FH //움직임카운트 펄스, 하위 비트 //
SET TR0 // 타이머 ON //
JNB $ // 카운트 값을 0까지 감소 //
CLR TF0 // 카운터 지우기, 플래그비트//
CLR TR0 // 타이머 중지 //
종료

8051 M을 사용한 직렬 통신 프로그래밍icrocontroller:

직렬 통신 일반적으로 데이터를 송수신하는 데 사용됩니다. 8051마이크로 컨트롤러UART / USART 직렬 통신으로 구성되며 신호는Tx및 Rx 핀. UART 통신은 데이터를 비트 단위로 직렬로 전송합니다. UART는 데이터를 전송하고 수신하는 반이중 프로토콜이지만 동시에는 아닙니다.

1. 문자를 하이퍼 터미널로 전송하는 WAP

MOV SCON, # 50H // 직렬 통신 설정 //
MOV TMOD, # 20H // 타이머 모드 선택 //
MOV TH1, # -3 // 전송 속도 설정 //
SET TR1 // 타이머 ON //
MOV SBUF, #’S’// S를 직렬 창으로 전송 //
JNB TI, $ // 0이 될 때까지 타이머 값 감소 //
CLR RI // 수신 인터럽트 삭제 //
CLR TR1 // 타이머 지우기 //

2. WAP는 하이퍼 터미널로 문자 수신을 전송

MOV SCON, # 50H // 직렬 통신 설정 //
MOV TMOD, # 20H // 타이머 모드 선택 //
MOV TH1, # -6 // 전송 속도 설정 //
SET TR1 // 타이머에서 //
MOV SBUF, #’S’// S를 직렬 창으로 전송 //
JNB RI, $ // 타이머 값이 0이 될 때까지 감소 //
CLR RI // 수신 인터럽트 삭제 //
MOV P0, SBUF // SBUF 레지스터 값을 포트로 전송 0 //
CLR TR1 // 타이머 지우기 //

이것은 예제 기반 프로그램과 함께 간략하게 어셈블리 언어로 8051 프로그래밍에 관한 것입니다. 어셈블리 언어에 대한이 적절한 정보가 독자들에게 확실히 도움이되기를 바라며, 아래 코멘트 섹션에서 그들의 소중한 의견을 기대합니다.