Электромеханические системы автоматизации

Характеристика, устройство, конфигурация и назначение микроконтроллеров I8051, PIC16F877, организация их памяти. Основные методы и приемы системного программирования микроконтроллеров и интерфейса на языках семейства ассемблер MCS-51 и PICmicro.

Рубрика Коммуникации, связь, цифровые приборы и радиоэлектроника
Вид методичка
Язык русский
Дата добавления 18.04.2010
Размер файла 3,0 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Министерство образования и науки Украины

Донбасская государственная машиностроительная академия

МЕТОДИЧЕСКИЕ УКАЗАНИЯ

к самостоятельной работе

по дисциплине «Микропроцессорные устройства»

для студентов специальности 7.092203

«Электромеханические системы автоматизации»

всех форм обучения

Утверждено

на заседании

методического совета

Протокол № от

Краматорск 2008

УДК

Методические указания к самостоятельной работе по дисциплине «Микропроцессорные устройства» для студентов специальности 7.092203 «Электромеханические системы автоматизации» всех форм обучения / Сост.: А.М. Наливайко, Д.С. Пономарев. - Краматорск: ДГМА, 2006. - 132 с.

В методических указаниях изложено краткое описание микроконтроллеров I8051, PIC16F877, основные методы и приемы программирования на языках ассемблера семейств MCS-51 и PICmicro. Приведены примеры составления программ и задания для самостоятельной работы студентов.

Составители: А.М. Наливайко, доц.,

Д.С. Пономарев, асс.

Отв. за выпуск А.М. Наливайко, доц.

Содержание

Введение

1 Описание микроконтроллера i8051

1.1 Организация памяти микроконтроллера

1.2 Организация таймеров/счетчиков

1.3 Организация системы прерываний

2 Основы программирования микроконтроллерных систем

2.1 Общие сведения

2.2 Процедуры и подпрограммы

2.3 Основные правила записи исходного текста программы

2.4 Директивы ассемблера ASM-51

2.4.1 Общие сведения

2.4.2 Директивы символических определений

2.4.3 Директивы резервирования и инициализации памяти

2.4.4 Директивы компоновки программы

2.4.5 Директивы управления состоянием ассемблера

2.4.6 Директивы выбора сегмента

2.4.7 Директивы макроопределений

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

2.6 Реализация подпрограмм

2.7 Реализация многомодульных программ

2.8 Использование сегментов в языке программирования ассемблер

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

3.1 Структурное программирование

3.2 Создание программы микропроцессорного устройства

3.3 Оптимизация программы и стиль программирования

4 Практикум по ассемблеру MCS-51

4.1 Требования к отчетам по практикуму

4.2 Практическое задание №1

4.3 Практическое задание №2

4.4 Практическое задание №3

4.5 Практическое задание №4

4.6 Практическое задание №5

4.7 Практическое задание №6

5 Описание микроконтроллера PIC16F877

5.1 Общая характеристика микроконтроллера

5.2 Внутреннее устройство ядра микроконтроллера

5.3 Слово конфигурации микроконтроллера

5.4 Организация памяти программ

5.5 Организация памяти данных

5.6 Система прерываний микроконтроллера

5.7 Порты ввода/вывода

5.8 Модуль таймера TMR0

5.9 Модуль таймера TMR1

5.10 Модуль таймера TMR2

6 Транслятор ассемблера микроконтроллеров PICmicro MPASM

6.1 Правила написания программ

6.2 Директивы ассемблера MPASM

7 Практикум по ассемблеру PICmicro

7.1 Требования к отчетам

7.2 Практическое задание №1

7.3 Практическое задание №2

7.4 Практическое задание №3

Литература

Приложение А

Приложение Б

Введение

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

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

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

1 Описание микроконтроллера I8051

1.1 Организация памяти микроконтроллера

Микроконтроллеры семейства Intel MCS-51 выполнены по гарвардской архитектуре и имеют раздельную память команд и данных. Такая организации памяти определяет некоторые особенности при программировании микроконтроллеров данного типа. Кроме этого к микроконтроллеру можно подключить внешнюю память команд и данных. Внутренняя память команд и данных организована непосредственно в самом микроконтроллере на одном кристалле.

На рис. 1 изображена карта памяти команд микроконтроллера. Объем внутренней (резидентной) памяти программ (ROM, EPROM или OTP ROM), располагаемой на кристалле, в зависимости от типа микросхемы может составлять 0 (ROMless), 4К (базовый кристалл), 8К, 16К или 32К. При необходимости пользователь может расширять память программ установкой внешнего ПЗУ. Разрешение работы с внутренним или внешним ПЗУ определяется значением логического сигнала на выводе ЕА (External Access):

EA=1 - доступ к внутреннему ПЗУ;

EA=0 - доступ к внешнему ПЗУ.

Рисунок 1 - Организация памяти команд

Область нижних адресов памяти программ используется системой прерываний. Архитектура микросхемы i8051обеспечивает поддержку пяти источников прерываний:

- двух внешних прерываний;

- двух прерываний от таймеров;

- прерывания от последовательного порта.

Распределение нижних адресов памяти команд указано на рис. 2. Данные адреса называют «Векторами прерываний». При подаче сигнала сброса RESET микроконтроллер выполняет начальную инициализацию и начинает извлекать команды по адресу 0000h. Поэтому, если предусматривается применять систему прерываний, по данному адресу следует записывать команду безусловного перехода на адрес 002Bh или выше. Это необходимо для обхода основной программой таблицы векторов прерываний.

При появлении соответствующего события, например переполнения таймера 0, и условии разрешения прерывания для данного события, основная программа прерывается и происходит извлечение команд по соответствующему адресу (для таймера 0 - 000Bh). Более подробно с системой прерываний можно познакомиться в главе 1.3 «Организация системы прерываний».

Рисунок 2 - Нижняя область памяти команд

Память данных отделена от памяти программ. В этой области возможна адресация 64К внешнего ОЗУ. При обращении к внешней памяти данных ЦП микроконтроллера генерирует соответствующие сигналы чтения или записи . Взаимодействие с внутренней памятью данных осуществляется на командном уровне, при этом сигналы и не вырабатываются.

Внешняя память программ и внешняя память данных могут комбинироваться путем совмещения сигналов и по схеме «логического И» для получения строба доступа к внешней памяти (программ/данных).

Внутренняя память данных разделена на 2 участка: нижняя область памяти - lower memory (адреса 00h-7Fh) содержит РОН, которые выбираются из 4х банков и область памяти пользователя (Рис. 5); верхняя область памяти - upper memory (адреса 80h-FFh) содержит регистры специальных функций (SFR). Данную область памяти нельзя использовать для хранения информации пользователя, и она используется только для доступа к регистрам SFR (Рис. 4). Организация памяти данных указана на рис. 3.

Рисунок 3 - Организация памяти данных

Первые 32 байта памяти lower memory представляют собой 4 банка (Register Bank) по 8 регистров R7...R0. Регистры R0 и R1 в любом из банков могут использоваться в качестве регистров косвенного адреса.

Следующие за регистровыми банками 16 байт образуют блок побитно-адресуемого пространства. Набор инструкций MCS-51 содержит широкий выбор операций над битами, а 128 бит в этом блоке адресуются прямо и адреса имеют значения от 00Н до 7FH.

Все байты в нижней 128-байтной половине памяти могут адресоваться как прямо, так и косвенно.

Верхняя 128 байтная половина памяти ОЗУ (Upper 128) в микросхеме i8051 отсутствует, но имеется в версиях кристаллов с 256 байтами ОЗУ. В этом случае область «Upper 128» доступна только при косвенной адресации. Область SFR (Special Function Register) доступна только при прямой адресации.

Размещение регистров специальных функций в пространстве SFR показано на рис. 4. Они включают в себя регистры портов, таймеры, средства управления периферией и т. п.

Для 16 адресов в пространстве SFR имеется возможность как байтовой, так и битовой адресации. Для побитно адресуемых регистров шестнадцатеричный адрес заканчивается на «0Н» или на «8Н». Битовые адреса в этой области имеют значения от 80Н до FFH.

Битовая адресация 8 байт

F8H

FFH

F0H

B

F7H

E8H

EFH

E0H

ACC

E7H

D8H

DFH

D0H

PSW

D7H

C8H

CFH

C0H

C7H

B8H

IP

BFH

B0H

P3

B7H

A8H

IE

AFH

A0H

P2

A7H

98H

SCON

SBUF

9FH

90H

P1

97H

88H

TCON

TMOD

TL0

TL1

TH0

TH1

8FH

80H

P0

SP

DPL

DPH

PCON

87H

0/8

1/9

2/A

3/B

4/C

5/D

6/E

7/F

Рисунок 4 - Размещение регистров специальных функций в пространстве SFR

7FH

30H

Побайтно-адресуемая область ОЗУ (direct, indirect)

2FH

7FH

7EH

7DH

7CH

7BH

7AH

79H

78H

2EH

77H

76H

75H

74H

73H

72H

71H

70H

Побитно-адресуемая область ОЗУ(direct)

21H

0FH

0EH

0DH

0CH

0BH

0AH

09H

08H

20H

07H

06H

05H

04H

03H

02H

01H

00H

1FH

18H

Банк РОН 3

17H

10H

Банк РОН 2

0FH

08H

Банк РОН 1

07H

00H

SP после RESET

Банк РОН 0(R7+R0)

Рисунок 5 - Нижняя область внутренней памяти данных

Регистры SFR имеют следующее назначение:

Аккумулятор А (Accumulator, адрес E0H).

Команды архитектуры MCS-51 используют аккумулятор как источник и как приемник при вычислениях и пересылках. Кроме обращения к аккумулятору командами, использующими мнемонику "А", имеется возможность побитовой или побайтовой адресации, как SFR-регистра.

Регистр В (Multiplication Register, адрес F0H).

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

Слово состояния программы PSW (Program Status Word, адрес D0H).

Данный регистр содержит биты, отражающие результаты исполнения операций, биты выбора регистрового банка и бит общего назначения, доступный пользователю. PSW отображен на область SFR и содержит:

Биты:

7

6

5

4

3

2

1

0

Обозначение:

CY

AC

F0

RS1

RS0

OV

-

P

Рисунок 6 - Расположение битов регистра PSW

Биты регистра PSW имеют следующее назначение:

CY (Carry) - признак переноса. Устанавливается, если в старшем бите аккумулятора при выполнении арифметической операции в результате возникает перенос бита или заем. При выполнении операций деления или умножения бит сбрасывается. Установка/сброс - аппаратно и программно;

AC (Auxiliary Carry) - признак дополнительного переноса. Используется при выполнении инструкций сложения или вычитания для указания переноса или заема из бита 3 при образовании младшего полубайта результата (D0-D3). Установка/сброс - аппаратно и программно;

F0 - флаг состояния, определяемый пользователем. Установка/сброс только программно;

RS0, RS1 - флаги-указатели банка рабочих регистров (РОН). Установка/сброс только программно;

OV (Overflow) - флаг переполнения. Устанавливается, если результат операции сложения/вычитания не укладывается в 7 битах и старший восьмой бит не может быть интерпретирован как знаковый. При выполнении операции деления флаг сбрасывается, а в случае деления на 0 устанавливается. При умножении флаг устанавливается, если результат больше 255. Возможен программный сброс/установка;

P (Parity) - флаг четности единичных битов в аккумуляторе. Является дополнением содержимого аккумулятора до четности. В 9-разрядном слове, состоящем из 8 разрядов аккумулятора и бита Р всегда содержится четное число единичных битов. Если все биты аккумулятора равны 0, то и бит Р сброшен. Он программно доступен только для чтения.

Разряд 1 PSW зарезервирован и может использоваться для программной записи/чтения.

Регистры портов Р0-Р3 (адреса 80Н, 90Н, А0Н, В0Н).

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

- Через порт 0 (в мультиплексном режиме) выводится младший байт адреса, а также выдается и принимается в микроконтроллер байт данных при работе с внешней памятью программ/данных;

- Через порт 2 выводится старший байт адреса внешней памяти программ и данных;

- Порт 3 имеет следующие альтернативные функции:

Р3.7 - строб чтения из внешней памяти данных (Read Data from External Memory,);

P3.6 - строб записи во внешнюю память данных (Write Data to External Memory, );

P3.5 - внешний вход T/C1 (Timer/Counter 1 External Input, T1);

P3.4 - внешний вход T/C0 (Timer/Counter 0 External Input, T0);

P3.3 - вход внешнего прерывания 1 (External Interrupt 1 Input Pin, );

P3.2 - вход внешнего прерывания 0 (External Interrupt 0 Input Pin, );

P3.1 - выход данных передатчика последовательного порта (Serial Port Transmit Pin, TxD);

P3.0 - вход данных передатчика последовательного порта (Serial Port Receive Pin, RxD).

Указатель стека SP (Stack Pointer, адрес 81Н).

Используется для указания на вершину стека в операциях записи в стек и чтения из него. Неявно используется такими командами, как PUSH, RET, RETI, POP. По аппаратному сбросу от ЦП устанавливается в значение 07Н (область стека в этом случае начинается с адреса внутренней памяти данных 08Н) и инкрементируется при каждой записи в стек. Запись в SFR-регистр SP (с использованием байтовой адресации) производится для предопределения положения стека во внутренней памяти данных.

Указатель данных DPTR (Data Pointer, адреса 82Н, 83Н).

Команды архитектуры MCS-51 используют DPTR для пересылки данных, пересылки кода и для переходов (JMP@A+DPTR). DPTR состоит из двух регистров: младшего - DPL и старшего - DPH, обращение к ним - только байтовое.

Регистр управления энергопотреблением PCON (Power Control Register, адрес 87Н).

Для кристаллов, выполненных по HMOS-технологии, данный регистр имеет только один значащий бит - SMOD, который управляет скоростью работы последовательного порта.

Регистры таймеров/счетчиков TL0, TL1, TH0, TH1 (адреса 8АН, 8ВН, 8СН, 8DH).

Образуют 16-битные (Low/High) регистры таймеров/счетчиков Т/C0 и Т/C1. Обращение к регистрам только байтовое. Подробно описаны в подразделе «Организация таймеров/счетчиков».

Регистр режима таймеров/счетчиков TMOD (Timer/Counter Mode Control Register, адрес 89Н).

Регистр управления таймеров/счетчиков TCON (Timer/Counter Control Register, адрес 88Н).

Предназначены для управления работой таймерной секции микроконтроллера. Подробно описаны в подразделе «Организация таймеров/счетчиков».

Буфер последовательного порта SBUF (Serial Data Buffer, адрес 99Н).

Представляет собой два отдельных регистра. При записи в SBUF загружается «буфер передачи» последовательного порта, при чтении SBUF считывается содержимое «буфера приема» последовательного порта.

Регистр управления последовательным портом SCON (Serial Port Control Register, адрес 98Н)

Предназначен для управления работой последовательного порта. Обращение к данному регистру может быть как байтовым, так и побитным.

Регистр разрешения прерываний IE (Interrupt Enable Register, адрес А8Н).

Регистр управления приоритетом прерывания IP(Interrupt Priority Control Register, адрес В8Н).

Поддерживают работу системы прерываний микроконтроллера. Подробное описание работы с регистрами дано в подразделе «Организация системы прерываний».

1.2 Организация таймеров/счетчиков

Таймеры/счетчики (Т/C0 и T/C1) предназначены для подсчета внешних событий (выводы Т0 и Т1), организации программно-управляемых временных задержек и измерения временных интервалов. Таймер 1 может также служить генератором скорости передачи для последовательного порта.

Таймер/счетчик, работая в режиме таймера, ведет подсчет тактов деленной системной частоты (запрограммированный промежуток времени) и выдает запрос прерывания. Регистр таймера инкрементируется один раз в каждом периферийном цикле. Поскольку цикл состоит из 12 тактов, то скорость счета таймера равна FOSC/12.

В режиме счетчика регистр таймера ведет подсчет (предустановленного числа событий) отрицательных перепадов сигнала на внешнем входе и по окончании счета выдает запрос прерывания. Поскольку распознавание отрицательного перехода внешнего сигнала занимает 24 периода тактовой частоты (2 цикла), то максимальная скорость счета равна FOSC/24. Ограничений на рабочий цикл не накладывается, но чтобы гарантировать опрос конкретного уровня сигнала хотя бы один раз до момента его смены, он должен удерживаться на входе хотя бы в течение одного полного периферийного цикла.

Программное управление функционированием Т/С0 и Т/С1 обеспечивают SFR-регистры TMOD и TCON. Возможны 4 режима работы Т/С микроконтроллера, которые определяются установкой соответствующих битов регистра TMOD. Режимы 0 (13-битовый таймер), 1 (16-битовый таймер) и 2 (8-битовый таймер с автоперезагрузкой) полностью идентичны для обоих Т/С. В режиме 3 (два 8-битовых регистра) работает только Т/С0, T/C1 в этом режиме заблокирован («лишен» бита управления запуском TR1 и флага переполнения TF1) и сохраняет содержимое своих регистров TL1 и TH1. Логика работы T/C0 и T/C1 в режимах 0,1,2,3 показана на рис. 7.

Рисунок 7 - Логика работы T/C0 и Т/C1в режимах 0, 1, 2 и 3

Путем соответствующего программирования регистров TMOD и TCON осуществляется включение и выключение таймеров/счетчиков, выбор источника их тактирования и установка определенного режима их работы.

Функциональное назначение разрядов этих регистров следующее:

Биты:

7

6

5

4

3

2

1

0

Обозначение:

GATE1

M1.1

M1.0

GATE0

M0.1

M0.0

Рисунок 8 - Расположение битов регистра TMOD

Назначение битов:

GATEx - Если GATEx=1 и TRx=1, то включение и выключение соответствующего таймера осуществляется внешним сигналом на входе INTx. Когда GATEx=0, бит управления запуском TRx=1 разрешает прохождение входных сигналов от выбранного источника тактирования;

- выбирает функцию таймера, (подсчет импульсов деленной системной частоты) или выбирает функцию счетчика (подсчет отрицательных переходов сигнала на внешнем выводе Тх);

Мх.1, Мх.0 - биты выбора режима таймеров. Могут иметь следующие сочетания:

Мх.1

Мх.0

0

0

Mode 0: 8-битовый таймер/счетчик (ТНх) с 5-битовым предделителем (TLx);

0

1

Mode 1: 16-битовый таймер/счетчик;

1

0

Mode 2: 8-битовый автоперезагружаемый таймер/счетчик (TLx). Константа перезагрузки предварительно заносится в ТНх.

1

1

Mode 3: TL0 - это 8-битовый таймер/счетчик; ТН0 - 8-битовый таймер, использующий биты TR1 и TF1.

Биты:

7

6

5

4

3

2

1

0

Обозначение:

TF1

TR1

TF0

TR0

IE1

IT1

IE0

IT0

Рисунок 9 - Расположение битов регистра TCON

Назначение битов:

TRx - биты запуска соответствующего таймера/счетчика. Устанавливаются/сбрасываются только программно;

TFx - биты переполнения соответствующего счетчика (устанавливаются/сбрасываются программно и аппаратно при переходе значения таймера из FFFFН в 0000H), очищается аппаратно, когда процессор переходит на подпрограмму обработки прерывания или программно;

IЕx - флаг обнаружения внешнего прерывания. Устанавливается аппаратно, когда обнаружено внешнее прерывание (по фронту или уровню сигнала) на выводе INTx; сбрасывается аппаратно во время обработки прерывания только в том случае, когда прерывание было вызвано фронтом сигнала или программно;

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

Пример настройки таймеров/счетчиков в режим 2:

mov

TMOD, #20H

; Т/C1 в режиме 2

mov

TL1, #data8

; константы перезагрузки

mov

TH1, #data8

; таймера/счетчика 1

SETB

TR1

; запуск таймера/счетчика на счет

1.3 Организация системы прерываний

Архитектура системы управления прерываниями для базовой модели I8051 показана на рис. 10:

Рисунок 10 - Система прерываний ОМЭВМ

Каждое из внешних прерываний INT0, INT1 может быть активизировано по уровню «0» или по фронту (переход из «1» в «0») сигналов на выводах ОМЭВМ Р3.2, Р3.3, что определяется состоянием битов IT0 и IT1 регистра TCON. При поступлении запроса внешнего прерывания INTx устанавливается флаг IEx регистра TCON. Установка флагов IEx в регистре TCON вызывает соответствующее прерывание. Очистка флага IEx производится следующим образом. При прерывании по фронту IEx сбрасывается аппаратно (автоматически внутренними средствами ОМЭВМ) при обращении к соответствующей подпрограмме обработки прерывания. При прерывании по уровню флаг очищается при снятии запроса внешнего прерывания, то есть в IEx отслеживается состояние вывода INTx.

Прерывания от таймеров/счетчиков вызываются установкой флагов TF0 и TF1 регистра TCON, которые устанавливаются при переполнении соответствующих регистров таймеров/счетчиков (за исключением режима 3, см. раздел «Организация таймеров/счетчиков»). Отчистка флагов TF0 и TF1 производится внутренней аппаратурой ОМЭВМ при переходе к подпрограмме обслуживания прерывания.

Прерывание от последовательного порта вызывается установкой флага прерывания приемника RI или флага прерывания передатчика TI в регистре SCON. В отличие от всех остальных флагов, RI и TI сбрасываются только программным способом обычно в пределах подпрограммы обработки соответствующего прерывания.

Каждый из перечисленных источников прерываний может быть индивидуально разрешен или запрещен установкой или сбросом соответствующего бита в регистре разрешения прерываний IE. Регистр IE содержит также бит ЕА, сброс которого в «0» запрещает сразу все прерывания. Необходимым условием прерывания является его разрешение в регистре IE. Формат и описание регистра разрешения прерываний приведены ниже:

Биты:

7

6

5

4

3

2

1

0

Обозначение:

EA

-

-

ES

ET1

EX1

ET0

EX0

Рисунок 11 - Расположение битов регистра IE

Назначение битов:

EA (Enable All) - разрешение прерываний от всех источников;

Биты 6, 5 - зарезервированы;

ES (Enable Serial) - разрешение прерывания от последовательного порта;

ETx (Enable T/Cx) - разрешение прерывания по переполнению от соответствующего таймера;

EXx (Enable eXternal) - разрешение прерывания по внешнему сигналу на входе ;

Все биты, которые вызывают прерывания (IE0, IE1, TF0, TF1, RI, TI), могут быть программно установлены или сброшены с тем же результатом, что и в случае их аппаратной установки или сброса. Т. е. прерывания могут программно вызываться или ожидающие обслуживания прерывания могут программно ликвидироваться. Кроме того, прерывания по входам , могут вызываться программной установкой Р3.2=0 и Р3.3=0, как показано в приведенном ниже примере:

MAIN:

MOV

IE, #00000101В

; Разрешение прерывания от INT0,INT1.

MOV

IP, #04H

; Присвоение INT1 старшего приоритета.

SETB

ЕА

; Общее разрешение прерываний.

M0V

P3, #11110011В

; Имитация внешних прерываний.

SUBR:

; Переход к подпрограмме обслуживания

ORG 013H

; INT1.

В предложенном примере запросы прерывания INT0 и INT1, имеющие различный приоритет, поступают одновременно. При этом обслуживается прерывание с высшим приоритетом.

В случае, когда прерывание по (х=0,1) вызывается уровнем сигнала на соответствующем входе ОМЭВМ, флаг IEx при переходе к подпрограмме обработки прерывания автоматически сбрасывается, а затем, если соответствующий вывод ОМЭВМ Р3.2 или Р3.3 все еще находится в состоянии логического «0», вновь устанавливается. Поэтому, в случае, когда прерывание по входам , вызывается уровнем, программная установка в «1» флагов IE0, IE1 вызовет прерывание, после чего соответствующий флаг IEx (х=0,1) будет автоматически сброшен при переходе к подпрограмме обработки прерывания.

Флаги IE0, IE1, TF0, TF1, RI, TI устанавливаются независимо от того разрешено или нет соответствующее прерывание в регистре IE.

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

Биты:

7

6

5

4

3

2

1

0

Обозначение:

-

-

-

PS

PT1

PX1

PT0

PX0

Рисунок 12 - Расположение битов регистра IP

Назначение битов:

Биты 7, 6, 5 - зарезервированы;

PS (Priority of Serial) - Установка уровня приоритета от последовательного порта;

PTx (Priority of T/Cx) - Установка уровня приоритета от соответствующего Т/С;

PXx (Priority of External) - Установка уровня приоритета от соответствующего внешнего источника прерываний.

Низкоприоритетное прерывание может прерываться высокоприоритетным, но никогда не прерывается запросом того же уровня приоритета. Поэтому, если одновременно возникают два прерывания с различным уровнем приоритета, то сначала выполняется высокоприоритетное. Если же подобная ситуация складывается для прерываний с одинаковым уровнем приоритета, то последовательность их обработки определяется специальной последовательностью опроса флагов прерываний (Interrupt Polling Sequence): IE0TF0IE1TF1RI+TI. Запрос IE0 - распознается первым, TI+RI - последним.

При выполнении прерывания основной программы для выполнения подпрограммы обработки прерывания внутри микропроцессора выполняется аппаратно-реализуемая команда LCALL, выполняющая переход по фиксированному адресу, значение которого зависит от источника прерывания. Данный адрес называют «вектором прерывания». Адреса векторов прерываний для базовой модели I8051 указаны на рис. 2. При этом подпрограмма будет выполняться до команды возврата из прерывания RETI. Данная команда снимает запрет на обработку других прерываний и загружает в счетчик команд из стека адрес следующей команды прерванной программы.

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

LOC

EQU

$

; Запоминание счетчика адреса.

ORG

0003h

; Начальный адрес программы прерывания.

LJMP

SERV

; Переход на обработчик прерывания.

;

...

...

; Выполнение подпрограммы.

ORG

LOC

; Восстановление счетчика адреса.

SERV:

PUSH

PSW

; Сохранение регистров в стек.

PUSH

ACC

PUSH

B

PUSH

DPL

PUSH

DPH

MOV

PSW, #1000b

; Выбор другого регистрового банка.

;

...

...

; Тело обработчика прерывания.

POP

DPH

; Восстановление регистров из стека

POP

DPL

; в обратном порядке.

POP

B

POP

ACC

POP

PSW

RETI

; Возврат из прерывания.

2 Основы программирования микроконтроллерных систем

2.1 Общие сведения

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

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

Если задача на разработку прикладной программы для микроконтроллера поставлена, то для получения текста исходной программы необходимо выполнить ряд последовательных действий:

- Подробно описать задачу.

- Проанализировать задачу.

- Выполнить инженерную интерпретацию задачи, желательно с привлечением того или иного аппарата формализации (граф автомата, сети Петри, матрицы состояний и связности и т.п.).

- Разработать общую схему алгоритма работы контроллера.

- Разработать детализированные схемы отдельных процедур, выделенных на основе модульного принципа составления программ.

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

- Распределить рабочие регистры и память.

- Сформировать текст исходной программы.

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

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

Алгоритм есть точно определенная процедура, предписывающая контроллеру однозначно определенные действия по преобразованию исходных данных в обработанные выходные данные. Поэтому разработка схемы требует предельной точности и однозначности используемой атрибутики: символических имен переменных, констант, подпрограмм (модулей), символических адресов таблиц, портов ввода вывода и т. п. Основное внимание при разработке следует уделить тому разделу функциональной спецификации прикладной программы, в котором приводится описание аппаратуры сопряжения с объектом управления. Это описание должно быть детализировано вплоть до электрических и временных характеристик каждого входного и выходного сигнала или устройства. Данным описанием является принципиальная электрическая схема системы, в которой используется микроконтроллер.

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

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

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

В международном стандарте на программный продукт HIPO (Hierarchy Input Process Output) декларируется аналогичный подход к разработке прикладных программ.

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

- Определить, что должен делать модуль.

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

- Определить необходимость какой-либо предварительной обработки введенных исходных данных (маскирование, сдвиг, масштабирование, перекодировка и т. п.).

- Определить метод преобразования входных данных в требуемые выходные. Используя операторы процедур и условные операторы принятия решения, отобразить на языке схемы алгоритма выбранный метод.

- Определить способы выдачи из модуля обработанных данных (передать в память, в вызывавшую программу или в порты вывода).

- Определить необходимость какой-либо вторичной обработки выводимых данных (изменение формата, перекодирование, масштабирование, маскирование и т. п.).

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

- Проверить работоспособность алгоритма на бумаге путем подстановки в него действительных данных. Убедиться в его сходимости и результативности.

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

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

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

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

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

При написании программ на ассемблере для I8051 необходимо учитывать особенности архитектуры микроконтроллера и следовать определенным рекомендациям, которые сформулированы ниже:

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

- Желательно, чтобы программа работала с одним 8-байтовым банком регистров. Это сократит объем программы и ускорит ее выполнение.

- Часто используемые переменные следует размещать в первых 256 байтах памяти, что также сократит объем и ускорит выполнение программы.

- Желательно, чтобы обработчик прерывания имел объем не более 8 байт, чтобы его можно было разместить в соответствующем окне.

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

- При использовании непосредственной адресации не забывайте ставить перед константой символ «#». Иначе константа будет интерпретироваться как адрес одного из первых 256 байт памяти.

Выполнение этих рекомендаций при разработке прикладных программ позволит свести к минимуму проблемы, которые могут возникнуть в дальнейшем при отладке программы.

Что касается дополнительной информации по написанию ассемблерных программ для I8051, то она зависит от конкретного используемого ассемблера. Формат написания программ практически одинаков для различных ассемблеров, но для нормальной их работы, возможно, понадобится ввести определенные директивы. Мы будем рассматривать свободно-распространяемый макро-ассемблер версии 2.2 производства Intel Corporation.

2.2 Процедуры и подпрограммы

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

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

Обращение к подпрограмме осуществляется по команде вызова CALL MARK, где MARK - символическое имя процедуры. Имя процедуры используется в качестве метки, отмечающей одну из команд (чаще всего первую) подпрограммы. Для I8051 мнемоническое значение CALL является обобщенным и транслируется в одну из команд ACALL или LCALL в зависимости от адресного расстояния текущей команды до вызываемой подпрограммы.

По команде CALL в стеке сохраняется значение счетчика команд, и возврат из подпрограммы осуществляется в то место основной программы, откуда был осуществлен вызов (к команде основной программы, следующей за командой CALL). Для этого любая подпрограмма должна заканчиваться командой возврата RET, осуществляющей восстановление содержимого программного счетчика из стека.

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

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

Иногда при обращении к подпрограмме возникает необходимость сохранить не только адрес возврата в основную программу, но и содержимое отдельных рабочих регистров. Удобным способом для этого является переключение банка регистров. Например, если основная программа использует банк регистров 0, то подпрограмма может использовать банк регистров 1. Однако переключение банка регистров не обеспечивает сохранение содержимого аккумулятора, что приводит к необходимости создавать в одном из рабочих регистров или в памяти копию аккумулятора.

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

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

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

Передача параметров через регистры осуществляется аналогичным образом.

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

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

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

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

2.3 Основные правила записи исходного текста программы

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

Оператор - это базовая конструкция языка программирования, определяющая действия в программе. В языке программирования ASM-51 в одной строке может быть записан только один оператор. Максимальный размер строки - 255 символов. Признаком конца оператора является символ «возврат каретки».

Оператор состоит из трех полей:

<поле метки> <поле операции> <поле комментария>,

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

Пример оператора, записанного на языке программирования ASM-51:

Рисунок 13 - Пример записи оператора на языке ASM-51

Поле метки используется для записи меток. Метки используются для организации условных и безусловных переходов, а также для объявления переменных и констант. Признаком конца поля метки является символ «двоеточие». Однако язык программирования ASM-51, в виде исключения, допускает использовать символы интервала, как признак конца поля метки.

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

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

PodprogammaPeredachiDannix:

; Помечается следующий оператор

MOV

R0,A

; <- Помечаемый оператор

MOV

A,@R0

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

Поле комментария начинается с символа «точка с запятой». Это поле используется для записи пояснений к программе. Оператор, в котором присутствует только поле комментария, используется для увеличения наглядности программы.

Комментарий начинается с символа (;) и может содержать любые ASCII символы. Примеры комментариев:

;---------------------------------------------------------------------*

; ПОДПРОГРАММА ВЫЧИСЛЕНИЯ ФУНКЦИИ |

;---------------------------------------------------------------------*

; X+Y*Z

Для набора текста программы используются следующие символы:

- Символы интервала.

- Буквы.

- Знаки.


Подобные документы

  • Семейство 16-разрядных микроконтроллеров Motorola 68HC12, их структура и функционирование. Модуль формирования ШИМ-сигналов. Средства отладки и программирования микроконтроллеров 68НС12. Особенности микроконтроллеров семейства MCS-196 фирмы INTEL.

    курсовая работа [239,6 K], добавлен 04.01.2015

  • Рассмотрение структуры и принципов работы таймеров/счетчиков (общего назначения, сторожевого, типов А, В, С, D, Е) микроконтроллеров и аналого-цифрового преобразователя семейства AVR с целью разработки обучающего компьютерного электронного пособия.

    курсовая работа [1,0 M], добавлен 06.03.2010

  • Использование микроконтроллеров AVR фирмы Atmel в проектируемой аппаратуре. Архитектура и общие характеристики прибора, предназначение арифметики логического устройства и понятие флэш-памяти. Формат пакета данных, алгоритм их передачи и система команд.

    контрольная работа [427,3 K], добавлен 12.11.2010

  • Структурная схема микроконтроллеров семейства MCS-51: отличительные особенности, назначение выводов, блок регистров специальных функций. Карта прямоадресуемых бит. Методы адресации, граф команд пересылки, обмена и загрузки. Ввод и отображение информации.

    курсовая работа [135,5 K], добавлен 22.08.2011

  • Адресное пространство микроконтроллеров MSP430F1xx. Байтовая и словная формы инструкций. Система команд MSP микроконтроллеров. Периферийные устройства микроконтроллеров MSP430F1xx. Аналого-цифровой преобразователь ADC12, его технические характеристики.

    курсовая работа [278,1 K], добавлен 04.05.2014

  • Микроконтроллер (MCU) — микросхема, предназначенная для управления электронными устройствами. Их можно встретить во многих современных приборах, в том числе и бытовых. Рассмотрение архитектуры различных микроконтроллеров, ядра, памяти, питания, периферии.

    реферат [216,5 K], добавлен 24.12.2010

  • Понятие и виды микроконтроллеров. Особенности программирования микропроцессорных систем, построение систем управления химико-технологическим процессом. Изучение архитектуры микроконтроллера ATmega132 фирмы AVR и построение на его основе платформы Arduino.

    курсовая работа [1,9 M], добавлен 13.01.2011

  • Проектирование специализированных радиоэлектронных устройств с применением микропроцессорных комплектов и цифровых микросхем среднего и малого уровней интеграции. Архитектура микроконтроллеров семейства INTEL8051. Программа устройства на Ассемблере.

    курсовая работа [42,3 K], добавлен 29.07.2009

  • Общая характеристика операций, выполняемых по командам базовой системы. Описание и мнемокоды команд, используемых при разработке программы на языке AVR Ассемблера. Основные принципы работы команд с обращением по адресу SRAM и к регистрам ввода–вывода.

    реферат [148,4 K], добавлен 21.08.2010

  • Классификация, структура, архитектура и модульная организация микроконтроллеров. Средства разработки программного обеспечения AVR-контроллеров. Директивы транслятора ассемблера, рабочая частота и циклы. Исследование арифметических и логических команд.

    методичка [3,0 M], добавлен 19.09.2019

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.