Добавил:
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
- •КОНТРОЛЬНЫЕ ВОПРОСЫ
- •ИСПОЛЬЗОВАННЫЕ ИСТОЧНИКИ
- •СОДЕРЖАНИЕ

В разделе описаний осуществляется подключение библиотек
используемых функций; описание и инициализация переменных и
констант, используемых в программе. Однократно исполняемые за
время работы программы операторы, служащие, например, для
конфигурирования каналов ввода/вывода информации, предварительных вычислений, помещены в тело функции 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 … 21)
7.
2 байта
(
базе
ATMega)
8.
4 байта
(
и
ZERO)
Нет
0 … 4,294,967,295
(0 … 21)
9.
4 байта
Да
– 2 147 483 648 …
2 147 483 647
(2
… 2
1)
10.
unsigned
long
4 байта
Нет
0 … 4,294,967,295
(0 … 21)
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 … 21)
0 … 65535
(0 … 21)
Arduino
DUE
long
short
float
20
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
