- •Семейство микроконтроллеров 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 и регистре-расширителе в соответственно
Вариант 8. В рпд, начиная с адреса 30h находится массив из 20 элементов. Подсчитать количество элементов массива, попавших в интервал от 50 до 100. Результат запомнить в регистре r5.
ORG 0 ; Установка начального адреса
MOV R5, #0 ; Инициализация счетчика в регистре R5
MOV R0, #30h ; Загрузка начального адреса массива в регистр R0
MOV R1, #20 ; Загрузка количества элементов массива в регистр R1
MOV R2, #50 ; Загрузка нижней границы интервала в аккумулятор A
LOOP:
MOV B, R2 ; Загрузка текущего элемента массива в регистр B
CJNE A, B, NOT_FOUND ; Сравнение элемента с нижней границей интервала
INC R5 ; Увеличение счетчика, если элемент попадает в интервал
NOT_FOUND:
INC R0 ; Увеличение указателя на следующий элемент массива
DJNZ R1, LOOP ; Повторение цикла, пока не обработаны все элементы
EXIT:
SJMP EXIT ; Бесконечный цикл для завершения программы
END ; Конец программы
Вариант 9. В рпд, начиная с адреса 30н, находится массив из 16 чисел. Найти максимальный элемент массива и поместить в r2 его значение, а в r3 его адрес.
ORG 0 ; Установка начального адреса
MOV R2, #0 ; Инициализация регистра R2 для хранения максимального элемента
MOV R0, #30h ; Загрузка начального адреса массива в регистр R0
MOV R1, #16 ; Загрузка количества элементов массива в регистр R1
LOOP:
MOV A, @R0 ; Загрузка текущего элемента массива в аккумулятор A
SUBB A, R2 ; Сравнение текущего элемента с максимальным элементом
JC NEXT ; Переход к следующему элементу, если текущий элемент меньше R2
MOV R2, A ; Загрузка нового максимального элемента в R2
NEXT:
INC R0 ; Увеличение указателя на следующий элемент массива
DJNZ R1, LOOP ; Повторение цикла, пока не обработаны все элементы
EXIT:
SJMP EXIT ; Бесконечный цикл для завершения программы
END ; Конец программы
Вариант 10. В регистре r5 находится двоично-десятичный операнд. Перевести операнд в шестнадцатеричное значение и поместить в r5
ORG 0 ; Установка начального адреса
MOV A, R5 ; Загрузка двоично-десятичного операнда в аккумулятор A
MOV R4, A ; Сохранение значения операнда в регистре R4
MOV A, #0Ah ; Загрузка числа 10 в аккумулятор A
DIV AB ; Деление значения в A на значение в B
MOV R5, A ; Сохранение частного (шестнадцатеричной цифры) в регистре R5
MOV A, B ; Загрузка остатка от деления в аккумулятор A
SWAP A ; Перестановка полубайтов аккумулятора A
MOV R6, A ; Сохранение старшего полубайта в регистре R6
MOV A, R4 ; Восстановление значения операнда в аккумулятор A
ANL A, #0Fh ; Маскирование старшего полубайта операнда
MOV R5, A ; Сохранение младшего полубайта (первой шестнадцатеричной цифры) в регистре R5
ANL A, #0Fh ; Очистка старшего полубайта операнда
ORL A, R6 ; Склеивание старшего полубайта операнда с аккумулятором A
MOV R4, A ; Сохранение результата в регистре R4 (шестнадцатеричное значение)
EXIT:
SJMP EXIT ; Бесконечный цикл для завершения программы
END ; Конец программы
$MOD51
ORG 0H ; начальный адрес программы
MOV R5, #25H ; пример BCD числа (для ввода своего числа замените 25H на нужное BCD значение)
MOV A, R5 ; скопируем значение из R5 в аккумулятор для удобства работы
ANL A, #0F0H ; маскируем младшие биты чтобы получить старшие BCD цифры
SWAP A ; меняем местами старшие и младшие 4 бита
MOV B, A ; сохраняем старшую BCD цифру в регистр B
MOV A, R5 ; снова помещаем значение R5 в аккумулятор
ANL A, #00FH ; маскируем старшие биты, чтобы получить младшие BCD цифры
ADD A, B ; складываем старшую и младшую BCD цифры - получаем шестнадцатеричное значение
MOV R5, A ; сохраняем результат обратно в R5
SJMP $ ; бесконечный цикл
END ; конец программы
Вариант 11. В РПД, начиная с адреса 20h, находится массив из 16 элементов. Подсчитать и сохранить в регистрах: R2 – количество элементов массива, меньших значения 128; R3 – количество элементов массива, равных 128; R4 – количество элементов массива, больших 128.
ORG 0 ; Установка начального адреса
MOV R2, #0 ; Инициализация регистра R2 для хранения количества элементов меньше 128
MOV R3, #0 ; Инициализация регистра R3 для хранения количества элементов равных 128
MOV R4, #0 ; Инициализация регистра R4 для хранения количества элементов больше 128
MOV R0, #20h ; Загрузка начального адреса массива в регистр R0
MOV R1, #16 ; Загрузка количества элементов массива в регистр R1
LOOP:
MOV A, @R0 ; Загрузка текущего элемента массива в аккумулятор A
CJNE A, #128, CHECK_LESS ; Сравнение текущего элемента с 128
INC R3 ; Увеличение счетчика элементов равных 128
SJMP NEXT ; Переход к следующему элементу
CHECK_LESS:
JB ACC.7, INCREMENT_R4 ; Проверка старшего бита текущего элемента
INC R2 ; Увеличение счетчика элементов меньше 128
SJMP NEXT ; Переход к следующему элементу
INCREMENT_R4:
INC R4 ; Увеличение счетчика элементов больше 128
NEXT:
INC R0 ; Увеличение указателя на следующий элемент массива
DJNZ R1, LOOP ; Повторение цикла, пока не обработаны все элементы
EXIT:
SJMP EXIT ; Бесконечный цикл для завершения программы
END ; Конец программы
$MOD51
ORG 0H ; начальный адрес программы
; Инициализация регистров
MOV R0, #20H ; адрес начала массива во внутреннем ОЗУ
MOV R2, #0 ; счётчик элементов меньше 128
MOV R3, #0 ; счётчик элементов равных 128
MOV R4, #0 ; счётчик элементов больше 128
MOV R7, #0 ; индекс текущего элемента массива
; Цикл перебора массива
LOOP:
MOV A, @R0 ; перемещаем текущий элемент массива в аккумулятор
INC R0 ; переходим к следующему адресу
CJNE A, #128, NOT_EQUAL ; сравниваем элемент с 128
INC R3 ; инкремент, если элемент равен 128
SJMP CONTINUE_LOOP
NOT_EQUAL:
JB ACC.7, ABOVE_128 ; проверяем, больше ли элемент 128
INC R2 ; инкремент, если элемент меньше 128
SJMP CONTINUE_LOOP
ABOVE_128:
INC R4 ; инкремент, если элемент больше 128
CONTINUE_LOOP:
INC R7 ; увеличиваем индекс
CJNE R7, #10H, LOOP ; проверяем, не дошли ли до конца массива 10h = 16
; Завершение программы
SJMP $ ; бесконечный цикл, чтобы программа не выполняла неопределённый код
END ; конец программы
Вариант 12. В РПД с адреса 20h находится массив, состоящий из 16 элементов. Суммировать элементы массива до тех пор, пока значение суммы не превысит 512. Выдать в R3 номер элемента, на котором произошло переполнение. Если сумма элементов не достигла значения 512, то выдать в регистре R3 значение 0.
ORG 0 ; Установка начального адреса
MOV R3, #0 ; Инициализация регистра R3 для хранения номера элемента
MOV A, #0 ; Инициализация аккумулятора A для хранения суммы
MOV R0, #20h ; Загрузка начального адреса массива в регистр R0
MOV R1, #16 ; Загрузка количества элементов массива в регистр R1
SUM_LOOP:
ADD A, @R0 ; Сложение текущего элемента массива с аккумулятором A
JC OVERFLOW ; Проверка флага переноса (если сумма превысила 255)
INC R0 ; Увеличение указателя на следующий элемент массива
DJNZ R1, SUM_LOOP ; Повторение цикла, пока не обработаны все элементы
EXIT:
MOV R3, #0 ; Установка значения 0 в регистр R3
SJMP END ; Переход к концу программы
OVERFLOW:
MOV A, R1 ; Сохранение значения R1 (номер элемента)
INC A ; Увеличение значения R3 на 1 (так как R1 начинается с 0)
MOV R3, A
SJMP END ; Переход к концу программы
END:
SJMP END ; Бесконечный цикл для завершения программы
END ; Конец программы
$MOD51 ORG 0
; Инициализируем регистры
MOV R0, #20h ; Устанавливаем адрес начала массива в РПД
MOV R1, #0 ; Счетчик элементов массива
MOV R2, #0 ; Нижний байт суммы
MOV R3, #0 ; Регистр R3 и будет хранить результат
MOV R4, #0 ; Верхний байт суммы, используется для проверки переполнения
SUM_LOOP: MOV A, @R0 ; Загружаем элемент массива в аккумулятор
ADD A, R2 ; Добавляем элемент к нижнему байту суммы
MOV R2, A ; Обновляем нижний байт суммы, A переполнен если было сложение с переносом
JC UPDATE_HIGH ; Если перенос, обновляем верхний байт суммы
INC R0 ; Переходим к следующему адресу элемента массива
INC R1 ; Инкрементируем счетчик элементов
CJNE R1, #10h, CHECK_SUM ; Проверяем, обработали ли мы все 16 элементов
SJMP END_SUM ; Если да, выходим из цикла
UPDATE_HIGH: INC R4 ; Инкрементируем верхний байт суммы
CHECK_SUM: JNB ACC.7, NO_OVERFLOW ; Проверяем, не произошло ли переполнение нижнего байта
MOV A, R4
SUBB A, #02h ; Вычитаем из верхнего байта значение 2 (512 в байтах)
JC SUM_OVERFLOW ; Если после вычитания произошел перенос, достигнуто условие
NO_OVERFLOW: SJMP SUM_LOOP
SUM_OVERFLOW: MOV R3, R1 ; Записываем в R3 номер элемента, на котором произошло переполнение
SJMP FINAL
END_SUM: MOV R3, #0 ; Устанавливаем значение 0 в R3, так как сумма не превысила 512 после цикла
FINAL:
END
Вариант 13. Для функции Y=20Х+45 выдать в R2 первое значение аргумента, при котором значение функции превысит 1024. Начальное значение аргумента Х=10.
ORG 0 ; Установка начального адреса
MOV R2, #10 ; Инициализация регистра R2 значением 10 (начальное значение аргумента X)
MOV A, R2 ; Загрузка значения аргумента X в аккумулятор A
MOV B, #20
MUL AB ; Умножение значения аргумента X на 20
ADD A, #45 ; Сложение 45 к результату умножения
CJNE A, #1024, NEXT_VALUE ; Проверка, превышает ли значение функции 1024
SJMP EXIT ; Если значение функции не превысило 1024, завершение программы
NEXT_VALUE:
MOV A, R2
INC A ; Увеличение значения аргумента X на 1
CJNE A, #256, LOOP ; Проверка, достигнуто ли максимальное значение аргумента (255)
SJMP EXIT ; Если достигнуто максимальное значение аргумента, завершение программы
LOOP:
MOV A, R2 ; Загрузка значения аргумента X в аккумулятор A
MOV B, #20
MUL AB ; Умножение значения аргумента X на 20
ADD A, #45 ; Сложение 45 к результату умножения
CJNE A, #1024, NEXT_VALUE ; Проверка, превышает ли значение функции 1024
SJMP EXIT ; Если значение функции превысило 1024, завершение программы
EXIT:
SJMP EXIT ; Бесконечный цикл для завершения программы
END ; Конец программы
$MOD51 ORG 0
; Инициализация начальных значений
MOV R1, #10 ; Начальное значение X
MOV R0, #0 ; Старший байт Y
MOV R2, #45 ; Младший байт Y с суммой начального значения 45
NEXT_VAL: ; Метка цикла для следующего значения X
CLR C ; Очищаем бит переноса, чтобы избежать ошибок при сложении
MOV A, R1
ADD A, #0 ; Проверяем перенос для увеличения старшего байта Y
JNC NO_CARRY ; Если не произошло переноса, пропускаем увеличение
INC R0 ; Увеличиваем старший байт Y
NO_CARRY:
MOV A, R2
ADD A, #20 ; Добавляем 20 к младшему байту Y
MOV R2, A ; Сохраняем новое значение Y
; Проверяем старший байт Y на переполнение
; (т.е., верхняя граница для проверки значения, превышающего 1024)
JNB ACC.7, CHECK_LOWER
OVERLIMIT: ; Условие превышения 1024 выполнено
SJMP RESULT ; Переход к выводу результата
CHECK_LOWER: ; Проверяем нижний байт Y (если старший байт Y == 4, нужно убедиться, что младший байт >0 для превышения 1024)
MOV A, R0
CJNE A, #4, LOOP ; Если R0 не равен 4, значит Y < 1024, продолжаем цикл
MOV A, R2
JZ LOOP ; Если R2 равен 0, значит Y точно не больше 1024, продолжаем цикл
RESULT: ; Место для вывода результата
MOV R2, R1 ; Перемещаем значение X, при котором Y превысила 1024 в R2
END_LOOP: ; Конец программы
SJMP END_LOOP
LOOP: ; Цикл, где X увеличивается на 1 и проверяется новое значение Y
INC R1 ; Увеличиваем X
SJMP NEXT_VAL ; Возвращаемся к началу цикла для новых вычислений
END
