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

13.
double
(введён
для обес-
платформами)
4 байта
Да
печения
совместимости с
другими
Помимо логических и численных данных, микроконтроллер
может обрабатывать символьные данные (буквы алфавита, знаки
препинания и т.п.), а также строковые переменные. Для задания переменных символьного типа используется тип char.
char – тип данных, используемый для хранения алфавитно-
цифровых символов. Длина внутреннего представления – 1 байт.
Символ может задаваться как литерой, так и кодом в формате ASCII.
Пример:
char myChar = 'A';
char myChar = 65;
Так как символы хранятся в памяти микроконтроллера в виде
числового кода, над ними можно производить арифметические
операции.
Массивы
Массивы (arrays) — именованный набор однотипных перемен-
ных, с доступом к отдельным элементам по их индексу.
Ниже приведено несколько корректных вариантов объявления массивов:
–3,4028235E+38 …
3,4028235E+38
int myInts[6];
int
myPins[] = {2, 4, 8, 3, 6};
int
mySensVals[6] = {2, 4, -8, 3, 2};
char
message[6] = "hello";
Массив может быть объявлен без непосредственной инициализации элементов массива, как в случае массива myInts. Массив
myPins был объявлен без явного задания размера. Компилятор сам
посчитает фактическое количество элементов и создаст в памяти
массив необходимого размера.
21

Размер может быть задан явно, одновременно с инициализацией элементов массива. Индексация массива начинается с 0. Это
значит, что для массива с 10-тью элементами, индекс 9 будет последним:
int myArray[10]={9,3,2,4,3,2,7,8,9,11};
// myArray[0] первый элемент, содержит 9
// myArray[9] последний элемент,
// содержит 11
Присвоение элементу массива некоторого значения:
myArray[0] = 10;
Возвращение значения элемента массива:
x = mySensVals[4];
К типам данных относится зарезервированное слово void. Данное слово используется только при вызове функции. Его использование означает, что функция после своего исполнения не будет воз-
6
вращать в вызывающую её программу какой-либо результат
.
Операторы управления последовательностью
выполнения операторов программы
2.6.1 Условные операторы
Условный оператор if
Условный оператор предназначен для выполнения той или
иной ветви алгоритма в зависимости от результата проверки выполнения какого либо условия. В языке С/С++ существуют две разновидности условного оператора, каждой из которых соответ-
6
Для обозначения таких функций используется термин «процедура» – функционально законченный, специальным образом
оформленный фрагмент программы. У процедуры могут быть аргументы, но она не вырабатывает выходное значение. Функция, в
отличие от процедуры, имеет один или несколько аргументов, а
также вырабатывает некоторое выходное значение. Пример функции у=sin(x).
22

ствует своя схема алгоритма. Условный оператор if служит для реализации алгоритма, схема которого приведена на рисунке 2.2,
формат использования оператора приведён ниже:
if (<условие>) оператор 1;
или
if (<условие>) {оператор 1;}
Рисунок 2.2 – Схема алгоритма, реализуемого
оператором if
Далее приведены корректные варианты записи условного
оператора типа if:
if (x > 120) digitalWrite(LEDpin, HIGH);
if (x > 120)
digitalWrite(LEDpin, HIGH);
if (x > 120){ digitalWrite(LEDpin, HIGH); }
if (x > 120){
digitalWrite(LEDpin1, HIGH);
digitalWrite(LEDpin2, HIGH);
}
Здесь HIGH – предопределённая логическая константа, соот-
ветствующая значению true.
23

Как видно, в данных примерах при истинности условия (x >
Оператор
Описание
Пример записи
==
равно
x == y
!=
не равно
x != y
<
меньше
x < y
>
больше
x > y
<=
меньше или равно
x <= y
>=
больше или равно
x >= y
Оператор
Результат
==
false
!=
true
<
false
>
true
<=
false
>=
true
120) выполняется различное количество действий. В первом, вто-
ром и третьем случаях это единственная функция digitalWrite(LEDpin, HIGH), поэтому допускается не использовать
операторные скобки «{}». В четвёртом случае предполагается выполнение двух действий:
{
digitalWrite(LEDpin1, HIGH);
digitalWrite(LEDpin2, HIGH);
}
Поэтому, применение операторных скобок в данном случае яв-
ляется обязательным.
Для записи условия в языке C/C++ допускается использовать
следующие операторы сравнения:
Результатом выполнения операторов сравнения является
true, если условие выполнено («истина»), в противном false
(условие не выполнено, «ложь»).
Пример
Даны две переменные, x = 120, y = 100. Найти результаты
выполнения логических операций.
24

Условный оператор if..else
Функциональности оператора if в ряде случаев оказывается
недостаточно. Больше возможностей предоставляет оператор
if..else, позволяющий реализовывать выбор из двух альтернативных ветвей алгоритма. Схема алгоритма, реализующая оператор if..else, приведена на рисунке 2.3
Рисунок 2.3 – Схема алгоритма, реализующего оператор if..else
Формат использования оператора if..else:
if (<условие>) {оператор 1;}
else {оператор 2;}.
Данный условный оператор работает следующим образом:
если в результате проверки условия вырабатывается значение
true (истина), управление передаётся на ветвь, содержащую оператор 1. В противном случае, управление передаётся на ветвь, содержащую оператор 2.
Допускается каскадное использование условного оператора
if..else, что позволяет реализовывать ветвление на более, чем
два потока обработки данных.
Пример
Дана некоторая величина input_val. Необходимо выполнить <оператор 1>, если значение величины input_val меньше
500; <оператор 2>, если значение величины величина in-
put_val больше или равно 1000, <оператор 3> во всех остальных
25

случаях. Данному заданию соответствует следующая схема алгоритма (рисунок 2.4).
Рисунок 2.4 – Схема алгоритма, использующего
каскадное включение условного оператора if..else
Фрагмент программы, реализующий данную схему алгоритма:
if (input_val < 500)
{
// {Оператор 1}
}
else if (input_val >= 1000)
{
// {Оператор 2}
}
else
{
// {Оператор 3}
}
Пример
Необходимо составить схему алгоритма и фрагмент программы, реализующие функцию двухпозиционного элемента с зоной нечувствительности (рисунок 2.5).
26

Рисунок 2.5 – Модель двухпозиционного элемента с зоной
нечувствительности
Вначале целесообразно записать аналитическое выражение,
задающее зависимость выходного сигнала от входного y(x):
=
Как видно, «сложному» условию соответствует вторая строка
формулы. В соответствии с ней, величина выходного сигнала y
равна 0, если входной сигнал x > –a, и x≤a. Это условие должно быть
записано следующим образом: x > -a && y <= a. С учётом сказанного, схема алгоритма, позволяющего решить поставленную задачу, выглядит следующим образом (рисунок 2.6):
, ;
0, < ;
, >
Рисунок 2.6 – Схема алгоритма решения задачи
27

Фрагмент программы, реализующей данный алгоритм:
if (x <= -a)
{
y = c;
}
else
if (x > -a && y <= a)
{
y = 0;
}
else
{
y = b;
}
Оператор switch…case
Данный оператор является ещё одной конструкцией, позволяющей управлять процессом выполнения программы путём выбора
альтернативного кода, который будет выполняться при различных
условиях.
switch (val)
{
case label:
// оператор(ы)
break;
case label:
// оператор(ы)
break;
default:
// оператор(ы)
break;
}
Здесь var – переменная, значение которой сравнивается с различными вариантами, задаваемыми ключевыми параметрами
case; label – величина, с которым сравнивается значение пере-
менной
Итак, в операторе switch сравнивается значение переменной
val со значениями label, определенными при помощи ключевых
параметрами case. В случае, если найден case, значение label
28

которого равно значению переменной val, выполняется программный код, соответствующий данному ключевому параметру.
Операторы, относящиеся к ключевому параметру default выполняются, если не найдено ни одного соответствия параметрам case.
Данный раздел является необязательным и может отсутствовать.
Используемое ключевое слово break является командой выхода из последовательности операторов, соответствующих ключевому параметру case. Очевидно, что оно обычно используется в
конце каждого case. Если не встретится команда break, будут
выполняться операторы, относящиеся к последующим ключевым параметрам case до тех пор, пока не будет найдена команда break или достигнут конец оператора switch.
Пример
switch (var)
{
case 1:
/ *операторы, выполняемые в случае,
когда var = 1 */
break;
case 2:
/* операторы, выполняемые в случае,
когда var = 2 */
break;
default:
/* операторы, выполняемые в случае,
когда соответствия var не найдено */
// данный параметр является опцией
break;
}
2.6.2 Операторы реализации циклических вычислений
Операторы реализации циклических вычислений используют
в том случае, когда имеется необходимость многократно выполнения какого-либо фрагмента программы. Рассмотрим некоторые из
операторов задания цикла, применяемых при программировании
на языке С.
29

Оператор цикла for
Предназначен для многократного исполнения операторов, заключённых в фигурные скобки. В языке С оператор for обладает
гораздо большей гибкостью, чем в остальных языках программирования, поэтому он может быть использован для решения практически любых задач, включая такие традиционные задачи, как доступ к элементам массивов.
Заголовок оператора for содержит три поля:
<инициализация переменной цикла>
<условие выполнения>
<приращение переменной цикла>
Здесь переменная цикла – управляющая переменная, используемая для управления цикла. Процесс инициализации переменной цикла подразумевает её объявление, то есть указание типа и
имени, а также начального значения. Переменная цикла может
быть связана как с целочисленным типом данных (например, int),
так и вещественным (float).
Поле условия выполнения определяет момент завершения
цикла, поле приращения переменной цикла определяет, как будет
изменяться величина переменной цикла на каждом шаге его исполнения. Формат вызова оператора for имеет следующий вид:
( <инициализация переменной цикла>;
for
цикла>
{
<условие завершения>
)
; <приращение переменной
//оператор(ы);
}
Инициализация переменной цикла выполняется самой первой
и один раз. Каждый раз в цикле проверяется условие выполнения,
если оно верно (true), выполняется блок операторов и вычисляется приращение переменной цикла. Затем условие выполнения
проверяется вновь и процесс повторяется. Когда результат проверки условия выполнения примет значение false, цикл заверша-
ется.
Пример
// Управление светодиодом при
// помощи генератора с ШИМ
30
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
