Задание к контрольной работе

Задание 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, все нижние блоки пропускаются. Все эти действия выполняются в бесконечном цикле.

Текст программы:

#includeAduC842.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)