Лабораторная работа №1
Изучение кросс-средств разработки программного обеспечения для однокристального микроконтроллера MCS51
Цель работы:
1.Получение навыков работы с кросс-средствами разработки программного обеспечения для однокристального микроконтроллера (ОМК) MCS51.
2.Ознакомление с системой команд ОМК MCS51.
3.Получение навыков программирования для ОМК MCS51
Задания на лабораторную работу:
Подготовить программу на языке ассемблера, выполняющую пересылку массива констант (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 (начало цикла).
Подготовить программу, копирующую в ячейки РПД с адресами 18h-1Dh(регистровый банк 3) содержимое следующих регистров специальных функций в указанной последовательности: DPH, DPL,TH0, TL0, TH1, TL1. Для выполнения пересылок использовать команду MOV @R0,ad, где ad - адрес источника, который необходимо определить по таблице 1.2. Регистр R0, используемый для косвенной адресации загружаемых ячеек РПД должен относится к первому регистровому банку.
Подготовить программу для обработки измерительной информации. Исходные данные хранятся во внешней памяти данных в виде массива (10 чисел). Необходимо найти среднее значение Xср, сравнить его с уставками - двумя константами Qmax и Qmin, хранящимися также во внешней памяти данных. По результатам сравнения сформировать признак p и вывести его на линии порта P1:
Xср >= Qmax, p=11;
Qmax > Xср > Qmin, p=10;
Xср <= Qmin, p=00;
Порядок выполнения работы
Подготовить с помощью кросс-средств программы, составленные в соответствии с предыдущим разделом.
С помощью кросс-отладчика проверить правильность работы этих программ, записав предварительно исходные данные в заданные разделы памяти, определить время выполнения программ. Продемонстрировать работу программ преподавателю.
Общий алгоритм подготовки программного обеспечения:
Для подготовки исходного текста программы на входном языке, может использоваться любой редактор, формирующий текстовый файл в коде ASCII. В настоящем цикле лабораторных работ в целях глубокого изучения архитектуры ОМК в качестве входного языка используется язык ассемблера. Для трансляции исходного текста программы в объектный код в данном цикле лабораторных работ используется ассемблер ASM51. На этапе трансляции выявляются и должны быть исправлены синтаксические ошибки в исходном тексте. При разработке достаточно сложных многомодульных программ используется также редактор связей (линкер), который позволяет включать в исполняемую программу независимо разработанные и библиотечные модули.
Часть 1.2
ASM:
$mod52
ORG 0h;Начало программы: от 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
ORG 1000h
init:
DB 1,2,3,4,5,6,7,8; Таблица данных во внешней памяти
END
Часть 1.3
ASM:
$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
MOV R0,#18h
MOV @R0,DPH
INC R0
MOV @R0,DPL
INC R0
MOV @R0,8Ch
INC R0
MOV @R0,8Ah
INC R0
MOV @R0,8Dh
INC R0
MOV @R0,8Bh
SETB RS1
end
Часть 1.4
ASM:
$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
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
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
Оценки времени выполнения программ, полученные с помощью отладчика:
С помощью средств отладцика были получены следующие времена работы программ.
Для части 1.2: Время работы составило 00,000082s. Такое время было обусловлено наличием в тексте программы цикла на 8 итераций.
Для части 1.3: Время работы составило 00,000033s. Такое время было обусловлено отсутствием в тексте программы цикла, все команды выполнялись однократно.
Для части 1.4: Время работы составило 00,000549s. Такое время было обусловлено наличием в тексте программы 2х циклов на 10 итераций.