; Основная программа
call delay ; вызов подпрограммы задержки delay
delay ; подпрограмма временной задержки
movlw d’82’ ; загрузка константы H’L’ в регистр W
movwf COUNT1 ; пересылка содержимого W в регистр COUNT1
loopd
decfsz COUNT1,F ; декремент COUNT1, пропустить команду,
; если (COUNT1) = 0
goto loopd ; повторение цикла H’L’ раз
return
Задание 6.
Для формирования больших задержек времени, лежащих в диапазоне долей и единиц секунд, используются вложенные циклы. Рассмотрим пример формирования временной задержки с двумя вложенными циклами. Определим значение константы L для получения длительности задержки 20 мс. Эта задержка буде использоваться в дальнейших программах управления.
Время исполнения внутреннего цикла подпрограммы delay_2 составляет 3 * 256 + 4 машинных циклов МК, поэтому общая задержка составит
TD = [5 + (3 * 256 + 4) * L]* Tц.
При тактовой частоте Fosc = 2 МГц время цикла равно Тц = 2 мкс. Тогда
L=(TD – 707 Tц)/4 Tц =(20мс – 707*2мкс)|4*2мкс=2323
Основная программа:
call delay_2
delay_2
movlw 0x913 ; загрузка константы h’L’ в регистр W
movwf COUNT2 ; пересылка содержимого W в регистр COUNT2
clrf COUNT1 ; очистка регистра COUNT1
loopd
decfsz COUNT1,F ; декремент COUNT1
goto loopd ; повторение цикла 256 раз
decfsz COUNT2,F ; декремент COUNT2
goto loopd ; повторение цикла h’L’ раз
return ; возврат из подпрограммы
Задание 7.
Рассмотрим далее несколько программ с использованием подпрограмм формирования задержки времени. Допустим, необходимо разработать программу, которая подает звуковой сигнал на динамик BA1 при нажатии на кнопку SB1. Динамик будет звучать только в том случае, если на вывод RA0 будет подан периодически изменяющийся сигнал (например, типа «меандр»). Для того, чтобы звук был хорошо слышен, его частота должна находиться вблизи максимума слышимости человеческого уха. Выберем частоту звучания равной 1 КГц, что соответствует периоду следования импульсов сигнала 1 мс.
Основная программа:
loop
call get_RA ; вызов подпрограммы get_RA
call SB1_BA1 ; вызов подпрограммы SB1_BA1
goto loop ; переход на метку loop для повторения процесса
; Подпрограмма чтения состояния порта А
get_RA
movf PORTA,W ; Пересылка состояния порта A в регистр W
movwf TEMPA ; Пересылка содержимого W в регистр TEMPA
return
; Подпрограмма подачи звука на динамик BA1 при нажатии на кнопку SB1
SB1_BA1
BTFSS TEMPA,4 ; пропустить команду, если
; TEMPA,4 = 1 (кнопка не нажата)
goto met0
BSF PORTA,0 ;подача высокого уровня на RA0
call del05ms ; вызов подпрограммы задержки на 0,5 мс
BCF PORTA,1 ; подача низкого уровня на RA0
call del05ms ; вызов подпрограммы задержки на 0,5 мс
met0
return
#include "del05ms.asm"
Задание 8.
Рассмотрим программу, которая заставляет мигать светодиод VD1 при нажатии на кнопку SB1. Для того, чтобы мигания были хорошо видны, выберем их частоту равной 1 Гц (период 1 с).
Основная программа:
loop
call get_RA ; вызов подпрограммы get_RA
call SB1_VD1M ; вызов подпрограммы SB1_VD1M
goto loop ; переход на метку loop для
; повторения процесса
; Подпрограмма чтения состояния порта А
get_RA
movf PORTA,W ; Пересылка состояния порта A в регистр W
movwf TEMPA ; Пересылка содержимого W в регистр TEMPA
return
; Подпрограмма мигания светодиода VD1 при нажатии на кнопку SB1
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.