Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Методическое пособие 539

.pdf
Скачиваний:
8
Добавлен:
30.04.2022
Размер:
2.16 Mб
Скачать

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

Команды, выполняющие пересылку данных, можно объединить в следующую таблицу (табл. 2.1).

 

 

Таблица 2.1

 

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

Команда

 

Значение

MOV A,Rn

 

Пересылка в аккумулятор из регистра (n = 0…7)

MOV A,direct

 

Пересылка в аккумулятор прямо-адресуемого

 

байта

 

 

MOV A,@Ri

 

Пересылка в аккумулятор косвенно-

 

адресуемого байта ОЗУ

 

 

MOV A,#data

 

Загрузка в аккумулятор константы

MOV Rn,A

 

Пересылка в регистр из аккумулятора

MOV Rn,direct

 

Пересылка в регистр прямо-адресуемого байта

MOV Rn,#data

 

Загрузка в регистр константы

MOV direct,A

 

Пересылка по прямому адресу аккумулятора

MOV direct,Rn

 

Пересылка по прямому адресу регистра

MOV direct,direct

 

Пересылка прямо-адресуемого байта по

 

прямому адресу

 

 

MOV direct,@Ri

 

Пересылка косвенно-адресуемого байта ОЗУ по

 

прямому адресу

 

 

MOV direct,#data

 

Пересылка по прямому адресу константы

MOV @Ri,A

 

Пересылка в косвенно-адресуемую ячейку ОЗУ

 

аккумулятора

 

 

 

 

Пересылка в косвенно-адресуемую ячейку ОЗУ

MOV @Ri,direct

 

прямо-адресуемого

 

 

байта

MOV @Ri,#data

 

Пересылка в косвенно-адресуемую ячейку ОЗУ

 

константы

 

 

MOV

 

Загрузка указателя данных

DPTR,#data16

 

 

 

MOVC

 

Пересылка в аккумулятор байта из памяти

A,@A+DPTR

 

программ

MOVC A,@A+PC

 

Пересылка в аккумулятор байта из памяти

 

программ

 

 

31

 

Продолжение табл. 2.1

Команда

Значение

MOVX A,@Ri

Пересылка в аккумулятор байта из внешней

памяти данных

 

MOVX @Ri,A

Пересылка байта из аккумулятора во внешнюю

память данных

 

MOVX A,@DPTR

Пересылка в аккумулятор из расширенной

внешней памяти данных

 

MOVX @DPTR,A

Пересылка из аккумулятора в расширенную

внешнюю память данных

 

PUSH direct

Загрузка в стек

POP direct

Извлечение из стека

XCH A,Rn

Обмен аккумулятора с регистром

XCH A,direct

Обмен аккумулятора с прямо-адресуемым

байтом

 

XCH A,@Ri

Обмен аккумулятора с косвенно-адресуемым

байтом ОЗУ

 

 

Обмен младшей тетрады аккумулятора с

XCHD A,@Ri

младшей тетрадой

 

косвенно-адресуемого байта ОЗУ

2.3. Команды арифметических операций

Команды, выполняющие арифметические операции, можно объединить в следующую таблицу (табл. 2.2).

 

 

Таблица 2.2

 

Команды арифметических операций

Команда

 

Значение

ADD A,Rn

 

Сложение аккумулятора с регистром (n = 0…7)

ADD A,direct

 

Сложение аккумулятора с прямо-адресуемым

 

байтом

 

 

ADD A,@Ri

 

Сложение аккумулятора с косвенно-адресуемым

 

байтом ОЗУ

 

 

ADD A,#data

 

Сложение аккумулятора с константой

ADDC A,Rn

 

Сложение аккумулятора с регистром и переносом

32

 

Продолжение табл. 2.2

Команда

Значение

ADDC A,direct

Сложение аккумулятора с прямо-адресуемым

байтом и переносом

 

ADDC A,@Ri

Сложение аккумулятора с косвенно-адресуемым

байтом ОЗУ и переносом

 

ADDC A,#data

Сложение аккумулятора с константой и

переносом

 

SUBB A,Rn

Вычитание из аккумулятора регистра и заема

SUBB A,direct

Вычитание из аккумулятора прямо-адресуемого

байта и заема

 

SUBB A,@Ri

Вычитание из аккумулятора косвенно-

адресуемого байта ОЗУ и заема

 

SUBB A,#data

Вычитание из аккумулятора константы и заема

INC A

Инкремент аккумулятора

INC Rn

Инкремент регистра

INC direct

Инкремент прямо-адресуемого байта

INC @Ri

Инкремент косвенно-адресуемого байта ОЗУ

DEC A

Декремент аккумулятора

DEC Rn

Декремент регистра

DEC direct

Декремент прямо-адресуемого байта

DEC @Ri

Декремент косвенно-адресуемого байта ОЗУ

INC DPTR

Инкремент указателя данных

MUL AB

Умножение аккумулятора на регистр В

DIV AB

Деление аккумулятора на регистр В

DA A

Десятичная коррекция аккумулятора

2.4. Команды логических операций

Команды, выполняющие логические операции, можно объединить в следующую таблицу (табл. 2.3).

 

 

Таблица 2.3

 

Команды логических операций

Команда

 

Значение

ANL A,Rn

 

Логическое И аккумулятора и регистра

ANL A,direct

 

Логическое И аккумулятора и прямо-

 

адресуемого байта

 

 

33

 

Продолжение табл. 2.3

Команда

Значение

ANL A,@Ri

Логическое И аккумулятора и косвенно-

адресуемого байта ОЗУ

 

ANL A,#data

Логическое И аккумулятора и константы

ANL direct,A

Логическое И прямо-адресуемого байта и

аккумулятора

 

ANL direct,#data

Логическое И прямо-адресуемого байта и

константы

 

ORL A,Rn

Логическое ИЛИ аккумулятора и регистра

ORL A,direct

Логическое ИЛИ аккумулятора и прямо-

адресуемого байта

 

ORL A,@Ri

Логическое ИЛИ аккумулятора и косвенно-

адресуемого байта ОЗУ

 

ORL A,#data

Логическое ИЛИ аккумулятора и константы

ORL direct,A

Логическое ИЛИ прямо-адресуемого байта и

аккумулятора

 

ORL direct,#data

Логическое ИЛИ прямо-адресуемого байта и

константы

 

XRL A,Rn

Исключающее ИЛИ аккумулятора и регистра

XRL A,direct

Исключающее ИЛИ аккумулятора и прямо-

адресуемого байта

 

XRL A,@Ri

Исключающее ИЛИ аккумулятора и косвенно-

адресуемого байта ОЗУ

 

XRL A,#data

Исключающее ИЛИ аккумулятора и константы

XRL direct,A

Исключающее ИЛИ прямо-адресуемого байта и

аккумулятора

 

XRL direct,#data

Исключающее ИЛИ прямо-адресуемого байта и

константы

 

CLR A

Сброс аккумулятора

CPL A

Инверсия аккумулятора

RL A

Сдвиг аккумулятора влево циклический

RLC A

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

RR A

Сдвиг аккумулятора вправо циклический

RRC A

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

SWAP A

Обмен местами тетрад в аккумуляторе

34

2.5. Команды операций над битами

Команды, выполняющие операции над битами, можно объединить в следующую таблицу (табл. 2.4).

Таблица 2.4

 

Команды операций над битами

Команда

Значение

CLR C

Сброс переноса

CLR bit

Сброс бита

SETB C

Установка переноса

SETB bit

Установка бита

CPL C

Инверсия переноса

CPL bit

Инверсия бита

ANL C,bit

Логическое И бита и переноса

ANL C,/bit

Логическое И инверсии бита и переноса

ORL C,bit

Логическое ИЛИ бита и переноса

ORL C,/bit

Логическое ИЛИ инверсии бита и переноса

MOV C,bit

Пересылка бита в перенос

MOV bit,C

Пересылка переноса в бит

JC rel

Переход, если перенос равен единице

JNC rel

Переход, если перенос равен нулю

JB bit,rel

Переход, если бит равен единице

JNB bit,rel

Переход, если бит равен нулю

JBC bit,rel

Переход, если бит установлен, с последующим

сбросом бита

 

35

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

Команды, выполняющие передачу управления, можно объединить в следующую таблицу (табл. 2.5).

Таблица 2.5

 

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

Команда

 

Значение

ACALL addr11

 

Абсолютный вызов подпрограммы в пределах

 

страницы в 2 Кбайта

 

 

LCALL addr16

 

Длинный вызов подпрограммы

RET

 

Возврат из подпрограммы

RETI

 

Возврат из подпрограммы обработки

 

прерывания

 

 

AJMP addr11

 

Абсолютный переход внутри страницы в 2

 

Кбайта

 

 

LJMP addr16

 

Длинный переход в полном объеме памяти

 

программ

 

 

SJMP rel

 

Короткий относительный переход внутри

 

страницы в 256 байт

 

 

JMP @A+DPTR

 

Косвенный относительный переход

JZ rel

 

Переход, если аккумулятор равен нулю

JNZ rel

 

Переход, если аккумулятор не равен нулю

CJNE

 

Сравнение аккумулятора с прямо-адресуемым

A,direct,rel

 

байтом и переход, если не равно

CJNE A,#data,rel

 

Сравнение аккумулятора с константой и

 

переход, если не равно

 

 

CJNE Rn,#data,rel

 

Сравнение регистра с константой и переход,

 

если не равно

 

 

CJNE

 

Сравнение косвенно-адресуемого байта ОЗУ с

@Ri,#data,rel

 

константой и переход, если не равно

DJNZ Rn,rel

 

Декремент регистра и переход, если не нуль

DJNZ direct,rel

 

Декремент прямо-адресуемого байта и переход,

 

если не нуль

 

 

NOP

 

Холостая команда

36

2.7. Программирование в среде Keil

Для систем с микроконтроллерами 8051 разработаны мощные инструментальные средства, позволяющие снизить до минимума время разработки и отладки программного обеспечения. Среди прочих лидирующие позиции занимают программные средства, разработанные фирмой Keil. Инструментальные средства этой фирмы включают целый ряд мощных приложений, таких как компилятор языка C для микроконтроллеров 8051, известный под названием Keil C51, макроассемблер A51, совместимый с ASM$51, и наконец, удобная графическая оболочка для разработки и отладки программ Keil uVision.

Среда разработки Keil uVision (в настоящее время используются версии 2 и 3) позволяет создавать сколь угодно сложные проекты, состоящие из разных модулей, написанных как на C, так и на языке ассемблера, подключать библиотеки функций и т.д. Кроме того, эта среда включает удобный отладчик (симулятор), позволяющий оценить и быстро проверить работоспособность программы. Хотя при разработке программ можно обойтись только командной строкой, откомпилировав и собрав программу вне среды Keil uVision, графическая среда раз работки все же более удобна, поскольку позволяет автоматизировать сборку программ и проверить их работоспособность с помощью отладчика.

Для разработки и отладки программ в среде Keil желательно иметь установленную графическую среду Keil uVision версии 2 или 3 и компиляторы C51 и A51. Можно использовать демонстрационные версии этих программных инструментов, доступные для скачивания на сайте www.keil.com. Все примеры, приведенные в этой главе, будут работать в демонстрационной версии среды Keil. Более того, для разработки программ на языке C в среде Keil uVision можно использовать и свободно распространяемый компилятор SDCC, который разработан в рамках открытого лицензионного соглашения GNU и не имеет ограничений по размеру

37

исполняемого программного кода. Несмотря на некоторые отличия в синтаксисе, многие (если не большинство) из принципов программирования систем с 8051, используемые в

Keil C51, работают и в SDCC.

2.8.Интерфейс с языком ассемблера

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

Втаких случаях намного быстрее и проще решить задачу, применив в программе на C ассемблерный код. Единственное, что требуется от программиста при разработке ассемблерного кода, – достаточно хорошее понимание программной архитектуры микроконтроллера и системы команд.

Компилятор C51 позволяет работать как со встроенными (inline) ассемблерными вставками, так и с процедурами на ассемблере, которые можно хранить в отдельном файле с расширением .asm. В последнем случае можно оттранслировать исходный ASM-файл при помощи компилятора a51.exe, а затем скомпоновать программу с помощью компоновщика bl51.exe.

38

2.9. Программирование на языке ассемблера в среде Keil

До сих пор мы рассматривали язык ассемблера как вспомогательное средство при разработке программ на Keil C51. Тем не менее в целом ряде случаев, особенно когда не требуется создавать сложный интерфейс пользователя, а требуется лишь работа с оборудованием, программы на языке ассемблера работают очень эффективно. Слабым местом ассемблера традиционно считается трудность реализации математических функций и обработки сложных типов данных (длинных целых чисел, чисел с плавающей точкой), а также функции преобразования различных типов данных. Тем не менее в Интернете имеется масса исходных текстов программ, позволяющих решить эти и другие проблемы, значительно расширив при этом возможности программ на ассемблере. В принципе, настроив среду программирования соответствующим образом и подключив необходимые библиотеки функций, можно решать практически любые задачи по программированию 8051-систем.

Синтаксис этого языка во многом похож на тот, что используется в «классическом» ASM$51. В программе на ассемблере A51 можно определять сегменты кода (абсолютные и перемещаемые), а также сегменты данных, указывая для них тип используемой памяти (DATA, IDATA, XDATA, CONST и

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

Вначале создадим ассемблерный вариант программы

«Hello, World» вне среды программирования Keil uVision.

Наберем в текстовом редакторе исходный текст программы:

39

NAME PROCS

ESC EQU 1Bh

MAIN SEGMENT CODE myData SEGMENT CODE CSEG AT 0

USING 0 JMP start RSEG MAIN start:

MOV SCON, #50h MOV TH1, #0FDh ORL TMOD, #20h SETB TR1

MOV DPTR, #text next_byte:

CLR TI

CLR A

MOVC A, @A+DPTR CJNE A, #ESC, write_char SJMP $

write_char: MOV SBUF, A JNB TI, $ INC DPTR

SJMP next_byte RSEG myData

text: DB ‘Hello, World’, ESC

END

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

CSEG AT 0

40