Лабораторная работа №8 (Вариант №2)
Режимы пониженного энергопотребления МК80С31
Цельработы: Получение практических навыков программирования режимов пониженного энергопотребления МК80С31.
Задание для варианта №2: Написать программу, осуществляющую опрос кнопки, подключённой к P1.0. Период подключения равен 1мс. Алгоритм опроса должен обеспечить защиту от дребезга контактов кнопки (сигнал считается достоверным, если он не изменился в течение пяти опросов). Достоверное состояние кнопки должно быть выведено через P1.1.
Схема подключения кнопки SW1:
Блок-схема алгоритма программы:
Листинг программы
BState EQU 30h ;временная переменная для хранения состояния кнопки
Five EQU 31h ;переменная для организации цикла из пяти итераций
ORG 0h ;адрес старта по сигналу RST
ajmp Start ;переход на метку Start
ORG 0Bh ;прерывание встроенного таймера/счетчика 0
ljmp IntT0 ;вызов подпрограмы обработки прерывания IntT0
ORG 30h
;тело программы
Start:
mov IE, #10000010b ;разрешаем прерывание только встроенного таймера/счетчика 0
mov TMOD, #01h ;0-й таймер: 16-разрядный
mov TH0, #0FCh ;период таймера = 1мс
mov TL0, #017h ;FC17 = 64535 = (65535 - 1000)
setb TR0 ;включаем нулевой таймер
mov Five, #5 ;инициализируем счётчик опросов
mov B, P1 ;считываем состояние P1 в B
setb IDL ;переводим МК в режим холостого хода
;подпрограмма обработки прерывания от таймера/счетчика 0
IntT0:
djnz Five, Skip ;если 5 опросов ещё не произошло возвращаемся из прерывания
mov Five, #5 ;инициализируем счётчик опросов
mov A, #1 ;копируем в аккумулятор 1
anl A, P1 ;A = A AND P1 = [0/1] (P1.0 = 0 => A = 0; P1.0 = 1 => A = 1;)
anl B, #1 ;B = B AND 1 = [0/1]
mov BState, A ;копируем текущее состояние P1.0 из аккумулятора в State
xrl A, B ;A = A XOR B = [0/1] (A = 0 => состояния совпадают; A = 1 =>
;состояния не совпадают;)
mov B, P1 ;считываем состояние P1 в B
jnz Skip ;если состояния не совпадают, возвращаемся
mov A, BState ;копируем состояние кнопки в аккумулятор для операции
;побитового сравнения
jb ACC.0, SetP11 ;если нулевой бит A равен 1, устанавливаем бит P1.1
jmp ResetP11 ;если нулевой бит A равен 0, сбрасываем бит P1.1
SetP11:
setb P1.1 ;устанавливаем P1.1
jmp Skip ;возвращаемся из прерывания
ResetP11:
clr P1.1 ;сбрасываем P1.1
Skip:
clr TF0 ;сбрасываем флаг переполнения таймера
mov TH0, #0FCh ;заново инициализируем
mov TL0, #017h ;таймер
reti ;возврат из прерывания
end
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.