Задание 1.
Разработать схему алгоритма и написать программу на языке программирования С.
Варианты:
0. Сформировать массив из 25 чисел. Найти среднее арифметическое среди положительных элементов.
1. Сформировать массив из 10 чисел. Найти наибольший элемент массива и его номер.
2. Сформировать массив из 10 чисел. Найти наименьший элемент массива и его номер.
3. Сформировать массив из 15 чисел. Определить количество положительных элементов и сумму отрицательных.
4. Сформировать массив из 15 чисел. Найти сумму всех элементов и количество отрицательных.
5. Сформировать массив из 15 чисел. Найти произведение отрицательных чисел и их количество.
6. Сформировать массив из 15 чисел. Найти сумму элементов, значения которых находится в пределах от 5 до 25.
7. Сформировать массив из 20 чисел. Найти сумму первой половины элементов и произведение второй половины.
8. Сформировать массив из 20 чисел. Найти среднее арифметическое среди положительных элементов.
9. Сформировать массив из 20 чисел. Найти наибольший элемент среди четных по номеру.
Методические указания к заданию №1.
Пример:
Сформировать массив из 10 чисел. Найти произведение всех элементов и сумму отрицательных элементов.
Схема алгоритма.

Текст
программы на языке С.
main()
{
int A[10]={2,5,-8,7,-3,15,38,-11,66,-6}; //задание массива
int I,S,P; //объявление переменных целого типа
S=0; //начальное значение суммы
P=1; //начальное значение произведения
for (I=1;I<10;I++) //переменная цикла I
изменяется от 1 до 10 с шагом 1
{
P=P*A[I]; //нахождение произведения всех элементов массива
if(A[I]<0) //если элемент массива меньше 0
S=S+A[I]; //нахождение суммы отрицательных элементов массива
}
}
Задание 2.
Разработать микропроцессорное устройство на основе микроконтроллера AduC842.
1. Привести схему устройства с описанием назначения элементов.
2. Разработать схему алгоритма и программу на языке программирования С. При написании программы обязательно использовать комментарии в каждой строке, описывающие производимые действия.
Варианты:
0. Разработать устройство, включающее электродвигатель при вводе в микроконтроллер определенной восьмиразрядной двоичной кодовой комбинации.
1. Разработать формирователь набора телефонного номера в импульсном режиме.
2. Разработать устройство, состоящее из микроконтроллера и подключенных к нему клавиатуры и восьми светодиодов. При нажатии кнопки на светодиодах должен высветиться двоичный код, соответствующий цифре на кнопке.
3. Разработать устройство, состоящее из микроконтроллера и подключенных к нему восьми светодиодов. После запуска программы каждый светодиод должен последовательно загореться на 1 секунду.
4. Разработать устройство управления елочной гирляндой
«Бегущие огни».
5. Разработать устройство, состоящее из микроконтроллера и подключенных к нему восьми светодиодов. При вводе в микроконтроллер определенной восьмиразрядной двоичной кодовой комбинации на светодиодах должен высветиться код, равный проинвертированному входному коду.
6. Разработать устройство, состоящее из микроконтроллера, клавиатуры и цифрового индикатора. При нажатии на кнопку должен высвечиваться соответствующий символ.
7. Разработать устройство формирования сигнала для двухтональной звуковой сирены.
8. Разработать устройство, состоящее из микроконтроллера и подключенных к нему клавиатуры и восьми светодиодов. При нажатии кнопки должен загораться один светодиод, при нажатии кнопки 2 должны загораться два светодиода и т.д.
9. Разработать устройство, состоящее из микроконтроллера и подключенных к нему восьми светодиодов. Каждый светодиод должен последовательно моргнуть по 5 раз с интервалом в 1 секунду.<
Методические указания к заданию №2.
Пример1: Разработать устройство, состоящее из микроконтроллера и подключенного к нему светодиода. Светодиод должен мигать 1 раз в секунду.

Рисунок 1. Схема устройства.
Описание схемы.
Основным элементом схемы является микроконтроллер AduC842. К нулевому разряду параллельного порта P0 подключен светодиод через резистор, ограничивающий ток светодиода. Анод светодиода подключен к источнику питания. При установке на выходе порта уровня напряжения, соответствующего логическому нулю (потенциала, близкого к нулю) светодиод будет гореть. Ток протекает от + источника питания, через светодиод к нулю. Если на выходе порта логическая единица (около +5 В), на светодиоде разность потенциалов близка к 0 и он не светится. Схема включения микроконтроллера типовая. Ко входу RESET подключена схема сброса микроконтроллера при включении питания. Для стабилизации напряжения питания использована схема стабилизатора напряжения. Для мигания светодиода необходимо программно последовательно записывать в нулевой разряд порта P0 цифру 0 и через паузу в 1 секунду цифру 1. Этот процесс должен повторяться циклически.
Схема алгоритма.

Текст
программы на языке С.
#include “AduC842.h” //подключение файла с описанием регистров AduC842.h
Time() //функция
задержки на 1 секунду
{ int I; //объявляем I целого
типа
TMOD=0x01; //устанавливаем
режим 1 таймера Т0
for( I=1; I<32;
I++) //цикл 32 раз
{
TF0=0; //обнуляем флаг
переполнения
TH0=0; //обнуляем
таймер
TL0=0; //
TCON=0x10; //запускаем таймер
while(!TF0); //ждем, пока не переполнится таймер Т0
}
}
main() //главная программа
{
while(1) //бесконечный цикл
{
P0 = 0; // в порт P0
записываем восьмиразрядный код 00000000
Time(); //вызываем
функцию задержки с (1 сек.)
P0 = 1; //в порт P0 записываем восьмиразрядный
код 00000001
Time(); //вызываем
функцию задержки (1 сек.)
} //завершение цикла while
} //завершение главной функции (main)
Для создания точных временных интервалов при формировании задержек в программах обычно используют специальные таймеры, встроенные в микроконтроллер. Таймер Т0 представляет собой двоичный 16-ти разрядный счетчик на вход которого поступают импульсы с тактового генератора. Счетчик состоит из двух регистров ТH0 (старшие 8 разрядов) и TL0 (младшие 8 разрядов). Частота тактовых импульсов для AduC842 по умолчанию равна fosc =2.097152 МГц.
На рисунке 3 изображена структурная схема таймера T0.

Рисунок 3. Структурная схема таймера T0.
С каждым импульсом от генератора в счетчик добавляется 1. При переполнении счетчика флаг TF0 устанавливается в 1. Для переполнения 16-разрядного счетчика требуется 65535 импульсов. Таким образом, максимальная задержка в таймере может быть:
65535/2.097152 мГц =31250 мкс
Это время можно изменять, предварительно записывая в регистры таймера различные коды от 0 до 65535.
Для формирования более длительных задержек нужно, чтобы счетчик таймера переполнялся несколько раз. Например, для задержки в 1 секунду, необходимо, чтобы таймер переполнился
1000000/31250=32 раза.
Пример 2: Разработать устройство, состоящее из микроконтроллера и подключенного к нему светодиода и кнопки. При нажатии кнопки светодиод должен мигнуть 5 раз.

Рисунок 4. Схема устройства.
Описание устройства аналогично описанию в примере 1. В этой схеме добавлена кнопка. При нажатии кнопки на 0-й разряд порта Р2 подается уровень логического нуля, в отжатом состоянии – логической 1.

Схема алгоритма программы.
Описание схемы алгоритма:
Если Р2.0=0 (т.е. кнопка нажата) выполняется цикл от 1 до 5 и каждый из пяти раз происходит мигание светодиода, подключенного к порту Р0. Если Р2.0 не равно 0, все нижние блоки пропускаются. Все эти действия выполняются в бесконечном цикле.
Текст программы:
#include “AduC842.h” //подключение файла с описанием регистров AduC842.h
sbit P20=0xA0; //описываем переменную Р20 как бит регистра с
адресом 0xA0,
//по этому адресу находится
нулевой бит порта P2
Time() //функция задержки на
1 секунду
{int I; //объявляем I целого
типа
TMOD=0x01; //устанавливаем режим 1 таймера Т0
for( I=1; I<32;
I++) //цикл 32 раза
{
TF0=0; //обнуляем флаг переполнения
TH0=0; //обнуляем таймер
TL0=0; //
TCON=0x10; //запускаем таймер
while(!TF0); //ждем, пока не переполнится таймер Т0
}
}
main() //главная программа
{int I;
while(1) //бесконечный цикл
{
if(P20==0)
for(I=1;I<=5;I++)
{
P0 = 0; //в порт P0 записываем восьмиразрядный
код 00000000
Time(); //вызываем функцию задержки с параметром 1(1 сек.)
P0 = 1; //в порт P0 записываем восьмиразрядный
код 00000001
Time(); //вызываем функцию задержки с параметром 1(1 сек.)
} //завершение
цикла for
} //завершение
цикла while
} //завершение
главной функции (main)