- •Семейство микроконтроллеров mcs-51.
- •Отличительные особенности контроллеров семейства mcs-51.
- •Структурная организация микроконтроллеров семейства mcs-51.
- •Распределение памяти данных mcs-51.
- •Распределение памяти программ mcs-51.
- •Флаги mcs-51. Слово состояния процессора mcs-51.
- •Команды, модифицирующие флаги.
- •Арифметические команды:
- •Логические команды:
- •Сдвиговые команды:
- •Команды сравнения:
- •Система команд mcs-51. Типы команд.
- •Методы адресации mcs-51.
- •Команды пересылки обмена и загрузки mcs-51.
- •Арифметические команды mcs-51.
- •Команда сложения (add):
- •Команда вычитания (subb):
- •Логические команды mcs-51.
- •1. Команда логического и (anl):
- •2. Команда логического или (orl):
- •3. Команда логического исключающего или (xrl):
- •4. Команда логического не (cpl):
- •Команды, оперирующие с битами, в системе команд mcs-51.
- •Команды условных переходов mcs-51.
- •1. Команда перехода, если равно (jz, je):
- •2. Команда перехода, если не равно (jnz, jne):
- •3. Команда перехода, если больше (jnc, jnb, ja, jae):
- •4. Команда перехода, если меньше или равно (jb, jbc, jbe):
- •Команды безусловных переходов mcs-51.
- •Команды инкремента и декремента.
- •Таймеры/Счетчики mcs-51. Программирование таймеров/счетчиков.
- •Режимы работы 0 и 1 таймеров/счетчиков mcs-51.
- •1. Режим работы 0 (Mode 0):
- •2. Режим работы 1 (Mode 1):
- •Режимы работы 2 и 3 таймеров/счетчиков mcs-51.
- •1. Режим работы 2 (Mode 2):
- •2. Режим работы 3 (Mode 3):
- •Режимы прерываний mcs-51. Программирование режимов прерываний.
- •1. Прерывания по уровню (Level-Triggered Interrupts):
- •2. Прерывания по фронту (Edge-Triggered Interrupts):
- •3. Программные прерывания (Software Interrupts):
- •4. Внешние прерывания (External Interrupts):
- •Приоритеты прерываний mcs-51.
- •Последовательный Порт mcs-51. Программирование последовательного порта.
- •Режимы работы последовательного порта mcs-51.
- •1. Асинхронный режим (uart):
- •2. Синхронный режим:
- •3. Режим мастера spi:
- •Состав и назначение регистров специальных функций mcs-51.
- •Система команд mcs-51.
- •Универсальный асинхронный приемник-передатчик (уапп) и режимы его работы.
- •1. Асинхронный режим (uart):
- •2. Синхронный режим:
- •3. Многопроцессорный режим:
- •Таймер-счетчики mcs-51 и режимы их работы.
- •1. Режим 0 (13-битный таймер):
- •2. Режим 1 (16-битный таймер):
- •3. Режим 2 (8-битный таймер с автоперезагрузкой):
- •Организация прерываний в микроконтроллере mcs-51.
- •1. Источники прерываний:
- •Способы адресации mcs-51.
- •Система команд микроконтроллеров mcs-51.
- •Организация пошагового режима работы при отладке микроконтроллеров mcs-51.
- •6. Наблюдение за состоянием и переменными:
- •7. Анализ и исправление ошибок:
- •Таймер-счетчики микроконтроллеров mcs-51 и режимы их работы.
- •5. Другие режимы:
- •3. Обработка прерываний таймера 0 (опционально):
- •4. Главный цикл программы:
- •1. Настройка таймера 1 в режиме захвата/сравнения:
- •2. Включение прерываний для захвата значения:
- •3. Настройка обработчика прерывания:
- •4. Главный цикл программы:
- •Организация прерываний в микроконтроллере mcs-51.
- •1. Настройка регистров:
- •2. Написание обработчиков прерываний:
- •3. Настройка векторов прерываний:
- •4. Включение прерываний:
- •Режимы работы микроконтроллера mcs-51.
- •Обзор 8-разрядных микроконтроллеров mcs-51.
- •Структурная организация и назначение выводов микроконтроллера mcs-51.
- •Семейство микроконтроллеров msp430.
- •Мк msp430x1xx. Система тактирования.
- •Архитектура мк msp430. Адресное пространство.
- •Немаскируемые и маскированные прерывания мк msp430.
- •Обработка прерываний мк msp430. Векторы прерываний.
- •Регистры цп мк msp430.
- •Режимы адресации мк msp430.
- •Система команд мк msp430. Командные циклы и длина команд.
- •Принципы построения устройств с низким энергопотреблением. Подключение неиспользуемых выводов.
- •Цифровые входы / выходы мк msp430. Функционирование цифровых входов / выходов.
- •Прерывания портов р1 и р2 мк msp430. Регистры флагов прерывания р1ifg, р2ifg.
- •Функционирование сторожевого таймера мк msp430.
- •Сторожевой таймер мк msp430 в режиме интервального таймера.
- •Блоки захвата / сравнения Таймера а мк msp430.
- •Таймер в мк msp430. Отличия от таймера а. Работа таймера в.
- •Инициализация usart. Асинхронные коммуникационные форматы.
- •Задачи mcs-51 на языке Ассемблера
- •Вариант 4. Составить программу вычитания четырехбайтовых беззнаковых чисел. Первое число находится в рпд по адресу 30÷33h, второе – по адресу 38÷3Bh. Результат поместить на место первого операнда.
- •Вариант 8. В рпд, начиная с адреса 30h находится массив из 20 элементов. Подсчитать количество элементов массива, попавших в интервал от 50 до 100. Результат запомнить в регистре r5.
- •Вариант 9. В рпд, начиная с адреса 30н, находится массив из 16 чисел. Найти максимальный элемент массива и поместить в r2 его значение, а в r3 его адрес.
- •Вариант 10. В регистре r5 находится двоично-десятичный операнд. Перевести операнд в шестнадцатеричное значение и поместить в r5
- •Вариант 14. В рпд с адреса 20h находится массив из 16 чисел. Элементами массива являются числа 32, 64, 96 и 128. Подсчитать и сохранить в регистрах r4 ÷ r7 количество повторений каждого элемента.
- •Вариант 18. В впд, начиная с адреса 100h, находится массив из 10 элементов. Получить в регистре r3 число элементов, равных 55h. Счет прервать, если число элементов превысит 3.
- •Вариант 20. В впд с адреса 300h находится массив из 15 чисел. Элементами массива являются числа 10, 20, 30 и 180. Подсчитать и сохранить в регистрах r4 - r7 количество повторений каждого элемента.
- •Вариант 21. В порты микроконтроллера р0-р3 поступают двоично-десятичные данные. Перевести данные в шестнадцатеричный формат и разместить в рпд последовательно с адреса 30h.
- •Вариант 22. Выдать последовательно в порты р1 и р2 микроконтроллера содержимое младших байт счетчиков в двоично-десятичном формате (в р1 – сотни, в р2 – десятки и единицы).
- •Вариант 23. В порты р0÷р3 поступают шестнадцатеричные данные. Занести в рпд, начиная с адреса 40h количество единиц, поступивших в каждый порт.
- •Вариант 24. Для каждого из регистров r0, r3 и регистра-расширителя в последовательно выдать в порты информацию о содержимом регистров:
- •Вариант 25. В каждый из портов р0÷р2 поступают данные от двух четырехразрядных датчиков. Выдать в порт р3 сумму шести датчиков, подключенных к портам р0÷р2.
- •Вариант 26. Записать в регистры r3, r7 и регистр-расширитель в произведение их старшей и младшей тетрады соответственно.
- •Вариант 27. Выдать в порты р0÷р2 количество единиц, содержащихся в регистрах r0, r7 и регистре-расширителе в соответственно
Вариант 14. В рпд с адреса 20h находится массив из 16 чисел. Элементами массива являются числа 32, 64, 96 и 128. Подсчитать и сохранить в регистрах r4 ÷ r7 количество повторений каждого элемента.
ORG 0 ; Установка начального адреса
MOV R4, #0 ; Инициализация регистра R4 для хранения количества повторений числа 32
MOV R5, #0 ; Инициализация регистра R5 для хранения количества повторений числа 64
MOV R6, #0 ; Инициализация регистра R6 для хранения количества повторений числа 96
MOV R7, #0 ; Инициализация регистра R7 для хранения количества повторений числа 128
MOV R0, #20h ; Загрузка начального адреса массива в регистр R0
MOV R1, #16 ; Загрузка количества элементов массива в регистр R1
COUNT_LOOP:
MOV A, @R0 ; Загрузка текущего элемента массива в аккумулятор A
CJNE A, #32, CHECK_64 ; Проверка, является ли текущий элемент числом 32
INC R4 ; Увеличение количества повторений числа 32
SJMP NEXT_ELEMENT ; Переход к следующему элементу
CHECK_64:
CJNE A, #64, CHECK_96 ; Проверка, является ли текущий элемент числом 64
INC R5 ; Увеличение количества повторений числа 64
SJMP NEXT_ELEMENT ; Переход к следующему элементу
CHECK_96:
CJNE A, #96, CHECK_128 ; Проверка, является ли текущий элемент числом 96
INC R6 ; Увеличение количества повторений числа 96
SJMP NEXT_ELEMENT ; Переход к следующему элементу
CHECK_128:
CJNE A, #128, NEXT_ELEMENT ; Проверка, является ли текущий элемент числом 128
INC R7 ; Увеличение количества повторений числа 128
NEXT_ELEMENT:
INC R0 ; Увеличение указателя на следующий элемент массива
DJNZ R1, COUNT_LOOP ; Повторение цикла, пока не обработаны все элементы
EXIT:
SJMP EXIT ; Бесконечный цикл для завершения программы
END ; Конец программы
$MOD51 ORG 0
; Задаем начальные адреса для регистров
MOV DPTR, #20h ; Устанавливаем указатель данных на начало массива
MOV R0, #16 ; Устанавливаем счетчик количества элементов массива
; Обнуляем регистры, которые будут содержать количество каждого элемента
MOV R4, #0 ; Количество элементов 32
MOV R5, #0 ; Количество элементов 64
MOV R6, #0 ; Количество элементов 96
MOV R7, #0 ; Количество элементов 128
COUNT_LOOP: ; Начало цикла подсчета
MOVX A, @DPTR ; Перемещаем значение элемента массива в аккумулятор
INC DPTR ; Увеличиваем указатель данных для следующего элемента
CJNE A, #32, CHK64 ; Проверяем, равен ли элемент 32
INC R4 ; Увеличиваем счетчик для элемента 32
SJMP CONT_LOOP ; Продолжаем цикл
CHK64:
CJNE A, #64, CHK96 ; Проверяем, равен ли элемент 64
INC R5 ; Увеличиваем счетчик для элемента 64
SJMP CONT_LOOP ; Продолжаем цикл
CHK96:
CJNE A, #96, CHK128 ; Проверяем, равен ли элемент 96
INC R6 ; Увеличиваем счетчик для элемента 96
SJMP CONT_LOOP ; Продолжаем цикл
CHK128:
CJNE A, #128, UNKNOWN ; Проверяем, равен ли элемент 128
INC R7 ; Увеличиваем счетчик для элемента 128
SJMP CONT_LOOP ; Продолжаем цикл
UNKNOWN: ; Если элемент неизвестен, пропускаем его
CONT_LOOP:
DJNZ R0, COUNT_LOOP ; Уменьшаем счетчик и возвращаемся к началу цикла
; если все элементы не были проверены
END_LOOP:
SJMP END_LOOP ; Зацикливаемся для предотвращения выполнения
; других инструкций памяти программ
END
Вариант 15. В РПД по адресам 20h÷2Fh находится массив. С адреса 30h создать массив, в который входят адреса элементов первого массива, равных 128. В регистре R2 сохранить число элементов, равных 128. Прервать выполнение программы, если будет найдено 5 элементов со значением 128.
ORG 0 ; Установка начального адреса
MOV R2, #0 ; Инициализация регистра R2 для хранения количества элементов, равных 128
MOV R0, #20h ; Загрузка начального адреса первого массива в регистр R0
MOV R1, #16 ; Загрузка количества элементов первого массива в регистр R1
MOV R3, #30h ; Загрузка адреса начала второго массива в регистр R3
SEARCH_LOOP:
MOV A, @R0 ; Загрузка текущего элемента первого массива в аккумулятор A
CJNE A, #128, NEXT_ELEMENT ; Проверка, равен ли текущий элемент числу 128
INC R2 ; Увеличение количества элементов, равных 128
MOV A, R0 ; Сохранение адреса текущего элемента первого массива во второй массив
MOV R3, A
INC R3 ; Увеличение указателя на следующую ячейку второго массива
INC R2 ; Увеличение количества элементов, равных 128
CJNE R2, #5, NEXT_ELEMENT ; Проверка, достигнуто ли количество 5 элементов со значением 128
SJMP EXIT ; Прерывание программы, если найдено 5 элементов со значением 128
NEXT_ELEMENT:
INC R0 ; Увеличение указателя на следующий элемент первого массива
DJNZ R1, SEARCH_LOOP ; Повторение цикла, пока не обработаны все элементы первого массива
EXIT:
SJMP EXIT ; Бесконечный цикл для завершения программы
END ; Конец программы
$MOD51 ORG 0
; Инициализация регистров
MOV R0, #20h ; Начальный адрес первого массива
MOV R1, #30h ; Начальный адрес второго массива для хранения адресов
MOV R2, #0 ; Счетчик элементов, равных 128
FIND_LOOP:
MOV A, @R0 ; Загружаем значение текущего элемента первого массива
INC R0 ; Переходим к следующему адресу в первом массиве
CJNE A, #128, CHECK ; Проверяем, равно ли значение элемента 128
; Если значение равно 128, сохраняем его адрес
MOV @R1, R0 ; Сохраняем адрес предыдущего элемента во второй массив
INC R1 ; Переходим к следующему адресу во втором массиве
INC R2 ; Увеличиваем счетчик найденных элементов, равных 128
; Проверка на достижение пяти найденных элементов
CJNE R2, #05, CONTINUE
SJMP END_PROGRAM ; Прерывание выполнения программы
CHECK:
; Проверка на окончание первого массива
CJNE R0, #2Fh, FIND_LOOP
CONTINUE:
; Еще не достигнут конец массива и не найдено 5 элементов
CJNE R0, #2Fh, FIND_LOOP
; Если достигнут конец массива, завершаем программу
SJMP END_PROGRAM
END_PROGRAM:
; Инструкция зацикливания для завершения программы
SJMP END_PROGRAM
END
Вариант 16. В РПД с адресов 20h и 30h находятся 2 массива, состоящие из 16 элементов каждый. Подсчитать количество элементов первого массива, которые имеют равные значения во 2 массиве. Результат занести в регистр R2.
ORG 0 ; Установка начального адреса
MOV R2, #0 ; Инициализация регистра R2 для хранения количества совпадающих элементов
MOV R0, #20h ; Загрузка начального адреса первого массива в регистр R0
MOV R1, #30h ; Загрузка начального адреса второго массива в регистр R1
MOV R3, #16 ; Загрузка количества элементов массивов в регистр R3
COUNT_LOOP:
MOV A, @R0 ; Загрузка текущего элемента первого массива в аккумулятор A
MOV B, @R1 ; Загрузка текущего элемента второго массива в регистр B
CJNE A, B, NEXT_ELEMENT ; Проверка, равны ли текущие элементы двух массивов
INC R2 ; Увеличение количества совпадающих элементов
NEXT_ELEMENT:
INC R0 ; Увеличение указателя на следующий элемент первого массива
INC R1 ; Увеличение указателя на следующий элемент второго массива
DJNZ R3, COUNT_LOOP ; Повторение цикла, пока не обработаны все элементы массивов
EXIT:
SJMP EXIT ; Бесконечный цикл для завершения программы
END ; Конец программы
Вариант 17. Для функции Y=40Х+10 получить первое значение, превышающее 512, начиная с Х=1. Значение аргумента записать в R4, функции - в R5, R6.
ORG 0 ; Установка начального адреса
MOV R4, #1 ; Инициализация регистра R4 с начальным значением аргумента
MOV R5, #0 ; Инициализация регистра R5 для хранения значения функции
MOV R6, #0 ; Инициализация регистра R6 для флага достижения значения 512
CALC_LOOP:
MOV A, R4 ; Загрузка текущего значения аргумента в аккумулятор A
MOV B, A ; Сохранение значения аргумента в регистр B для расчета значения функции
; Расчет значения функции Y=40X+10
MOV B, #40
MUL AB ; Результат будет храниться в регистрах B (старший байт) и A (младший байт)
ADD A, #10 ; Добавление константы 10 к результату
; Проверка, превышает ли значение функции 512
MOV R7, #0
SUBB A, R7 ; Сравнение с нулем
JC VALUE_EXCEEDS_512 ; Переход, если значение функции превышает 512
INC R4 ; Увеличение значения аргумента
SJMP CALC_LOOP ; Повторение цикла для следующего значения аргумента
VALUE_EXCEEDS_512:
MOV R5, A ; Сохранение значения функции в регистре R5
MOV R6, #1 ; Установка флага достижения значения 512 в регистре R6
EXIT:
SJMP EXIT ; Бесконечный цикл для завершения программы
END ; Конец программы
