Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование микропроцессорных систем управления подвижного состава железных дорог. Учебное пособие по дисциплинам «Автоматизированные и микропроц.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
В разделе описаний осуществляется подключение библиотек используемых функций; описание и инициализация переменных и констант, используемых в программе. Однократно исполняемые за время работы программы операторы, служащие, например, для конфигурирования каналов ввода/вывода информации, предвари­тельных вычислений, помещены в тело функции setup(). Ко­манды основного раздела помещены в тело функции loop(). Раз­берём более подробно приведённый выше пример. Строка
int buttonPin = 3;
объявляет целочисленную переменную buttonPin и устанав­ливает её значение, равное 3.
Далее, осуществляется вызов встроенной функции setup():
void setup() { //... }
В теле этой функции выполняются две командные последова­тельности:
Serial.begin(9600); – инициализирует последователь-
ный канал связи на скорость обмена информацией 9600 бод;
pinMode(buttonPin, INPUT); – конфигурирует выход-
ной порт с номером, определяемым содержим переменной
buttonPin (в нашем случае 3) на вывод цифровой информа-
ции.
Функция setup выполняется единственный раз, при запуске программы. Выполнение команд основного раздела осуществля­ется после вызова функции loop:
void loop() { ... }
Команды, выполняемые в теле функции loop, обеспечивают взаимодействие с аппаратурой микроконтроллера, выполнение
11
арифметических, логических и прочих операций по обработке дан­ных. Выполнение последовательности команд, заданных в теле функции loop, осуществляется циклически, т.е. после выполнения последней команды последовательности управление передаётся первой команде этой же последовательности.
На основании разобранного примера, отметим некоторые важ­ные особенности языка программирования C/C++:
1. Наименования процедур и функций, переменных и командных
последовательностей являются чувствительными к исполь-
зуемому регистру. Это означает, что вызов встроенной функ-
ции pinMode () приведёт к корректному результату компи-
ляции программы, а PinMode – сообщение об ошибке. Так же
и переменные buttonPin и Buttonpin являются полностью
самостоятельными, не зависящими друг от друга.
2. Прежде, чем использовать какую-либо переменную (кон-
станту), её необходимо описать, т.е. указать её имя, тип связан-
ных с ней данных и, в случае константы, указать её значение.
Подобная строгость на этапе разработки программы позво-
ляет исключить ошибки, которые могут возникнуть при вы-
полнении действий над данными ошибочных имён идентифи-
каторов и, соответственно, использования неверных данных.
3. Служебные слова int, void, INPUT и ряд других являются за-
резервированными, т.е. такими, назначение которых не мо-
жет быть переопределено пользователем при разработке про-
граммы ни при каких условиях. Также существуют слова (опе-
раторы, константы и переменные), значение которых опреде-
лено в библиотеках, загружаемых средой разработки по умол-
чанию. Значение некоторых из этих слов (например, опера-
торы pinMode, Serial) не может быть переопределено в
пользовательской программе, но может после получения до-
ступа к определяющим их библиотекам; некоторых (главным
образом, переменные) – может быть легко переопределено из
программы пользователя. В интегрированной среде разра-
ботки Arduino IDE служебные и предопределённые слова выде-
ляются цветом (бирюзовый оттенок и кирпично-красный, со-
ответственно).
12

Арифметические операторы

Операция
Синтаксис
Пример
сложение
результат = операнд 1
+ операнд 2;
вычитание
результат = операнд 1
- операнд 2;
умножение
результат = операнд 1
* операнд 2;
деление
результат = операнд 1
/ операнд 2;

2.2.1 Оператор присваивания

В качестве оператора присваивания используется знак «=». Применение данного оператора позволяет записать в ячейку па­мяти, связанную с переменной, указанной в левой части выраже­ния, значение, записанное в правую часть этого выражения. Таким образом, смысл, который вложен в использование знака «=» в языке C, существенно отличается от смысла, вложенного в этот знак в алгебре. Пример применения оператора присваивания:
int val; //Объявление целочисленной
// переменной val
val = analogRead(0); //Присвоение переменной
//val значения, // полученного в // результате чтения
// информации с 0-го
// канала // аналого-цифрового // преобразователя

2.2.2 Сложение, вычитание, умножение и деление

Данные операторы являются функциями двух аргументов (операндов). Ниже приведены привила применения данных опера­торов.
Таблица 2.1 Перечень арифметических операторов
x=x+1;
y=y1+y2;
z=2 * 5;
k=k / 4;
13

2.2.3 Вычисление остатка от деления

логическое И
true, если оба усло­вия вырабатывают значение true
Для вычисления остатка от деления двух целых чисел ис­пользуется операция деления по модулю: %. Данная операция имеет аналогичный предыдущим формат записи:
результат = операнд 1 % операнд 2.
Далее приведены примеры применения этой операции для разных значений операндов.
x = 7 % 5; // x присвоено значение 2 x = 9 % 5; // x присвоено значение 4 x = 5 % 5; // x присвоено значение 0 x = 4 % 5; // x присвоено значение 4

Логические операторы

При создании алгоритмов и программ для управления ка­кими-либо объектами, часто встречаются случаи, когда некоторое действие должно быть выполнено по результатам проверки «слож­ного» условия, например, «выработать сигнал в том случае, если включены одновременно выключатели K1 и К2». Для упрощения алгоритмов и программ, в которых необходимо решать подобные задачи, в языке C/C++ предусмотрены логические операторы, реа­лизующие функции булевой алгебры, перечень которых приведён в таблице 2.2:
Таблица 2.2 Перечень логических операторов
Оператор
&&
Описание
Пример
записи
x >= 0 &&
y == 1
14
Действие
||
логическое
ИЛИ
true, если хотя
вий вырабатывает значение true
логическое НЕ
true, если опе-
(или
0)
x == 1 ||
y == 1
бы одно из усло-
!
!x
ранд имеет зна­чение
false
Синтаксические символы языка
программирования
Синтаксические символы это символы, определяющие взаи­модействие между собой различных частей программного кода. К синтаксическим относятся следующие символы:
– ; (semicolon) – // (однострочный комментарий) – /* */ (многострочный комментарий)
#define
– – #include
– {} (curly braces)
Символ «;» используется для обозначения конца оператора и для разделения нескольких операторов друг от друга. Так, в теле функции setup(), может быть применена следующая запись:
Serial.begin(9600); pinMode(buttonPin, INPUT);
В то же время, записи
Serial.begin(9600); pinMode(buttonPin, INPUT) // Отсутствует «;» после оператора pinMode
или
Serial.begin(9600) pinMode(buttonPin, INPUT); // Отсутствует «;» после оператора Serial.begin
будут ошибочными.
Символами // начинается однострочный комментарий, т.е. текст, не воспринимаемый компилятором при переводе про­граммы, размещённой в окне редактора, в машинный код:
15
Serial.begin(9600); // Это однострочный комментарий pinMode(buttonPin, INPUT);
Внутри комбинации символов /* и */ может находиться ком­ментарий, занимающий несколько строк в окне редактора про­граммы:
Serial.begin(9600);
/* Это многострочный комментарий */
pinMode(buttonPin, INPUT);
Команда #define представляет собой обычный для языка C компонент, позволяющий программисту определить константу (величину, доступную только для чтения) в программе прежде её компиляции. Пример использования команды #define:
#define ledPin 3
Здесь константе ledPin присваивается значение 3. Следует отметить, что в начале команды должен обязательно присутство­вать символ #, в конце строки отсутствует разделитель «;».
Команда #include предназначена для подключения к разра­батываемой программе внешних библиотек функций, как стан­дартных для языка C, так и разработанных специально для Arduino. Пример использования команды #include, демонстрирующий подключение к программе библиотеки функций pgmspace.h, при- ведён ниже:
#include <pgmspace.h>
Сочетание символов {} является весьма важным в языке
C/C++. Данная пара символов является так называемыми «опера­торными скобками», группирующими несколько последовательно расположенных операторов в единый логический блок.
Открывающей скобке «{« обязательно должна соответ-
ствовать закрывающая скобка «}». Рекомендуется при написа-
нии программы ставить сразу пару скобок, после чего размещать внутри них необходимые командные последовательности. Также, при наличии вложенности нескольких уровней скобок, удобно раз­мещать операторы, относящиеся к каждому уровню, со своей уста­новленной величиной отступа от левого края. Это весьма облег­чает написание программы и последующую её отладку.
16
Пример:
{ //уровень 1 оператор 1.1; оператор 1.2; { //уровень 2 оператор 2.1 оператор 2.2 оператор 2.3 { //уровень 3 оператор 3.1 }
}
}
Операторные скобки находят широкое применение при оформлении функций, в условных операторах, в операторах цикла и т. п.
Неверное расположение скобок может полностью нару­шить логику работы программы из-за нарушения последова­тельности выполнения операторов. В частности, поэтому реко­мендуется перед написанием программы разработать схему ал­горитма.
Разберём сказанное на примере. Приведённая программа реа­лизует алгоритм, фрагмент которого представлен на ри­сунке 2.1, а).
а)
17
б)
Рисунок 2.1 – Примеры схем алгоритмов
#define analog_PIN A0 byte z; float x, angle; void setup() { pinMode(analog_PIN, INPUT); } void loop() { z=0; x=analogRead(analog_PIN); if (x>=512) { z=1; x=x-512; }
18
angle=(180/512)*x;
Наименова-
ние
Длина
внутреннего
представле-
ния
Знаковая
(Да/Нет)
1.
Логический
2.
Ц
е
byte
1 байт
Нет
0 … 255
delay (50); }
Ошибочное размещение закрывающей скобки после опера-
тора z=1 (выделено)
if (x>=512) {
z=1;} x=x-512;
даёт алгоритм, схема которого приведена на рисунке 2.1, б):
Типы данных, применяемых при
программировании систем на базе Arduino
Как отмечалось ранее, при разработке программы возникает задача описания используемых идентификаторов, которая вклю­чает, в том числе, указание типа связанных с идентификатором данных. Тип данных определяет способ их внутреннего представ­ления, а также действия, которые разрешается выполнять над дан­ными. В таблице приведены сведения о типах данных, используе­мых для описания логических и численных переменных.
Таблица 2.3 Логический и числовые типы данных, используемые при программировании Arduino
№
п/п Тип
boolean 1 байт
—
Диапазон
(принимаемые
значения)
true (истина) false (ложь)
19
3.
int
2 байта
(
базе ATMega)
4.
4 байта
( DUE)
Да
– 2 147 483 648 … 2 147 483 647
(2

… 2

1)
5.
2 байта
(
базе ATMega)
6.
4 байта
( DUE)
Нет
0 … 4,294,967,295 (0 … 21)
7.
2 байта (
базе ATMega)
8.
4 байта (
и
ZERO)
Нет
0 … 4,294,967,295 (0 … 21)
9. 4 байта
Да
– 2 147 483 648 … 2 147 483 647
(2

… 2

1)
10.
unsigned long
4 байта
Нет
0 … 4,294,967,295 (0 … 21)
11.
2 байта
Да
–32768 … 32767 (2

… 2

1)
12.
Ве-
ще-
4 байта
Да
–3,4028235E+38 … 3,4028235E+38
unsigned int
word
Arduino
UNO и
контрол­леры на
Arduino
Arduino
UNO и
контрол­леры на
Arduino
Arduino
UNO и
контрол­леры на
Да
Нет
Нет
–32768 … 32767

… 2

1)
(2
0 … 65535 (0 … 21)
0 … 65535 (0 … 21)
Arduino
DUE
long
short
float
20
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]