
;Настроить таймер на генерацию 5-миллисекундного интервала времени
MOV TH0, #HIGH(-5000) ;Загрузить старший байт таймера
MOV TL0, #LOW(-5000) ;Загрузить младший байт таймера
В рассмотренном исходном тексте программы используется двоичное представление управляющей константы. Это позволяет показать каждый отдельный бит константы, тем более, что разные биты управляют различными узлами таймера. Для того чтобы программа была более понятной, в комментарии поясняется назначение отдельных битов константы.
В исходном тексте программы, особенно при написании его под Windows, невозможно использовать символы псевдографики, поэтому для указания, к какому же из битов константы относится комментарий, используются символы "-" и "|". Для перехода от горизонтальной черты к вертикальной используется символ "+". В случае, когда для управления блоком таймера требуется несколько битов константы, в одной строке может быть использовано несколько символов "+".
При настройке таймера требуется загрузить 16-битную константу в счетчик таймера. Однако в системе команд микроконтроллера существуют только команды загрузки 8-битной константы. Для расщепления 16-битной константы на два отдельных байта в приведенном участке программы были использованы операторы выделения старшего и младшего байта HIGH и LOW соответственно. Эти функции присутствуют в большинстве языков программирования ассемблера, предназначенных для микроконтроллеров MCS-51. Если же язык программирования не содержит в своем составе подобные функции, то можно для выделения байтов воспользоваться операцией деления на 256:
MOV TH0, #-5000/256 ;Загрузить старший байт константы в старший байт таймера
MOV TL0, #-(5000–5000/256) ;Загрузить младший байт константы в младший байт таймера
Режим 1
В режиме 1 таймер работает как 16-разрядный счетчик. Этот режим похож на режим 0, за исключением того, что в регистрах таймера использует все 16 битов. В этом режиме регистры ТНх и TLx также включены последовательно друг за другом. Работе таймера Т0 или таймера T1 в режиме I соответствует схема, приведенная на рис. 6.15. На этой схеме изображен таймер Т0.

Рис. 6.15.Схема таймера Т0, работающего в режиме 1
В этом режиме можно обеспечить формирование интервала времени длительностью до 65536 мкс при частоте задающего генератора 12 МГц.
Рассмотрим пример использования таймера Т0 для формирования временного интервала 15 мс.

;Настроить таймер на генерацию 15-миллисекундного интервала времени
MOV TH0, #HIGH(-15000) ;Загрузить старший байт константы в старший байт таймера
MOV TL0, #LOW(-15000) ;Загрузить младший байт константы в младший байт таймера
OjidanTimer:
JNB TF0, OjidanTimer ;Подождать пока не переполнится таймер
В рассмотренном примере переполнение таймера произойдет через 15000 циклов процессора, т. е. при частоте тактового генератора микроконтроллера, равной 12 МГц, через 15 мс. Программа будет постоянно проверять состояние флага переполнения таймера и, как только он установится в единицу, перейдет к выполнению следующей команды. Это не самый лучший вариант использования таймера, но для иллюстрации его настройки для работы в режиме 1 вполне подходит.
Режимы 0 и 1 таймеров Т0 и T1 предназначены для формирования одиночного интервала времени. Если требуется формировать периодическую последовательность интервалов времени, то надо обеспечить программную загрузку регистров ТН0 и TL0 для задания нужного интервала времени, что для коротких интервалов времени может привести к значительным затратам процессорного времени.
Для формирования последовательности одинаковых интервалов времени используется режим работы таймера с перезагрузкой - режим 2.
Режим 2
В режиме 2 регистр таймера TL0 работает как 8-битный суммирующий счетчик с автоматической перезагрузкой начального значения из регистра ТН0. Переполнение счетчика TL0 не только устанавливает флаг TF0, но и снова загружает регистр TL0 содержимым ТН0. Перезагрузка таймера не изменяет содержимое регистра ТН0.
Для задания периода временных интервалов в регистр ТН0 записывается отрицательное число. Работе таймера 0 или таймера 1 в режиме 2 соответствует схема, приведенная на рис. 6.16. При этом первый период колебания будет произвольным, но в большинстве случаев это не важно. Если же первый период колебания важен, то кроме регистра ТН0 необходимо программно устанавливать значение регистра ТН1.

Рис. 6.16.Схема таймера Т0, работающего в режиме 2
Ниже приведен пример инициализации таймера в режиме 2 для генерации прямоугольного колебания с частотой 10 кГц (период 100 мкс) и скважностью 2.

;Настроить таймер на генерацию 50-микросекундного интервала времени-
MOV ТН0, #-50 ;Загрузить константу в старший байт таймера
MOV TL0, #-50 ;Загрузить константу в младший байт таймера
OjidanTimer:
JNB TF0, OjidanTimer ;Подождать пока не переполнится таймер
CPL P2.6 ;Проинвертировать сигнал на выводе 6 порта Р2
SJMP OjidanTimer ;Снова перейти к ожиданию окончания временного интервала
Режим 3
Таймер 1 при работе в режиме 3 просто хранит свое значение. Эффект такой же, как при сбросе бита TR1. Таймер 0 в режиме 3 представляет собой два раздельных 8-битных счетчика (регистры TL0 и ТН0). Регистр TL0 использует биты управления таймера 0: С/Т0, GATE0, TR0 и TF0.
Регистр ТН0 работает тоже в режиме отдельного таймера и использует биты TR1 и TF1 таймера 1. Логика работы таймера 0 в режиме 3 показана на схеме, приведенной на рис. 6.17.

Рис. 6.17. Логика работы таймера 0 в режиме 3
Работа таймера TL0 разрешена, если бит TR0 = 1, а таймера ТН0 - если бит TR1 = 1. Таймер 1 при работе таймера 0 в режиме 3 постоянно включен, т. к. он обычно при этом используется для синхронизации последовательного порта и работает в первом или втором режимах работы. Этот режим работы позволяет реализовать два независимых таймера, если таймер 1 используется для работы последовательного порта. Но надо сказать, что на практике, особенно после появления таймера 2 в ядре MCS-52, режим 3 мало интересен.
Управление таймерами/счетчиками
Схема управления таймерами 0 и 1 идентична и для таймера Т0 приведена на рис. 6.18. Для схемы управления таймером Т1 изменятся только номера управляющих битов (в их наименованиях 0 будет заменен на 1). В приведенной схеме заштрихованным прямоугольником обозначены внешние выводы микросхемы микроконтроллера.

Рис. 6.18.Схема управления таймерами
Из схемы видно, что таймер может включаться и выключаться битами TRx. Таким образом, можно уменьшать ток потребления микросхемы и уровень помех, создаваемый ею. Счетчики таймеров переключаются на высокой частоте, поэтому они могут потреблять до половины от общего тока потребления микроконтроллера. Следует отметить, что при включении и после сброса микроконтроллера работа таймеров запрещена.
Есть возможность управлять работой таймера извне при помощи внешнего вывода Т0 - для таймера Т0 или T1 - для таймера T1. Чтобы разрешить передачу сигнала Тх, необходимо записать в бит GATEx логическую единицу (не забыв при этом разрешить работу таймера при помощи бита TRx).
Кроме того, таймер может работать от внешнего генератора. Для этого в бит управления С/Т нужно записать логическую единицу.
Биты включения таймеров TR0 и TR1 размещены в регистре управления таймерами TCON, а биты GATE и С/Т - в регистре режима таймеров TMOD. Название регистра TCON образовалось при соединении двух слов: Timer - таймер и CONtrol - управлять. Формат регистра TCON рассматривался ранее, а формат регистра TCON и описание его отдельных битов приведен на рис. 6.19.