Федеральное агентство по образованию бийский технологический институт (филиал)

Вид материалаДокументы
4Типичные применения микроконтроллеров 4.1 Ввод информации с датчиков
4.1.1.1Ожидание события
4.1.1.2Ожидание импульсного сигнала
4.1.2Устранение дребезга контактов
4.1.3Подсчет числа импульсов
4.1.3.2Подсчет числа импульсов за заданный промежуток времени
4.1.4Опрос группы двоичных датчиков
СБА2 – старший байт адреса подпрограммы 2
4.1.5Ввод информации с матричной клавиатуры
Контрольные вопросы
Подобный материал:
1   ...   4   5   6   7   8   9   10   11   ...   14

4Типичные применения микроконтроллеров

4.1 Ввод информации с датчиков

4.1.1Опрос двоичного датчика


В устройствах и системах логического управления объектами события фиксируются с использованием датчиков цифрового и аналогового типов. Наибольшее распространение имеют двоичные датчики, например, концевые выключатели, которые подключаются к МК так, как показано на рисунке 4.1. Все нижеприведенные листинги написаны для сигнала датчика с рисунка 4.1б.





а) структура датчика; б) сигнал на выходе


Рисунок 4.1 – Концевой датчик

4.1.1.1Ожидание события


Типовая процедура ожидания события состоит из следующих действий: ввода сигнала от датчика, анализа значения сигнала и передачи управления в зависимости от состояния датчика. Программа, реализующая эту процедуру, зависит от того, каким образом датчик подключен к МК. Он может быть подключен к одной из линий портов МК или к специальным входам прерываний (INT0, INT1).

Например, при подключении датчика к третьему разряду порта P1 программа реализации процедуры ожидания размыкания, а затем замыкания контакта представлена в листинге 4.1):



Листинг 4.1 – Регистрации события




.ORG 0000H

SETB P1.3


; Адрес начала программы

; Настройка разряда 3 порта

; P1 на ввод сигнала

MAIN:




JNB P1.3, $





JB P1.3,$





JMP MAIN



; Ожидание размыкания

; контакта датчика

; Подпрограмма обработки

; размыкания

; Ожидание замыкания

; контакта датчика

; Подпрограмма обработки

; размыкания

; Переход на регистрацию

; размыкания контакта

При подключении датчика к входу INT0, в режиме прерывания возможно отслеживание только замыкания контакта. Программа, реализующая регистрацию замыкания контакта, имеет следующий вид (листинг 4.2):

Листинг 4.2 – Регистрация события с использованием входа
прерывания




.ORG 0000H

JMP BEGIN

; Адрес начала программы

; Переход к основной части

; программы




.ORG 0003H


JMP EXT0

; Адрес процедуры

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

; по входу INT0

; Переход к процедуре

; обработчика

BEGIN:



MOV TCON, #01H





; Настройка контроллера на

; режим прерываний по

; заднему фронту сигнала

; на входе INT0




MOV IE, #81H

; Разрешение обработки

; прерываний по входу INT0




JMP $

; Остановка основной

; программы («команда

; перехода на саму себя»)

; для ожидания прерывания

EXT0:








; Подпрограмма обработки

; замыкания контакта




RETI

; Выход из процедуры

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



Следует отметить, что:

– режим прерывания целесообразно использовать для опроса особо важных датчиков с целью уменьшения времени реакции на исключительную ситуацию в объекте управления. При этом соответственно должна быть спроектирована схема;

– использование прерываний позволяет «избавить» основную программу от необходимости регулярно опрашивать и анализировать состояние порта, так как при использовании прерываний этот процесс реализован аппаратно, а «высвободившееся» время может быть использовано для выполнения других операций.

4.1.1.2Ожидание импульсного сигнала


Схема подключения датчика импульсного сигнала аналогична схеме на рисунке 4.1. Особенность процедуры ожидания импульсного сигнала состоит в том, что МК должен обнаружить не только факт появления, но и факт окончания сигнала.

Для программирования этой процедуры удобно воспользоваться рассмотренными выше примерами ожидания события (см. листинг 4.1), смонтировав их последовательно в линейную программу. Оформлять процедуры ожидания замыкания и размыкания контакта в виде отдельных подпрограмм нецелесообразно, так как это удлиняет программу, а следовательно, время исполнения программы, которое определяет минимальную длительность импульса, который может быть обнаружен программой.



а) отрицательный

б) положительный


Рисунок 4.2 – Формы импульса

Последовательность объединения процедур ожидания нуля и единицы зависит от формы импульса. Для отрицательного импульса (рисунок 4.2) процедура ожидания замыкания контакта предшествует процедуре ожидания размыкания, для положительного импульса – следует за ней.

Ниже приведены примеры программной реализации процедуры ожидания «отрицательного» импульсного сигнала при подключении датчика к разряду 3 порта P1 (листинг 4.3):


Листинг 4.3 – Программа регистрации отрицательного импульса




.ORG 0000H

; Адрес начала программы




SETB P1.3

; Настройка разряда 3

; порта P1 на ввод сигнала

MAIN:

JB P1.3, $

; Ожидание логического «0»




JNB P1.3, $

; Ожидание логической «1»






; Подпрограмма обработки

; импульса




JMP MAIN

; Переход на регистрацию

; следующего импульса



Аналогичным образом строится программа при подключении датчика положительного импульсного сигнала (листинг 4.4):


Листинг 4.4 – Программа регистрации положительного импульса




.ORG 0000H

; Адрес начала программы




SETB P1.3

; Настройка разряда 3

; порта P1 на ввод сигнала

MAIN:

JNB P1.3, $

; Ожидание логической «1»




JB P1.3, $

; Ожидание логического «0»






; Подпрограмма обработки

; импульса




JMP MAIN

; Переход на регистрацию

; следующего импульса

Программная реализация цикла ожидания накладывает ограничения на длительность импульса: импульсы длительностью меньше времени выполнения цикла ожидания могут быть «не замечены» МК. Минимально допустимые длительности импульсов определяются тактовой частотой процессора. Гарантирована регистрация событий, частота которых не превышает 1/24 частоты процессора.

Для обнаружения кратковременных импульсов можно использовать способ фиксации импульса на внешнем триггере флага (рисунок 4.3).





Рисунок 4.3 – Схема фиксации кратковременного импульса на триггере флага



На вход МК в этом случае поступает не кратковременный сигнал с датчика, а флаг, формируемый триггером. Триггер устанавливается по фронту импульса, а сбрасывается программным путем – выдачей специального управляющего воздействия (листинг 4.5). Длительность импульса при этом будет ограничена снизу только быстродействием триггера.



Листинг 4.5 – Программа регистрации кратковременного импульса, ориентированная на использование внешнего триггера




.ORG 0000H

; Адрес начала программы




SETB P1.3


; Настройка разряда 3

; порта P1 на ввод

; сигнала

BEGIN:

CLR P2.0

SETB P2.0

; Сброс триггера флага





JNB P1.3, $

; Ожидание логической «1»






; Подпрограмма обработки

; импульса




JMP BEGIN

; Переход на начало

; программы

4.1.2Устранение дребезга контактов





Рисунок 4.4 – Переходные процессы при дребезге контактов




Рисунок 4.5 – Схема подавления дребезга контактов

При работе МК с датчиками, имеющими механические или электромеханические контакты (кнопки, клавиши, реле и т.п.), возникает явление, называемое дребезгом контактов (рисунок 4.4). Это явление заключается в том, что при замыкании контактов возможно появление отскока контактов, которое приводит к переходному процессу. При этом сигнал с контакта может быть прочитан МК как случайная последовательность нулей и единиц. Подавить это нежелательное явление можно схемотехническими средствами с использованием буферного триггера (рисунок 4.5), но чаще это делается программным путем.

Наибольшее распространение получили два программных способа ожидания установившегося значения:

1) подсчет заданного числа последовательно совпадающих значений сигнала;

2) временная задержка.

Блок-схемы процедур подавления помех от дребезга контактов при вводе сигнала логического 0 показаны на рисунке 4.6.

В первом способе число N подбирается экспериментально для каждого типа используемых датчиков в зависимости от частоты кварцевого резонатора МК и лежит, как правило, в пределах от 5 до 50.

Устранение дребезга контакта путем введения временной задержки заключается в следующем. Программа, обнаружив замыкание контакта, запрещает опрос состояния этого контакта на время, заведомо большее длительности переходного процесса, после чего вновь проверяет наличие замыкания. Если замыкание не подтвердилось, делается вывод о случайной помехе и процесс опроса повторяется. Временная задержка (в пределах 1–10 мс) подбирается экспериментально для каждого типа датчиков. Подробное описание реализации временных задержек приведено в п. 4.3.




а) путем многократного считывания;
б) с использованием временной задержки


Рисунок 4.6 – Блок-схемы процедур подавления дребезга контактов

Примеры программ устранения дребезга контактов первым и вторым способом приведены в листингах 4.6, 4.7 соответственно.


Листинг 4.6 – Программа устранения дребезга контактов путем
многократного считывания

; Пример программного подавления дребезга контакта приводится

; для случая, когда датчик импульсного сигнала подключен к входу

; Р3.4 (Т0), счет «удачных» опросов ведется в регистре RЗ, N=20.

; При замыкании на вход Р3.4 поступает логический 0.




.ORG 0000H

; Адрес начала программы




SETB P3.4

; Настройка разряда 4

; порта P3 на ввод сигнала

BEGIN:

NEXT:

MOV R3, #20

JB P3.4, BEGIN


DJNZ R3, NEXT

; Инициализация счетчика

; Если контакт разомкнут,

; (Р3.4=«1»), то переход к

; инициализации счётчика

; Иначе декремент

; счётчика и проверка его

; на равенство нулю. Если

; R3=0, то выход из цикла,

; иначе – переход на опрос

; разряда порта






; Подпрограмма обработки

; нажатия кнопки




JMP BEGIN

;Переход на начало

; программы



Листинг 4.7 – Программа устранения дребезга контактов путем
введения временной задержки

; Программа написана для случая подключения датчика к входу Т0.

; Временная задержка реализуется подпрограммой DELAY.

; Длительность временной задержки определяется числом,

; загружаемым в регистры R1:R0.

; При замыкании на вход Т0 поступает логический 0.




.ORG 0000H

; Адрес начала программы




SETB T0

; Настройка разряда 4

; порта P3 на ввод сигнала

BEGIN:

JB T0, $


CALL DELAY

; Ожидание замыкания

; контактов


; Вызов процедуры,

; реализующей временную

; задержку




JB T0, BEGIN

; Повторная проверка

; замыкания контактов

; после паузы. Если нет

; замыкания, то на начало






; Подпрограмма обработки

; нажатия кнопки




JMP BEGIN

; Переход на начало

; программы

; Процедура временной задержки

DELAY:



PUSH 0

PUSH 1

MOV R1, #7Fh

; Сохранение в стеке

; регистров R0 и R1

; Загрузка старшего байта

WAIT:

MOV R0, #FFh


DJNZ R0, $


DJNZ R1, WAIT


POP 1

POP 0


; Загрузка младшего байта

; счетчика R1:R0

; Декрементирование

; младшего байта счётчика

; и переход на эту же

; команду, если R00

; Декрементирование

; старшего байта счётчика

; и переход на метку WAIT,

; если R10

; Восстановление из стека

; регистра R0

; Восстановление из стека

; регистра R1




RET

; Выход из процедуры

4.1.3Подсчет числа импульсов

4.1.3.1Подсчет числа импульсов за интервал времени между двумя событиями


Типовую процедуру подсчёта числа импульсов между двумя событиями удобно проиллюстрировать на конкретном примере.

Предположим, что необходимо подсчитать число деталей, сошедших с конвейера от момента его включения до момента выключения. Факт схода детали с конвейера фиксируется фотоэлементом, на выходе которого формируется импульсный сигнал положительной полярности, а факт работы конвейера подтверждается логической единицей на входе INT1 микроконтроллера (рисунок 4.7). Считается, что сигналы на входах INT1 и T1 без дребезга контактов.




Рисунок 4.7 – Схема контроля качества деталей


По окончании выполнения процедуры (листинг 4.8) в аккумуляторе фиксируется число деталей, представленное в двоично-десятич-ном коде.


Листинг 4.8 – Программа, реализующая подсчет числа импульсов за интервал времени между двумя событиями

; Для простоты реализации программы считается, что общее

; количество деталей не превышает 99.




.ORG 0000H

; Адрес начала программы




SETB INT1

SETB T1

; Инициализация входов

; INT1 и T1 на ввод сигнала




MOV A, #00h

JNB INT1, $

; Обнуление счётчика

; Ожидание включения

; конвейера

WAIT1:


WAIT0:

JNB INT1, EXIT


JNB T1, WAIT1


JNB INT1, EXIT


JB T1, WAIT0

; Проверка работы

; конвейера. Если конвейер

; отключен, то выход из

; процедуры

; Проверка наличия

; логической «1» на выходе

; фотодатчика

; Проверка работы

; конвейера

; Проверка наличия

; логического «0» на

; выходе фотодатчика




INC A

DA A

; Увеличение счётчика

; Десятичная коррекция



EXIT:

SJMP WAIT1



; Продолжение счета

; Завершение

; процедуры



Процедура подсчета импульсов может быть реализована иначе, если вход T1 рассматривать как вход таймера-счётчика, а вход INT1 как вход контроллера прерываний (листинг 4.9).


Листинг 4.9 – Программа, реализующая подсчет числа импульсов за интервал времени между двумя событиями с использованием аппаратных средств микроконтроллера




.ORG 0000h

JMP BEGIN


.ORG 0013h


JMP STOP

; Адрес начала программы

; Переход к основной части

; программы

; Адрес обработчика

; прерываний по входу INT1

; Переход на процедуру

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

BEGIN:

SETB INT1

SETB T1

CLR 20h.0


MOV IE, #00h

MOV TCON, #04h


MOV TMOD, #E0h


MOV TL1, #00h

SETB TR1

MOV IE, #84h

JNB 20h.0, $



; Инициализация входов INT1

; и T1 на ввод сигнала

; Очистка флага состояния

; конвейера (флаг переходит ; в состояние логической

; единицы при остановке

; конвейера)

; Запрет всех прерываний

; Настройка режима

; прерывания (по спаду

; сигнала на входе INT1)


; Настройка таймера T/C1

; на счёт внешних событий

; при единичном состоянии

; входа INT1

; Обнуление счетчика

; Разрешение счета

; Разрешение прерываний по

; входу INT1

; Ожидание запуска и

; последующей остановки

; конвейера

STOP:



CLR TR1

MOV IE, #00h

SETB 20h.0


RETI



; Остановка счетчика

; Запрещение прерываний

; Установка флага

; состояния конвейера

; Выход из прерывания



После остановки конвейера в регистре TL1 в двоичном виде будет храниться количество деталей.

Преимущество счёта данным способом заключается в том, что при автономной работе периферийных устройств (таймер-счётчика и контроллера прерываний), процессор может выполнять другую «полезную» работу, лишь изредка проверяя флаг состояния конвейера.

4.1.3.2Подсчет числа импульсов за заданный промежуток времени


При решении задачи преобразования числоимпульсного кода в двоичный код, а также в ряде других задач может потребоваться подсчёт числа импульсов N за заданный интервал времени (t1, t2) (рисунок 4.8).




Рисунок 4.8 – Иллюстрация к задаче подсчета числа импульсов
за заданный промежуток времени


Эта процедура может быть реализована четырьмя различными способами:
  • программной реализацией временного интервала и программным подсчетом числа импульсов на входе МК;
  • программной реализацией временного интервала и аппаратным подсчетом числа импульсов (на внутреннем таймере-счетчике);
  • аппаратной реализацией временного интервала и программным подсчетом числа импульсов;
  • аппаратной реализацией временного интервала с аппаратным подсчетом числа импульсов.

Первый способ неэффективен и значительно сложнее других, а потому не рассматривается.

При аппаратной реализации подсчета числа событий импульсный датчик должен быть подключен ко входу одного из таймеров (в приведённом примере программы (листинг 4.10) используется вход T1).


Листинг 4.10 – Программа подсчёта числа импульсов за заданный промежуток времени с использованием аппаратного счётчика импульсов




.ORG 0000h

JMP BEGIN

; Адрес начала программы

; Переход к основной части

; программы

BEGIN

SETB T1


MOV IE, #00h

MOV TMOD, #50h


MOV TL1, #00h

MOV TH1, #00h

SETB TR1

CALL DELAY


CLR TR1



; Инициализация входа T1 на

; ввод сигнала

; Запрет всех прерываний

; Настройка таймера T/C1

; на счёт внешних событий

; Очистка регистров

; счётчика

; Разрешение счёта

; Вызов процедуры,

; реализующей временную

; задержку

; Остановка счёта


Подсчет импульсов производится счетчиком событий, а отсчет заданного временного интервала – процедурой DELAY (см. листинг 4.7). Результат сохраняется в регистровой паре TH1:TH0.

При аппаратной реализации отсчета временного интервала используется один из таймеров микроконтроллера. Счёт импульсов реализуется программно (листинг 4.11):


Листинг 4.11 – Программа подсчёта числа импульсов за заданный промежуток времени с использованием аппаратного счётчика времени

T:


N:


F:


ST:


.EQU 0.025


.EQU 40


.EQU 24000000


.EQU 65536-T*F/12


; Требуемый интервал

; времени от

; момента запуска таймера ; до его переполнения

; Необходимое количество

; прерываний от таймера

; Величина T*N – время

; счёта

;Частота кварцевого

; резонатора (24 МГц),

; подключаемого к

; микроконтроллеру

; Число, загружаемое в

; регистровую пару TH0:TL0




.ORG 0000h

JMP BEGIN


.ORG 000Bh


JMP TIMER

; Адрес начала программы

; Переход к основной

; программе

; Адрес обработчика

; прерываний от таймера

; Переход к процедуре

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

BEGIN:


C1:


C2:


STOP:

MOV IE, #00h


SETB T1


MOV R0, #00h


MOV A, #N


MOV TMOD, #01h


MOV TL0, #
MOV TH0, #>ST


MOV IE, #82h


SETB TR0


JNB TR0, STOP


JB T1, C1


INC R0


JNB TR0, STOP


JNB T1, C2


JMP C1




; Запрет всех прерываний


; Инициализация входа T1 на

; ввод сигнала

;Обнуление счетчика

; импульсов

; Загрузка счетчика

; прерываний от таймера

; Настройка таймера T/C0

; на счёт по модулю 16

; внутренней частоты

; Загрузка таймера


; Разрешение прерывания,

; генерируемого таймером

; Разрешение счёта


; Проверка флага

; разрешения счёта таймера

; Ожидание заднего фронта

; одного из подсчитываемых

; импульсов

; Увеличение счётчика

; импульсов

; Проверка флага

; разрешения счёта таймера

; Ожидание переднего

; фронта одного из

; подсчитываемых

; импульсов

; Переход к циклу ожидания

; следующего импульса

; Выход из процедуры

; После выхода из процедуры результат будет сохранен в
; регистре R0


; Обработчик прерываний, генерируемых таймер-счетчиком T/C0

TIMER:


TEXIT:

MOV TL0, #
MOV TH0, #>ST

DJNZ A, TEXIT


CLR TR0


MOV IE, #00h

RETI

; Загрузка таймера


; Декрементирование

; счётчика прерываний


; и переход на метку TEXIT,

; если A0

; Сброс флага разрешения

; счета

; Запрет прерываний

; Выход из прерывания



В приведённой программе время счёта (t2–t1) составляет 1 секунду. Значения T и N выбирались из следующих соображений: для отсчёта 1 с необходимо, чтобы произведение Т×N=1. При частоте кварцевого резонатора 24 МГц таймер ведет счет импульсов внутреннего генератора, частота которых 2 МГц. Время отсчёта (с) 65536 периодов внутреннего генератора составляет:

.

Целого числа, умножение которого на 0,032768 составит 1, не существует, поэтому из интервала выбирается максимальное число, умножение которого на целое число составит 1. Очевидно, что одним из вариантов будет комбинация: T = 0,025, N=40.

Четвертый способ подсчета числа импульсов может быть реализован двумя способами:

– с использованием двух таймеров-счётчиков (один для генерации интервала времени, другой – для счёта внешних импульсов);

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

Первый способ позволяет полностью «разгрузить» процессор микроконтроллера. Этот способ является сочетанием двух предыдущих (листинг 4.10 и 4.11).

Второй способ аппаратной регистрации импульсов представлен листингом 4.12.


Листинг 4.12 – Программа подсчёта импульсов за заданный интервал времени с использованием внутреннего контроллера прерываний

T:


N:


F:


ST:


.EQU 0.025


.EQU 40


.EQU 24000000


.EQU 65536-T*F/12


; Интервал времени от

; момента запуска таймера ; до его переполнения

; Необходимое количество

; прерываний от таймера

; Величина T*N – время

; счёта

;Частота кварцевого

; резонатора (24 МГц),

; подключаемого к

; микроконтроллеру

; Число, загружаемое в

; регистровую пару TH0:TL0




.ORG 0000h

JMP BEGIN


.ORG 0003h


INC DPTR


RETI


.ORG 000Bh

JMP TIMER



; Адрес начала программы

; Переход к основной

; программе

; Адрес обработчика

; прерываний по входу INT0

; Увеличение счётчика

; импульсов

; Выход из обработчика


; Адрес обработчика

; прерываний от таймера

; Переход к процедуре

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

BEGIN:



MOV IE, #00h

SETB INT0


MOV DPTR, #0000h


MOV A, #N


MOV TMOD, #01h


MOV TL0, #
MOV TH0, #>ST

SETB TR0

MOV TCON, #01h


MOV IE, #83h


JB TR0, $




; Запрет всех прерываний

; Инициализация входа INT0

; на ввод сигнала

;Обнуление счетчика

; импульсов

; Загрузка счетчика

; прерываний от таймера

; Настройка таймера T/C0

; на счёт по модулю 16

; внутренней частоты

; Загрузка регистров

; счётчика

; Разрешение счёта

; Настройка контроллера

; прерываний на режим

; срабатывания по спаду

; сигнала на входе INT0


; Разрешение прерываний,

; генерируемых таймером и

; внешним источником

; Проверка флага

; разрешения счёта таймера

; Выход из подпрограммы

; счета

; Обработчик прерываний, генерируемых таймером-счетчиком T/C0

; приведен в листинге 4.11



В данной программе счетчик внешних импульсов представлен регистром DPTR. Подсчитываемые импульсы должны подаваться на вход INT0.

4.1.4Опрос группы двоичных датчиков


Микроконтроллеры чаще всего имеют дело не с одним датчиком, как в рассмотренных выше примерах, а с группой двоичных датчиков (например, рисунок 4.9).







Рисунок 4.9 – Схема подключения группы двоичных датчиков



При этом МК может выполнять процедуру опроса датчиков и передачи управления отдельным подпрограммам в зависимости от кода, формируемого группой датчиков.

Можно отметить два наиболее часто встречающихся случая работы с группой датчиков:
  • ожидание заданного кода (листинг 4.13);
  • анализ кода с передачей управления одной из подпрограмм в зависимости от полученного значения (листинг 4.14).

Листинг 4.13 – Программа ожидания заданного кода

; Программа реализована для случая подключения группы из

; восьми взаимосвязанных статических датчиков к входам порта P1.

CODE:

.EQU 10101010h

; Ожидаемый код



STOP:

.ORG 0000h

MOV P1, #FFh

MOV A, P1


CJNE A, #CODE, STOP




; Адрес начала программы

; Настройка порта P1 на ввод

; Считывание в аккумулятор

; данных из порта P1

; Переход к следующему опросу,

; если считанное значение не

; совпадает с заданным кодом




Листинг 4.14 – Программа анализа кода с передачей управления одной из подпрограмм в зависимости от полученного значения

; Программа реализована для случая подключения трех датчиков

; к разрядам 0–2 порта P1. В зависимости от принятого кода

; управление передается одной из подпрограмм PROG0–PROG7.



TABEL:


PROG1:


PROG8:

.ORG 0000h

MOV SP, #30h

MOV DPTR, #TABEL


MOV P1, #FFh

MOV A, P1


ANL A, #00000111b


RL A

PUSH A


MOVC A, @A+DPTR


MOV 0, A


POP A


INC A


MOVC A, @A+DPTR


MOV DPH, 0

MOV DPL, A


MOV A, #00h


JMP @A+DPTR


.DW PROG1, PROG2

.DW PROG3, PROG4

.DW PROG5, PROG6

.DW PROG7, PROG8







; Адрес начала программы

; Переопределение дна стека

; В регистр DPTR заносится

; адрес таблицы с адресами

; подпрограмм *

; Настройка порта P1 на ввод

; Чтение в аккумулятор данных ; из порта P1

; Принудительное обнуление

; незначащих разрядов

; Умножение значения на 2 **

; Сохранение в стеке

; содержимого аккумулятора

; Чтение из таблицы старшего

; байта адреса подпрограммы

; Сохранение в ячейке 0

; считанного значения

; Восстановление из стека

; содержимого аккумулятора

; Инкремент аккумулятора


; Чтение из таблицы младшего

; байта адреса подпрограммы

; Помещение в регистровую

; пару DPH:DPL=DPTR

; младшего и старшего байтов

; адреса подпрограммы

; Формирования смещения

; подпрограммы

; Переход к подпрограмме


; Таблица адресов подпрограмм


; Подпрограммы

; PROG1–PROG8


; * – таблица адресов подпрограмм располагается по адресу,

; которому соответствует метка TABEL. Таблица состоит из

; двухбайтовых адресов подпрограмм. Содержимое таблицы

; представлено следующим образом:

;

A

A+1

A+2

A+2

A+4

А+5

A+6



;

СБA1

МБА1

СБA2

МБА2

СБA

МБА3

СБA4

; где A – адрес таблицы адресов подпрограмм

; СБА1 – старший байт адреса подпрограммы 1

; МБА1 – младший байт адреса подпрограммы 1

; СБА2 – старший байт адреса подпрограммы 2

; МБА2 – младший байт адреса подпрограммы 2

; и т.д.

; ** – команда поразрядного сдвига влево равносильна умножению на 2

4.1.5Ввод информации с матричной клавиатуры


Во многих применениях МК работают автономно по заранее заданной программе без вмешательства человека. Наряду с этим существуют микроконтроллерные системы, включающие в контур управления человека-оператора. Типичным средством ввода информации в этом случае является клавиатура.

Наиболее широкое распространение получили матричные клавиатуры. Клавиатуры, построенные данным способом, представляют
матрицу двоичных переключателей требуемой размерности (рисунок 4.10).

Линии порта P1 используются для выбора одной из строк клавиатуры, а линии порта P2 – для опроса состояний клавиш этой строки. Каждая клавиша в такой матрице имеет свой номер, соответствующий ее местоположению. Диоды, включенные в данную схему, обеспечивают защиту от замыкания между собой строк в случае одновременного нажатия более чем одной клавиши в разных строках и тем самым снижают нагрузку на активный выход порта Р1.




Рисунок 4.10 – Схема построения матричной клавиатуры


Обслуживание матричной клавиатуры состоит из последовательности процедур:

– сканирования матрицы клавиш;

– устранения дребезга контактов при нажатии клавиши (для некоторого типа клавиатур может отсутствовать);

– ожидания отпускания клавиши;

– устранения дребезга контактов при отпускании клавиши (для некоторого типа клавиатур может отсутствовать);

– идентификации кода нажатой клавиши.

Программа обслуживания клавиатуры может быть реализована следующим образом (листинг 4.15):


Листинг 4.15 – Программа обслуживания клавиатуры

; Назначение регистров в программе:

; R0 – счетчик линий (хранит код, посылаемый в линии стробирования)

; R1 – код предыдущего нажатия

; R2 – счетчик повторений

; Программа не отслеживает нажатие нескольких клавиш

; одновременно в разных строках матрицы.




.ORG 0000H

; Адрес основной программы




JMP BEGIN

; Переход к основной программе




.ORG 000BH

; Адрес обработчика прерываний ; от таймера T0




JMP TIMER0

; Переход к процедуре

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

; Начало основной программы

BEGIN:










MOV IE, #00H

; Запрет всех прерываний




MOV TMOD, #02H

; Настройка таймера в режим

; перезагрузки




MOV TL0, #FFH

; Инициализация




MOV TH0, #FFH

; таймера




MOV R0, #11111110B

; Иницализация счетчика линий




MOV P1, R0

; Активация строки




MOV P2, #FFH

; Настройка порта P2 на ввод




MOV IE, #82H

; Разрешение прерываний от

; таймера




SETB TR0

; Разрешение счета таймера

; Цикл ожидания нажатия

WAIT:










CJNE A, #FFH, OK

; Если клавиша нажата
; (А!=FFh),








; то переход к обработке

; нажатия,







; иначе переход к ожиданию




JMP WAIT




; Обработчик нажатия

; О том, какая комбинация нажата, судится по R0 и A
; соответственно


OK:










MOV A, #FFH







JMP WAIT




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

TIMER0:










MOV A, P2

; Чтение кода из порта P2




ANL A, #0FH

; Выделение значащих бит 0–3




CJNE A, #0FH, PRESSED ; Если клавиша нажата







; (A!=0Fh),







; то перейти на метку PRESSED







; иначе осуществляем сдвиг
; сканирующего нуля





MOV A, R0

; Сдвиг нуля в счетчике




RL A

;линий на одну




MOV R0, A

; позицию




CJNE A, #F7H, NO_INIT ; Проверка предельного







; положения нуля




MOV R0, #FEH




NO_INIT:










MOV A, #FFH

; Клавиша не нажата




RETI

; Возврат в основную программу

; Обработка нажатия клавиши

PRESSED:










MOV R1, A;

; Помещаем в R1 код предыдущего ; нажатия

; Исключение дребезга

; Если в течение цикла проверки дребезга зафиксирован

; одинаковый код, то он считается истинным




MOV R2, #20

; Инициализация счетчика
; повторений


BNC_DWN:










MOV A, P2

; Чтение кода из порта P2




ANL A, #0FH

; Выделение значащих бит 0–3




CJNE A, 01, FLS_STRT ; Если считан другой код







;(A!=R1),







; то выходим из обработки
; нажатия





DJNZ R2, BNC_DWN ; Реализация цикла проверки







; дребезга





PUSH A


; Помещение в стек считанного ; кода

; Ожидание отпускания клавиш с исключением дребезга

; Если в течение цикла ни одна клавиша не нажата,

; то предположение, что все клавиши отпущены, истинно

BNC_UP_ERR:










MOV R2, #20

; Инициализация счетчика
; повторений


BNC_UP:










MOV A, P2

; Чтение кода из порта P2




ANL A, #0FH

; Выделение значащих бит 0–3




CJNE A, #0FH, BNC_UP_ERR ; Если клавиша нажата







; (A!=0Fh),







; то снова инициализируем

; счетчик,







; иначе исключаем дребезг




DJNZ R2, BNC_UP ; Реализация цикла проверки







; дребезга




POP A

; Извлечение из стека

; считанного кода




RETI

; Выход из прерывания

; (в А хранится считанный код)

; Выход из обработки нажатия, клавиша не нажата

FLS_STRT:










MOV A, #FFH







RETI




Контрольные вопросы
  1. Как настроить порт на ввод данных? Отдельный разряд порта.

Что подразумевается под событием для микроконтроллера?

Почему при регистрации импульса целесообразно использовать разряды 2 и 3 порта P3?

Каким образом можно организовать счет импульсов за интервал времени между двумя событиями?

Как организуется счет времени?

Чем отличается реальная кнопка от идеальной? Каким образом возможно подавление дребезга? Какой из этих способов предпочтительнее?

Как организуется регистрация коротких импульсов?

Каков алгоритм обработки матричной клавиатуры? Необходима ли при этом обработка дребезга?