Аккумулятор - 8-разрядный регистр, предназначенный для приема и хранения результата, полученного при выполнении арифметико-логических операций или операций сдвига.
Блок последовательного интерфейса и прерываний предназначен для организации последовательного ввода-вывода информации и организации прерываний выполнения программы. В состав этого блока входят:
- логика управления;
- регистр управления;
- буфер передатчика;
- буфер приемника;
- приемопередатчик последовательного порта;
- регистр приоритетов прерываний;
- регистр разрешения прерываний;
- логика обработки флагов прерываний.
Счетчик команд предназначен для формирования текущего 16-разрядного адреса внутренней или внешней памяти программ. В состав счетчика команд входят 16-разрядный буфер счетчика команд, регистр счетчика команд и схема инкремента (увеличения содержимого на 1).
Память данных предназначена для временного хранения информации, используемой в процессе выполнения программы.
Порты Р0, P1, P2, РЗ являются квазидвунаправленными портами ввода-вывода и предназначены для обеспечения обмена информацией между микроконтроллером и внешними устройствами, образуя 32 линии ввода-вывода.
Регистр состояния программы (PSW) предназначен для хранения информации о состоянии АЛУ при выполнении программы.
Память программ предназначена для хранения программного кода и представляет собой постоянное запоминающее устройство (ПЗУ). В разных микросхемах применяются масочные, стираемые ультрафиолетовым излучением или FLASH ПЗУ.
Регистр указателя данных (DPTR) предназначен для формирования 16-разрядного адреса внешней памяти данных или памяти программ при считывании таблиц констант.
Указатель стека (SP) представляет собой 8-разрядный регистр, предназначенный для организации особой области памяти данных (стека), в которой хранятся адреса возврата из подпрограмм, переменные и содержимое внутренних регистров микроконтроллера (в том числе регистры PSW и аккумулятор).
Система команд микроконтроллеров MCS-51
Ни один из видов микропроцессоров не может рассматриваться отдельно от системы команд. Не является исключением и семейство микроконтроллеров MCS-51. Система команд микроконтроллеров этого семейства предоставляет большие возможности обработки данных, обеспечивает реализацию логических, арифметических операций, а также управление устройствами в режиме реального времени.
В этой системе команд реализована побитная, потетрадная (4 бита), побайтовая (8 бит) и 16-разрядная обработка данных. Микросхемы семейства MCS-51 - это 8-разрядные микропроцессоры, а это означает, что ПЗУ, ОЗУ, регистры специального назначения, АЛУ и внешние шины имеют байтовую организацию. Двухбайтовые данные используются только регистром-указателем (DTPR) и счетчиком команд (PC).
В машинном коде команда занимает один, два или три байта в зависимости от типа адресации.
Команды выполняются за один, два или четыре (умножение и деление) машинных цикла.
Запись команд в машинных кодах для человека неудобна. Кроме того, машинные команды, отличающиеся младшими битами или вторым байтом, выполняют одинаковые действия над разными ячейками памяти. Поэтому для записи команд микропроцессоров была придумана система мнемонических обозначений. В записи команды микропроцессора сначала ставится мнемоническое обозначение кода операции, затем указывается ячейка памяти - приемник результата выполнения операции и, наконец, источник данных для выполнения операции. Например, в команде
Е535 MOV A, 35h
символы MOV обозначают операцию копирования, второй операнд 35 определяет, что данные необходимо взять из ячейки памяти с шетнадцатеричным адресом 35, а первый операнд A определяет, что результат необходимо поместить в регистр-аккумулятор. При этом старое значение регистра-аккумулятора будет стерто. Слева приведена машинная команда микроконтроллера в шестнадцатеричной записи, соответствующая находящейся справа мнемонической записи команды.
Мнемоническое обозначение кода операции отделяется от операндов одним или несколькими символами пробела пли табуляции, а операнды отделяются друг от друга запятыми. При этом между операндами допустимо использование символов пробела или табуляции, которые могут потребоваться для более наглядной записи команды.
Если операция требует для выполнения двух источников и одного приемника результата операции (например, команда сложения ADD или вычитания SUBB), то первый операнд является одновременно и источником и приемником результата операции. Например, в команде
2535 ADD A, 35h
символы ADD обозначают операцию сложения двух чисел, данные будут взяты из ячейки памяти с шестнадцатеричным адресом 35 и аккумулятора, а результат будет помещен в аккумулятор вместо старого значения этого регистра.
В табл. П1 приведены мнемонические обозначения машинных команд, влияющих на значения флагов регистра слова состояния программы PSW, а в табл. П2 приведены обозначения и символы, используемые при описании команд микроконтроллеров семейства MCS-51.
Команды микроконтроллера условно можно разбить на пять групп:
- арифметические команды;
- логические команды с байтовыми переменными;
- команды передачи данных;
- команды битового процессора;
- команды ветвления программ и передачи управления ОЭВМ.
Арифметические команды
В наборе команд микроконтроллера имеются следующие арифметические операции:
- сложение - ADD;
- сложение с учетом флага переноса - ADDCC;
- вычитание с заемом из флага переноса - SUBB;
- инкрементирование (увеличение на 1) - INC;
- декрементирование (уменьшение на 1) - DEC;
- десятичная коррекция - DA;
- умножение - MUL;
- деление - DIV.
Действия производятся над целыми беззнаковыми 8-разрядными числами. Арифметические операции в рассматриваемой системе команд могут быть выполнены только над содержимым регистра-аккумулятора.
При операции умножения содержимое аккумулятора А умножается на содержимое регистра В, и результат размещается следующим образом: младший байт в регистре В, старший - в регистре А.
В случае выполнения операции деления целое от деления помещается в аккумулятор А, остаток - в регистр В.
Логические команды с байтовыми переменными
Система команд рассматриваемого микроконтроллера позволяет реализовать следующие логические операции:
- логическое "И" - ANL;
- логическое "ИЛИ" - ORL;
- исключающее "ИЛИ" - XRL.
Логические операции могут выполняться только над аккумулятором или над портами ввода-вывода.
Существуют логические операции, которые выполняются только на аккумуляторе:
- сброс всех восьми разрядов А - CLR A;
- инвертирование всех восьми разрядов А - CPL A;
- циклический сдвиг влево и вправо без учета флага переноса - RL A и RR A;
- циклический сдвиг влево и вправо с учетом флага переноса - RLC A и RRC A;
- обмен местами старшей и младшей тетрад внутри аккумулятора - SWAP A.
Команды пересылки данных
Как было рассмотрено ранее, арифметические и логические команды могут быть выполнены только над содержимым регистра-аккумулятора, поэтому исключительное значение в системе команд приобретают команды пересылки данных. С помощью этих команд можно скопировать содержимое любой ячейки памяти в регистр-аккумулятор или наоборот скопировать содержимое аккумулятора в любую ячейку памяти.
Так как в микроконтроллере присутствуют три независимых области памяти, то для обращения к ним введены различные команды:
- копирование данных во внутреннем ОЗУ - MOV;
- обмен данными аккумулятора с внутренним ОЗУ - XCH, XCHO;
- копирование из внешней памяти данных - MOVX;
- копирование данных из памяти программ - MOVC.
Рассмотрим несколько примеров использования команд пересылки данных.
Любая из 256 ячеек внутреннего ОЗУ данных может быть выбрана с использованием косвенно-регистровой адресации через регистры-указатели R0 и R1 (выбранного банка рабочих регистров):
MOV A, @R0 ;Скопировать число из ячейки памяти с адресом, хранящимся в R0, в аккумулятор
MOV @R1, А ;Скопировать число из аккумулятора, в ячейку памяти с адресом, хранящимся в R1
Команды пересылки между ячейками памяти, использующие прямую адресацию, позволяют заносить содержимое порта в ячейку внутреннего ОЗУ или пересылать содержимое из одной ячейки внутреннего ОЗУ в другую без использования аккумулятора:
MOV 15, 25 ;Скопировать содержимое 25-ой ячейки в 15-ю ячейку
Таблицы символов (кодов), записанные в ПЗУ программы, могут быть скопированы в аккумулятор с помощью команд передачи данных с косвенной адресацией, например:
MOVC A, @A+DPT ;Скопировать символ в аккумулятор
Ячейка адресного пространства 64-килобайтного внешнего ОЗУ также может быть выбрана с использованием косвенно-регистровой адресации через регистр-указатель данных DPTR, например:
MOVX A, @DPTR ;Скопировать число из внешней ячейки памяти с адресом, хранящимся в DPTR, в аккумулятор
Содержимое аккумулятора может быть обменено с содержимым рабочих регистров выбранного банка, например:
ХСН A, R0.
Битовые команды
Каждый бит из битового пространства внутренней памяти может быть установлен в 1, сброшен в 0 или инвертирован.
Эти операции можно выполнить при помощи следующих команд:
- установить бит (записать логическую единицу) - SETB;
- сбросить бит (записать логический ноль) - CLR;
- проинвертировать значение бита (изменить на противоположное) - CPL;
- записать бит во флаг переноса или считать из флага переноса - MOV.
По значениям бита могут быть реализованы переходы:
- если бит установлен (содержит логическую 1) - JB;
- если бит не установлен (содержит логический 0) - JNB;
- переход, если бит установлен со сбросом этого бита после выполнения команды (запись в этот бит 0) - JBC.
Между любым битом из битового пространства внутренней памяти и флагом переноса могут быть произведены логические операции "И" или "ИЛИ".
- "И" - ANL
- "ИЛИ" - ORL
Команды ветвления и передачи управления
Команды ветвления позволяют реализовывать условные операторы и операторы циклов. В микроконтроллерах семейства MCS-51 доступны следующие команды:
- безусловный переход: LJMP, AJMP, SJMP;
- вызов и возврат из подпрограммы: LCALL, ACALL, RET, RETI;
- переход в зависимости от результата проверки содержимого аккумулятора: JZ, JNZ, CJNE, JMP;
- переход в зависимости от значения флага переноса С: JC, JNC;
- переход в зависимости от значения любого бита в битовом пространстве: JB, JNB, JBC.
Команды 16-разрядных безусловных переходов и вызовов подпрограмм позволяют осуществить переход в любую точку адресного пространства памяти программ объемом до 64 Кбайт. Примеры команд:
LJMP Metka ;Переход к команде, расположенной по адресу обозначенному меткой 'Metka'
LCALL Podprogramma ;Вызов подпрограммы по адресу, обозначенному меткой 'Podprogramma'
Команды II-разрядных переходов и вызовов подпрограмм позволяют сократить объем программы, но при этом обеспечивают переходы только внутри сегмента программной памяти размером 2 Кбайт. Эти команды принципиально могут приводить к необнаруживаемым транслятором ошибкам, когда программный модуль размещается на двух соседних двух килобайтовых сегментах памяти.
AJMP Metka ;Переход к команде, расположенной по адресу обозначенному меткой 'Metka'
ACALL Podprogramma ;Вызов подпрограммы по адресу, обозначенному меткой 'Podprogramma'
В системе команд микроконтроллеров семейства MCS-51 имеются команды условных и безусловных переходов относительно начального адреса следующей команды в пределах от (PC)-127 до (PC)+127. Примеры команд:
SJMP Metka ;Переход к команде, расположенной по адресу, обозначенному меткой 'Metka'
JB P3.5, TstNxtUsl ;Если на выводе 6 порта РЗ нулевой потенциал,
ACALL Podprogramma ;то вызвать подпрограмму, обозначенную меткой 'Podprogramma'
CJNE A, #5, TstNxtUsl ;Если в аккумуляторе содержится число 5,
ACALL Podprogramma ;то вызвать подпрограмму, обозначенную меткой 'Podprogramma'
Команды условного перехода в зависимости от результата анализа содержимого аккумулятора или значения флага переноса С могут быть использованы для реализации проверки различных условий. При этом содержимое не изменяется, т. е. если требуется произвести несколько проверок одной и той же переменной, то повторно заносить значение этой переменной в аккумулятор не нужно. Например:
MOV А, 34 ;Если в переменной, хранящейся в ячейке внутренней
JNB ACC_7, TstEQ5 ; памяти с адресом 34, число меньше нуля,
CALL Podprogramma ;то вызвать подпрограмму, обозначенную меткой 'Podprogramma'
Косвенный переход JMP @A+DPTR в системе команд микроконтроллеров семейства MCS-51 обеспечивает ветвление программы по содержимому аккумулятора А. Это позволяет реализовывать операцию перехода по заданному коду, эквивалентную оператору case в языке программирования Pascal, но намного быстрее (за два машинных цикла). Использование в этой команде указателя данных DPTR позволяет размещать таблицу переходов в любом месте памяти программ. Пример реализации команды выбора варианта:
Способы адресации операндов
При определении способа адресации операндов в команде необходимо учитывать, что виды адресации для каждого операнда команды (источника или приемника) могут не совпадать.
Неявная адресация. При неявной адресации регистр-источник или регистр-приемник подразумевается в самом коде операции. Например:
03 RR А ;Сдвинуть содержимое аккумулятора вправо
D4 DA А ;Произвести десятичную коррекцию результата суммирования
Е8 MOV A, R0 ;В первом операнде использована неявная адресация, а во втором - регистровая
Регистровая адресация используется для обращения к восьми рабочим регистрам выбранного банка рабочих регистров, а также для обращения к регистрам А, В, АВ (сдвоенному регистру), DPTR и к флагу переноса С. Номер регистра записывается в трех младших битах команды. Например:
F8 MOV R0,А ;в первом операнде использована регистровая адресация, а во втором - неявная
Прямая байтовая адресация используется для обращения к ячейкам внутренней памяти (ОЗУ) данных (адреса 0:127) и к регистрам специального назначения (адреса 128…256). Адрес ячейки памяти помещается во второй байт команды. Например:
Е520 MOV A,20h ;во втором операнде использована прямая байтовая адресация, а в первом - неявная
8D15 MOV 15h,R6 ;в первом операнде использована прямая байтовая адресация, а во втором - регистровая
Прямая битовая адресация используется для обращения к отдельно адресуемым 128 битам, расположенным в ячейках с адресами 20Н-2FH, и к отдельно адресуемым битам регистров специального назначения. Например:
D220 SETB 20h ;использована прямая битовая адресация
С215 CLR 15H ;использована прямая битовая адресация
Косвенно-регистровая адресация используется для обращения к ячейкам внутреннего ОЗУ данных. В качестве регистров-указателей используются регистры R0, R1 выбранного банка регистров. Например:
Е6 MOV A,@R0 ;B первом операнде использована неявная адресация, а во втором - косвенно-регистровая
F7 MOV @R1,A ;B первом операнде использована косвенно-регистровая адресация, а во втором - неявная
Косвенно-регистровая адресация используется также для обращения к внешней памяти данных. В этом случае с помощью регистров-указателей R0 и R1 (рабочего банка рабочих регистров) выбирается ячейка из блока 256 байт внешней памяти данных. Номер блока предварительно задается содержимым порта Р2.
Е2 MOVX A,@R0 ;B первом операнде использована неявная адресация, а во втором - косвенно-регистровая
F3 MOVX @R1,A ;B первом операнде использована косвенно-регистровая адресация, а во втором - неявная
Если в качестве регистра-указателя используется 16-разрядный указатель данных (DPTR), то можно выбрать любую ячейку внешней памяти данных объемом до 64 Кбайт. (В некоторых моделях микроконтроллеров семейства MSC-51 таким образом можно обращаться к внутренней памяти данных объемом более 256 байт).
Е0 MOVX A,DPTR ;B первом операнде использована неявная адресация, а во втором - косвенно-регистровая
F0 MOVX DPTR,A ;B первом операнде использована косвенно-регистровая адресация, а во втором - неявная