Рисунок 1. Подключение светодиодного индикатора к параллельному порту со стандартным TTL выходом.
В приведённой схеме резистор R1 ограничивает базовый ток транзистора, а резистор R2 предотвращает открывание транзистора обратным током коллектора при повышенной температуре. Резистор R3 ограничивает коллекторный ток транзистора, задавая тем самым яркость свечения светодиода.
Квазидвунаправленный параллельный порт микросхем семейства MCS-51 позволяет подключать светодиоды несколько иначе. Каждый из портов содержит восьмиразрядный регистр, имеющий байтовую и битовую адресацию для установки (запись '1') или сброса (запись '0') разрядов этого регистра с помощью программного обеспечения. Выходы этих регистров соединены с внешними ножками микросхемы. Упрощенная схема одного разряда порта показана на рисунке 2.
Так как в этой схеме вместо транзистора в верхнем плече применён генератор тока, то появляется возможность подключать базу транзистора непосредственно к выводу порта как это показано на рисунке 3.
Рисунок 2. Упрощенная схема одного бита порта.
Рисунок 3. Схема подключения светодиодов к портам микроконтроллеров семейства MCS-51.
3.3. Управление светодиодами на языке программирования C
Для того, чтобы определить какой уровень необходим для зажигания светодиода необходимо проанализировать принципиальную схему устройства. Например, светодиод VD1 зажигается при нулевом уровне сигнала на выводе порта. В то же время светодиод VD2 будет светиться только если на вывод порта выдать высокий потенциал (записать логическую “1”).
Порт с точки зрения языка программирования – это просто переменная, в которую можно производить запись каких либо чисел. В простейшем случае эту запись можно произвести оператором присваивания, как это показано на следующем примере:
Port2 = 0x80;
В этом примере в младший бит порта записывается логическая единица, а в остальные биты порта записывается логический ноль. То есть в устройстве, схема которого приведена на рисунке 3 светодиод VD2 загорится. Такой оператор применяется при начальной инициализации устройства, когда необходимо определить первоначальные уровни на всех выводах порта.
При работе со светодиодом VD1 оператор присваивания будет выглядеть несколько иначе:
Port1 = 0xbf;
Здесь для зажигания диода VD1 на шестой вывод порта выдаётся нулевой потенциал, а на остальные выводы порта – единицы. Высчитывать шестнадцатеричный код может оказаться затруднительным, поэтому часто пользуются операцией инвертирования ‘~’. При использовании операции инвертирования приведённый выше оператор будет выглядеть следующим образом:
Port1 = ~0x40;
Однако более распространённый случай – это когда необходимо записать единицу только в один или несколько бит (выводов) порта. В этом случае используется операция логического суммирования:
Port2 = Port2 | 1;
Язык программирования СИ позволяет записать эту операцию несколько короче:
Port2 |= 1;
Указывать необходимые номера бит порта удобнее всего в двоичной форме. К сожалению язык программирования C не позволяет записывать константы в двоичной форме, но этот язык позволяет записывать константы в шестнадцатеричной форме. Преобразование же шестнадцатеричной константы в двоичную и обратно элементарно. Например:
0x01 – единица записана только в нулевом бите
0x82 – единицы записаны в битах номер 7,1 и 0
0x07– единицы записаны в битах номер 2,1 и 0
Те же программисты, которые с трудом переводят числа из двоичной системы в шестнадцатеричную могут воспользоваться для формирования константы выражениями с логическим суммированием бит:
Port2 |= 1 //Записать логическую единицу в нулевой бит
|(1<<2) // Записать логическую единицу во второй бит
|(1<<7); // Записать логическую единицу в седьмой бит
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.