Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Что-то МК-51.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
605.7 Кб
Скачать
  • Порт P2 может быть использован для передачи старшего байта адреса при программировании внутреннего ППЗУ и при чтении внутренней памяти программ. Через порт Р2 выводится старший байт адреса А8 - А15 при работе с внешней памятью программ и внешней памятью данных (с 16- разрядным адресом). Во время доступа к внешней памяти содержимое регистра - защелки порта P2 не изменяется. Схема использования порта P2 в качестве шины адреса приведена на рисунке 2. При сбросе микросхемы во все разряды порта P2 записываются '1'.

    • Порт P3. Каждая линия порта Р3 имеет индивидуальную альтернативную функцию, которая может быть задействована простым обращением к устройству, соединенному с ножкой порта (например, для того чтобы был выработан строб WR, достаточно обратиться с внешней памяти командой MOVX @DPTR, A или MOVX @R0,A). Линии порта Р3 могут выполнять альтернативные функции только в том случае, если в соответствующие этим линиям разряды регистра записаны логические '1', иначе на линиях порта будет присутствовать '0' независимо от характера принимаемой или передаваемой информации. При сбросе микросхемы во все разряды порта записываются '1'.

    Р3.0 RxD - вход последовательного порта; Р3.1 TxD - выход последовательного порта; Р3.2 INT0 -используется как вход 0 внешнего запроса прерываний; Р3.3 INT1 -используется как вход 1 внешнего запроса прерываний; Р3.4 Т0 - используется как вход счетчика внешних событий 0; Р3.5 Т1 - используется как вход счетчика внешних событий 1; Р3.6 WR - строб записи во внешнюю память данных; Р3.7 RD - строб чтения из внешней памяти данных.

    Последовательный порт микроконтроллера 8051.

    Через универсальный последовательный порт осуществляются прием и передача информации, представленной в последовательном коде (младшими битами вперед). Наличие буферного регистра приемника позволяет совмещать операцию чтения ранее принятого байта с приемом очередного. Но если к моменту окончания приема байта предыдущий не был считан из SBUF, то он будет потерян. Работой последовательного порта управляют три регистра:

    • Регистр управления/статуса приемопередатчика SCON

    • Бит SMOD регистра управления мощностью PCON

    • Буферный регистр приемопередатчика SBUF

    Последовательный порт может работать в четырех различных режимах.

    • Режим 0. Синхронный режим . Информация передается, и принимается через вывод входа приемника RxD. Принимаются или передается 8 бит данных. Через вывод TxD выдаются импульсы синхронизации, которые сопровождают каждый бит. Скорость передачи фиксирована и составляет 1/12 Fген.

    • Режим 1. Асинхронный 8-ми битовый режим . Передаются (через TXD) или принимаются (через RXD) 10 бит: старт-бит (логический 0), 8 бит данных (младшим разрядом вперед) и стоп-бит (логическая 1). При приеме, стоп-бит поступает в бит RB8 регистра SCON. Скорость передачи в режиме 1 переменная: для управления скоростью передачи вы можете использовать таймер Т1 и/или Т2.

    • Режим 2. Асинхронный 9-ти битовый режим с фиксированной скоростью передачи. Передаются (через TXD) или принимаются (через RXD) 11 бит: старт-бит. 8 бит данных (младшим разрядом вперед), программируемый 9-й бит данных и стоп-бит. При передаче, в 9-й бит данных (бит ТВ8 регистра SCON) может быть записан логический 0 или 1, например, значение бита четности (бит Р регистра PSW). При приеме, 9-й бит данных поступает в бит RB8 регистра SCON. Присутствие стоп-бита контролируется схемой обнаружения ошибки кадра. Скорость передачи программируется и может быть равна либо 1/32, либо 1/64 частоты резонатора в зависимости от управляющего бита SMOD.

    • Режим 3. Асинхронный 9-ти битовый режим. совпадает с режимом 2 во всех деталях, за исключением частоты приема/передачи, которая задается таймером.

    Во всех четырех режимах передача начинается любой командой, которая использует SBUF как регистр-приемник. Прием в режиме 0 начинается при условии RI = 0, REN = 1. Прием в других режимах начинается с приходом старт-бита, если бит REN установлен.

    Регистр управления/статуса приемопередатчика scon

    Управление режимом работы приемопередатчика осуществляется через специальный регистр с символическим именем SCON. Этот регистр содержит не только управляющие биты, определяющие режим работы последовательного порта, но и девятый бит принимаемых или передаваемых данных (RB8 и ТВ8) и биты прерывания приемопередатчика (R1 и Т1).

    Функциональное назначение бит регистра управления/статуса приемопередатчика scon.

    Символ

    Позиция

    Имя и назначение

    SM0

    SCON.7

    Биты управления режимом работы приемопередатчика. Устанавливаются/сбрасываются программно см. примечание 1

    SM0

    SM1

    Режим работы приемопередатчика

    Сдвигающий регистр расширения ввода/вывода

    0

    1

    8 битовый приемопередатчик, изменяемая скорость передачи

    1

    0

    9 битовый приемопередатчик. Фиксированная скорость передачи

    1

    1

    9 битовый приемопередатчик, изменяемая скорость передачи

    SM1

    SCON.6

    SM2

    SCON.5

    Бит управления режимом приемопередатчика. Устанавливается программно для запрета приема сообщения, в котором девятьй бит имеет значение 0

    REN

    SCON.4

    Бит разрешения приема. Устанавливается/сбрасывается программно для разрешения/запрета приема последовательных данных

    TB8

    SCON. 3

    Передача бита 8. Устанавливается/сбрасывается программно для задания девятого передаваемого бита в режиме 9-битового передатчика

    RB8

    SCON.2

    Прием бита 8. Устанавливается/сбрасывается аппаратно для фиксации девятого принимаемого бита в режиме 9-битового приемника

    TI

    SCON. 1

    Флаг прерывания передатчика. Устанавливается аппаратно при окончании передачи байта. Сбрасывается программно после обслуживания прерывания

    RI

    SCON.0

    Флаг прерывания приемника. Устанавливается аппаратно при приеме байта. Сбрасывается программно после обслуживания прерывания

    Прикладная программа путем загрузки в старшие биты регистра SCON двухбитного кода определяет режим работы приемопередатчика. Во всех четырех режимах работы передача инициализируется любой командой, в которой буферный регистр SBUF указан как получатель байта. Как уже отмечалось, прием в режиме 0 осуществляется при условии, что R1 = 0 и REN = 1, в остальных режимах - при условии, что REN = 1.

    В бите ТВ8 программно устанавливается значение девятого бита данных, который будет передан 8 режиме 2 или 3. В бите RB8 в этих режимах фиксируется девятый принимаемый бит данных. В режиме 1 в бит RB8 заносится стоп-бит. В режиме 0 бит RB8 не используется.

    Флаг прерывания передатчика ТI устанавливается аппаратно в конце периода передачи стоп-бита во всех режимах. Соответствующая подпрограмма обслуживания прерывания должна сбрасывать бит TL.

    Флаг прерывания приемника RI устанавливается аппаратно в конце периода приема восьмого бита данных в режиме 0 и в середине периода приема стоп-бита в режимах 1, 2 и 3. Подпрограмма обслуживания прерывания должна сбрасывать бит RI.

    Скорость приема/передачи информации через последовательный порт

    Скорость приема/передачи, т.е. частота работы приемопередатчика в различных режимах, определяется различными способами.

    В режиме 0 частота передачи зависит только от резонансной частоты кварцевого резонатора f РЕЗ:

    f=fРЕЗ/12.

    За машинный цикл последовательный порт передает один бит информации. В режимах 1, 2 и 3 скорость приема/передачи зависит от значения управляющего бита SMOD в регистре специальных функций PCON.

    Регистр управления мощностью pcon

    Символ

    Позиция

    Наименование и функция

    SMOD

    PCON.7

    Удвоенная скорость передачи. Если бит установлен в 1, то скорость передачи вдвое больше, чем при SMOD = 0. По сбросу SMOD = 0.

     

    PCON.6

    Не используется

     

    PCON.5

    Не используется

     

    PCON.4

    е используется

    GF1 GF0

    PCON.3 PCON.2

    Флаги, специфицируемые пользователем (флаги общего назначения)

    PD

    PCON.1

    Бит пониженной мощности. При установке бита в 1 микро-ЭВМ переходит в режим пониженной потребляемой мощности

    IDL

    PCON.0

    Бит холостого хода. Если бит установлен в 1, то микро-ЭВМ переходит в режим холостого хода

    Примечание. При одновременной записи 1 в PD и IDL бит PD имеет преимущество. Сброс содержимого PCON выполняется путем загрузки в него кода 0XXX0000.

    В режиме 2 частота передачи определяется выражением

    f =2SMODfРЕЗ/64.

    Иными словами, при SMOD = 0 частота передачи равна 1/64 частоты fРЕЗ, а при SMOD = 1 - 1/32 частоты fРЕЗ.

    В режимах 1 и 3 в формировании частоты передачи, кроме управляющего бита SMOD, принимает участие таймер 1. При этом частота передачи f зависит от частоты переполнения f OVLT и определяется следующим образом:

    f=2SMODfOVTL1/32

    При использовании таймера 1 для тактирования последовательного порта прерывания от этого таймера должны быть запрещены. Таймер может быть использован как в режиме шестнадцатиразрядного таймера, так и в режиме таймера с автозагрузкой. Обычно используется режим таймера с автозагрузкой (старшая тетрада регистра TMOD = 0010В). При этом скорость передачи последовательного порта определяется выражением:

    f = 2SMODfРЕЗ/(32х12х(256 -ТН1)).

    Предельно низких скоростей приема и передачи по последовательному порту можно достичь при использовании таймера в режиме 1 (старший полубайт TMOD = 0001В). Перезагрузка 16-битного таймера должна осуществляться программным путем. При этом для того, чтобы можно было независимо от передачи выполнять дополнительные задачи, необходимо использовать механизм обработки прерываний и для этого разрешить прерывания от таймера 1.

    Настройка таймера 1 для управления скоростью работы последовательного порта.

    Частота приема/передачи (BAUD RATE)

    Частота резонатора МГц

    Таймер/счетчик 1

    SMOD

    С/Т

    Режим (MODE)

    Перезагружаемое число

    Режим 0, макс: 1 МГц

    12

    X

    X

    X

    X

    Режим 2, макс: 375 КГц

    12

    1

    X

    X

    X

    Режим 1, 3: 62,2 Кгц

    12

    1

    0

    2

    0FFH

    19,2 Кгц

    11,059

    1

    0

    2

    0FDH

    9,6 Кгц

    11,059

    0

    0

    2

    0FDH

    4,8 Кгц

    11,059

    0

    0

    2

    0FAH

    2,4 Кгц

    11,059

    0

    0

    2

    0F4H

    1,2 Кгц

    11,059

    0

    0

    2

    0F4H

    137,5 Гц

    11,059

    0

    0

    2

    1DH

    110 Гц

    6

    0

    0

    2

    72H

    110 Гц

    12

    0

    0

    1

    0FЕЕВН

    Отметим, что для старших моделей семейства MCS-51 при использовании для синхронизации последовательного порта таймеров 1 и 2 скорости приема и передачи информации по последовательному порту могут различаться.

    Режим 0. Синхронный последовательный порт.

    В нулевом режиме последовательный порт работает как обыкновенный сдвиговый регистр. Это позволяет использовать последовательный порт для увеличения количества внешних ножек микросхемы. Использование сдвиговых регистров для этой цели показано на рисунке 1 и 3. Передача по последовательному порту начинается после записи байта в регистр данных SBUF. Временная диаграмма сигнала, вырабатываемого последовательным портом микроконтроллера при передаче восьми бит данных приведена на рисунке 2. Приём байта по последовательному порту начинается после обнуления флага готовности приёмника RI. Временная диаграмма приёма входной информации последовательным портом в нулевом режиме приведена на рисунке 4.

    Рисунок 1. Использование нулевого режима работы последовательного порта в качестве расширителя портов.

    Рисунок 2. Временная диаграмма работы последовательного порта в нулевом режиме после записи передаваемого байта в регистр данных SBUF.

    Нулевой режим работы задаётся записью комбинации 00 в биты SM0 и SM1 регистра SCON. В синхронном режиме работы информация передается, и принимается через вывод входа приемника RxD, то есть в этом режиме работы последовательный порт работаем в симплексном режиме. Через вывод TxD выдаются импульсы синхронизации, которые сопровождают каждый информационный бит. Скорость передачи в этом режиме фиксирована и составляет 1/12*Fген. Это означает, что при частоте задающего генератора 24 МГц обмен данными осуществляется на скорости 2 мегабита в секунду.

    Для осуществления передачи байта данных достаточно занести его в буфер данных SBUF, как это показано в примере:

    MOV SCON, #0 ;Настроить последовательный порт на передачу в синхронном режиме

    MOV SBUF, A ;Передать содержимое аккумулятора по последовательному порту

    JNB TI, $ ;Подождать окончания передачи

    MOV SBUF, #56H ;Передать по последовательному порту число 56h

    JNB TI, $ ;Подождать окончания передачи

    Рисунок 3. Использование нулевого режима работы последовательного порта для ввода информации.

    Рисунок 4. Временная диаграмма приёма входной информации последовательным портом в нулевом режиме после обнуления флага готовности приёмника RI.

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

    ;Настроить режим работы последовательного порта-----------------------------------------------------------------------------------

    mov SCON,#00010000b ;настроить последовательный порт на нулевой режим работы

    ;||||||||

    ;|||||||+-------Обнулить флаг приёмника RI

    ;||||||+--------Обнулить флаг передатчика TI

    ;|||||+---------Обнулить девятый бит приёмника RB8

    ;||||+----------Обнулить девятый бит передатчика TB8

    ;|||+-----------Разрешить работу приёмника

    ;||+------------В синхронном режиме не имеет значения

    ;++-------------Включить синхронный режим работы последовательного порта

    ;Так как предыдущая команда обнуляет флаг RI то с этого момента начинается приём байта--------------------------------------------

    JNB RI, $ ;Подождать окончания приёма байта по последовательному порту

    MOV A, SBUF ;и скопировать его в аккумулятор

    Рисунок 5. Программа считывания одного байта из внешнего регистра по последовательному порту.

    В настоящее время разработано огромное количество микросхем таких как, например, синтезаторы частоты, микросхемы приёмников, блоков цветности телевизоров, микросхем памяти данных, управление которыми осуществляется по последовательному протоколу. При этом микросхемы обычно реализуют синхронные протоколы обмена SPI или I2C. Последовательный порт микроконтроллеров семейства MCS-51, работающий в нулевом режиме позволяет осуществлять обмен с такими микросхемами при минимальных программно-аппаратных затратах.

    Справедливости ради необходимо отметить, что в современных микросхемах семейства MCS-51 присутствуют отдельные последовательные порты, работающие по протоколу SPI или I2C. В качестве примера такой микросхемы можно назвать ADuC834 фирмы Analog Devices. В микросхемах с отдельными SPI или I2C портами последовательный порт используется исключительно для связи с универсальным компьютером.

    Режим 1. Асинхронный восьмиразрядный последовательный порт.

    В первом режиме работы последовательный порт работает в асинхронном режиме. Временная диаграмма передаваемых сигналов через последовательный порт в асинхронном режиме работы показана на рисунке 6. Первый режим работы задаётся записью комбинации 01 в биты SM0 и SM1 регистра SCON. В асинхронном режиме работы информация передается через ножку передатчика последовательного порта микроконтроллера TxD, а принимается через вывод входа приемника RxD, то есть в этом режиме работы последовательный порт работает в дуплексном режиме. Это означает, что передача и приём информации может вестись независимо друг от друга. Скорость передачи в этом режиме настраивается при помощи таймера T1.

    Рисунок 6. Временная диаграмма приёма или передачи информации последовательным портом в первом режиме работы.

    При работе в асинхронном режиме работы два микроконтроллера могут обмениваться информацией между собой. Такой способ обмена позволяет сократить до минимума количество соединительных проводов между блоками или даже отдельными устройствами. Единственное условие: в отличие от синхронного режима работы, скорости работы последовательных портов должны быть одинаковыми. Обычно используются стандартные скорости передачи, такие как 1200бит/с, 2400 бит/с и т.д. Для таких скоростей передачи обычно используется кварцевый резонатор с частотой 11.0592 МГц. Скорости передачи и коэффициенты, загружаемые в таймер 1, для этих скоростей передачи приведены в таблице 1.

    В отличие от нулевого режима работы в первом режиме работы возможен обмен информацией между двумя микроконтроллерами, а не только между микроконтроллером и исполнительными микросхемами. Схема соединения двух микроконтроллеров между собой для обмена информацией приведена на рисунке 7. Таким образом может быть построена простейшая многопроцессорная система.

    Рисунок 7. Схема обмена информацией между двумя микроконтроллерами по последовательному порту.

    В первом режиме работы, также как и в нулевом для передачи байта через последовательный порт достаточно скопировать его в буфер данных SBUF. Единственное отличие заключается в том, что, кроме настройки регистра SCON, необходимо настроить таймер для задания скорости передачи информации по последовательному порту. При приёме байта по последовательному порту приём начинается только после обнаружения стартового бита.

    В качестве примера работы с последовательным портом приведём подпрограмму инициализации последовательного порта для работы в асинхронном режиме на скорости 9600 бит/с. Настройка режима работы последовательного порта в этой программе производится записью двоичной константы в регистр управления SCON. Выбор конкретных значений бит двоичной константы подробно приводится в комментариях к программе.

    Так как для последовательного порта требуется таймер, то, кроме настройки последовательного порта, при помощи регистра выбора режима работы таймеров TMOD настраивается таймер T1. Эта настройка тоже производится при помощи записи двоичной константы.

    Скорость работы последовательного порта настраивается записью константы 0FDh в старший байт таймера T1.

    ;*********************************************************************************************************************************

    ;НАСТРОЙКА ПОСЛЕДОВАТЕЛЬНОГО ПОРТА

    ;*********************************************************************************************************************************

    ;Настроить режим работы последовательного порта-----------------------------------------------------------------------------------

    mov SCON,#01110000b ;настроить последовательный порт на первый режим работы

    ;||||||||

    ;|||||||+-------Обнулить флаг приёмника RI

    ;||||||+--------Обнулить флаг передатчика TI

    ;|||||+---------Обнулить девятый бит приёмника RB8

    ;||||+----------Обнулить девятый бит передатчика TB8

    ;|||+-----------Разрешить работу приёмника

    ;||+------------Проверять ошибку кадра (приём нулевого бита на месте стоп-бита)

    ;++-------------Включить асинхронный режим работы последовательного порта

    ;Настроить режим работы таймера T1 ----------------------------------------------------------------------------------------------

    anl TMOD,#00001111b ;Подготовить таймер T1 к настройке (таймер T0 не трогать!)

    orl TMOD,#00100000b ;перевести таймер T1 вo второй режим работы (таймер T0 не трогать!)

    ;||||

    ;||++--------------Перевести таймер T1 в режим автозагрузки

    ;|+----------------Синхронизироваться от внутреннего генератора

    ;+-----------------Запретить управление таймером от ножки INT1

    ;Настроить таймер на генерацию 3-x микросекундного интервала времени--------------------------------------------------------------

    mov TH0, #fdh ;Загрузить старший байт таймера

    mov TL0, #fdh ;Загрузить младший байт таймера

    setb TR1 ;Включить таймер 1

    ;*********************************************************************************************************************************

    ;РАБОТА С ПОСЛЕДОВАТЕЛЬНЫМ ПОРТОМ

    ;*********************************************************************************************************************************

    JNB RI, $ ;Подождать окончания приёма байта по последовательному порту

    MOV A, SBUF ;и скопировать его в аккумулятор

    Рисунок 8. Программа приёма одного байта по последовательному порту.

    Возможность работы в асинхронном режиме позволяет использовать последовательный порт для связи с универсальным компьютером через его последовательный COM порт. К сожалению уровни последовательного порта микроконтроллера не совпадают с уровнями последовательного порта компьютера, поэтому для подключения микроконтроллера к последовательному порту компьютера используются специализированные микросхемы согласования уровней. Эти же микросхемы обеспечивают защиту микроконтроллера от вывода из строя статическим потенциалом при подключении разъёмов.

    Обычно для работы используются только сигнальные цепи COM-порта компьютера. Тем не менее, оставшиеся буферы интерфейсной микросхемы могут быть использованы для контроля питания микроконтроллерной схемы. Типовая схема подключения компьютера к последовательному порту микроконтроллеров семейства MCS-51 с применением микросхемы ADM3202 приведена на рисунке 9.

    Рисунок 9. Подключение последовательного порта микроконтроллеров семейства MCS-51 к последовательному COM порту компьютера.

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

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

    В этом режиме последовательный порт работает на фиксированной скорости передачи также как и в нулевом режиме работы. Скорость передачи определяется значением бита SMOD и при частоте кварцевого резонатора 12 МГц составляет 375 кбит/с то есть для современных микроконтроллеров может превышать скорость передачи 1 Мбит/с.

    Основной особенностью работы последовательного порта в этом режиме является передача девятого информационного бита, который может быть использован для контроля достоверности передаваемой информации. Для вычисления чётности передаваемого байта можно воспользоваться аппаратным вычислителем, подключенным к аккумулятору микроконтроллера A. Результат вычисления чётности байта сохраняется в бите чётности P регистра PSW, откуда его можно скопировать в девятый информационный бит последовательного порта TB8, расположенный в регистре управления последовательным портом SCON.

    Ещё большие возможности для построения устройств предоставляет девятиразрядный режим работы при реализации многопроцессорных систем. Параллельные порты микроконтроллеров семейства MCS-51 построены по схеме с открытым стоком. Это позволяет объединять несколько выходов передатчиков в одну шину. Такое выполнение выходных каскадов микросхем облегчает построение многопроцессорных систем. В многопроцессорной системе один процессор должен быть главным (master), остальные - подчинёнными (slave). Естественно команды главного процессора должны восприниматься подчинёнными процессорами, поэтому выход передатчика главного процессора соединяется со входами приёмников подчинённых. Выходы же передатчиков подчинённых процессоров объединяются и подключаются ко входу приёмника главного процессора. Схема примера многопроцессорной системы приведена на рисунке 10.

    Рисунок 10. Схема соединения нескольких микроконтроллеров между собой по последовательному порту, работающему в асинхронном режиме.

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

    Рисунок 11. Временная диаграмма работы многопроцессорной шины.

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

    Режим 3. Асинхронный девятиразрядный последовательный порт.

    Работа последовательного порта в этом режиме не отличается от работы во втором режиме за исключением скорости передачи. Скорость передачи по последовательному порту задаётся таймером 1 также как и в первом режиме работы. Для построения программы можно воспользоваться примером, приведённым для первого режима работы с учётом того, что в регистре SCON необходимо задать вместо первого режима третий режим работы.

    Система команд микроконтроллеров MCS-51

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

    В этой системе команд реализована побитная, потетрадная (4 бита), побайтовая (8 бит) и 16-разрядная обработка данных. Микросхемы семейства MCS-51 - это 8-разрядные микропроцессоры, а это означает, что ПЗУ, ОЗУ, регистры специального назначения, АЛУ и внешние шины имеют байтовую организацию. Двухбайтовые данные используются только регистром-указателем (DPTR) и счетчиком команд (PC).

    В машинном коде команда занимает один, два или три байта в зависимости от типа адресации.

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

    Запись команд в машинных кодах для человека неудобна, кроме того, разные машинные команды выполняют одинаковые действия только над разными ячейками памяти. Поэтому для записи команд микропроцессоров была придумана система мнемонических обозначений. Для записи команды микропроцессора сначала ставится мнемоническое обозначение, затем указывается ячейка памяти – приёмник результата выполнения операции и наконец источник данных для выполнения операции. Например, в команде

    E535 MOV A, 35h

    символы MOV обозначают операцию копирования, второй операнд 35 определяет, что данные необходимо взять из 35 ячейки памяти, а первый операнд A определяет, что результат необходимо поместить в регистр – аккумулятор. При этом старое значение регистра – аккумулятора будет стёрто. Слева приведена машинная команда микроконтроллера в шестнадцатеричной записи, соответствующая мнемонической записи команды.

    Мнемоническое обозначение команды отделяется от операндов одним или несколькими символами пробела или табуляции, а операнды отделяются друг от друга запятыми.

    Если операция требует для выполнения двух источников и одного приёмника результата операции (например, команда сложения ADD или вычитания SUBB), то первый операнд является одновременно и источником и приёмником результата операции. Например, в команде

    2535 ADD A, 35h

    символы ADD обозначают операцию сложения двух чисел, данные будут взяты из 35 ячейки памяти и аккумулятора а результат будет помещён в аккумулятор вместо старого значения этого регистра.

    В таблице 1 приведены инструкции, влияющие на установку флагов микроконтроллера.

    Таблица 1

    Мнемоника

    Флаги

    Мнемоника

    Флаги

    C

    OV

    AC

    C

    OV

    AC

    ADD

    +

    +

    +

    CLR C

    0

     

     

    ADDC

    +

    +

    +

    CPL C

    +

     

     

    SUBB

    +

    +

    +

    ANL C, bit

    +

     

     

    MUL

    0

    +

     

    ANL C, /bit

     

     

     

    DIV

    0

    +

     

    ORL C, bit

    +

     

     

    DA

    +

     

     

    ORL C, /bit

    +

     

     

    RRC

    +

     

     

    MOV C, bit

    +

     

     

    RLC

    +

     

     

    CJNE

    +

     

     

    SETB C

    1

     

     

     

     

     

     

    Систему команд микроконтроллера условно можно разбить на пять групп:

    • арифметические команды

    • логические команды с байтовыми переменными

    • команды передачи данных

    • команды битового процессора

    • команды ветвления программ и передачи управления

    Арифметические команды

    В наборе команд микроконтроллера имеются следующие арифметические операции:

    • сложение ADD,

    • сложение с учетом флага переноса ADDC,

    • вычитание с заемом SUBB,

    • инкрементирование (увеличение на 1) INC,

    • декрементирование (уменьшение на 1) DEC,

    • десятичная коррекция DA,

    • умножение MUL

    • деление DIV.

    Действия производятся над целыми числами без знака.

    При операции умножения содержимое аккумулятора A умножается на содержимое регистра B, и результат размещается следующим образом: младший байт в регистре B, старший - в регистре А.

    В случае выполнения операции деления целое от деления помещается в аккумулятор A, остаток - в регистр В.

    Логические команды с байтовыми переменными.

    Система команд рассматриваемого микроконтроллера позволяет реализовать логические операции

    • И ( ANL),

    • ИЛИ ( ORL),

    • ИСКЛЮЧАЮЩЕЕ ИЛИ ( XRL).

    Логические операции выполняются над аккумулятором или непосредственно над портами ввода/вывода.

    Существуют логические операции, которые выполняются только на аккумуляторе:

    • сброс всех восьми разрядов A ( CLR A);

    • инвертирование всех восьми разрядов A ( CPL A );

    • циклический сдвиг влево и вправо без учета флага переноса ( RR A; RL A);

    • циклический сдвиг влево и вправо с учетом флага переноса ( RRC A; RLC A);

    • обмен местами старшей и младшей тетрад внутри аккумулятора ( SWAP A).

    Команды пересылки данных.

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

    • копирование данных во внутреннем ОЗУ: MOV;

    • обмен данными аккумулятора с внутренним ОЗУ: XCH, XCHD

    • копирование из внешней памяти данных: MOVX

    • копирование данных из памяти программ: MOVC

    Примеры использования команд пересылки данных:

    Любая ячейка 256- байтового блока внутреннего ОЗУ данных может быть выбрана с использованием косвенно-регистровой адресации через регистры указатели R0 и R1 (выбранного банка рабочих регистров):

    MOV A, @R0 ;Скопировать число из ячейки памяти с адресом, хранящемся в R0, в аккумулятор

    MOV @R1, A ;Скопировать число из аккумулятора, в ячейку памяти с адресом, хранящемся в R1

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

    MOV 15, 25 ;Скопировать содержимое 25-й ячейки  в 15-ю ячейку

    Таблицы символов (кодов), записанные в ПЗУ программы могут быть скопированы в аккумулятор с помощью команд передачи данных с косвенной адресацией:

    MOVC A, @A+DPTR ;Скопировать символ в аккумулятор

    Ячейка адресного пространства 64 Кбайт внешнего ОЗУ также может быть выбрана с использованием косвенно-регистровой адресации через регистр указатель данных DPTR:

    MOVX A, @DPTR ;Скопировать число из внешней ячейки памяти с адресом, ;хранящемся в DPTR, в аккумулятор

    Содержимое аккумулятора может быть обменено с содержимым рабочих регистров выбранного банка:

    XCH A, R0.

    Кроме того, любой бит с прямой адресацией может быть скопирован в бит переноса и наоборот:

    MOV C, AdrBit

    Битовые команды.

    Каждый бит из битового пространства внутренней памяти может быть установлен в 1, сброшен в 0, или инвертирован:

    • установить бит (записать логическую единицу) SETB;

    • сбросить бит (записать логический ноль) CLR;

    • проинвертировать значение бита (изменить на прямо противоположное) CPL;

    • бит может быть записан во флаг переноса или считан из флага переноса MOV.

    Могут быть реализованы переходы:

    • если бит установлен (содержит логическую 1) JB;

    • если бит не установлен (содержит логический 0) JNB;

    • переход, если бит установлен со сбросом этого бита после выполнения команды (запись в этот бит 0) JBC;

    Между любым битом из битового пространства внутренней памяти и флагом переноса могут быть произведены логические операции "И" или "ИЛИ".

    • И ( ANL),

    • ИЛИ ( ORL),

    Команды ветвления и передачи управления.

    Команды ветвления позволяют реализовывать условные операторы и операторы циклов. В микроконтроллерах семейства MCS-51 доступны следующие команды:

    • безусловный переход: LJMP, AJMP, SJMP

    • Вызов и возврат из подпрограммы: LCALL, ACALL, RET, RETI

    • проверка содержимого аккумулятора: JZ, JNZ, CJNE, JMP

    • проверка флага переноса С: JC, JNC

    • проверка содержимого любого бита в битовом пространстве: JB, JNB, JBC

    Команды 16-разрядных безусловных переходов и вызовов подпрограмм позволяют осуществить переход в любую точку адресного пространства памяти программ объемом до 64 Кбайт. Примеры команд:

    LJMP Metka ;Переход к команде, расположенной по адресу обозначенному меткой ‘Metka’

    LCALL Podprogramma ;Вызов подпрограммы по адресу, обозначенному меткой ‘Podprogramma’

    Команды 11-разрядных переходов и вызовов подпрограмм позволяют сократить объем программы, но при этом обеспечивают переходы только внутри программного модуля 2 Кбайт. Эти команды принципиально могут приводить к необнаруживаемым транслятором ошибкам, когда программный модуль размещается на двух соседних 2 Кбайтовых сегментах памяти.

    AJMP Metka ;Переход к команде, расположенной по адресу обозначенному меткой ‘Metka’

    ACALL Podprogramma ;Вызов подпрограммы по адресу, обозначенному меткой ‘Podprogramma’

    В системе команд имеются команды условных и безусловных переходов относительно начального адреса следующей команды в пределах от (РС)-127 до (РС)+127. Примеры команд:

    SJMP Metka ;Переход к команде, расположенной по адресу обозначенному меткой ‘Metka’

    JB P3.5, TstNxtUsl ;Если на 6 выводе порта P3 нулевой потенциал,

    ACALL Podprogramma ;то вызвать подпрограмму, обозначенную меткой ‘Podprogramma’

    CJNE A, #5, TstNxtUsl ;Если в аккумуляторе содержится число 5,

    ACALL Podprogramma ;то вызвать подпрограмму, обозначенную меткой ‘Podprogramma’

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

    MOV A, 34 ;Если в переменной, хранящейся в ячейке внутренней памяти 34

    JNB ACC_7, TstEQ5 ;число меньше нуля,

    CALL Podprogramma ;то вызвать подпрограмму, обозначенную меткой ‘Podprogramma’

    TstEQ5 ;------------------------------------------------------------------------------------------------------

    CJNE A,#5,TstLT5 ;Если в переменной, хранящейся в ячейке внутренней памяти 34 занесено число 5,

    CALL Podpr5 ;то вызвать подпрограмму, обозначенную меткой ‘Podpr5’

    TstLT5 ;------------------------------------------------------------------------------------------------------

    JNС TstGE5 ;Если в переменной, хранящейся в ячейке внутренней памяти 34 занесено число, меньшее 5,

    CALL PodprLT5 ;то вызвать подпрограмму, обозначенную меткой ‘PodprLT5’

    TstGE5 ;---------------------------------------------------------------------------------

    JC TstNxtUsl ;Если в переменной, хранящейся в ячейке внутренней памяти 34 занесено число, большее или равное 5,

    CALL PodprGE5 ;то вызвать подпрограмму, обозначенную меткой ‘PodprGE5’

    TstGT5 ;------------------------------------------------------------------------------------------------------

    CJNE A,#6,$+3 ;Если в переменной, хранящейся в ячейке внутренней памяти 34

    JC TstNxtUsl ;занесено число, большее 5,

    CALL PodprGT5 ;то вызвать подпрограмму, обозначенную меткой ‘PodprGT5’

    ;---------------------------------------------------------------------------------

    JNC TstNxtUsl ;Если в переменной, хранящейся в ячейке внутренней памяти 34 занесено число, меньшее или равное 5,

    CALL PodprLE5 ;то вызвать подпрограмму, обозначенную меткой ‘PodprLE5’

    Как видно из приведённых примеров, команды переходов этого микроконтроллера позволяет реализовать намного более эффективные по количеству команд программы по сравнению с другими процессорами, такими как, например MCS-48.

    Косвенный переход JMP @A+DPTR в системе команд микроконтроллеров семейства MCS-51 обеспечивает ветвление программы по содержимому аккумулятора А. Это позволяет реализовывать операцию перехода по заданному коду, эквивалентную оператору case в языке программирования pascal, но намного быстрее (за два машинных цикла). Использование в этой команде указателя данных DPTR позволяет размещать таблицу переходов в любом месте памяти программ. Пример реализации команды выбора варианта:

    BeginOpCase: ;Начало команды выбора вариантов------------------------------------------------------

    MOV DPTR, #JMP_TBL ;Задать начальный адрес таблицы переходов

    MOV A, 33 ;В этой ячейке хранится переменная, по которой необходимо осуществить переход на обслуживающую программу

    CLR C ;Осуществить арифметический сдвиг аккумулятора вправо

    RLC A ;(умножить на 2) т.к. команды переходов занимают два байта

    JMP @A+DPTR ;Перейти к выполнению заданного в 33 ячейке кода

    JMP_TBL: ;начало таблицы переходов по содержимому переменной в ячейке памяти 33-----------------

    JMP Case0 ;Перейти к выполнению кода по числу 0

    JMP Case1 ;Перейти к выполнению кода по числу 1

    JMP EndCase ;Это число в ячейке 33 в список разрешённых не входит

    JMP EndCase ;Это число в ячейке 33 в список разрешённых не входит

    JMP Case4 ;Перейти к выполнению кода по числу 4

    EndCase:;------------------------------------------------------------------------------------------

    Способы адресации операндов.

    При определении способа адресации операндов в команде необходимо учитывать, что адресация для каждого операнда команды своя. В общем случае адресация источника и приёмника могут не совпадать.

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

    03 Rr a ;Сдвинуть содержимое аккумулятора вправо

    D4 DA A ;Произвести десятичную коррекцию результата суммирования

    E8 MOV A, R0 ;В первом операнде использована неявная адресация, а во втором - регистровая

    Регистровая адресация используется для обращения к восьми рабочим регистрам выбранного банка рабочих регистров, а также для обращения к регистрам А, В, АВ (сдвоенному регистру), DPTR, и к флагу переноса С. Номер регистра записывается в трех младших битах команды. Например:

    F8 MOV R5, A ;в первом операнде использована регистровая адресация, а во втором - неявная

    Прямая байтовая адресация используется для обращения к ячейкам внутренней памяти (ОЗУ) данных (адреса 0:127) и к регистрам специального назначения (адреса 128:256). Адрес ячейки памяти помещается во второй байт команды. Например:

    E520 MOV A, 20h ;во втором операнде использована прямая байтовая адресация, а в первом – неявная

    8D15 mov 15h,r6 ;в первом операнде использована прямая байтовая адресация, а во втором – регистровая

    Прямая битовая адресация используется для обращения к отдельно адресуемым 128 битам, расположенным в ячейках с адресами 20Н-2FH, и к отдельно адресуемым битам регистров специального назначения. Например:

    D220 SETB 20h ;использована прямая битовая адресация

    C215 CLR 15h ;использована прямая битовая адресация

    Косвенно-регистровая адресация используется для обращения к ячейкам внутреннего ОЗУ данных. В качестве регистров-указателей адреса используются регистры R0, R1 выбранного банка регистров. Например:

    E6 MOV A,@R0 ;В первом операнде использована неявная адресация, а во втором - косвенно-регистровая

    F7 MOV @R1,A ;В первом операнде использована косвенно-регистровая адресация, а во втором - неявная

    Косвенно - регистровая адресация используется также для обращения к внешней памяти данных. В этом случае с помощью регистров- указателей R0 и R1 (рабочего банка рабочих регистров) выбирается ячейка из блока 256 байт внешней памяти данных. Номер блока предварительно задается содержимым порта Р2. Например:

    E2 MOVX A,@R0 ;В первом операнде использована неявная адресация, а во втором - косвенно-регистровая

    F3 MOVX @R1,A ;В первом операнде использована косвенно-регистровая адресация, а во втором - неявная

    Если в качестве регистра - указателя используется 16 - разрядный указатель данных (DPTR), то можно выбрать любую ячейку внешней памяти данных объемом до 64 Кбайт. (В некоторых моделях микроконтроллеров семейства MSC-51 таким образом можно обращаться к внутренней памяти данных объемом более 256 байт).

    E0 MOVX A,DPTR;В первом операнде использована неявная адресация, а во втором - косвенно-регистровая

    F0 MOVX DPTR,A;В первом операнде использована косвенно-регистровая адресация, а во втором - неявная

    Косвенно-регистровая адресация по сумме базового и индексного регистра (содержимое аккумулятора А) упрощает просмотр таблиц, записанных в памяти программ. Любой байт из таблицы может быть выбран по адресу, определяемому суммой содержимого DPTR или РС и содержимого А, например:

    83 MOV A, @A+PC ;В первом операнде использована неявная адресация, а во втором - косвенно-регистровая

    93 MOV A, @A+DPTR ;В первом операнде использована неявная адресация, а во втором - косвенно-регистровая.

    Непосредственная адресация позволяет выбрать из адресного пространства памяти программ константы, явно указанные в команде, например:

    7414 MOV A, #14h ;В первом операнде использована неявная адресация, а во втором - непосредственная

    902048 MOV DPTR, #2048h ;В первом операнде использована неявная адресация, а во втором - непосредственная

    Устройство таймеров микроконтроллеров MCS-51

    В базовых моделях семейства имеются два программируемых 16-битных таймера/счетчика (T/C0 и T/C1), которые могут быть использованы как в качестве таймеров, так и в качестве счетчиков внешних событий. Каждый из них состоит из двух 8-битных регистров TH0 (старший байт) и TH0 (младший байт) для таймера 0 или TH1 (старший байт) и TH1 (младший байт) для таймера 1.

    В режиме таймера содержимое соответствующего таймера/счетчика инкрементируется в каждом машинном цикле, т.е. через каждые 12 периодов колебаний кварцевого резонатора.

    В режиме счетчика содержимое соответствующего таймера/счетчика инкрементируется под воздействием перехода из 1 в 0 внешнего входного сигнала, подаваемого на вывод микроконтроллера T0 или T1. Так как на распознавание периода требуются два машинных цикла, максимальная частота подсчета входных сигналов равна 1/24 частоты резонатора. На длительность периода входных сигналов ограничений сверху нет. Для гарантированного прочтения входной сигнал должен удерживать значение 1, как минимум, в течение одного машинного цикла микро-ЭВМ.

    Схемы управления таймерами идентичны. Таймер 0 и Таймер 1 могут работать в четырех режимах работы:

    • режим 0: 13-битный таймер

    • режим 1: 16-битный таймер

    • режим 2: 8-битный автоперезагружаемый таймер

    • режим 3: Таймер 0 как 2 раздельных 8-битных таймера.

    Кроме того, Таймер 1 можно использовать для задания скорости передачи (baud rate) последовательного порта.

    Для переключения режимов работы таймеров используются биты M0 и M1 регистра специальной функции TMOD. Название образовано от сокращения двух английских слов: T(timer)- таймер и mode - режим. Имена и расположение битов приведено на рисунке 1:

    Рисунок 1. Формат регистра управления режимами работы таймеров TMOD.

    Так как управление таймерами 0 и 1 полностью идентично, то приведём назначение битов по именам:

    Символ

    Позиция бита

    Имя и назначение

    GATE

    TMOD.7 для таймера 1 и TMOD.3 для таймера 0

    Управление блокировкой таймера от ножки INTx. Если бит установлен в 1, то таймер/счетчик "x" разрешен до тех пор, пока на входе "lNTx" высокий уровень и бит управления "TRx" установлен. Если бит сброшен в 0, то Т/С разрешается, как только бит управления "TRx" устанавливается в 1.

    С/Т

    TMOD.6 для таймера 1 и TMOD.2 для таймера 0

    Бит выбора режима таймера или счетчика событий. Если бит сброшен в 0, то таймер работает от внутреннего генератора, если установлен в 1, то работает от внешних сигналов на входе "Tx"

    M1

    TMOD.5 для таймера 1 и TMOD.1 для таймера 0

    Выбор режима работы таймера

    M1

    M0

    0

    0

    13 битный таймер/счетчик "TLx" работает как 5-битный предварительный делитель

    0

    1

    16 битный таймер/счетчик. "THx" и "TLx" включены последовательно

    1

    0

    8-битный автоперезагружаемый таймер/счетчик. "THx" хранит значение, которое должно быть перезагружено в "TLx" каждый раз по переполнению

    1

    1

    Таймер/счетчик 1 останавливается. Таймер/счетчик 0: TL0 работает как 8-битный таймер/счетчик, и его режим определяется управляющими битами таймера 0. TH0 работает только как 8 битный таймер, и его режим определяется управляющими битами таймера 1

    M0

    TMOD.4 для Т/С1 и TMOD.0 для Т/С0

    Режим 0

    В нулевом режиме таймер работает как 13-битный суммирующий счётчик. Этот счётчик состоит из 8 бит регистра ТНх и младших 5 бит регистра TLx, где x в обозначении регистра заменяется на 0 или 1 в зависимости от того таймера, которым мы управляем. Старшие 3 бита регистров TLx не определены и игнорируются. Установка запускающего таймер флага TR0 или TR1 не очищает эти регистры. Работе таймера 0 или таймера 1 в режиме 0 соответствует схема:

    Рисунок 2. Схема таймеров 0 или 1 в режиме 0.

    Этот режим был введён для совместимости с устаревшим семейством микроконтроллеров MCS-48 для облегчения переноса уже разработанных программ на новые процессоры и поэтому в настоящее время не используется. Тем не менее, в этом режиме можно обеспечить формирование интервала времени длительностью до 8096 мс при частоте задающего генератора 12 МГц.

    Когда содержимое счетчика изменяется из состояния все "1" в состояние все "0" , то устанавливается (принимает значение "1") флаг прерывания таймера TF0 или TF1.

    Обычно пользователя интересует не максимальный интервал времени, а свой конкретный интервал времени. Для уменьшения интервала времени в регистры таймера можно предварительно занести число и тем самым сформировать произвольный интервал времени. Рассмотрим пример подготовки таймера T0 для формирования временного интервала 5мс.

    ;Настроить режим работы таймера-------------------------------------------------------------------------------------------

    mov TMOD,#00000000b ;настроить таймеры T0 и T1 на нулевой режим работы

    ;||||||||

    ;||||||++-------Перевести таймер T0 в тринадцатиразрядный режим работы

    ;|||||+---------Синхронизироваться от внутреннего генератора

    ;||||+----------Запретить управление таймером от ножки INT0

    ;||++-----------Перевести таймер T1 в тринадцатиразрядный режим работы

    ;|+-------------Синхронизироваться от внутреннего генератора

    ;+--------------Запретить управление таймером от ножки INT1

    ;Настроить таймер на генерацию 5-ти миллисекундного интервала времени--------------------------------------

    mov TH0, #HIGH(-5000) ;Загрузить старший байт таймера

    mov TL0, #LOW(-5000) ;Загрузить младший байт таймера

    В рассмотренном примере для расщепления 16-ти битной константы на два отдельных байта были использованы функции выделения старшего и младшего байта. Эти функции присутствуют в большинстве ассемблеров для микроконтроллеров MCS-51. Если же язык программирования не содержит в своём составе подобные функции, то можно для выделения байтов воспользоваться операцией деления на 256.

    mov TH0, #-5000/256 ;Загрузить старший байт таймера

    mov TL0, #-(5000-5000/256) ;Загрузить младший байт таймера

    Режим 1

    В первом режиме работы таймер работает как шестнадцатиразрядный счётчик. Режим 1 похож на режим 0, за исключением того, что в регистрах таймера использует все 16 бит. В этом режиме регистры ТНх и TLx также включены друг за другом. Работе таймера 0 или таймера 1 в режиме 1 соответствует схема:

    Рисунок 3. Схема таймеров 0 или 1 в режиме 1.

    В этом режиме можно обеспечить формирование интервала времени длительностью до 65536 мкс при частоте задающего генератора 12 МГц.

    Рассмотрим пример использования таймера T0 для формирования временного интервала 15мс.

    ;Настроить режим работы таймера-------------------------------------------------------------------------------------------

    mov TMOD,#00000001b ;перевести таймер T0 в первый режим работы, а T1 - в нулевой

    ;||||||||

    ;||||||++-------Перевести таймер T0 в шестнадцатиразрядный режим работы

    ;|||||+-----------Синхронизироваться от внутреннего генератора

    ;||||+------------Запретить управление таймером от ножки INT0

    ;||++-------------Перевести таймер T1 в тринадцатиразрядный режим

    ;|+----------------Синхронизироваться от внутреннего генератора

    ;+-----------------Запретить управление таймером от ножки INT1

    ;Настроить таймер на генерацию 15-ти миллисекундного интервала времени------------------------------------

    mov TH0, #HIGH(-15000) ;Загрузить старший байт таймера

    mov TL0, #LOW(-15000) ;Загрузить младший байт таймера

    OjidanTimer:

    jnb TF0, OjidanTimer ;Подождать пока не переполнится таймер

    В рассмотренном примере переполнение таймера произойдёт через 15000 циклов процессора, то есть через 15 мс. Программа будет постоянно проверять состояние флага переполнения таймера и как только он установится в единицу перейдёт к выполнению следующей команды.

    Нулевой и первый режимы работы таймеров T0 и T1 предназначены для формирования одиночного интервала времени. Если возникает необходимость формировать последовательность интервалов времени для периодических процессов, то загрузка регистров TH0 и TL0 для задания нужного интервала времени производится программно, что для коротких интервалов времени может привести к значительным затратам процессорного времени.

    Для формирования последовательности одинаковых интервалов времени используется режим работы таймера с перезагрузкой - режим 2.

    Режим 2

    В режиме 2 регистр таймера TLx работает как 8-битный счетчик с автоматической перезагрузкой начального значения из регистра ТНх в регистр TLx. Переполнение регистра TLx не только устанавливает флаг TFx, но и загружает регистр TLx содержимым регистра ТНх, который предварительно инициализируется программно. Перезагрузка не изменяет содержимое регистра ТНх. Работе таймера 0 или таймера 1 в режиме 2 соответствует схема:

    Рисунок 4. Схема таймеров 0 или 1 в режиме 2.

    Работа с таймерами во втором режиме не отличается от рассмотренных ранее примеров, поэтому следующий пример инициализации таймера на генерацию частоты с периодом сто микросекунд (10кГц) приводится без комментария.

    ;Настроить режим работы таймера-------------------------------------------------------------------------------------------

    mov TMOD, #00000010b ;перевести таймер T0 во второй режим работы, а T1 - в нулевой

    ;||||||||

    ;||||||++---Перевести таймер T0 в режим 8-ми разр. таймера с автозагрузкой

    ;|||||+-----Синхронизироваться от внутреннего генератора

    ;|||+-------Запретить управление таймером от ножки INT0

    ;||++-------Перевести таймер T1 в тринадцатиразрядный режим

    ;|+---------Синхронизироваться от внутреннего генератора

    ;+----------Запретить управление таймером от ножки INT1

    mov TMOD,#2 ;перевести таймер T0 во второй режим работы, а T1 - в нулевой

    mov TH0, #-50 ;Загрузить старший байт таймера

    mov TL0, #-50 ;Загрузить младший байт таймера

    OjidanTimer:

    jnb TF0, OjidanTimer ;Подождать пока не переполнится таймер

    cpl P2.6 ;Проинвертировать сигнал на шестой ножке второго порта и

    sjmp OjidanTimer ;снова перейти к ожиданию окончания временного интервала

    Режим 3

    Таймер 1 при работе в режиме 3 просто хранит свое значение. Эффект такой же как при сбросе бита TR1.

    Таймер 0 в режиме 3 представляет собой два раздельных 8 битных счетчика (регистры TL0 и ТН0), Регистр TL0 использует биты управления таймера 0: С/Т0. GATE0, TR0 и TF0. Регистр ТН0 работает только в режиме таймера и использует биты TR1 и TF1 таймера 1. Таким образом, регистр ТН0 управляет прерыванием таймера 1. Логика работы таймера 0 в режиме 3 показана на схеме:

    Рисунок 5. Схема таймерa 0 в режиме 3.

    Работа таймера TL0 разрешается, если бит TR0 = 1, а таймера TH0 - если бит TR1 = 1. Таймер 1 при работе таймера 0 в режиме 3 постоянно включен.

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

    Управление таймерами-счётчиками.

    Схема управления таймерами 0 и 1 идентична и для таймера T0 приведена на рисунке 6. Для схемы управления таймером T1 изменятся только номера управляющих бит (нули будут заменены на 1). В приведенной схеме заштрихованным прямоугольником обозначены внешние ножки микросхемы микроконтроллера.

    Рисунок 6. Схема управления таймерами 0 или 1.

    Из схемы видно, что таймер может включаться и выключаться битами TRx. Таким образом можно уменьшать потребление микросхемы и уровень помех, создаваемый ею. Учитывая, что счетчики таймеров переключаются на высокой частоте, то они могут потреблять до половины тока потребления микроконтроллера. Следует отметить, что при включении и после сброса микроконтроллера работа таймеров запрещена.

    Есть возможность управлять работой таймера извне при помощи внешней ножки T0 для таймера T0 или T1 для таймера T1. Для этого необходимо записать в бит GATEx логическую единицу (не забыв при этом разрешить работу таймера при помощи бита TRx).

    Кроме того, таймер может синхронизироваться от внешнего генератора. Для этого в бит управления C/T нужно записать логическую единицу.

    Биты включения таймеров TR0 и TR1 размещены в регистре TCON (control - управлять), а биты GATE и C/T в регистре TMOD. Формат регистра TCON приведён на следующем рисунке:

    Рисунок 7. Формат регистра управления режимами работы таймеров TCON.

    Символ

    Позиция

    Имя и назначение

    TF1

    TCON.7

    Флаг переполнения таймера 1. Устанавливается аппаратно при переполнении таймера/счетчика. Сбрасывается при обслуживании прерывания аппаратно

    TR1

    TCON.6

    Бит управления таймера 1. Устанавливается/сбрасывается программой для пуска/останова

    TF0

    TCON.5

    Флаг переполнения таймера 0. Устанавливается аппаратурно. Сбрасывается при обслуживании прерывания

    TR0

    TCON.4

    Бит управления таймера 0. Устанавливается / сбрасывается программой для пуска/останова таймера/счетчика

    IE1

    TCON.3

    Флаг фронта прерывания 1. Устанавливается аппаратно, когда детектируется срез внешнего сигнала INT1. Сбрасывается при обслуживании прерывания

    IT1

    TCON.2

    Бит управления типом прерывания 1. Устанавливается / сбрасывается программно для определения типа запроса прерывания INT1 (срезу/низким уровнем).

    IE0

    TCON.1

    Флаг фронта прерывания 0. Устанавливается по срезу сигнала INT0. Сбрасывается при обслуживании прерывания

    IT1

    TCON .0

    Бит управления типом прерывания 0. Устанавливается / сбрасывается программно для определения типа  запроса прерывания INT0 (срез/низкий уровень)

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

    Использование таймера в качестве измерителя ширины импульсов.

    Известно, что измерение длительности импульса можно произвести, подсчитав импульсы эталонной частоты. Принцип измерения длительности импульсов иллюстрируется рисунком 8.

    Для измерения длительности импульса измеряемый сигнал подаётся на вывод микроконтроллера INTx и в бит управления GATE записывается разрешающий сигнал логической единицы. Таймер/счётчик настраивается в режим таймера записью в бит C/Tx логического нуля. Содержимое таймера обнуляется.

    Пример программы измерения длительности импульса приведён на рисунке 9.

    Рисунок 8. Принцип измерения длительности импульсов

    mov TMOD,#00001001b

    ;||||||||

    ;||||||++--Перевести таймер T0 в шестнадцатиразрядный режим

    ;|||||+----Синхронизироваться от внутреннего генератора

    ;||||+-----Включать таймер от ножки микроконтроллера INT0

    ;||++------Перевести таймер T1 в тринадцатиразрядный режим

    ;|+--------Синхронизироваться от внутреннего генератора

    ;+---------Запретить управление таймером от ножки INT1

    mov TH0, #0 ;Обнулить старший байт таймера

    mov TL0, #0 ;Обнулить младший байт таймера

    setb TR0 ;Включить измеритель ширины импульса

    TstLog0: jnb INT0, TstLog0 ;Подождать начало импульса

    TstLog1: jnb INT0, TstLog1 ;Подождать конец импульса

    Clr TR0 ;Отключить измеритель ширины импульса

    Рисунок 9. Программа измерения длительности импульсов

    Если теперь на вход микроконтроллера INT0 подать импульс с неизвестной длительностью, то в регистрах TH0 и TL0 будет записана его длительность в микросекундах.

    Использование таймера в качестве частотомера.

    Известно, что измерение частоты можно произвести, подсчитав количество периодов неизвестной частоты за единицу времени. Принцип измерения частоты иллюстрируется рисунком 10.

    Рисунок 10. Принцип измерения частоты

    Для измерения частоты измеряемый сигнал подаётся на вывод микроконтроллера Tx. Таймер/счётчик настраивается в режим счётчика записью в бит C/Tx логической единицы. Содержимое таймера обнуляется. Таймер включается на строго определённый интервал времени. Этот интервал задаётся оставшимся таймером.

    Пример программы измерения частоты сигнала на ножке микроконтроллера T0 приведён на рисунке 11.

    mov TMOD,#00010101b

    ;||||||||

    ;||||||++-------Перевести таймер T0 в шестнадцатиразрядный режим

    ;|||||+---------Работать от сигнала на ножке T0

    ;||||+----------Запретить управление таймером от ножки INT0

    ;||++-----------Перевести таймер T1 в шестнадцатиразрядный режим

    ;|+-------------Синхронизироваться от внутреннего генератора

    ;+--------------Запретить управление таймером от ножки INT1

    mov TH0, #0 ;Обнулить старший байт счётчика

    mov TL0, #0 ;Обнулить младший байт счётчика

    ;---измерение вести 1 мс---------------------------------------------------------

    mov TH1, #HIGH(-1000) ;Загрузить старший байт таймера

    mov TL1, #LOW(-1000) ;Загрузить младший байт таймера

    mov TCON,#01010000b ;Включить частотомер

    ;||||||||

    ;|||||||+-------Прерывание от ножки INT1возникает по фронту

    ;||||||+--------Сбросить запрос прерывания от ножки INT1

    ;|||||+---------Прерывание от ножки INT1возникает по фронту

    ;||||+----------Сбросить запрос прерывания от ножки INT1

    ;|||+-----------Включить таймер T0

    ;||+------------Обнулить флаг таймера T0

    ;|+-------------Включить таймер T1

    ;+--------------Обнулить флаг таймера T1

    TstTimeOut:

    jnb TF1, TstTimeOut ;Если 1 мс прошла

    mov TCON, #00000000b ;то отключить частотомер

    ;||||||||

    ;|||||||+-------Прерывание от ножки INT1 возникает по фронту

    ;||||||+--------Сбросить запрос прерывания от ножки INT1

    ;|||||+---------Прерывание от ножки INT1возникает по фронту

    ;||||+----------Сбросить запрос прерывания от ножки INT1

    ;|||+-----------Отключить таймер T0

    ;||+------------Обнулить флаг таймера T0

    ;|+-------------Отключить таймер T1

    ;+--------------Обнулить флаг таймера T1

    Рисунок 11. Программа измерения частоты

    Если теперь на вход микроконтроллера T0 подать сигнал с неизвестной частотой, то в регистрах TH0 и TL0 будет записана его частота в килогерцах.

  • Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]