Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование микропроцессорных систем управления подвижного состава железных дорог. Учебное пособие по дисциплинам «Автоматизированные и микропроц.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
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) выполняется различное количество действий. В первом, вто- ром и третьем случаях это единственная функция digital­Write(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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]