- •Часть I – Основы архитектуры и язык ассемблера мк51
- •Вивчення команд арифметичних операцій та способу вивода даних на статичний 7-сегментний індикатор
- •Изучение команд передачи управления и программирование алгоритмов с ветвлением для микроконтроллеров mcs-51
- •Изучение команд передачи управления и программирование алгоритмов с ветвлением для микроконтроллеров mcs-51
- •Порядок выполнения работы
- •Содержание отчёта
- •Контрольные вопросы
- •Перечень рекомендуемой литературы
- •Приложение а – сИстема команд мк51
Изучение команд передачи управления и программирование алгоритмов с ветвлением для микроконтроллеров mcs-51
Цель работы: изучить команды передачи управления однокристальных микроконтроллеров MCS-51 и освоить составление программ с ветвлением.
Теоретические положення
Структура и способы организации индикаторов.
Часто в МПС требуется индикация типа ДА/НЕТ, ВКЛ/ВЫКЛ. Такая информация отображается с помощью отдельных светодиодов. На рис. 4.1 показаны схемы включения светодиодов, где в качестве ключей используется логический инвертор.
Рисунок 4.1 Включение светодиодных индикаторов с применением ИМС инвертора: а - с открытым коллектором ; б - типовая схема
В полупроводниковых светодиодах используется свойство р-n перехода излучать свет в видимой части спектра при протекании через него прямого тока IПР = 5 – 20 мА, UПР = 2 – 3 В). Балластный резистор включается последовательно со светодиодом и ограничивает величину его прямого тока 1ПР.
Для отображения цифровой информации наибольшее распространение получили 7-ми сегментные индикаторы, в которых изображение цифры составляют из семи линейных светодиодных сегментов (а, b, с, d, e, f, g) расположенных в виде цифры 8. С помощью этих индикаторов отображаются десятичные и шестнадцатеричные цифры, некоторые буквы русского и латинского алфавитов, а так же некоторые специальные знаки. Светодиодные сегменты располагают на корпусе ИМС цифрового индикатора с добавлением сегмента h десятичной точки (DP) и вывода EN - блокировки (BL) работы индикатора.
Структура 7-ми сегментного индикатора и способы его подключения к порту МК51 Р1 показаны на рис. 4.2.
Низкая нагрузочная способность линий порта МК51 (1ВЫХ = 1 мА) позволяет подключить только один вход ТТЛ ИМС и не допускает прямого включения индикатора. В качестве промежуточных усилителей тока используются логические элементы (обычно инверторы) или ИМС преобразователей кодов (дешифраторов DC) для управления 7-ми сегментным индикатором.
Рисунок 4.2 7 - ми сегментный индикатор: а — внешний вид; б — схемы с общим катодом и анодом, в, г – способы подключения к порту P1 MK51
Подходы к построению системы индикации в МПС
На основе светодиодов и 7 - ми сегментных индикаторов строятся модули отображения информации МПС. При построении модулей отображения информации различают два подхода — динамическая и статическая схема построения индикации.
Статическая индикация заключается в постоянной подсветке индикаторов HL1 - HLn от одного источника информации рис. 4.3. В такой системе каждый индикатор HL1 - HLn подключен через собственный дешифратор DC1 - DCn и регистр-защелку Rl - Rn к шине данных ШД. Выборка регистров Rl - Rn производится при помощи селектора на основе дешифратора адреса DA. Аппаратные затраты при такой организации составляют n пар: регистр + дешифратор при n десятичных разрядов индикатора.
Сущность динамической индикации заключается в поочередном циклическом подключении каждого индикатора HL1 - HLn к источнику информации через общую шину данных, рис 4.4. Выборка индикатора осуществляется дешифратором адреса DA. В регистре данных RD хранится цифровой код, предназначенный для отображения. В регистре RA хранится адрес индикатора.
При таком включении индикаторов HL1 - HLn значительно уменьшаются аппаратные затраты на реализацию модуля индикации. Преимущества динамического способа построения модуля особенно заметны при количестве разрядов индикации больше пяти. Для достижения достаточной яркости необходимо обеспечить определённое время свечения одного индикатора и такую частоту их перебора, чтобы не было заметно мерцание. Если информацию обновлять с частотой примерно 20 раз в секунду, то данные на индикаторе представляются неизменными.
Рисунок 4.3 Структурная схема статической индикации
Здесь обозначены:
DA – дешифратор адреса, который необходим для выборки соответствующего регистра;
Rl - R4 – регистры, в которых временно хранится значение кода числа для отображения (соответствующий регистр выбирается дешифратором DA);
DC1 - DC4 – дешифраторы, преобразующие двоичный код в 7-ми сегментный код;
HL1 - HL4 – 7-ми сегментные индикаторы;
ШД – шина данных, по линиям которой осуществляется передача данных на индикацию.
Знакосинтезирующая светодиодная индикация (ЗСИ) используется для отображения алфавитно-цифровой информации. ЗСИ выполняются в виде ИМС, представляющей собой матрицу светодиодов размерностью m x n , где m - число строк, n - число колонок матрицы (рис. 4.5). Чаще всего ЗСИ имеют размерность 7x5 или 9x7.
Рисунок 4.4 Структурная схема динамической индикации
Здесь обозначены:
RD – регистр данных для временного хранения отображаемого числа или символа;
RA – регистр адреса для временного хранения двоичного кода адреса выбираемого индикатора;
DA – дешифратор для преобразования адреса, задаваемого двоичным кодом, в строб выбора индикатора;
HL1 - HL4 – 7-ми сегментные индикаторы.
Рисунок 4.5 - Знакосинтезирующий индикатор: a - внешний вид; б – схема
Для включения одного светодиода матрицы необходимо обеспечить прямой ток 10-15 мА при прямом падении напряжения в 2 - 2,5 В. Подключение ЗСИ к МК51 осуществляется посредством управляемых схем формирования тока колонок и строк (рис. 4.6).
Рисунок 4.6 - Схема подключения ЗСИ к МК (а) и цепь протекания через светодиод (б)
Для отображения многосимвольной информации применяются линейные (однострочные) дисплеи. Такие дисплеи представляют собой «линейку», составленную из отдельных светодиодов, 7-ми сегментных индикаторов или ЗСИ. Число знакомест дисплея зависит от требований МПС.
В стенде (рис. 4.7) статическая индикация реализована на четырех статических 7-ми сегментных индикаторах HG1 (разряды HG1.0, HG1.1, HG1.2 HG1.3). Обращение к ним производится, как к ячейкам памяти с адресами A000h (левая пара знакомест - 0, 1), B000h (правая пара знакомест - 2, 3).
Динамическая индикация реализована на плате расширения с помощью четырехразрядного 7-ми сегментного индикатора HL2. Управление динамической индикацией осуществляется посредством порта В микросхемы системного контроллера (см. схему электрическую принципиальную стенда, приложение 1), сигналы выборки соответствующего индикатора поступают от линии порта РС0, РС1 к дешифратору адреса разряда DD3.
ЗСИ HG1 расположен на плате расширения стенда и является матрицей светодиодов 5x7. Управление светодиодной матрицей осуществляется по линиям РА0 – РА4 и РС0 – РС6. Например для того чтоб засветить точку с координатами [1;1] необходимо выставить уровень логической единицы на линии РА0, в уровень логического нуля на линии РС0.
Также в стенде есть линейка светодиодов HL1 - HL8, доступ к которым осуществляется как к ячейке внешнего ОЗУ по адресу 0A006h. Светодиоды включаются записью логических единиц в соответствующие разряды.
Вывод данных на индикаторы. Вывод данных, представленных двоичным кодом, наиболее прост при его отображении единичными светодиодными индикаторами или линейкой светодиодов. Достаточно только записать этот код в регистр индикатора LED_REG по адресу 0A006h (рис. 4.7). Но для 7-ми сегментного индикатора и светодиодной матрицы требуется преобразование двоичного кода в код символа, которое реализуется либо с помощью дешифратора, либо программным способом.
Статический 4-х разрядный индикатор с помощью дешифраторов DC преобразует двоичный код в код шестнадцатеричных символов для 7-ми сегментных индикаторов (рис. 4.7). Для индикации данных на статическом индикаторе HG1 требуется записать их в соответствующие регистры-дешифраторы RG - DC: DISPLAY[0] – адрес 0A000h (0, 1 знакоместо) или DISPLAY[1] – адрес 0B000h (рис. 4.7).
Режим работы статического индикатора задаётся путём установки битов регистра управления DC_REG по адресу 0A004h. Формат этого регистра дан в карте портов ввода/вывода данных стенда табл. 4.1, где DPi - бит управления десятичной точкой разряда; BLi - бит управления гашением разряда; i = 0, 1, 2, 3 - номер разряда (знакоместо). Установка в 0 битов регистра управления DC_REG блокирует индикацию десятичных точек (DP0 - DP3) и разрешает работу индикаторов (BL0 - BL3).
При динамической индикации байт кода символа записывается в регистр порта В PB_REG по адресу 08001h. Выходы этого регистра (РВ0 – РВ6 — код символа, РВ7 — бит гашения) подключены на входы всех четырёх 7-ми сегментных индикаторов. Для выбора разряда в регистр порта С PC_REG по адресу 08002h записывается 2-х битовый код его номера РС0, PC 1. Дешифратор DC по линиям 1, 2, 3, 4 выбирает соответствующий разряд динамического индикатора.
Для отображения символа на ЗСИ используется принцип динамической индикации по колонкам. Байт индикации является кодом засветки светодиодов соответствующей колонки. Графический образ символа набирается из последовательности пяти байтов индикации путём перебора колонок.
Байт индикации записывается в регистр порта С PC_REG по адресу 08002h: РС0 – бит 1-й строки, ... , РС6 – бит 7-й строки, РС7 = 0 (этот бит не влияет на работу ЗСИ). Запись 0 в соответствующий бит соответствует засветке данного светодиода ЗСИ.
Таблица 4.1 - Карта портов ввода/вывода данных стенда
Адрес |
Тип цикла |
B7 |
B6 |
B5 |
B4 |
B3 |
B2 |
B1 |
B0 |
Имя |
||||||
Порты периферийных устройств |
||||||||||||||||
8xx0 |
Запись |
[Порт A] |
PA_REG |
|||||||||||||
8xx1 |
Запись |
[Порт B] |
PB_REG |
|||||||||||||
8xx2 |
Запись |
[Порт C] |
PC_REG |
|||||||||||||
8xx3 |
Запись |
x |
x |
x |
x |
x |
TRISC |
x |
x |
TRIS |
||||||
ЖКИ |
||||||||||||||||
8xx4 |
Запись |
Регистр команд ЖК индикатора |
LCD_CMD |
|||||||||||||
8xx5 |
Запись |
Регистр данных ЖК индикатора |
LCD_DATA |
|||||||||||||
Последовательный порт |
||||||||||||||||
9xxx |
Чтение |
CTS |
DSR |
DCD |
RI |
KL3 |
KL2 |
KL1 |
KL0 |
US_REG |
||||||
Cxx0 |
Запись |
x |
x |
X |
x |
DTR |
RTS |
CFG1 |
CFG0 |
UC_REG |
||||||
Индикатор и светодиоды |
||||||||||||||||
Axx0 |
Запись |
[Регистр индикатора 0] |
DISPLAY[0] |
|||||||||||||
Axx1 |
Запись |
[Регистр индикатора 1] |
DISPLAY[1] |
|||||||||||||
Axx2 |
Запись |
<зарезервировано> |
DISPLAY[2] |
|||||||||||||
Axx3 |
Запись |
<зарезервировано> |
DISPLAY[3] |
|||||||||||||
Axx4 |
Запись |
DP3 |
DP2 |
DP1 |
DP0 |
BL3 |
BL2 |
BL1 |
BL0 |
DC_REG |
||||||
Axx5 |
Запись |
<зарезервировано> |
EDC_REG |
|||||||||||||
Axx6 |
Запись |
LED7 |
LED6 |
LED5 |
LED4 |
LED3 |
LED2 |
LED1 |
LED0 |
LED_REG |
||||||
Управление работой |
||||||||||||||||
Axx7 |
Запись |
x |
x |
X |
x |
x |
x |
x |
RUN |
SYS_CTL |
||||||
|
|
|
|
|
|
|
|
|
|
|
||||||
Совместимые регистры |
||||||||||||||||
Bxx0 |
Запись |
[Регистр индикатора 1] |
DISPLAYB |
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
||||||
Выбор колонки ЗСИ организуется путём записи 1 в один из 5-ти битов РА0 – РА4 порта A PA_REG по адресу 08000h: «00001» - 1-я колонка; ... ; «10000» - 5-я колонка («бегущая» 1). Биты РА5 - РА7 = 0 и не влияют на работу ЗСИ.
Следовательно, вывод символа на динамическую индикацию или на ЗСИ целесообразно представить в виде двух отдельных процедур (подпрограмм): перекодировки и отображения. Перекодировка — представление двоичного кода символа в виде 7-ми сегментного кода (динамический индикатор) или последовательности пяти кодов индикации колонок (ЗСИ). Процедуру перекодировки рекомендуется выполнять таблично. Процедура отображения символа определяется алгоритмом выбора индикатора (колонки).
Рисунок 4.7 Функциональная схема к лабораторной работе №4
Основу всех программ данной лабораторной работы (и многих следующих) составляет подпрограмма временной задержки TIME. Подпрограмма требует 1, 2 или 3 РОН, например, Rl, R2, R3.
Суть подпрограммы TIME — выполнение команд «цикл в цикле». Цикл организуется с помощью команды DJNZ Rn, Met, которая предписывает декремент (–1) содержимого регистра Rn и переход на метку Met, если не ноль. Рассмотрим подпрограмму TIME для организации длительных временных задержек.
-
TIME:
; подпрограмма задержки
mov Rl,#const
; загрузка POH R1константой const
С3:
mov R2,#0FFh
; загрузка POH R2 константой FFh (25510)
С2:
mov R3,#0FFh
; загрузка POH R3 константой FFh (25510)
С1:
djnz R3,C1
; первый цикл (метка С1)
djnz R2,C2
; второй цикл (метка С2)
djnz Rl,C3
; третий цикл (метка СЗ)
ret
; выход из подпрограммы
Рассчитаем время задержки подпрограммы TIME. В приложении «Система команд» выберем для каждой из команд подпрограммы число машинных циклов (столбец «МЦ»): Call — 2; Mov — 1; djnz — 2; ret — 2. Определим число машинных циклов, затрачиваемых МК51 на выполнение подпрограммы TIME:
TTIME = 2CALL + 1MOV + const * [1MOV + 255*(1MOV + 255*2DJNZ + 2DJNZ) + 2DJNZ] + 2RET = 5 + const * [3 + 255 * 513] = 5 + const * 130818 (машинных циклов).
Зная длительность одного машинного цикла (1,628 10–6 сек.), получим время выполнения подпрограммы (время задержки):
Тзадержки = ТТIМЕ * Тмц = (5 + const * 130818) * 1,628 10–6 сек.
Например, при const = 5 получим Тзадержки = 1,065 сек.
Очевидно, что три цикла дают нам время задержки в единицы – десятки секунд. При меньшей задержке требуется и меньшее число циклов (два или даже один). Пользуясь вышеизложенной методикой, можно легко организовать задержку в соответствии с требованиями индивидуального задания.
Рассмотрим пример программы для статической индикации, использующую подпрограмму задержки TIME.
Пример 4.1. С частотой 1 Гц отобразить число 0404h на статическом индикаторе.
$INCLUDE(C:\MK5 l\Compiler\ASM5l\MOD\MOD51)
ORG 0
Continue:
mov A,#0 ; отменить гашение знакомест
mov DPTR,#0A004h ; и десятичные точки
movx @DPTR,A ; статического индикатора
mov A,#04h ; записать в Аккумулятор число 04h
mov DPTR,#0A000h ; индикация числа 04h на 3 и 4
movx @DPTR,A ; знакоместе статического индикатора
mov DPTR,#0B000h ; индикация числа 04h
movx @DPTR,A ; на 1 и 2 знакоместе
; статического индикатора
CALL TIME ; вызов подпрограммы задержки
mov A,#00001111b ; гашение всех знакомест mov DPTR,#0A004h ; статического movx @DPTR,A ; индикатора
CALL TIME ; вызов подпрограммы задержки
jmp Continue ; переход на начало программы
TIME: ; подпрограмма задержки
mov Rl,#05h
С3: mov R2,#0FFh
С2: mov R3,#0FFh
С1: djnz R3,C1
djnz R2,C2
djnz R1,C3
ret ; выход из подпрограммы
END
Следующей по частоте применения в программах лабораторных работ является подпрограмма CODER — перекодировка на основе табличного метода.
Работа подпрограммы CODER основана на командах MOVC (см. приложение «Система команд»), которые предполагают 3-х шаговую последовательность для доступа к таблице в памяти программ МК51.
Команда MOVC A, @A+DPTR предполагает выполнение следующей последовательности действий (команд):
загрузка регистра - указателя адреса DPTR;
загрузка аккумулятора А индексом (координатой входа в таблицу);
выполнить команду MOVC A, @A+DPTR и записать в аккумулятор А данные из ячейки памяти программ МК51 с адресом (A+DPTR).
Версия с программным счётчиком PC команды MOVC A,@A+PC не требует регистра DPTR и обычно используется для «локальных» таблиц и так же предполагает выполнение 3-х шаговой последовательности:
загрузка аккумулятора А индексом;
добавление смещения к содержимому аккумулятора А, чтобы выйти на требуемый адрес таблицы;
выполнить команду MOVC А, @А+РС и записать в аккумулятор А данные из ячейки памяти программ МК51 с адресом (А+РС+1).
Рассмотрим подпрограмму CODER на основе команды MOVC A, @А+РС.
CODER: ; подпрограмма перекодировки 2-го кода в 7-ми сегментный код
inc А ; смещение на 1 для «перехода» через ret
move A, @A+PC ; загрузка в А кода символа ret ; выход из подпрограммы
; таблица 7-ми сегментных кодов шестнадцатеричных символов
; биты Tgfedcba Т - дес. точка, gfedeba - сегменты индикатора
DB 0011111lb ; «0»
DB 00000110b ; «1»
DB 01011011b ; «2»
DB 01001111b ; «3»
DB 01100110b ; «4»
DB 01101101b ; «5»
DB 01111101b ; «6»
DB 00000111b ; «7»
DB 01111111b ; «8»
DB 0ll0l1l1b ; «9»
DB 01110111b ; «A»
DB 01111100b ; «B»
DB 00111001b ; «C»
DB 01011110b ; «D»
DB 01111001b ; «E»
DB 01110001b ; «F»
Перед вызовом подпрограммы (перед командой CALL CODER) необходимо в аккумулятор А записать код отображаемого символа: 00h – «0», 01h – «1», ... , 0Fh – «F».
Рассмотрим пример программы для динамической индикации, использующую подпрограмму перекодировки CODER.
Пример 4.2 – На динамическом индикаторе отобразить число 3.3.3.3.
$INCLUDE(C:\MK51\Compiler\ASM51\MOD\MOD51)
ORG 0
START:
MOV R0, #0 ; Установить начальное состояние
; регистра номера знакоместа (D1)
MOV A, #03h ; Занести в А код цифры 3
SETB ACC.7 ; Индицировать десятичные точки
mov DPTR,#08001h ; Занести в регистр индикатора movx @DPTR,A ; код символа
МЕТ1:
mov A,R0 ; Динамическая индикация символа
DPTR,#08002h ; R0.0 = PC0, R0.1 = PC1 - код знакоместа
movx @DPTR, A ; 00 - Dl, 01 - D2, 10 - D3, 11 - D4
; (слева направо)
inc R0 ; Перейти на индикацию следующего
CJNE R0,#04h,MET1 ; знакоместа, если R0 Ф 4
jmp START ;Переход на начало программы START
CODER: ; подпрограмма перекодировки 2-го кода в 7-ми сегментный код
inc А ; смещение на 1 для «перехода» через ret
move A, @A+PC ; загрузка в А кода символа ret ; выход из подпрограммы
; таблица 7-ми сегментных кодов шестнадцатеричных символов
; биты Tgfedcba Т - дес. точка, gfedeba - сегменты индикатора
DB 0011111lb ; «0»
DB 00000110b ; «1»
DB 01011011b ; «2»
DB 01001111b ; «3»
DB 01100110b ; «4»
DB 01101101b ; «5»
DB 01111101b ; «6»
DB 00000111b ; «7»
DB 01111111b ; «8»
DB 0ll0l1l1b ; «9»
DB 01110111b ; «A»
DB 01111100b ; «B»
DB 00111001b ; «C»
DB 01011110b ; «D»
DB 01111001b ; «E»
DB 01110001b ; «F»
END
