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

ПСМПС (лаб)

.pdf
Скачиваний:
20
Добавлен:
10.06.2015
Размер:
1.42 Mб
Скачать

61

с помощью специальных макродиректив. Макродирективы бывают двух видов:

директивы повторения WHILE, REPT, IRP и IRPC. Директивы этой группы предназначены для создания макросов, содержащих несколько повторяющихся одинаковых последовательностей строк. При этом возможна частичная модификация этих строк;

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

Директивы WHILE и REPT применяют для повторения определенного количества раз некоторой последовательности строк. Эти директивы имеют следующий формат:

WHILE <const_expression> < strings_sequence >

ENDM

REPT <const_expresssion> <strings_sequence >

ENDM

Например:

len = 10

WHILE len DB 0

len = len - 1

ENDM

len = 10

REPT len DB 0

ENDM

Обе директивы повторяют последовательность строк до тех пор пока <const_expression> не станет равным нулю. Отличием этих двух макродиректив является то, что директива WHILE требует изменения <const_expression>

62

внутри повторяемого блока <strings_sequence>, тогда как директива REPT автоматически уменьшает значение <const_expression>.

Директивы IRP и IRPC делают процесс размножения последовательности строк макроса более гибким, позволяя модифицировать на каждой итерации некоторые элементы последовательности.

Директива IRP имеет следующий синтаксис:

IPR <formal_param>, << symlols1 >, <symbols2>, . . . > <strings_sequence >

ENDM

Действие данной директивы рассмотрим на примере:

IRP ini <1,2,3,4,5> DB ini

ENDM

Макрогенератором будет сгенерировано следующее макрорасширение:

DB 1

DB 2

DB 3

DB 4

DB 5

Повторение последовательности строк сопровождается заменой формального параметра строкой символов из второго операнда.

3.Практическая часть

3.1.Техника использование стека для передачи параметров

Рассмотрим пример, в котором демонстрируется стандартная последовательность действий для размещения параметров в стеке, выполняемая при вызове подпрограммы (рис. 4.4).

1. Создадим проект со следующим исходным текстом программы:

.MODEL SMALL

.DATA

63

; объявим две пословные ячейки для переменных var1 и var2 var1 DW ?

var2 DW ?

.CODE

main PROC

;инициализируем сегментный регистр DS mov AX, @data

mov DS, AX

;зададим начальные значения для переменных mov var1, 100

mov var2, 200

;выполним вызов процедуры (в стиле Pascal)

;предварительно разместив в стеке два параметра push var1

push var2

call myproc4 ; вызов процедуры

;сохраняем возвращаемое значение в CX

mov CX, AX

; выход в ОС mov AX, 4c00h int 21h

main endp

myproc4 PROC

;стандартный пролог push BP

mov BP, SP

;копируем параметры в регистры AX и BX mov AX, [BP+4]

mov BX, [BP+6]

;выполняем действие (например, складываем параметры) add AX, BX

pop BP ret

myproc4 endp END main

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

64

Будем наблюдать за содержимым стека программы с помощью команды DW SS:SP L 10, а также регистрами AX и BX.

«Дно» стека

push var1

00h

push var2

00h

call myproc

IP(H)

push BP

BP(H)

64h

C8h

IP(L)

BP(L)

В область младших адресов

SP = SP - 2 SP = SP - 4 SP = SP - 6 SP = SP - 8

Рис. 4.4. Размещения в стеке параметров процедуры myproc4

3.2. Техника использования стека для хранения локальных переменных процедуры

Следующий пример показывает использование стека для размещения локальных параметров подпрограммы и технику произвольного доступа к элементам стека с помощью регистра BP.

1. Создадим новый проект и введем следующий исходный текст программы.

.MODEL SMALL

.STACK 128

.DATA

param DW ?

.CODE

 

 

main PROC

 

 

mov AX, @data

 

mov DS, AX

 

mov param, 200

; (1)

push

param

; (2)

call

myproc5

; (3)

65

mov AX, 4c00h int 21h

main ENDP

myproc5 PROC

myproc5_param equ [BP + 4]

myproc5_var equ [BP - 2]

 

push BP

 

; (4)

mov BP, SP

 

sub SP,

2

; (5)

mov myproc5_var, 100

; (6)

mov CX, myproc5_param

 

add CX, myproc5_var

 

mov AX, CX

 

mov SP, BP

 

pop BP

 

; (7)

ret 2

 

; (8)

myproc5 ENDP END main

2. Выполним сборку проекта, включив в исполняемый модуль отладочную информацию. Выполним пошаговую отладку проекта с заходом в процедуры (клавиша F8). Будем наблюдать за содержимым стека программы с помощью команды DW SS:SP L 10 (рис. 4.4.). Номера, приведенные в комментариях к программе, указывают на точки, в которых необходимо производить повторный просмотр области стека программы.

(1)

(2)

(3)

(4)

(5)

(6)

(7)

(8)

Рис. 4.4. Наблюдение в Code View за «разверткой» и «сверткой» стека

66

4.Контрольные вопросы

1.Что представляет собой процедура в ассемблере?

2.Какие директивы ассемблера используются для оформления проце-

дур?

3.Какие действия выполняет процессор при выполнении инструкции

CALL?

4.Какие варианты расположения процедуры возможны в ассемблере?

5.Какова последовательность размещения в стеке компонентов логического адреса точки входа при вызове процедуры?

6.Каким образом и с использованием каких объектов параметры могут быть переданы в вызываемую процедуру?

7.Почему в высокоуровневых языках программирования для передачи параметров используется стек программы?

8.Каким образом параметры удаляются из стека после вызова проце-

дуры?

9.Чем обусловлена необходимость размещения в стеке локальных переменных процедуры?

10.Что собой представляет стандартный пролог и эпилог процедуры?

11.В чем состоит принципиальное отличие макрокоманды от процедуры? Когда целесообразнее использовать макросы, а когда процедуры?

67

ЧАСТЬ II. ОСНОВЫ АРХИТЕКТУРЫ

И ПРОГРАММИРОВАНИЯ СОВРЕМЕННЫХ МИКРОКОНТРОЛЛЕРОВ СЕМЕЙСТВА MCS-51

Лабораторная работа № 5

АРХИТЕКТУРА И ПРОГРАММНАЯ МОДЕЛЬ МИКРОКОНТРОЛЛЕРОВ СЕМЕЙСТВА MCS-51.

СРЕДА РАЗРАБОТКИ KEIL µVISION2 И АССЕМБЛЕР А251/51

1. Цель работы

Данная лабораторная работа имеет своей целью познакомить студента с фундаментальными основами программной модели и аппаратной архитектуры микроконтроллеров семейства MCS-51. В рамках данной работы студент должен получить представления о программировании микроконтроллеров с использованием современной среды разработки µVision2 фирмы Keil Software и развитого макроассемблера А251/51. В практической части работы предполагается, что студент составит и отладит простейшую программу для микроконтроллера.

2. Основные теоретические сведения

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

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

68

Программно-аппаратная модель и архитектура этого контролера получила развитие в более современных устройствах, таких, как семейство 8-разрядных микроконтроллеров MCS-52, MCS-251 и 16-разрядных контроллеров MCS-96 и MCS-196. Идеи, заложенные в этих микро-ЭВМ, дали жизнь совершенно новым семействам микроконтроллеров на основе более совершенных и развитых технологий.

По оценкам экспертов еще на протяжении 10-ти лет этот микроконтроллер будет самым используемым среди 8-разрядных микро-ЭВМ, поэтому изучение его архитектуры, программирования и схемотехники является весьма перспективным, тем более что это дает представление о других микроконтроллерах и возможность изучить их особенности.

2.1. Понятие архитектуры микроконтроллера. Назначение выводов микроконтроллеров MCS-51

Под архитектурой семейства микроконтроллеров принято понимать совокупность внутренних программно доступных ресурсов, системы команд, системы прерываний, функций ввода/вывода и протоколов обмена по магистралям.

При создании разнообразных прикладных систем на основе микроконтроллеров существенную роль играет понимание назначения выводов микроконтроллера и их использование при схемотехническом проектировании. Рассмотрим более подробно назначение выводов классического варианта микроконтроллера семейства MCS-51 (8051), который выполнен на основе 40-выводного PDIP корпуса (рис. 5.1). Для полноценной работы данного микроконтроллера требуется минимальное количество внешних навесных компонентов: кварцевые резонатор, два резистора и три конденсатора. Микроконтроллер имеет встроенную память, подсистему поддержки прерываний и драйверы цифровых линий, тем самым представляя полноценную микроЭВМ.

Микроконтроллеры семейства MCS-51 запитываются напряжением в диапазоне от 3…6 В. Источник питания подключается к выводам Vss (20) – «земляной» вывод и Vсс (40) – «плюсовой» вывод. Для управления работой всех устройств в микроконтроллере используется тактовый генератор импульсов, который может работать от внешнего источника или автономно (в режиме самовозбуждения). В последнем случае к выводам XTAL2 (18) и XTAL (19) должен быть подключен кварцевый или пьезокерамический резонатор на частоту не более 12 МГц (для классического микроконтроллера Intel типа 8051AH). После подачи питающего напряжения микроконтроллер тре-

69

бует установки своих внутренних устройств в исходное состояние путем подачи импульса на вывод RST (9), для чего используется или специализированный монитор питания, или RC-цепочка. После этого микроконтроллер начинает работу c исполнения команды, записанной по адресу 0000h.

 

40

 

 

1

 

Vcc

 

P1.0

 

 

 

P1.1

2

31

EA#

 

P1.2

3

 

P1.3

4

9

RST

 

P1.4

5

 

P1.5

6

 

MCS -51

P1.6

7

 

 

 

P1.7

8

29

PSEN#

 

P2.0 21

 

 

 

P2.1

22

30

ALE

 

P2.2 23

19

 

 

P2.3

24

XTAL2

 

P2.4

25

 

 

P2.5 26

 

 

 

P2.6

27

18

XTAL1

 

P2.7

28

 

 

 

39

P0.0

 

P3.0

10

38

P0.1

 

P3.1

11

37

P0.2

 

P3.2

12

36

P0.3

 

P3.3

13

35

P0.4

 

P3.4

14

34

P0.5

 

P3.5

15

33

P0.6

 

P3.6

16

32

P0.7

Vss

P3.7

17

 

 

 

 

 

 

20

 

 

Рис. 5.1. Цоколевка и стандартная схема включения контроллера семейства MCS-51

Для связи с внешним миром у микроконтроллера есть двунаправленные порты: 4 параллельных и один последовательный порт (полнодуплексный порт для приема и передачи данных). Параллельные порты работают в побайтовом формате и имеют по восемь выводов: P0 (32-39), P1 (1-8), P2 (2128), P3 (10-17). Порты P0 и P2 используются также для формирования адреса и передачи данных при обращении к внешним запоминающим устройствам. Хотя порты являются двунаправленными, однако чтение данных от внешнего

70

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

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

для последовательного порта в качестве принимающей RxD (10) и передающей TxD линий (13);

для ввода сигналов внешних прерываний INT0# (12) и INT1# (13);

для счета внешних импульсов T0 (14) и T1 (15);

для выдачи сигналов записи WR# (16) и чтения RD#(17) на внешние запоминающие устройства.

Для работы с внешним ЗУ используются также выводы PSEN# (29), ALE# (30), EA# (31). Если на выводе EA# подана логическая единица, то контроллер работает с внутрикристальной памятью. Нуль на входе EA# заставит контроллер выполнять программу из внешней памяти. При построении устройств на основе MCS-51 следует избегать плавающего потенциала на этом входе – если он окажется «висящим в воздухе», контроллер будет работать нестабильно и «зависать».

На выводе ALE# обычно присутствует непрерывная последовательность прямоугольных импульсов с частотой в 6 раз ниже, чем частота тактового сигнала. Длительность единицы примерно вдвое меньше длительности нуля, т.е. скважность составляет приблизительно составляет 33 %. Этот сигнал можно использовать для тактирования микросхем, которым для работы требуется внешний источник тактового сигнала.

2.2. Программная модель микроконтроллеров MCS-51

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

В микроконтроллерах программа и константы записываются в постоянную память (ПЗУ). Тогда как для хранения изменяемых данных используется оперативная память (ОЗУ). Оба вида памяти находятся на кристалле микроконтроллера и представляют собой набор побайтовых ячеек памяти. Постоянную память называют также памятью программ – занесенные в нее коды сохраняются неизменными после выключения питания и записываются