Программирование микропроцессорных систем в интегрированной среде программирования keil-c: Методические указания к лабораторным работам, страница 13

Рисунок 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);   // Записать логическую единицу в седьмой бит