МИНОБРНАУКИ РОССИИ
САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ
ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
«ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА)
Кафедра ВТ
ОТЧЕТ
по лабораторной работе
по дисциплине «Микропроцессорные системы»
Тема: ИЗУЧЕНИЕ СИСТЕМЫ КОМАНД MCS-51
И КРОСС-СРЕДСТВ РАЗРАБОТКИ ПРОГРАММНОГО
ОБЕСПЕЧЕНИЯ ДЛЯ ОДНОКРИСТАЛЬНОГО
МИКРОКОНТРОЛЛЕРА ADuC812
Студенты гр. |
|
|
|
|
|
|
|
|
|
|
|
Преподаватель |
|
Зуев И.С. |
Санкт-Петербург
2023
Цель работы.
1. Ознакомление с системой команд однокристального микроконтроллера (ОМК) MCS-51.
2. Получение навыков программирования для ОМК MCS-51.
3. Получение навыков работы с кросс-средствами разработки программного обеспечения для ОМК MCS-51.
Для подготовки исходного текста программы на входном языке может использоваться любой редактор, формирующий текстовый файл в коде ASCII. Для трансляции исходного текста программы в объектный код в данном цикле лабораторных работ используется ассемблер ASM51. При разработке достаточно сложных многомодульных программ используется также редактор связей (линкер), который позволяет включать в исполняемую программу независимо разработанные и библиотечные модули.
Задание на лабораторную работу
1. Повторить последовательность и назначение этапов подготовки программного обеспечения с использованием кросс-средств. Повторить синтаксис директив ассемблера ASM51, команды и режимы адресации OMK MCS-51.
2. Подготовить программу на языке ассемблера, выполняющую пересылку массива констант (8 чисел) из памяти программ (ПП) в резидентную память данных (РПД) по адресам 20H–27H. В программе необходимо предусмотреть инициализацию указанной области ПП константами с помощью директивы DB.
Считывание данных из ПП в цикле реализуется парой команд:
– MOV A,#0;
– MOVC A,@A+DPTR.
При этом двухбайтовый регистр-указатель DPTR в начале программы должен быть инициализирован командой MOV DPTR,#addr (addr– адрес первой константы), а затем инкрементироваться при каждом проходе цикла (INC DPTR). Пересылку значений в ячейки РПД целесообразно выполнять в цикле командой MOV @R1,A. Предварительно регистр R1 должен инициализироваться константой 20H (MOV R1,#20H), а затем инкрементироваться при каждом проходе цикла (INC R1).
Кроме того, для подсчета числа пересылок необходим счетчик цикла (например, регистр R0). Для организации цикла удобно использовать команду DJNZ R0,M1, которая декрементирует содержимое R0 и в случае его неравенства нулю передает управление на метку M1 (начало цикла).
3. Подготовить программу, копирующую в ячейки РПД с адресами 18H–1DH (регистровый банк 3) содержимое следующих регистров специальных функций в указанной последовательности: DPH, DPL, TH0, TL0, TH1, TL1. Для наблюдаемости процесса следует предварительно записать в эти региcт-ры некоторые отличные от нуля значения. Для выполнения пересылок использовать команду MOV @R0,ad, где ad – адрес источника (см. табл. 1.2). Регистр R0, используемый для косвенной адресации загружаемых ячеек РПД, должен относиться к первому регистровому банку. Программу следует демонстрировать в пошаговом режиме.
4. Подготовить программу для обработки измерительной информации. Исходные данные хранятся во внешней памяти данных в виде массива (10 чисел). Необходимо найти среднее значение , сравнить его с уставками – двумя константами и , хранящимися также во внешней памяти данных. По результатам сравнения сформировать признак и вывести его на линии порта P1:
-
,
,
,
Для демонстрации результатов среднее значение следует запомнить в регистре РПД; следует определить реальные данные, при которых сумма десяти чисел больше 255. Эту и последующие программы следует демонстрировать в автоматическом режиме, для чего организовать зацикливание программы как это делается в программе управления реальным объектом.
Часть 1.2
$mod52
ORG 0h
M1:
MOV DPTR, #init ;Устанавливаем указатель DPTR на начало данных
MOV R0, #8 ;Количество повторений цикла
MOV R1, #20h ;Начальный адрес таблицы данных в DSEG
LOOP:
MOV A, #0
MOVC A, @A+DPTR ;Чтение данных из CSEG по адресу (A)+(DPTR)
MOV @R1, A ;Запись данных в таблицу DSEG по адресу (R1)
INC DPTR
INC R1
DJNZ R0,LOOP ;Декремент R0, если не ноль то переход на LOOP
JMP M1 ;Повторение с начала
ORG 1000h
init:
DB 1,2,3,4,5,6,7,8 ;Таблица данных во внешней памяти
END
Рисунок 1. Результат исполнения программы
Часть 1.3
$mod52
ORG 0h ;Начало программы: от 0h - только если нет обработки других прерываний
M1:
MOV DPH, #1
MOV DPL, #2
MOV TH0, #3
MOV TL0, #4
MOV TH1, #5
MOV TL1, #6 ;Установка регистров в указанной последовательности
SETB RS0 ;R0 должен относиться к первому регистровому банку
MOV R0,#18h ;Начальный адрес
MOV @R0,DPH ;Выполнение перессылки
INC R0
MOV @R0,DPL
INC R0
MOV @R0,8Ch ;Значения из таблицы 1.2
INC R0
MOV @R0,8Ah
INC R0
MOV @R0,8Dh
INC R0
MOV @R0,8Bh
SETB RS1
END
Рисунок 2. Результат исполнения программы
Часть 1.4
$mod52
START:
ORG 0h
MOV DPTR,#init;Устанавливаем указатель DPTR на начало данных
MOV R0, #10 ;Количество повторений цикла
MOV R1, #20h ;Начальный адрес таблицы данных в DSEG
;Перессылка массива констант из памяти программы в РПД
LOOP:
MOV A,#0
MOVC A,@A+DPTR;Чтение данных из CSEG по адресу (A)+(DPTR)
MOV @R1,A;заносим содержимое в регистровый банк R1
INC DPTR
INC R1
DJNZ R0,LOOP;Декремент R0, если не ноль то переход на LOOP
;Вычисление среднего арифметического
MOV R2,#0 ;текущее среднее значение
MOV R4,#0 ;накопитель остатка от деления
MOV R6,#0 ;накопитель остатка от деления
MOV B, #1
MOV R0,#10 ;Количество повторений цикла
MOV R1,#20h ;Начальный адрес таблицы данных в DSEG
;old=old+(x(n)-old)/n
LOOP1:
MOV A,@R1
SUBB A,R2 ;"вычитание с заемом", вычитает указанную переменную
;вместе с флагом переноса из содержимого аккумулятора,
;засылая результат в аккумулятор
JC NEGATIVE ;Команда "переход, если перенос установлен"
JMP POZITIVE ;команда безусловного перехода в указанное место
NEGATIVE:
CLR C ;сбрасывает указанный бит в 0 (для флага переноса С)
MOV A,R2
MOV R3,B
MOV B,@R1
SUBB A,B
MOV B,R3
MOV R3,B
DIV AB
MOV R7,A
MOV A,R6
ADD A,B
MOV R6,A
MOV B,#100
SUBB A,B
JC NEGATIVE3
JMP POZITIVE3
NEGATIVE3:
CLR C
MOV A,R7
JMP FINAL3
POZITIVE3:
MOV R6,A
MOV A,R7
MOV B,R2
DEC B ;Декремент В
MOV R2,B
FINAL3:
MOV B,R3
MOV R3,A
MOV A,R2
SUBB A,R3
MOV R2,A
JMP FINAL
POZITIVE:
MOV R3,B
DIV AB
MOV R5,A
MOV A,R4
ADD A,B
MOV R4,A
MOV B,#100
SUBB A,B
JC NEGATIVE2
JMP POZITIVE2
NEGATIVE2:
CLR C
MOV A,R5
JMP FINAL2
POZITIVE2:
MOV R4,A
MOV A,R5
INC A
FINAL2:
MOV B,R3
ADD A,R2
MOV R2,A
FINAL:
INC R1
INC B
DJNZ R0,LOOP1;Декремент R0, если не ноль то переход на LOOP1
;Сравнение ср. знач. с уставками (QMAX, QMIN)
MOV DPTR, #QMAX
MOV A, #0
MOVC A, @A+DPTR
SUBB A, R2;Эта команда ставит флаг переноса(заема),если при вычитании
;для бита 7 необходим заем, иначе сбрасывает флаг переноса; A-=R2
JC M3;прыжок на M3 если флаг переноса остался,т.е. R2>=QMAX
MOV DPTR, #QMIN
MOV A, #0
MOVC A, @A+DPTR
SUBB A, R2;A-=R2
JNC M2;прыжок на M2 если флаг переноса не остался,т.е. R2<=QMIN
MOV P1, #00000010b;QMAX>R2>QMIN
JMP M4
M2:
MOV P1, #00000000b
JMP M4
M3:
MOV P1, #00000011b
M4:
JMP START
ORG 1000h
init:
DB 101,121,50,73,119,11,13,115,2,97 ;Таблица данных во внешней памяти, ср=70.2
QMIN:
DB 69
QMAX:
DB 71
END
Рисунок 3. Результат выполнения программы
Оценка времени выполнения программ
Время работы для части 1.2 составило 0,000082 с: это связано с наличием в тексте программы цикла на 8 итераций
Время работы для части 1.3 составило 0,000031 с: это связано с отсутствием циклов в программе
Время работы для части 1.4 составило 0,000549 с: это связано с наличием в тексте программы двух циклов на 10 итераций