Мегаобучалка Главная | О нас | Обратная связь


Арифметические операции в MCS -51



2019-12-29 366 Обсуждений (0)
Арифметические операции в MCS -51 0.00 из 5.00 0 оценок




Введение

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

При рассмотрении решения задач, связанных с генерацией временных интервалов и работой последовательного порта предполагается использование МК с частотой задающего генератора равной 12 МГц.

 


Использование команд передачи данных

 

Пример 1. Передать содержимое буфера последовательного адаптера в резидентную память данных по косвенному адресу в R0:

MOV @R0, SBUF; передача принятого по последовательному каналу; байта в РПД.

Пример 2. Записать в ячейки РПД с адресами 39 и 40 число FA1BH:

LOAD:            MOV 39H,#0FAH

MOV 40H,#1BH

Пример З. Загрузить в указатель данных начальный адрес 4300Н массива данных, расположенного во внешней памяти данных:

MOV DPTR,#4300Н ; загрузка начального значения указателя данных.

Пример 4. Загрузить управляющее слово в регистр управления таймером:

MOV TCON,#00000101В; разрешение внешних прерываний по низкому уровню сигнала.

Пример 5. Сбросить все флажки пользователя (биты) в резидентной области памяти от 20Н до 2FH:

MOV R0,#20Н ; заданный начальный адрес области памяти

MOV Rl,#0FH ; загрузить счетчик (длина области памяти)

LOOP: MOV   @R0,#0 ; снять один байт (8 флажков)

INC R0       ; переход к следующему байту

DJNZ R1, LOOP ; цикл, если не все флажки сброшены

Пример 6. Передать управление по метке L0, если счетчик 0 достиг значения 128:

MOV A, TL0 ; передача содержимого счетчика в аккумулятор

JB  А.7, L0 ; перейти на L0, если А.7=1

L0:                           ; продолжение программы

Пример Запомнить во внешней памяти данных содержимое регистров
банка 0. Начальный адрес ВПД – 2000Н:

MOV PSW,#00010000B; выбор банка регистров 1

MOV R0,#8  ; счетчик 8

MOV DPTR, #2000H; определение начального адреса ВПД

MOV Rl,#0   ; определение начального адреса РПД

LOOP: MOV   A,@R1  ; (А) (регистр)

MOVX            @DPTR, A; передача из аккумулятора в ВПД

INC Rl        ; переход к следующему регистру

INC DPTR  ; приращение указателя адреса

DJNZ R0, LOOP ; R0=R0–1, если R0>0 то повторить цикл

Пример 8. Обращение к памяти программ, где сохраняется готовая таблица значений. Для этого используется специальная команда MOVC. Например: программа для выбора значений функции синуса из таблицы с точностью 0,4% и дискретом 1°. Начальный параметр для подпрограммы есть значения угла х, которое находится в аккумуляторе. Данная программа работает без указателя данных DPTR. Инкремент аккумулятора перед обращением к таблице необходим в связи с использованием однобайтной команды возврата. Таблица синусов занимает в памяти 90 байтов.

; вычисление sin(x) по таблице значений: вход (А)(х), хÎ(0,89°);

; выход (А) дробная часть значения синуса

SIN: INC     A ; инкремент аккумулятора

MOVC            А,@А+РС ; загрузка значения синуса из таблицы

RET                ; возвращение

; таблица синусов

SINUS: DB 00000000В; SIN (0)=0

DB 00000100В ; SIN (1)=0,017 DB 00001001В; SIN (2)=0,035

………………………

DB 11111111В ; SIN (89)=0,999

Пример 9. Операции со стеком и организация прерываний. Механизм доступа к стеку MCS-51: перед записью в стек содержимое регистра-указателя стека SP инкрементируется, а после чтения данных из стека декрементируется.

После начальной установки ОМЭВМ в SP заносится начальное значение 07Н. Для переопределения начального значения SP можно использовать команду MOV SP, #data16.

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

Подпрограмма обработки прерываний.

ORG 3          ; задание адреса вектора прерываний

SJMP SUBINO ; переход на подпрограмму обработки

ORG 30Н

SUBINO: PUSH PSW ; сохранение в стеке PSW

PUSH A         ; сохранение в стеке аккумулятора А

PUSH В         ; сохранение в стеке дополнения-аккумулятора В

PUSH DPL     ; сохранение в стеке DPTR

PUSH DPH    ; сохранение в стеке DPTR

MOV PSW,#00001000B; выбор другого банка регистров (1)

.

обработка прерываний

.

POP DPH    ; восстановление DPTR

POP DPL     ; восстановление DPTR

POP В         ; восстановление В

POP A         ; восстановление аккумулятора

POP PSW    ; восстановление PSW и банка регистров 0

RETI               ; возвращение в основную программу

Если SP=1FH, размещение регистров в стеке после входа в подпрограмму обработки будет таким, как показано на рис. 1.

 

7FH    
26H DPH (SP)
25H DPL  
24H В  
23H А  
22H PSW  
21H РСН

Указатель

(счетчик)

команд PC

20H PCL
1FH  
00H    

Рисунок 1 – Распределение памяти при вызове подпрограммы

 

Пример 10. Передать управление одной из восьми подпрограмм при появлении нулевого уровня на соответствующем входе порта 1. Высший приоритет входаР1.3.

 

ORL P1,#FFH ; настройка Р1 на ввод

L1: MOV   А, Р1 ; ввод данных из порта

CPL А         ; инверсия аккумулятора

JZ   L1        ; ожидание появления первого нуля

JNB Р1.3, SUBR1; переход на первую подпрограмму

JNB P1.4, SUBR2; переход на вторую подпрограмму

…………………………………………

JNB P1.2, SUBR8; переход на восьмую подпрограмму

Порядок приоритетов определяется порядком проверки нулевого уровня на соответствующем входе и может быть любым.


Арифметические операции в MCS -51

Пример 11. Сложить десятичные двоично-кодированные числа, размещенные в А и R5:

ADD A, R5   ; двоичное сложение

DA A         ; десятичная коррекция результата

Пример 12. Вычитание байтов. Данная операция может выполняться двумя способами: 1) перевести уменьшаемое как отрицательное в дополнительный код и выполнить операцию добавления; 2) перевести уменьшаемое в обратный код и произвести инверсию суммы.

Например, из данных в А необходимо отнять данные регистра R3. Вычитание выполняем по алгоритму:

А

CPL A         ; инверсия аккумулятора

ADD A, R3   ; добавление байтов

CPL A         ; получение разности

Пример 13. Сложить два двоичных многобайтных числа. Оба слагаемых находятся в РПД, начиная из младшего байта. Начальный адрес слагаемых находится в R0 и R1, формат в R2. Результат размещают на месте первого слагаемого.

CLR С         ; сбрасывание переноса

LOOP: MOV   A,@R0  ; загрузка в аккумулятор; бегущего байта первого слагаемого

ADDC A,@R1 ; добавление байтов с учетом переноса

MOV @R0, A ; размещение байта результата

INC R0       ; смещение указателя

INC Rl        ; смещение указателя

DJNZ R2, LOOP ; цикл, если не все байты просуммированы

Время суммирования составляет (1+7N) мкс, где N – длина в байтах.

Пример 14. Перемножить число в аккумуляторе на число 2х, где х ≤ 8 – значение в R6. Умножение на 2 заменяется арифметическим сдвигом аккумулятора и R0:

MOV R0,#0  ; сброс R0

CLR С         ; сброс переноса

LI:  RLC     А ; сдвиг влево 16-разрядного данного в А и R0

ХСН А, R0

RLC A

ХСН А, R0

DJNZ R6, L1 ; цикл

Пример 15. Умножение (MUL). Выполняется для двух беззнаковых чисел, которые находятся в регистрах А и В. После выполнения операции младший байт произведения размещается в А, а старший – в В.

Умножение числа любого формата на константу 168. Число размещено в РПД, адрес младшего байта находится в R0. Формат числа в байтах задан в R2.

MOV А,#00Н ; сброс аккумулятора А

LOOP: ADD    A,@R0  ; загрузка множимого

MOV B,#168D ; загрузка множителя

MUL AB       ; перемножение

MOV @R0, A ; запись младшего байта частичного произведения

INC R0       ; прирост адреса

MOV А, В     ; пересылка старшего байта частичного произведения в аккумулятор А

ХСН A,@R0 ; предшествующее формирование очередного байта произведения

JNZ R2, LOOP ; цикл, если не все байты начального числа перемноженные на константу.

Полученный результат находится на месте начального числа и занимает в РПД на 1 байт больше. Время вычисления произведения составляет (1+13N) мкс, где N – длина числа в байтах.

Пример 16. Деление (DIV) – делится содержимое аккумулятора на значение в В. После деления в А находится целая часть, в В-остаток. Команда может быть использована для быстрого преобразования двоичного числа в двоично-десятичный формат.

Программа переводит двоичное число, находящееся в аккумуляторе, в двоично-десятичный код, который может быть трехразрядным (в десятичной системе счисления). В этом случае число сотен будет размещено вR0, десятки и единицы – соответственно в А и В.

MOV B,#100D ; (B) 100 для вычисления числа сотен в числе

DIV AB       ; в А є число сотен (то есть старшая цифра)

MOV R0, A   ; пересылка в R0 старшей цифры

ХСН А, В     ; пересылка остатка от деления входного числа в А

MOV B,#10D ; (В)10 (определяется число десятков в числе)

DIV AB       ; в А – число десятков, В-число единиц

SWAP A         ; размещение числа десятков в старшей тетраде А

ADD А, В     ; суммирование остатка (числа единиц) аккумулятор сохраняет две младших цифры.

Время преобразования – 16 мкс.

Пример 1 Сравнение двух четырехразрядных чисел, которые подаются на входы порта Р2.

Сигнал равенства выводится на Р1.1, большее – Р1.2, меньшееР1.3, разрешение сравнения подается на Р1.0.

ANL P1,#11110001В ; сброс всех сравнений

L0: JNB     Р1.0, L0 ; ожидание разрешения

MOV A, P2

ANL A,#F0H ; выделение первого числа

SWAP A

MOV В, A     ; запоминание первого числа

CLR C         ; сброс переноса

MOV А, P2

ANL A,#0FH ; выделение второго числа

SUBB А, В     ; вычисление В

JZ   LR       ; переход, если А=В

JC  LL        ; переход, если А<В

SETB P1.2     ; результат А>В

JMP EXIT

LR: SETB  P1.1 ; результат А=В

JMP EXIT

LL: SETB  P1.3 ; результат А<В

EXIT:                       ; продолжение выполнения программы

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



2019-12-29 366 Обсуждений (0)
Арифметические операции в MCS -51 0.00 из 5.00 0 оценок









Обсуждение в статье: Арифметические операции в MCS -51

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

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



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (366)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.007 сек.)