Исследование таймеров/счетчиков микроконтроллера МК51. Программа формирования импульса, страница 2

В программах управления и контроля часто требуется реализовать временные задержки. Это удобно сделать с помощью таймеров. В микроконтроллерах семейства МК51 счетные импульсы  на входы таймеров поступают от генератора тактовых импульсов через делитель на 12. Частота тактовых импульсов fclk равна частоте внешнего резонатора fxtal. Таким образом, частота счетных импульсов на входе таймера равна  fсч = fclk/12 или fсч = fxtal/12. При типовой частоте резонатора 12 МГц тактовая частота равна 12 МГц, а частота счетных импульсов – 1 МГц. Соответственно период счетных импульсов равен 1 мкс. Для реализации временных задержек обычно используется режим 1. В этом режиме таймер – это 16-разрядный счетчик, который считает от 0 до 65535. Программно более удобно анализировать не текущее состояние таймера, а момент его переполнения, которое сигнализируется установкой флага переполнения TF и запросом прерывания. В этом случае таймер считает от 1 до 65536. При тактовой частоте fclk=12 Мгц время задержки может быть от 1 до 65536 мкс.  Если требуемое время задержки меньше 65536 мкс, то в таймер при инициализации необходимо загрузить число, которое в сумме с задержкой даст 65536. Например, надо реализовать задержку на 50 мс. Тогда в таймер первоначально необходимо загрузить число 65536 – 50000 = 15536 = 3CB0H. Если требуемое время задержки больше 65536 мкс, то можно считать количество переполнений таймера, используя любой свободный регистр микроконтроллера.

                              3.  Порядок  выполнения работы         

3.1. Рассмотрим методы формирования временной задержки с программным опросом флага переполнения таймера.

3.1.1. Допустим, что надо сформировать импульс низкого уровня длительностью 10 мс на выводе P1.7 микроконтроллера. Тактовая частота работы fclk = 12 МГц. Для формирования задержки используем таймер T/C0 в режиме 1. Число, которое необходимо загрузить в таймер при его инициализации:

65536 – 10000 = 55536 = D8F0H.

Программа формирования импульса может иметь вид:

TIMER_1:   MOV  TMOD,#01H  ; Режим 1 для T/C0

MOV  TH0,#0D8H    ; Загрузить старший байт

MOV  TL0,#0F0H     ; Загрузить младший байт

CLR  P1.7                   ; Вывод P1.7 ß 0

SETB  TR0                 ; Запустить таймер

COUNT:     JNB  TF0,COUNT      ; Ожидание переполнения таймера

SETB  P1.7                 ; Вывод P1.7 ß 1

CLR  TR0                   ; Остановить таймер

STOP:         JMP  STOP                 ; Зацикливание программы

END

Задание. В своем каталоге создайте файл с именем timer_1.asm. Запишите в него текст программы TIMER_1. Получите файлы timer_1.obj и timer_1.hex. Проверьте правильность работы программы с помощью отладчика AVSIM51. Обратите внимание, что после останова таймера флаг переполнения TF0 не сбрасывается.

Примечание.  Остановить работу программы можно нажатием клавиши F1. Для повторного запуска программы необходимо произвести начальную установку регистров микроконтроллера. Эти действия удобно выполнить командами (выбираемыми из командной строки):

Reset à Cpu

3.1.2. Допустим, что надо сформировать импульс на выводе P1.7 длительностью 40 мс. Будем полагать, что таймер обеспечивает задержку на 10 мс. Для получения задержки на 40 мс необходимо 4 раза запускать и останавливать таймер.

Программа формирования импульса в этом случае имеет вид:

TIMER_2:   MOV  TMOD,#01H  ; Режим 1 для T/C0

MOV  R7,#4              ; Загрузить счетчик переполнений таймера

CLR    P1.7                ; Вывод P1.7 ß 0

AGAIN:      MOV  TH0,#0D8H    ; Загрузить старший байт

MOV   TL0,#0F0H    ; Загрузить младший байт

SETB   TR0                ; Запустить таймер

COUNT:     JNB   TF0,COUNT    ; Ожидание переполнения таймера

CLR  TR0                   ; Остановить таймер

CLR  TF0                   ;  Сбросить флаг переполнения таймера

DJNZ  R7,AGAIN     ; Повторить цикл 4 раза

SETB  P1.7                ; Вывести P1.7 ß 1

STOP:         JMP  STOP                ; Зацикливание программы

END

Примечание. Конечно, выполнить задержку на 40 мс можно и без подсчета числа переполнений, так как таймер позволяет получить  65536 мкс за один проход. Программа TIMER_2 просто иллюстрирует метод получения больших задержек.

Задание.Получите файлы timer_2.asm, timer_2.obj, timer_2.hex. Проверьте правильность работы программы TIMER_2 с помощью отладчика AVSIM51. Наблюдайте за изменением содержимого регистра R7  и состояния вывода P1.7 порта в процессе работы программы.

                   Задание 1 для самостоятельной работы

Разработайте программу с именем TIMER_3, которая формирует на выводе порта P1.0 периодический сигнал с параметрами: длительность паузы (лог. 0) равна 30 мс, длительность импульса (лог. 1) равна 90 мс. Тактовая частота работы микроконтроллера – 12 МГц. Проверьте правильность работы программы с помощью отладчика.

3.2. Рассмотрим методы формирования временных задержек с использованием прерывания программы при переполнении таймера.