Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Программирование микропроцессорных систем управления подвижного состава железных дорог. Учебное пособие по дисциплинам «Автоматизированные и микропроц.pdf
X
- •ВВЕДЕНИЕ
- •1. Платформа Arduino UNO
- •1.1 Описание аппаратной части
- •2.1 Основы языка программирования С/С++
- •2.2 Арифметические операторы
- •2.2.1 Оператор присваивания
- •2.2.2 Сложение, вычитание, умножение и деление
- •2.2.3 Вычисление остатка от деления
- •2.3 Логические операторы
- •2.6.1 Условные операторы
- •2.6.1.1 Условный оператор if
- •2.6.1.2 Условный оператор if..else
- •2.6.1.3 Оператор switch…case
- •2.6.2 Операторы реализации циклических вычислений
- •2.6.2.1 Оператор цикла for
- •2.6.2.2 Оператор цикла while
- •2.6.2.3 Оператор цикла do...while
- •2.6.3 Оператор break
- •2.6.4 Оператор continue
- •2.6.5 Оператор return
- •2.6.6 Оператор перехода goto
- •2.7 Операции над битами
- •2.8 Составные операторы
- •2.8.1 Операторы ++ (инкремент) и – – (декремент)
- •2.8.2 Операторы += , –= , *= , /= , %=
- •2.8.3 Оператор &= и |=
- •2.9 Математические функции
- •2.9.2 Вычисление модуля числа
- •2.9.3 Ограничение числа заданным диапазоном
- •2.9.4 Масштабирование переменной
- •2.9.5 Возведение числа в степень
- •2.9.6 Вычисление квадратного корня числа
- •3. Ввод-вывод сигналов
- •3.2 Вывод дискретных сигналов digitalWrite()
- •3.3 Ввод дискретных сигналов digitalRead().
- •3.4 Ввод аналоговых сигналов analogRead()
- •3.5 Вывод аналоговых сигналов analogWrite()
- •4. Практические задания
- •5. Основы алгоритмизации
- •6. Элементы математической логики
- •7.1 Макетная плата
- •7.2 Постоянный резистор
- •7.3 Переменный резистор
- •7.4 Тактовая кнопка DTS-61N
- •7.5 Светодиод видимого спектра свечения
- •7.6 Четыре компаратора LM239N
- •7.7 Шесть логических элементов НЕ SN74HC04N
- •7.8 Приоритетный шифратор 8 в 3 SN74HC148N
- •7.9 Датчик угла поворота EXW1J-C24-AC0024L
- •7.11 Полевой транзистор IRF530NPBF
- •7.12 Дроссель Д25
- •КОНТРОЛЬНЫЕ ВОПРОСЫ
- •ИСПОЛЬЗОВАННЫЕ ИСТОЧНИКИ
- •СОДЕРЖАНИЕ

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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
