- •Вычислительные машины, системы и сети. Микроконтроллеры и микропроцессоры в системах управления
- •Содержание
- •Глава 1. Архитектура семейства mcs51 14
- •Глава 2. Особенности микроконтроллера 80c51gb 46
- •Глава 3. Программирование mk 8051gb 94
- •Глава 4. Язык программирования asm-51 117
- •Глава 5. Язык программирования с-51 139
- •Глава 6. Подготовка программ в интегрированной среде разработки Keil μVision2 187
- •Глава 7. Описание учебного контроллера 204
- •Введение
- •Глава 1. Архитектура семейства mcs51
- •1.1 Общие характеристики
- •1.2 Структурная схема
- •1.4 Организация памяти
- •1.4.1 Память программ (пзу)
- •1.4.2 Память данных (озу)
- •1.4.3 Регистры специальных функций
- •1.4.4 Регистр флагов (psw)
- •1.5 Устройство управления и синхронизации
- •1.6 Организация портов ввода-вывода
- •1.6.1 Общие сведения
- •1.6.2 Альтернативные функции
- •1.7. Таймеры / счетчики микроконтроллеров семейства 8051
- •1.7.1. Структура таймеров-счетчиков
- •1.7.2 Режимы работы таймеров-счетчиков
- •1.8. Последовательный порт
- •1.8.1. Структура последовательного порта
- •1.8.2. Регистр управления/статуса приемопередатчика scon
- •1.8.3. Регистр управления мощностью pcon
- •1.9. Система прерываний
- •1.9.1. Структура системы прерываний
- •1.9.2 Выполнение подпрограммы прерывания
- •Глава 2. Особенности микроконтроллера 80c51gb
- •2.1 Функциональные особенности
- •2.2 Порты I/o p0-p5
- •2.2.1 Функционирование портов ввода-вывода
- •2.2.2 Запись в порт
- •2.3 Особенности системы прерываний 8xc51gb
- •Разрешение/запрещение прерываний
- •Регистр iе
- •Регистр iеа
- •Управление приоритетами прерываний
- •Регистр ip
- •Регистр iрн кристаллов 8xc51gb
- •Регистр ipа кристалла 8xc51gb
- •Регистр iрна кристаллов 8xc51gb
- •Внешние прерывания
- •Регистр exicon
- •2.3. Узел ацп
- •Регистры результатов преобразований ацп
- •Регистр результатов сравнения ацп - асмр
- •Регистр результата сравнения асмр
- •Режим сравнения ацп
- •Режим запуска ацп
- •Режимы входа ацп
- •Использование ацп для меньшего количества каналов
- •Ацп в режиме микропотребления.
- •2.4. Аппаратный сторожевой таймер
- •2.5. Обнаружение сбоя тактового генератора
- •2.6. Матрица программируемых счётчиков рса
- •2.6.1. Структура pca
- •2.6.2. Регистр режима счётчика рса (cmod)
- •2.6.3. Регистр управления счётчика рса (con)
- •Регистр управления рса - ccon
- •Режим 16-битного программного таймера
- •Высокоскоростной выход - hso
- •Режим сторожевого таймера (рис. 2.22)
- •Широтно-импульсный модулятор — pwm (рис.2.23, рис.2.24)
- •2.7. Расширенный последовательный порт
- •2.8. Таймеры/счетчики
- •Таймер 0 и Таймер 1
- •Таймер 2
- •Режимы работы таймера 2
- •Режим захвата
- •Генерирование импульсов
- •Глава 3. Программирование mk 8051gb
- •3.1. Программная модель (рис. 3.1, рис. 3.2)
- •3.2 Типы данных
- •3.3 Способы адресации данных
- •3.4 Система команд
- •3.4.1 Общая характеристика
- •3.4.2 Типы команд
- •3.4.3 Типы операндов
- •3.4.4 Команды пересылки данных микроконтроллера
- •3.4.5 Команды арифметических операций 8051
- •3.4.6 Команды логических операций микроконтроллера 8051
- •3.4.7 Команды операций над битами микроконтроллера 8051
- •3.4.8. Команды передачи управления микроконтроллера 8051
- •3.5 Отладка программ
- •Глава 4. Язык программирования asm-51
- •4.2 Запись текста программы
- •4.3 Алфавит языка.
- •4.4 Идентификаторы.
- •4.5 Числа
- •4.6 Директивы
- •4.7 Реализация подпрограмм на языке asm51
- •4.7.1 Структура подпрограммы-процедуры на языке asm51
- •4.7.2 Передача переменных-параметров в подпрограмму
- •4.7.3 Реализация подпрограмм-функций на языке asm51
- •4.7.4. Реализация подпрограмм обработки прерываний на языке asm51
- •4.8 Структурное программирование на языке ассемблера
- •4.9 Особенности трансляции многомодульных программ
- •4.10 Использование сегментов
- •4.10.1 Разбиение памяти мк на сегменты (рис. 4.9)
- •4.10.2 Абсолютные сегменты памяти
- •4.10.2 Перемещаемые сегменты памяти.
- •Глава 5. Язык программирования с-51
- •5.1 Общая характеристика языка
- •5.3 Структура программ с-51
- •5.3. Элементы языка программирования с-51
- •5.3.1. Символы
- •5.3.2. Лексические единицы, разделители и использование пробелов
- •5.3.3 Идентификаторы
- •5.3.4 Ключевые слова
- •5.3.5 Константы
- •5.4. Выражения в операторах языка программирования
- •5.5. Приоритеты выполнения операций
- •5.6. Операторы языка программирования c-51
- •5.6.1. Операторы объявления
- •5.6.2 Исполняемые операторы
- •5.6.3 Оператор присваивания
- •5.6.4 Условный оператор
- •5.6.5 Структурный оператор {}
- •5.6.6 Оператор цикла for
- •5.6.7 Оператор цикла с проверкой условия до тела цикла while
- •5.6.8 Оператор цикла с проверкой условия после тела цикла do while
- •5.6.9 Оператор break
- •5.6.10 Оператор continue
- •5.6.11 Оператор выбора switch
- •5.6.12 Оператор безусловного перехода goto
- •5.6.13 Оператор выражение
- •5.6.14 Оператор возврата из подпрограммы return
- •5.6.15 Пустой оператор
- •5.7. Объявление переменных в языке программирования
- •5.7.1. Объявление переменной
- •5.7.2 Категории типов данных
- •5.7.3 Целые типы данных
- •5.7.4 Числа с плавающей запятой
- •5.7.5 Переменные перечислимого типа
- •5.7.6. Объявление массивов в языке программирования c-51
- •5.7.7. Структуры
- •5.7.8. Объединения (смеси)
- •5.8. Использование указателей в языке c-51
- •5.8.1. Объявление указателей
- •5.8.2. Нетипизированные указатели
- •5.8.3. Память зависимые указатели
- •5.9. Объявление новых типов переменных
- •5.10. Инициализация данных
- •5.11. Использование подпрограмм в языке программирования с-51
- •5.11.1. Определение подпрограмм
- •5.11.2. Параметры подпрограмм
- •5.11.3. Предварительное объявление подпрограмм
- •5.11.4 Вызов подпрограмм
- •5.11.5 Рекурсивный вызов подпрограмм
- •5.11.6 Подпрограммы обработки прерываний
- •5.11.7 Области действия переменных и подпрограмм
- •5.12. Многомодульные программы
- •Глава 6. Подготовка программ в интегрированной среде разработки Keil μVision2
- •6.1 Создание проекта на языке asm-51
- •6.2 Пример создания проекта на языке c для учебного контроллера в интегрированной среде разработки Keil μVision2
- •Глава 7. Описание учебного контроллера
- •7.1. Структура контроллера (рис. 7.1)
- •7.2. Адресное пространство
- •7.2.1. Распределение памяти (рис. 7.2)
- •7.2.2 Внешняя память
- •7.2.3. Внутренняя память данных
- •7.3. Распределение портов ввода-вывода
- •7.4. Последовательный порт
- •7.5. Работа с жки
- •Приложение п1. Список рекомендуемых лабораторных работ
- •Конкретные задания для обучаемых составляет преподаватель. Для отладки каждой из программ необходимо:
- •7. Текст программы.
- •8. Перечень выявленных в примерах ошибок
- •9. Выводы.
- •Список литературы
- •195251, Санкт-Петербург, Политехническая ул., 29.
- •194021, Санкт-Петербург, Политехническая ул., 21
4.10 Использование сегментов
4.10.1 Разбиение памяти мк на сегменты (рис. 4.9)
В программе присутствует два сегмента: сегмент кода программы и сегмент данных. Кроме кодов команд в памяти программ хранятся константы, то есть в памяти программ микроконтроллера располагаются, по крайней мере, два сегмента: программа и данные. Чередование программы и констант может привести к нежелательным последствиям. Вследствие каких-либо причин данные могут быть случайно выполнены в качестве программы или наоборот программа может быть воспринята и обработана как данные.
Рис. 4.9. Пример разбиения памяти программ и памяти данных на сегменты
На примере размещения сегментов в адресном пространстве памяти программ и внутренней памяти данных видно, что при использовании нескольких сегментов переменных во внутренней памяти данных редактор связей может разместить меньший из них на месте неиспользованных банков регистров. Под сегмент стека обычно отводится вся область внутренней памяти, не занятая переменными. Это позволяет создавать программы с максимальным уровнем вложенности подпрограмм. Сегмент переменных, расположенный во внешней памяти данных, при использовании современных микросхем, таких как AduC842, может находиться в ОЗУ, расположенном на кристалле микроконтроллера.
4.10.2 Абсолютные сегменты памяти
Наиболее простой способ определения сегментов это использование абсолютных сегментов памяти. При этом способе распределение памяти ведётся вручную точно так же, как это делалось при использовании директивы EQU. В этом случае начальный адрес сегмента жёстко задаётся программистом и он же следит за тем, чтобы сегменты не перекрывались друг с другом в памяти микроконтроллера. Использование абсолютных сегментов позволяет более гибко работать с памятью данных, так как теперь байтовые переменные в памяти данных могут быть назначены при помощи директивы резервирования памяти DS, а битовые переменные при помощи директивы резервирования битов DBIT.
Для определения абсолютных сегментов памяти используются директивы:
BSEG - абсолютный сегмент в области битовой адресации;
CSEG - абсолютный сегмент в области памяти программ;
DSEG - абсолютный сегмент в области внутренней памяти данных;
ISEG - абсолютный сегмент в области внутренней памяти данных с косвенной адресацией;
XSEG - абсолютный сегмент в области внешней памяти данных.
Эти директивы не назначают имени сегменту, то есть объединение сегментов из различных программных модулей невозможно. Для определения конкретного начального адреса сегмента применяется атрибут AT. Если атрибут AT не используется, то начальный адрес сегмента предполагается равным нулю.
Директива BSEG позволяет определить абсолютный сегмент во внутренней памяти данных с битовой адресацией по определённому адресу. Использование битовых переменных позволяет значительно экономить внутреннюю память программ микроконтроллера.
Пример использования директивы BSEG для объявления битовых переменных:
BSEG AT 8 ;Сегмент начинается с восьмого бита
RejInd DBIT 1 ;Флаг режима индикации
RejPriem DBIT 1 ;Флаг режима приема
Flag DBIT 1 ;Флаг общего назначения
Директива CSEG позволяет определить абсолютный сегмент в памяти программ по определённому адресу.
Директива DSEG позволяет определить абсолютный сегмент во внутренней памяти данных по определённому адресу. Предполагается, что к этому сегменту будут обращаться команды с прямой адресацией.
Директива ISEG позволяет определить абсолютный сегмент во внутренней памяти данных по определённому адресу. Напомню, что внутренняя память с косвенной адресацией в два раза больше памяти с прямой адресацией.
Пример использования директивы ISEG для объявления байтовых переменных:
ISEG AT 80 ;Разместить сегмент в диапазоне адресов, совмещенных с SFR
Bufer DS 10 ;Десятибайтовый массив
Stack DS 245 ;Стек
Директива XSEG позволяет определить абсолютный сегмент во внешней памяти данных по определённому адресу. До недавнего времени использование внешней памяти не имело смысла, так как это значительно увеличивало габариты и цену устройства. Однако в последнее время ряд фирм стал размещать на кристалле значительные объёмы ОЗУ, доступ к которому осуществляется как к внешней памяти.
Использование абсолютных сегментов позволяет облегчить работу программиста по распределению памяти микроконтроллера для различных переменных. Однако в большинстве случаев абсолютный адрес переменной нас совершенно не интересует. Исключение составляют только регистры специальных функций. Так зачем же вручную задавать начальный адрес сегментов?
