Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Операторы перехода языка С51: break, continue, goto.

Читайте также:
  1. Алгоритм работы библиотечных функций malloc/free языка С
  2. Артикуляционная гимнастика для мышц языка
  3. Атрибуции в рамках дискурсивного подхода: объяснение успехов и неудач в изучении английского языка как иностранного
  4. Вольтамперная характеристика (ВАХ) реального электронно-дырочно! о перехода
  5. Втеударство и право в период перехода к буржуазной монархии 253
  6. Глава 1. История происхождения английского языка
  7. Говорение на языках - знамение для верующих

Оператор break имеет два назначения. Первое – это окончание работы оператора switch. Второе – это принудительное окончание цикла, минуя стандартную проверку условия. Когда оператор break встречается в теле цикла, цикл немедленно заканчивается и выполнение программы переходит на строку, следующую за циклом.

Рассмотрим пример использования оператора break для досрочного прекращения работы цикла for.

#include<reg51.h>

unsigned char in_port1;

void main(void)

{

int x;

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

in_port1 = P1; // ввод числа из порта Р1

for(x = 0; x < 100; x++)

{

P2 = x; // вывод в порт Р2

if (x == in_port1)

break; // прекращение цикла вывода

}

while(1);

}

Работа оператора continue чем-то похожа на работу оператора break. Но вместо форсированного окончания цикла оператор continue переходит к следующей итерации цикла, пропуская оставшийся код тела цикла.

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

#include<reg51.h>

int sum = 0; // сумма чисел

int sum_even = 0; // накопленная сумма четных сумм

void main(void)

{

int i;

for(i = 1; i < 15; i++)

{

sum += i; // вычисление суммы чисел

if (sum % 2) // проверка суммы чисел на четность

continue;

sum_even += sum; // накопление четных сумм

}

while(1);

}

В программе continue.c производится вычисление суммы чисел и накопление четных сумм в переменной sum_even. Когда сумма чисел от 1 до i становится нечетной (это проверяется операцией sum % 2 – определением остатка от деления на 2), оператор continue передает управление на очередное повторение цикла for, не выполняя оператор sum_even += sum накопления четных сумм.

Оператор goto (идти к ….) – это безусловный переход на метку. Метка – это идентификатор Си, завершающийся двоеточием. Пример записи оператора goto:

goto label;

……….

label: …….

Рассмотрим простейшую программу, где используется оператор перехода goto.

#include<reg51.h>

void main(void)

{

char x = 1;

loop:

x++;

if (x < 10)

goto loop;

while(1);

}

В программе goto.c реализуется цикл инкремента переменной x от 1 до 10 с помощью оператора goto и метки loop. Очевидно, что такой цикл можно было бы реализовать и с использованием операторов while или for.

 

 

Программирование параллельным вводом/выводом в С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++);

}

/* программа управления светодиодом VD1 от кнопки SB1 */

#include<reg51.h>

sbit P1_0 = P1^0;

sbit P2_0 = P2^0;

void main(void)

{

bit bit1_0;

while(1)

{

while((bit1_0 = P1_0) == 1); // ожидание замыкания контакта SB1

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

while((bit1_0 = P1_0) == 0); // ожидание размыкания контакта SB1

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

}

}

 

 


Дата добавления: 2015-12-07; просмотров: 68 | Нарушение авторских прав



mybiblioteka.su - 2015-2024 год. (0.011 сек.)