- •Вычислительные машины, системы и сети. Микроконтроллеры и микропроцессоры в системах управления
- •Содержание
- •Глава 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.4. Реализация подпрограмм обработки прерываний на языке asm51
- •4.7 Реализация подпрограмм на языке asm51
- •4.7.1 Структура подпрограммы-процедуры на языке asm51
- •4.7.2 Передача переменных-параметров в подпрограмму
- •4.7.3 Реализация подпрограмм-функций на языке 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
5.11.7 Области действия переменных и подпрограмм
Любой объект, который объявляется в программе, написанной на языке программирования C-51, имеет область действия. В языке программирования С область действия объекта распространяется на всю программу, то есть любой объект является глобальным.
К объектам запрещено обращение до того, как они будут объявлены, поэтому при обращении к объекту, объявленному в другом программном модуле этот объект должен быть объявлен в данном программном модуле как external. Например:
extern char code ERROR []; /*Строка сообщения об ошибке */
extern struct mrec current; /* Текущее измерение */
extern struct interval setinterval;/* Значения установленных интервалов */
extern struct interval counter ; /* Счетчик интервалов */
При использовании внутри модуля переменной, уже объявленной в другом модуле, могут возникнуть проблемы при связывании программы. Если использование переменной с тем же именем, что и в другом модуле делает программу более наглядной, то можно в одном из модулей (или во всех сразу) использовать переменные с атрибутом static.
Некоторые блоки могут содержать структурные операторы. Использование внутренних блоков позволяет объявлять локальные переменные. Использование локальных переменных позволяет использовать одни и те же ячейки памяти для различных переменных и тем самым экономить ресурсы памяти данных.
Локальные переменные существуют только в пределах структурного оператора. Если внутри структурного оператора были присвоены локальным переменным какие-то значения, то не следует ожидать, что вернувшись снова в этот оператор, переменные сохранят присвоенные ранее или вычисленные значения.
В случае, если требуется сохранить значение переменных и при повторном вхождении в подпрограмму или структурный оператор, эту переменную необходимо объявить с атрибутом static.
То же самое относится и к подпрограммам. Если требуется объявить подпрограмму, которая не должна быть видна из других модулей, то ее необходимо объявить с атрибутом static. Это кроме прочего приведет к тому, что если эта подпрограмма не используется и в данном модуле, то она просто не будет транслироваться и занимать место в памяти программ. Пример объявления подпрограммы с атрибутом static:
static void tmp(void)
{
i=5;
}
Иногда требуется локальные переменные хранить не в одних и тех же ячейках памяти, а в стеке. Это требуется, например, при вызове подпрограммы самой из себя. В таком случае подпрограмма должна быть объявлена как reentrant.
5.12. Многомодульные программы
Язык программирования C-51 позволяет писать многомодульные программы.
Оттранслированный программный модуль сохраняется в виде отдельного файла в объектном формате, где кроме машинных команд сохраняется информация о именах переменных, адресах команд, требующих модификации при объединении модулей в единую программу, и отладочная информация.
Раздельная трансляция программы возможна при использовании двух программ: транслятора исходного текста программы c-51 и редактора связей bl-51.
При программировании на языке С раздельная трансляция не вызывает каких либо проблем. Однако если при компиляции исходного текста программы транслятор обнаружит переменную, которая не была заранее объявлена, то будет сформировано сообщение об ошибке и объектный модуль будет стёрт с диска компьютера.
Для того, чтобы транслятор вместо формирования сообщения об ошибке записал в объектный модуль информацию, необходимую для редактора связей, нужно осуществить объявление внешних переменных подпрограмм и меток. Для объявления внешних переменных после обычного объявления добавляется слово extern. При таком объявлении при трансляции исходного текста программы для переменной память данных для переменных не распределяется, а создаются соответствующие записи для редактора связей, позволяющие осуществить соответствующие вызовы подпрограмм и переходы между модулями, а также обращение к переменным другого модуля.
Все используемые в модуле подпрограммы должны быть предварительно объявлены или определены. Это же относится и к подпрограммам из других модулей. При объявлении подпрограммы должны быть полностью объявлены все ее параметры.
Пример объявления внешних подпрограмм на языке С-51:
char TestOZU(void);
char Rd558(char AdrRAM,char NachAdr,char Nbyte);
char Wr558(char AdrRAM,char NachAdr,char Nbyte);
В языке программирования С все подпрограммы и глобальные переменные доступны из любого модуля по умолчанию, поэтому никаких особых действий при написании подпрограммы, используемой в других модулях, не требуется.
Программа bl-51 объединяет несколько объектных файлов (модулей) в один. Для объединения нескольких модулей в исполняемую программу имена всех модулей передаются в редактор связей в качестве параметров при запуске этой программы. Пример вызова редактора связей из командной строки DOS для объединения трёх модулей:
bl51.exe progr.obj, modul1.obj, modul2.obj
В результате работы редактора связей в этом примере будет создан исполняемый модуль с именем progr. Как уже указывалось ранее намного удобнее пользоваться готовой средой программирования, где для объединения модулей в единую программу достаточно просто включить все необходимые модули в программный проект, пользуясь окном менеджера проекта.
Необходимость предварительного объявления внешних переменных и подпрограмм приводит к тому, что исходный текст программы загромождается этими объявлениями и найти собственно программу становится сложно. Кроме того при таких объявлениях возможно возникновение ошибок. Поэтому лучше вынести объявления подпрограмм и переменных в отдельные файлы, которые затем могут быть подключены в исходный текст программы директивой #include.
