Дата последнего обновления файла 23.10.2009

Система команд микроконтроллеров MCS-51

Система команд микроконтроллера предоставляет большие возможности обработки данных, обеспечивает реализацию логических, арифметических операций, а также управление в режиме реального времени.

В этой системе команд реализована побитная, потетрадная (4 бита), побайтовая (8 бит) и 16-разрядная обработка данных. Микросхемы семейства MCS-51 — это 8-разрядные микропроцессоры, а это означает, что ПЗУ, ОЗУ, регистры специального назначения, АЛУ и внешние шины имеют байтовую организацию. Двухбайтовые данные используются только регистром-указателем (DPTR) и счетчиком команд (PC).

В машинном коде команда занимает один, два или три байта в зависимости от типа адресации.

Команды выполняются за один, два или четыре (умножение и деление) машинных цикла.

Запись команд в машинных кодах для человека неудобна, кроме того, разные машинные команды выполняют одинаковые действия только над разными ячейками памяти. Поэтому для записи команд микропроцессоров была придумана система мнемонических обозначений. Для записи команды микропроцессора сначала ставится мнемоническое обозначение, затем указывается ячейка памяти – приёмник результата выполнения операции и наконец источник данных для выполнения операции. Например, в команде

E535        MOV A, 35h

символы MOV обозначают операцию копирования, второй операнд 35 определяет, что данные необходимо взять из 35 ячейки памяти, а первый операнд A определяет, что результат необходимо поместить в регистр – аккумулятор. При этом старое значение регистра – аккумулятора будет стёрто. Слева приведена машинная команда микроконтроллера в шестнадцатеричной записи, соответствующая мнемонической записи команды.

Мнемоническое обозначение команды отделяется от операндов одним или несколькими символами пробела или табуляции, а операнды отделяются друг от друга запятыми.

Если операция требует для выполнения двух источников и одного приёмника результата операции (например, команда сложения ADD или вычитания SUBB), то первый операнд является одновременно и источником и приёмником результата операции. Например, в команде

2535        ADD A, 35h

символы ADD обозначают операцию сложения двух чисел, данные будут взяты из 35 ячейки памяти и аккумулятора а результат будет помещён в аккумулятор вместо старого значения этого регистра.

В таблице 1 приведены инструкции, влияющие на установку флагов микроконтроллера.

Таблица 1

Мнемоника

Флаги

Мнемоника

Флаги

C

OV

AC

C

OV

AC

ADD

+

+

+

CLR C

0

   

ADDC

+

+

+

CPL C

+

   

SUBB

+

+

+

ANL C, bit

+

   

MUL

0

+

 

ANL C, /bit

     

DIV

0

+

 

ORL C, bit

+

   

DA

+

   

ORL C, /bit

+

   

RRC

+

   

MOV C, bit

+

   

RLC

+

   

CJNE

+

   

SETB C

1

           

Систему команд микроконтроллера условно можно разбить на пять групп:

Арифметические команды

В наборе команд микроконтроллера имеются следующие арифметические операции:

Действия производятся над целыми числами без знака.

При операции умножения содержимое аккумулятора A умножается на содержимое регистра B, и результат размещается следующим образом: младший байт в регистре B, старший - в регистре А.

В случае выполнения операции деления целое от деления помещается в аккумулятор A, остаток - в регистр В.

Логические команды с байтовыми переменными.

Система команд рассматриваемого микроконтроллера позволяет реализовать логические операции

  • И ( ANL),
  • ИЛИ ( ORL),
  • ИСКЛЮЧАЮЩЕЕ ИЛИ ( XRL).

Логические операции выполняются над аккумулятором или непосредственно над портами ввода/вывода.

Существуют логические операции, которые выполняются только на аккумуляторе:

  • сброс всех восьми разрядов A ( CLR A);
  • инвертирование всех восьми разрядов A ( CPL A );
  • циклический сдвиг влево и вправо без учета флага переноса ( RR A; RL A);
  • циклический сдвиг влево и вправо с учетом флага переноса ( RRC A; RLC A);
  • обмен местами старшей и младшей тетрад внутри аккумулятора ( SWAP A).

Команды пересылки данных.

Как было рассмотрено ранее, арифметические и логические команды могут быть выполнены только над содержимым регистра аккумулятора, поэтому исключительно важное значение в системе команд приобретают команды пересылки данных. С помощью этих команд можно скопировать содержимое любой ячейки памяти в регистр-аккумулятор или наоборот скопировать содержимое аккумулятора в любую ячейку памяти. Так как в микроконтроллере присутствует три независимых области памяти, то для обращения к ним введены различные команды:

  • копирование данных во внутреннем ОЗУ: MOV;
  • обмен данными аккумулятора с внутренним ОЗУ: XCH, XCHD
  • копирование из внешней памяти данных: MOVX
  • копирование данных из памяти программ: MOVC

Примеры использования команд пересылки данных:

Любая ячейка 256- байтового блока внутреннего ОЗУ данных может быть выбрана с использованием косвенно-регистровой адресации через регистры указатели R0 и R1 (выбранного банка рабочих регистров):

MOV A, @R0             ;Скопировать число из ячейки памяти с адресом, хранящемся в R0, в аккумулятор
MOV @R1, A             ;Скопировать число из аккумулятора, в ячейку памяти с адресом, хранящемся в R1

Команды пересылки с прямой адресацией между ячейками памяти позволяют заносить содержимое порта в ячейку внутреннего ОЗУ или обмениваться содержимым ячеек внутреннего ОЗУ между собой без использования аккумулятора:

MOV 15, 25            ;Скопировать содержимое 25-й ячейки  в 15-ю ячейку

Таблицы символов (кодов), записанные в ПЗУ программы могут быть скопированы в аккумулятор с помощью команд передачи данных с косвенной адресацией:

MOVC A, @A+DPTR         ;Скопировать символ в аккумулятор

Ячейка адресного пространства 64 Кбайт внешнего ОЗУ также может быть выбрана с использованием косвенно-регистровой адресации через регистр указатель данных DPTR:

MOVX A, @DPTR          ;Скопировать число из внешней ячейки памяти с адресом, ;хранящемся в DPTR, в аккумулятор

Содержимое аккумулятора может быть обменено с содержимым рабочих регистров выбранного банка:

XCH A, R0.

Кроме того, любой бит с прямой адресацией может быть скопирован в бит переноса и наоборот:

MOV C, AdrBit

Битовые команды.

Каждый бит из битового пространства внутренней памяти может быть установлен в 1, сброшен в 0, или инвертирован:

  • установить бит (записать логическую единицу) SETB;
  • сбросить бит (записать логический ноль) CLR;
  • проинвертировать значение бита (изменить на прямо противоположное) CPL;
  • бит может быть записан во флаг переноса или считан из флага переноса MOV.

Могут быть реализованы переходы:

  • если бит установлен (содержит логическую 1) JB;
  • если бит не установлен (содержит логический 0) JNB;
  • переход, если бит установлен со сбросом этого бита после выполнения команды (запись в этот бит 0) JBC;

Между любым битом из битового пространства внутренней памяти и флагом переноса могут быть произведены логические операции "И" или "ИЛИ".

Команды ветвления и передачи управления.

Команды ветвления позволяют реализовывать условные операторы и операторы циклов. В микроконтроллерах семейства MCS-51 доступны следующие команды:

Команды 16-разрядных безусловных переходов и вызовов подпрограмм позволяют осуществить переход в любую точку адресного пространства памяти программ объемом до 64 Кбайт. Примеры команд:

LJMP Metka            ;Переход к команде, расположенной по адресу обозначенному меткой ‘Metka’
LCALL Podprogramma    ;Вызов подпрограммы по адресу, обозначенному меткой ‘Podprogramma’

Команды 11-разрядных переходов и вызовов подпрограмм позволяют сократить объем программы, но при этом обеспечивают переходы только внутри программного модуля 2 Кбайт. Эти команды принципиально могут приводить к необнаруживаемым транслятором ошибкам, когда программный модуль размещается на двух соседних 2 Кбайтовых сегментах памяти.

AJMP Metka            ;Переход к команде, расположенной по адресу обозначенному меткой ‘Metka’
ACALL Podprogramma    ;Вызов подпрограммы по адресу, обозначенному меткой ‘Podprogramma’

В системе команд имеются команды условных и безусловных переходов относительно начального адреса следующей команды в пределах от (РС)-127 до (РС)+127. Примеры команд:

SJMP Metka                   ;Переход к команде, расположенной по адресу обозначенному меткой ‘Metka’
JB P3.5, TstNxtUsl           ;Если на 6 выводе порта P3 нулевой потенциал,
  ACALL Podprogramma            ;то вызвать подпрограмму, обозначенную меткой ‘Podprogramma’
CJNE A, #5, TstNxtUsl        ;Если в аккумуляторе содержится число 5,
  ACALL Podprogramma            ;то вызвать подпрограмму, обозначенную меткой ‘Podprogramma’

Команды проверки содержимого аккумулятора и флага переноса C могут быть использованы для реализации проверки различных условий. При этом содержимое не изменяется, то есть если требуется произвести несколько проверок одной и той же переменной, то повторно заносить значение этой переменной в аккумулятор не нужно. Например:

  MOV A, 34            ;Если в переменной, хранящейся в ячейке внутренней памяти 34 
  JNB ACC_7, TstEQ5    ;число меньше нуля,
    CALL Podprogramma    ;то вызвать подпрограмму, обозначенную меткой "Podprogramma"

TstEQ5 ;------------------------------------------------------------------------------------------
  CJNE A,#5,TstLT5     ;Если в переменной, хранящейся в ячейке внутренней памяти 34 
                       ;занесено число 5,
    CALL Podpr5          ;то вызвать подпрограмму, обозначенную меткой "Podpr5"

TstLT5 ;------------------------------------------------------------------------------------------
  JNС TstGE5           ;Если в переменной, хранящейся в ячейке внутренней памяти 34 
                       ;занесено число, меньшее 5,
    CALL PodprLT5        ;то вызвать подпрограмму, обозначенную меткой "PodprLT5"

TstGE5 ;---------------------------------------------------------------------------------
  JC TstNxtUsl         ;Если в переменной, хранящейся в ячейке внутренней памяти 34 
                       ;занесено число, большее или равное 5,
    CALL PodprGE5        ;то вызвать подпрограмму, обозначенную меткой "PodprGE5"

TstGT5 ;------------------------------------------------------------------------------------------
  CJNE A,#6,$+3        ;Если в переменной, хранящейся в ячейке внутренней памяти 34
  JC TstNxtUsl         ;занесено число, большее 5,
    CALL PodprGT5        ;то вызвать подпрограмму, обозначенную меткой "PodprGT5"

;---------------------------------------------------------------------------------
  JNC TstNxtUsl        ;Если в переменной, хранящейся в ячейке внутренней памяти 34 занесено число, 
                       ;меньшее или равное 5,
    CALL PodprLE5        ;то вызвать подпрограмму, обозначенную меткой "PodprLE5"

Как видно из приведённых примеров, команды переходов этого микроконтроллера позволяет реализовать намного более эффективные по количеству команд программы по сравнению с другими процессорами, такими как, например MCS-48.

Косвенный переход JMP @A+DPTR в системе команд микроконтроллеров семейства MCS-51 обеспечивает ветвление программы по содержимому аккумулятора А. Это позволяет реализовывать операцию перехода по заданному коду, эквивалентную оператору case в языке программирования pascal, но намного быстрее (за два машинных цикла). Использование в этой команде указателя данных DPTR позволяет размещать таблицу переходов в любом месте памяти программ. Пример реализации команды выбора варианта:

BeginOpCase: ;Начало команды выбора вариантов-------------------------------------------------
  MOV DPTR, #JMP_TBL ;Задать начальный адрес таблицы переходов
  MOV A, 33          ;В этой ячейке хранится переменная, по которой необходимо 
                     ;осуществить переход на обслуживающую программу

  CLR C              ;Осуществить арифметический сдвиг аккумулятора вправо
  RLC A              ;(умножить на 2) т.к. команды переходов занимают два байта

  JMP @A+DPTR        ;Перейти к выполнению заданного в 33 ячейке кода
  
JMP_TBL:    ;начало таблицы переходов по содержимому переменной в ячейке памяти 33-----------------
     JMP Case0       ;Перейти к выполнению кода по числу 0
     JMP Case1       ;Перейти к выполнению кода по числу 1
     JMP EndCase     ;Это число в ячейке 33 в список разрешённых не входит
     JMP EndCase     ;Это число в ячейке 33 в список разрешённых не входит
     JMP Case4       ;Перейти к выполнению кода по числу 4
EndCase:;------------------------------------------------------------------------------------------

Способы адресации операндов.

При определении способа адресации операндов в команде необходимо учитывать, что адресация для каждого операнда команды своя. В общем случае адресация источника и приёмника могут не совпадать.

Неявная адресация При неявной адресации регистр источник или регистр приёмник подразумевается в самом коде операции. Например:

03      RR A      ;Сдвинуть содержимое аккумулятора вправо
D4      DA A      ;Произвести десятичную коррекцию результата суммирования
E8      MOV A, R0 ;В первом операнде использована неявная адресация, а во втором - регистровая

Регистровая адресация используется для обращения к восьми рабочим регистрам выбранного банка рабочих регистров, а также для обращения к регистрам А, В, АВ (сдвоенному регистру), DPTR, и к флагу переноса С. Номер регистра записывается в трех младших битах команды. Например:

F8      MOV R5, A ;в первом операнде использована регистровая адресация, а во втором - неявная

Прямая байтовая адресация используется для обращения к ячейкам внутренней памяти (ОЗУ) данных (адреса 0:127) и к регистрам специального назначения (адреса 128:256). Адрес ячейки памяти помещается во второй байт команды. Например:

E520    MOV A, 20h ;во втором операнде использована прямая байтовая адресация, а в первом – неявная
8D15    MOV 15h,R6 ;в первом операнде использована прямая байтовая адресация, а во втором – регистровая

Прямая битовая адресация используется для обращения к отдельно адресуемым 128 битам, расположенным в ячейках с адресами 20Н-2FH, и к отдельно адресуемым битам регистров специального назначения. Например:

D220    SETB 20h ;использована прямая битовая адресация
C215    CLR  15h ;использована прямая битовая адресация

Косвенно-регистровая адресация используется для обращения к ячейкам внутреннего ОЗУ данных. В качестве регистров-указателей адреса используются регистры R0, R1 выбранного банка регистров. Например:

E6    MOV A,@R0 ;В первом операнде использована неявная адресация, а во втором - косвенно-регистровая
F7    MOV @R1,A ;В первом операнде использована косвенно-регистровая адресация, а во втором - неявная

Косвенно - регистровая адресация используется также для обращения к внешней памяти данных. В этом случае с помощью регистров- указателей R0 и R1 (рабочего банка рабочих регистров) выбирается ячейка из блока 256 байт внешней памяти данных. Номер блока предварительно задается содержимым порта Р2. Например:

E2    MOVX A,@R0 ;В первом операнде использована неявная адресация, а во втором - косвенно-регистровая
F3    MOVX @R1,A ;В первом операнде использована косвенно-регистровая адресация, а во втором - неявная

Если в качестве регистра - указателя используется 16 - разрядный указатель данных (DPTR), то можно выбрать любую ячейку внешней памяти данных объемом до 64 Кбайт. (В некоторых моделях микроконтроллеров семейства MSC-51 таким образом можно обращаться к внутренней памяти данных объемом более 256 байт).

E0    MOVX A,DPTR;В первом операнде использована неявная адресация, а во втором - косвенно-регистровая
F0    MOVX DPTR,A;В первом операнде использована косвенно-регистровая адресация, а во втором - неявная

Косвенно-регистровая адресация по сумме базового и индексного регистра (содержимое аккумулятора А) упрощает просмотр таблиц, записанных в памяти программ. Любой байт из таблицы может быть выбран по адресу, определяемому суммой содержимого DPTR или РС и содержимого А, например:

83    MOV A, @A+PC ;В первом операнде использована неявная адресация, а во втором - косвенно-регистровая
93    MOV A, @A+DPTR ;В первом операнде использована неявная адресация, а во втором - косвенно-регистровая.

Непосредственная адресация позволяет выбрать из адресного пространства памяти программ константы, явно указанные в команде, например:

7414    MOV A, #14h      ;В первом операнде использована неявная адресация, а во втором - непосредственная
902048  MOV DPTR, #2048h ;В первом операнде использована неявная адресация, а во втором - непосредственная

Литература:

  1. Боборыкин А.В., Липовецкий Г.П., и др. Однокристальные микроЭВМ М.: Бином 1994
  2. В.В. Сташин, А.В. Урусов, О.Ф. Мологонцева Проектирование цифровых устройств на однокристальных микроконтроллерах М.: Энергоатомиздат 1990
  3. Карасев Однокристальный микропроцессор семейства MCS-51 М.: 1995
  4. Бродин В.Б., Калинин А.В. Системы на микроконтроллерах и БИС программируемой логики М.: ЭКОМ 2001
  5. Микушин А.В. Сединин В.И. Однокристальный микроконтроллер семейства MCS-51 фирмы INTEL 8xC51GB Новосибирск: СибГУТИ, 2001
  6. Микушин А.В. Занимательно о микроконтроллерах. СПб, БХВ-Петербург, 2006.
  7. Микушин А.В., Сажнев А.М., Сединин В.И. Цифровые устройства и микропроцессоры. СПб, БХВ-Петербург, 2010.

Вместе со статьей "Архитектура микроконтроллеров MCS-51" читают:

Состав семейства MCS-51
http://digteh.ru/MCS51/tablms.php

Архитектура микроконтроллеров MCS-51
http://digteh.ru/MCS51/MCS_51.php

Система команд микроконтроллеров MCS-51
http://digteh.ru/MCS51/SysInstr.php

Устройство параллельных портов микроконтроллеров MCS-51
http://digteh.ru/MCS51/port.php

Построение памяти микроконтроллеров семейства MCS-51
http://digteh.ru/MCS51/pam_cntr.php

Устройство таймеров микроконтроллеров MCS-51
http://digteh.ru/MCS51/timers.php

Последовательный порт микроконтроллера 8051
http://digteh.ru/MCS51/PoslPort.php


Автор Микушин А. В. All rights reserved. 2001 ... 2017

Предыдущие версии сайта:
http://neic.nsk.su/~mavr
http://digital.sibsutis.ru/

Поиск по сайту сервисом Яндекс

Поиск по сайту сервисом ГУГЛ

пЕИРХМЦ@Mail.ru


Rambler's Top100