Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МПТ 2013 ШПОРЫ.docx
Скачиваний:
297
Добавлен:
15.04.2015
Размер:
669.17 Кб
Скачать

4. Программирование параллельным вводом/выводом в с51: операторы управления портами и отдельными разрядами портов. Примеры программ управления светодиодами и опроса контактов переключателей.

Микроконтроллеры семейства MCS-51 имеют несколько портов ввода/вывода, позволяющих получать информацию от внешних устройств (ввод данных) или отправлять данные внешним устройствам (вывод данных). Стандартный МК 8051 имеет четыре 8-разрядных порта, которые нумеруются цифрами: порт 0, порт 1, порт 2 и порт 3. Все порты являются двунаправленными, то есть они могут использоваться как для ввода, так и для вывода.

Управление портами производится при помощи так называемых регистров специальных функций (РСФ). Каждый из четырех портов имеет свой РСФ, они именуются, соответственно, как Р0, Р1, Р2 и Р3.

В заголовочном файле reg51.h переменные Р0-Р3 объявляются с помощью ключевого слова sfr как регистры специальных функций.

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

Например, мы можем послать какие-либо данные в порт Р1 следующим образом:

P1 = 0xF0; // записать 11110000 в порт 1

Операцию предварительной записи единиц в регистры-защелки порта часто называют настройкой порта на ввод или настройкой на режим чтения.

Таким образом, для чтения данных из порта Р1 нужно выполнить следующий код программы:

unsigned char port_data; // объявление однобайтной переменной

// для хранения введенных данных

P1 = 0xFF; // настроить порт 1 на ввод

port_data = P1; // чтение (ввод) из порта 1

По сигналу сброса RST в регистры-защелки всех портов МК 8051 автоматически записываются единицы, настраивающие их тем самым на режим ввода.

В языке С51 имеется возможность доступа к отдельным разрядам (битам) регистров специальных функций, в частности, к разрядам (линиям) портов Р0-Р3. Для этого используется ключевое слово sbit.

Например, для доступа к разряду 0 порта Р2 (линия Р2.0) можно создать битовую переменную с именем Р2_0 следующим образом:

sbit P2_0 = P2^0;

Здесь символ “^” означает доступ к разряду 0 порта Р2. В классическом Си этот символ обозначает поразрядную операцию Исключающее ИЛИ.

С использованием переменной Р2_0 мы можем записывать (выводить) данные на линию Р2.0 порта:

P2_0 = 1; // вывести 1 на линию Р2.0 порта Р2

P2_0 = 0; // вывести 0 на линию Р2.0 порта Р2

При чтении (вводе) с выводов порта (ножки микросхемы) необходимо предварительно объявить битовую переменную, в которой будут храниться введенные данные. Это объявление в С51 выполняется с использованием ключевого слова bit. Битовая переменная может принимать одно из двух значений: 0 или 1. Вот пример объявления битовых переменных:

bit my_bit;

bit bit0;

Для хранения битовых переменных используется внутренняя область памяти данных МК (ячейки памяти с адресами 20H – 2FH), обладающая свойством поразрядной адресации.

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

sbit P2_7 = P2^7; // объявление переменной P2_7

bit bit2_7; // объявление переменной bit2_7

P2_7 = 1; // настроить линию Р2.7 на ввод

bit2_7 = P2_7; // чтение состояния линии порта Р2.7

Следует отметить, что переменные, объявленные с помощью ключевого слова sbit, могут быть только глобальными, т.е. их нельзя объявлять в теле функции, где они используются, в том числе и main( ).

/*программа переключения светодиода */

#include<reg51.h>

void delay_ms( unsigned int MS); // прототип функции задержки

sbit P2_0 = P2^0;

void main(void)

{

while( 1 )

{

P2_0 = 0; // зажечь светодиод

delay_ms( 1000 ); // задержка на 1000 мс = 1 с

P2_0 = 1; // погасить светодиод

delay_ms( 1000 );

}

}

void delay_ms( unsigned int MS) // функция задержки

{

unsigned int i, j;

for( i = 0; i < MS; i++)

for( j = 0; j < 123; j++);

}

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