Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование микропроцессорных систем управления подвижного состава железных дорог. Учебное пособие по дисциплинам «Автоматизированные и микропроц.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
int PWMpin = 10;
// Светодиод должен быть подключен к выводу 10, // через резистор 470 Ом
void setup()
{
// инициализация не требуется
}
void loop()
{
for (int i=0; i <= 255; i++)
//i++ эквивалентно i = i + 1
{
analogWrite(PWMpin, i); //управление генератором с ШИМ
delay(10);
//задержка 10 мс
}
}
Особенностью языка оператора for в языке C является воз- можность использования в поле <приращение переменной цикла> любого арифметического выражения. Например, допускается ис­пользование такой записи:
x = x * 1.5
Оператор цикла while
Формат применения циклического оператора while имеет следующий вид:
while(проверка условие завершения) { // оператор(ы) }
При использовании данной конструкции операторы, содержа­щиеся внутри операторных скобок (тело цикла), выполняются непрерывно до тех пор, пока в результате проверки условия завер­шения цикла не выработается значение false. На рисунке 3.6. при­ведена схема алгоритма, реализующего данную структуру и пояс­няющая особенности его функционирования. Очевидно, что при
31
оформлении документации на алгоритмы необходимо придержи­ваться требований нормативных документов, в соответствии с ко­торыми цикл данного типа должен быть оформлен так, как пред­ставлено на рисунке 1.6, б.
Рисунок 2.7 – Схема алгоритма, реализующего цикл while
Как видно, циклический оператор данного типа является опе­ратором с предпроверкой условия завершения, то есть операторы, составляющие тело цикла, могут быть не выполнены ни одного раза.
Пример
var = 0; // Установка 0 в качестве начального значения // счётчика var while(var < 200) // Пока значение счётчика var меньше 0, выполнять… {
// Операторы тела цикла выполняются 200 раз var++; // Увеличение содержимого счётчика на 1 }
32
Оператор цикла do...while
Формат применения циклического оператора do...while имеет следующий вид:
do { // тело цикла } while (проверка условия завершения);
Конструкция данного типа является циклом с постпроверкой условия завершения, в котором операторы, составляющие тело цикла, будут выполнены хоты бы один раз. На рисунке 2.8 приве­дена схема алгоритма, реализующего циклический оператор
do…while.
Пример
do {
delay(50); // Приостановка выполнения программы на 50 мс val = analogRead(3); /* Считывание данных с 3-го канала АЦП микроконтроллера, запись полученного значения в переменную val */ } while (val < 511);
/* Остановка цикла произойдёт в том случае, если содержимое переменной val превысит значение 511 или станет ему равным*/

2.6.3 Оператор break

Оператор break используют для досрочного завершения цик­лов, определяемых операторами for, while и do…while в обход нормальных условий завершения, заданных при вызове данных операторов. Также оператор break используют для завершения выполнения последовательности операторов в конструкции switch…case.
33
Рисунок 2.8 – Схема алгоритма, реализующего цикл do…while
Пример
for (x = 0; x < 255; x ++) { analogWrite(PWMpin, x); sens = analogRead(sensorPin); if (sens > threshold) { x = 0; break; /* Досрочный выход из цикла, если сигнал с дат- чика превышает пороговый уровень */ } delay(50); }

2.6.4 Оператор continue

Оператор continue позволяет пропустить на текущем шаге
выполнение операторов, составляющих тело цикла (do, for, или
34
do…while). Вместо этого, проверяется условие завершения цикла и начинается следующий шаг.
Пример
for (x = 0; x < 255; x ++) { if (x > 40 && x < 120) // Задание условия для пропуска операторов { continue; // Переход на следующий шаг цикла } analogWrite(PWMpin, x); delay(50); }

2.6.5 Оператор return

Оператор return завершает выполнение функции и возвра­щает значение, являющееся результатом её работы в вызывающую программу.
Пример
int checkSensor() { if (analogRead(0) > 400) { return 1; } else { return 0; } }
В данном примере функция checkSensor в результате своей работы возвращает 1, если величина на выходе аналого-цифрового преобразователя превышает 400, или 0 в противном случае. Если используется return без аргументов, то функция не вырабатывает выходного значения. В качестве аргументов может быть использо­вана переменная или константа любого типа.
35

2.6.6 Оператор перехода goto

Данный оператор служит для перенаправления потока выпол­нения оператор, обозначенный меткой label. Здесь label – лю­бое имя, записанное по правилам языка 7.
Синтаксис данного оператора:
\\ оператор(ы) goto point; \\ оператор(ы) point: \\ оператор(ы)
Пример
for (byte r = 0; r < 255; r++) { for (byte g = 255; g > -1; g--) { for (byte b = 0; b < 255; b++) { if (analogRead(0) > 250) { goto bailout;} // оператор(ы) } } }
bailout:

Операции над битами

Рассмотренные ранее операции (арифметические, логиче­ские) выполняются целиком над всем аргументом. Битовые опера­ции применяются для выполнения действий над операндами на уровне отдельных битов. В языке C определены следующие бито­вые операции:
– Побитовое И (Bitwise AND); – Побитовое ИЛИ (Bitwise OR); – Побитовое Исключающее ИЛИ (Bitwise XOR); – Побитовое НЕ (Bitwise NOT); – Сдвиг числа влево (bitshift left); – Сдвиг числа вправо (bitshift right);
36
В качестве аргументов данных операций должны выступать
Операция
Обозначение
Операнд 1
Операнд 2
Результат
int a = 92;
int a =92;
int a = 92; int a = 92;
целочисленные переменные. Ниже в таблице приведена краткая информация о побитовых операциях AND, OR, XOR и NOT.
Таблица 2.4 Правила выполнения и применения побитовых опера- ций AND, OR, XOR и NOT.
Пример
применения
Bitwise AND
Bitwise
OR
Bitwise
XOR
Bitwise
NOT
Операции сдвига влево (<<) или вправо (>>) позволяют сдви­гать переменную variable соответственно влево или вправо на указанное количество битов number_of_bits.
Синтаксис:
variable << number_of_bits;
variable >> number_of_bits.
Здесь variable – переменная любого целочисленного типа (byte, int, long);
number_of_bits – любое целое число в диапазоне от 0 до
32.
0011 0101 0001
&
0011 0101 0111
|
0011 0101 0110
^
0011
~
– 1100
int b = 101; int c = a & b;
int b =101; int c = a | b;
int b = 101; int c = a ^ b;
int b = ~a;
37
Пример
int a = 5; /* двоичное: 0000000000000101*/ int b = a << 3; /* двоичное: 0000000000101000, или 40 десятичное */ int c = b >> 3; /* двоичное: 0000000000000101, снова 5 */
В том случае, если выполняется сдвиг на большее число разря­дов, чем допускает разрядная сетка, разряды, вышедшие за гра­ницу сетки, будут потеряны.
int a = 5; // двоичное: 0000000000000101 int b = a << 14; /* двоичное: 0100000000000000 - Первая 1 в 101 по- терялась*/
Как видно из примеров, высвобождаемые при сдвиге разряды заполняются нулями. В том случае, если в сдвигаемое число явля­ется отрицательным, записанном в дополнительном коде, при сдвиге вправо по умолчанию высвобождаемые разряды заполня­ются единицами:
int x = -16; // двоичное: 1111111111110000 int y = x >> 3; // двоичное: 1111111111111110
В том случае, если необходимо избежать применения данного правила (т.е., при сдвиге отрицательного числа высвобождаемые биты заполнять нулями), следует использовать вспомогательную запись unsigned int:
int x = -16; // двоичное: 1111111111110000
int y = (unsigned int)x >> 3; // двоичное: 0001111111111110

Составные операторы

Как было показано ранее, все арифметические и логические операторы, а также операторы побитового преобразования, для своей работы использовали три ячейки памяти, в том числе две –
38
для размещения аргументов, и одну – для размещения результата
Обозначение
Наименование
++
Инкремент (increment)
––
Декремент (decrement)
+=
Составное сложение (compound addition)
–=
Составное вычитание (compound subtraction)
*=
Составное умножение (compound multiplication)
/=
Составное деление (compound division)
%=
Составное, нахождение остатка от деления (compound modulo)
&=
Составное побитовое И (compound bitwise and)
|=
Составное побитовое ИЛИ (compound bitwise or)
вычислений. В языке С/С++, как и во многих других языках про­граммирования, представлен ряд составных (также встречается термин «унарных») операторов, позволяющих выполнять арифме­тические и логические действия, и требующих для своей работы меньшего количества ячеек памяти. В языке С, используемом в среде Arduino IDE данный тип представлен следующими операто- рами:

2.8.1 Операторы ++ (инкремент) и – – (декремент)

Данные операторы предназначены для увеличения или уменьшения аргумента на 1 соответственно.
Синтаксис операторов
x++; /* Увеличивает x на единицу, но возвращает предыдущее значение x */ ++x; /* Увеличивает x на единицу, и возвращает новое значение x */ x-- ; /* Уменьшает x на единицу, но возвращает предыдущее x */
--x ; /* Уменьшает x на единицу, и возвращает новое значение x*/
Пример
39
x = 2;
Запись оператора
Эквивалентная запись
x += y;
x = x + y;
x -= y;
x = x - y;
x *= y;
x = x * y;
x /= y;
x = x / y;
x %= y;
x = x % y;
y = ++x; // В результате, x содержит 3, y содержит 3 y = x--; // x содержит снова 2, y всё ещё содержит 3

2.8.2 Операторы += , –= , *= , /= , %=

Предназначены для выполнения математических действий
над переменными совместно с другой переменной или константой Таблица 2.5 Синтаксис составных операторов
Пример
x = 2; x += 4; // x содержит 6 x -= 3; // x содержит 3 x *= 10; // x содержит 30 x /= 2; // x содержит 15 x %= 5; // x содержит 0

2.8.3 Оператор &= и |=

Составной битовый оператор И – &= (compound bitwise AND) за- частую используют для преобразования выбранных битов аргу­мента к НИЗКОМУ (LOW) уровню (то есть, к 0). В отличие от него, составной битовый оператор ИЛИ |= (compound bitwise OR) находит применение, если необходимо преобразовать выбранные биты ар­гумента к ВЫСОКОМУ (HIGH) уровню/
Синтаксис операторов
x &= y;
40
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]