Микроконтроллер типа AVR компании ATMEL

Тип работы:
Курсовая
Предмет:
Программирование


Узнать стоимость

Детальная информация о работе

Выдержка из работы

ВВЕДЕНИЕ

Задачей данного курсового проекта было практическое применение знаний, полученных ранее в различных областях науки, для реализации конкретного технического задания.

Результатом выполнения такого задания являлась реализация сетевой игры «Пинг Понг», рассчитанной на двух игроков на микроконтроллере AVR АТMEGA 128. Счёт игры ведётся до 8, после чего определяется игрок победитель (индикация победителя на экране) затем игра начинается сначала через заранее установленное время. Возможность управления ракетками реализована в одной системе координат. В пояснительной записке представлены этапы перехода от словесного описания поставленной задачи до конкретной реализации в виде функционирующего устройства. Выполнены все этапы проектирования от технического задания до реализации проекта в выбранной элементной базе. Также выполнено программирование микроконтроллера AVR АТMEGA 128.

Микроконтроллеры семейства AVR за сравнительно короткое время завоевали заслуженную популярность во всём мире.

AVR, пожалуй, одно из самых интересных направлений, развиваемых корпорацией Atmel. Они представляют собой мощный инструмент для создания современных высокопроизводительных и экономичных многоцелевых контроллеров. На настоящий момент соотношение «цена — производительность — энергопотребление» для AVR является одним из лучших на мировом рынке 8-разрядных микроконтроллеров. Объемы продаж AVR в мире удваиваются ежегодно. В геометрической прогрессии растет число сторонних фирм, разрабатывающих и выпускающих разнообразные программные и аппаратные средства поддержки разработок для них. Можно считать, что AVR постепенно становится еще одним индустриальным стандартом среди 8-разрядных микроконтроллеров общего назначения.

Области применения AVR многогранны. Для семейства «tiny» — это интеллектуальные автомобильные датчики различного назначения, игрушки, игровые приставки, материнские платы персональных компьютеров, контроллеры защиты доступа в мобильных телефонах, зарядные устройства, детекторы дыма и пламени, бытовая техника, разнообразные инфракрасные пульты дистанционного управления. Для семейства «classic» — это модемы различных типов, современные зарядные устройства, изделия класса Smart Cards и устройства чтения для них, спутниковые навигационные системы для определения местоположения автомобилей на трассе, сложная бытовая техника, пульты дистанционного управления, сетевые карты, материнские платы компьютеров, сотовые телефоны нового поколения, а также различные и разнообразные промышленные системы контроля и управления. Для «mega» AVR — это аналоговые (NMT, ETACS, AMPS) и цифровые (GSM, CDMA) мобильные телефоны, принтеры и ключевые контроллеры для них, контроллеры аппаратов факсимильной связи и ксероксов, контроллеры современных дисковых накопителей, CD-ROM и т. д.

Микроконтроллер семейства mega — ATmega128 — маломощный 8-разрядный КМОП микроконтроллер, основанный на расширенной AVR RISC-архитектуре. За счет выполнения большинства инструкций за один машинный цикл ATmega128 достигает производительности 1 млн. операций в секунду, что позволяет проектировщикам систем оптимизировать соотношение энергопотребления и быстродействия. Высокая производительность, наличие развитой подсистемы ввода/вывода и широкого спектра встроенных периферийных устройств позволяют отнести микроконтроллеры AVR АТMEGA128 к классу наиболее функциональных микроконтроллеров для встроенных систем управления.

1. ТЕХНИЧЕСКОЕ ЗАДАНИЕ

1.1 Постановка задачи

Задача данного курсового проекта заключается в том, что необходимо аппаратно реализовать сетевую игру «Пинг Понг» на базе двух микроконтроллеров ATmega128. Сетевое взаимодействие реализуется соединением контроллеров посредством СОМ-порта. Игра рассчитана для двух игроков. По достижению общей суммы проигрышей двумя игроками в количестве восьми игра должна завершаться.

Основными моментами работы являются:

- реализация алгоритмов рисования графических примитивов;

- реализация алгоритмов пересечения, отражения и отсечения отрезков;

- реализация обмена данными по COM-port;

- реализация управления при помощи мыши;

- тестирование и оптимизация программного продукта;

- исследование возможностей микроконтроллера.

1.2 Входные/выходные параметры

Входные и выходные параметры (табл.1. 1) определяются из задания.

Таблица 1.1 — Входные/выходные параметры

Входы

Назначение

Разрядность

Сигналы маши по изменению координат

Управление одной из ракеток на дисплее

5.8 бит

Принимаемые данные с порта

Получение координат положения ракетки

5.8 бит

Посылка информации на порт

Передача координат положения ракетки

5.8 бит

Основные требования к проектированию: описание моделей с помощью языков программирования типа С или ассемблер. Способ проверки: пошаговое тестирование основных этапов программы вплоть до физической реализации.

2. ТЕХНИЧЕСКОЕ ПРЕДЛОЖЕНИЕ

2.1 Описание алгоритма

Алгоритм общего взаимодействия блоков проекта (см. рисунок 2. 1) основан на последовательной передаче управления каждому блоку. Блок «установки сетевого соединения» отвечает за автоматическую синхронизацию передачи данных. Блок проверки соединения проверяет корректность синхронизации. Блок «игра» отвечает за проведение игрового процесса. Алгоритм игры приведен на рисунке 2.3. Определение победителя осуществляется путём сравнения количества промахов каждого игрока. В конце осуществляется проверка победителя, вывод сообщения о победителе и запускается счетчик перезапуска игры. Блок установки соединения содержит в себе два алгоритма: алгоритм сервера и алгоритм клиента.

Рисунок 2.1 — Алгоритм общего взаимодействия всех блоков проекта

Рисунок 2.2 — Алгоритм игры

2.2 Выбор элементной базы

Макет представляет собой универсальное устройство на базе микроконтроллера AVR ATmega 128 (fт=11,59 200 МГц), в состав которого входят: микроконтроллер AVR ATmega 128, графический ЖК-дисплей Toshiba T6963C, блок светодиодов, клавиатуры: 34 и 31 (количество столбцов количество строк), АЦП, последовательный интерфейс RS-232C. Сопряжение лабораторного макета и программатора (ПЭВМ) обеспечивается с помощью последовательного интерфейса SPI, конструктивно использующего стандартный разъем Centronics DB-25. Блок из восьми светодиодов подключен к микроконтроллеру через порт D. Сопряжение клавиатуры 34 осуществляется с помощью порта Е. Через порт F, линии которого являются входами АЦП. На рис. 2.4 показана структурная схема лабораторного макета на базе микроконтроллера AVR ATmega 128.

Интерфейс порта В конструктивно выполнен в виде унифицированного разъема DB-25, Для линий двух встроенных в микроконтроллер последовательных интерфейсов RS-232C (USART0, USART1) [4] предназначены разъемы DB-9, расположенные на задней панели макета. На задней панели находится также разъем для подключения внешнего источника питания (12 В) и выключатель электропитания.

Рисунок 2.3 — Структурная схема лабораторного макета на базе микроконтроллера AVR ATmega 128

Технические характеристики:

1. Высокопроизводительный, маломощный 8-разрядный AVR-микроконтроллер.

2. Развитая RISC-архитектура.

3. 133 мощных инструкций, большинство из которых выполняются за один машинный цикл.

4. 32 8-разрядных регистров общего назначения + регистры управления встроенной периферией.

5. Полностью статическая работа.

6. Производительность до 16 млн. операций в секунду при тактовой частоте 16 МГц.

7. Встроенное умножающее устройство выполняет умножение за 2 машинных цикла.

8. Энергонезависимая память программ и данных.

9. Износостойкость 128-ми кбайт внутрисистемно перепрограммируемой флэш-памяти: 1000 циклов запись/стирание.

10. Опциональный загрузочный сектор с отдельной программируемой защитой.

11. Внутрисистемное программирование встроенной загрузочной программой.

12. Гарантированная двухоперационность: возможность чтения во время записи.

13. Износостойкость 4 кбайт ЭСППЗУ: 100 000 циклов запись/стирание.

14. Встроенное статическое ОЗУ емкостью 4 кбайт.

15. Опциональная возможность адресации внешней памяти размером до 64 кбайт.

Рисунок 2.4 — Функциональная схема

Ядро AVR сочетает богатый набор инструкций с 32 универсальными рабочими регистрами. Все 32 регистра непосредственно подключены к арифметико-логическому устройству (АЛУ), который позволяет указать два различных регистра в одной инструкции и выполнить ее за один цикл. Данная архитектура обладает большей эффективностью кода за счет достижения производительности в 10 раз выше по сравнению с обычными CISC-микроконтроллерами (рис 2. 5).

ATmega128 поддерживается полным набором программных и аппаратных средств для проектирования, в т. ч.: С-компиляторы, макроассемблеры, программные отладчики/симуляторы, внутрисистемные эмуляторы и оценочные наборы.

В целях достижения максимальной производительности и параллелелизма у AVR-микроконтроллеров используется Гарвардская архитектура с раздельными памятью и шинами программ и данных. Команды в памяти программ выполняются с одноуровневой конвейеризацией. В процессе выполнения одной инструкции следующая предварительно считывается из памяти программ. Данная концепция позволяет выполнять одну инструкцию за один машинный цикл. Память программ представляет собой внутрисистемно программируемую флэш-память.

Регистровый файл с быстрым доступом содержит 32×8-разр. рабочих регистров общего назначения с однотактовым циклом доступа. Благодаря этому достигнута однотактность работы арифметико-логического устройства (АЛУ). При обычной работе АЛУ сначала из регистрового файла загружается два операнда, затем выполняется операция, а после результат отправляется обратно в регистровый файл и все это происходит за один машинный цикл.

Шесть регистров из 32 могут использоваться как три 16-разр. регистра косвенного адреса для эффективной адресации в пределах памяти данных. Один из этих указателей адреса может также использоваться как указатель адреса для доступа к таблице преобразования во флэш-памяти программ. Данные 16-разр. регистры называются X-регистр, Y-регистр и Z-регистр и описываются далее в этом разделе.

АЛУ поддерживает арифметические и логические операции между регистрами, а также между константой и регистром. Кроме того, АЛУ поддерживает действия с одним регистром. После выполнения арифметической операции регистр статуса обновляется для отображения результата выполнения операции.

Для ветвления программы поддерживаются инструкции условных и безусловных переходов и вызовов процедур, позволяющих непосредственно адресоваться в пределах адресного пространства. Большинство инструкций представляют собой одно 16-разр. слово. Каждый адрес памяти программ содержит 16- или 32-разр. инструкцию. Флэш-память программ разделена на две секции: секция программы начальной загрузки и секция прикладной программы. Обе секции имеют раздельные биты защиты от записи и чтения/записи. Инструкция SPM (запись в секцию прикладной программы) должна использоваться только внутри секции программы начальной загрузки.

Высокопроизводительное АЛУ AVR-микроконтроллеров работает в непосредственной связи со всеми 32 универсальными рабочими регистрами. АЛУ позволяет выполнить за один машинный цикл операцию между двумя регистрами или между регистром и константой. Операции АЛУ могут быть классифицированы на три группы: арифметические, логические и битовые. Кроме того, архитектурой ATmega128 поддерживаются операции умножения со знаком и без знака и дробным форматом.

В соответствии с гарвардской архитектурой память AVR-микроконтроллера разделена на две области: память данных и память программ. Кроме того, ATmega128 содержит память на ЭСППЗУ для энергонезависимого хранения данных. Все три области памяти являются линейными и равномерными.

Внутрисистемно программируемая флэш-память программ ATmega128 содержит 128 кбайт внутренней внутрисистемно перепрограммируемой флэш-памяти для хранения программы. Поскольку все AVR-инструкции являются 16 или 32-разр., то флэш-память организована как 64 кбайт16. Для программной защиты флэш-память программ разделена на два сектора: сектор программы начальной загрузки и сектор прикладной программы.

Рисунок 2.5 — Карта памяти программ

3. ЭСКИЗНЫЙ ПРОЕКТ

Эскизный проект — этап составления спецификаций отдельных блоков, разработка подробной структурно-блочной схемы устройства. На рисунке 3.1 изображена функциональная модель.

Рисунок 3.1 — Функциональная модель

Блок обмена информации — в данном блоке производится обмен информации через Com-port. Работа этого блока осуществляется в полудуплексном режиме — поочередна передавая данные о положении управляемой ракетки. Также этот блок отвечает за установление и проверку сетевого соединения. Проверка проводится по схеме «Рукопожатие» при этом один контроллер посылает запросный маркер «123», второй, в свою очередь, получив данный маркер, отсылает ответный «321» если маркер не получен или искажен, то на дисплее выдастся ошибка. Первый контроллер, получив маркер «321», отправляет сигнал на начало игры, если же ответный маркер не пришел или искажен на экране также выведется сообщение об ошибке.

Блок перемещения ракеток отвечает за перемещение ракеток по игровому полю начиная с начальных координат. Передвижение происходит по координате у.

Блок перемещения шарика отвечает за перемещение шарика по игровому полю начиная с начальных координат. Обеспечивает непрерывное передвижение шарика по двум осям х и у.

Блок сравнения координат отвечает за сравнение координат с константами которые определяют: края поля, рамки ракетки и ее местоположения, местоположения шарика относительно ракеток, относительно краёв игрового поля. В том случае если шарик пересёк координаты ракетки и не был отбит, управление передается блоку определения результата, в противном случае мы продолжаем работу в блоке сравнения координат.

Блок определения результата считает количество промахов для каждого игрока.

Блок подсветки диодов выполняет индикацию диодов в соответствии с общим количеством пропущенных очков.

Блок индикации победителя сообщает о победителе и подаёт сигнал на блок задержки.

Блок задержки выполняет задержку на 10 секунд и этим определяет завершение игры. После чего передаёт управление блоку движения шарика и блоку перемещения ракеток, начиная тем самым новую игру.

4. ТЕХНИЧЕСКИЙ ПРОЕКТ

На данном этапе происходит описание и моделирование функций языка программирования, выбор организации проекта и принципов построения моделей и т. д.

Основными моментами данного этапа являются:

— составление и описание блоков на языке программирования;

— определяются межблоковые связи;

— описание констант и переменных;

— отладка проекта (пошаговое тестирование основных блоков программы в процессе написания и исправление некорректной работы).

4.1 Разработка проекта

При описании моделей на языках программирования большое внимание следует уделять конструкциям языка. Так нужно использовать конструкции, которые воспринимаются программой программирования микроконтроллера, а также оптимизировать конструкции для достижения наименьших аппаратных затрат.

Рисунок 4.1 — Связи файлов

4.2 Описание интерфейса

Принципы построения модели включает методологию написания языкового кода. Спецификация составляется на всю программу, состоящую из основных блоков в соответствие со следующими этапами.

Необходимо выполнить анализ требуемых входных параметров и констант, а также определить их тип и начальные значения.

Начальные значения выбираются в соответствие с описанием устройства. Тип параметров — int целочисленный тип. При этом по умолчанию используется модификатор типа unsigned, который указывает, что переменная принимает неотрицательные значения. При этом самый левый бит области памяти, выделяемой для хранения значения, используется так же, как и все остальные биты области памяти — для представления значения.

Таблица 4.1 — Описание интерфейса всей программы

Входы

Тип

Начальные значения

Описание

х

int

65

Начальная координата шарика по оси х

у

int

63

Начальная координата шарика по оси у

f

int

0

Флаг определяющий отражение шарика

d

int

0

Общие очки игроков

g2

int

0

Очки игрока 1

g1

int

0

Очки игрока 2

lx1

int

239

Начальные координаты ракетки игрока 2 по оси х

ly1

int

53

Начальные координаты ракетки игрока 2 по оси у

lx2

int

5

Начальные координаты ракетки игрока 1 по оси х

ly2

int

53

Начальные координаты ракетки игрока 1 по оси у

r

int

5

Размер шарика

t

int

3

Размер ракеток игроков

4.3 Основные конструкции и процедуры, используемые для написания программы

При разработке проекта необходимо подключить заголовочные файлы:

1. #include «mega128. h» — для регистрации вводов-выводов для ATMEGA128;

2. #include «delay. h» — для использования задержек;

3. #include «graphics. h» — для вызова функций используемых в главном файле source.c. Сами функции описаны в файле «graphics. c».

Ниже приведены примеры наиболее значащих для проекта функций:

Листинг 4.1 — Функция определяющая порты

void init_cpu (void)

{

DDRB = 0xff; // Регистр направления данных порта B

PORTB = 0xff; // Регистр данных порта В

DDRD = 0xff; // Регистр направления данных порта D

PORTD =0xff; // Регистр данных порта D

DDRF = 0×00; // Регистр направления данных порта F

PORTF = 0×00; // Регистр данных порта F

DDRE = 0xf0; // Регистр направления данных порта E

MCUCR = 0x8a; // Регистр управления микроконтроллером

XMCRA = 0xff; // Регистр, А управления внешней памятью

SFIOR = 0×10; // Регистр специальных функций ввода-вывода

}

Листинг 4.2 — Функция отображения

void init_display (void);

{

write_command (0xB2); // Автоматический перезапуск

set_graphic_window (GRAPHICS_HOME0);

write_data (GRAPHICS_WIDTH); // Младший бит

write_data (0×00); // Старший бит

write_command (0×43); // Установка длинны графической линии

set_text_window (TEXT_HOME0);

write_data (TEXT_WIDTH); // Младший бит

write_data (0×00); // Старший бит

write_command (0×41); // Длинна линии текста

write_command (0b10000000); // Способ набора

write_command (0b10011100); // Способ показа

write_command (0xA3); // Выбор образца курсора

write_command (0×01);

write_command (0×00);

write_command (0×21); // Установка позиции курсора

return;

}

Листинг 4.3 — Функция перерисовки текста

void clear_text (void)

{

unsigned int i=0; // Положительное целое число

set_address (TEXT_HOME0); // Установить адресс

for (i; i<TEXT_WIDTH*TEXT_LINES;i++)// Определить ширину и длину

{

write_data (0); // Запись данных

write_command (0xC0); // Вывод данных

}

return;

}

При написании программы использовался оператор условия if/else, который позволяет выполнять одно из двух действий в зависимости от условия.

Листинг 4.4 — Использование оператора if/else

if (g2> g1)// если пропущенных очков у игрока 2 больше чем //у игрока 1

{sprintf (string,"WINNER: Player 1″); // то игрок 1 победил

write_string (10, 7, string);

delay_ms (10 000); }

С помощью этого оператора были описаны условия отражения шарика от границ экрана и от ракеток игроков.

Для рисования шарика и ракеток использовался оператор цикла с параметром for, когда заранее известно количество итераций цикла, что позволяло задать размер и заливку шарика, а также ширину ракеток.

Листинг 4.5 — Использование цикла for для отрисовки ракеток

for (t=0; t<3;t++)

{

Line (lx2-t, ly2, lx2-t, ly2+20,1); // ракетка игрока 1

Line (lx1-t, ly1, lx1-t, ly1+20,1); // ракетка игрока 2

}

В программе используется флаг необходимый для определения начальных координат и направления движения шарика и для предотвращения одновременного выполнения более чем одного условия изменения направления движения по координатам х и у одновременно.

Листинг4.6 — Задание начальных координат и движения

if (x< =0 & & y> =63)

{f=0; }

if (f==0)

{

x=x+4;

y=y+4;

}

Проект содержит файл source. map, который генерируется компилятором и находится в одном каталоге с исходным модулем программы. В нём указывается размещение переменных (в регистрах процессора или памяти данных) поскольку часто в ассемблерных подпрограммах возникает необходимость получить доступ к значениям переменных, объявленных в С-программе.

5. РАБОЧИЙ ПРОЕКТ

5.1 Компиляция

Данный проект реализован с помощью программы CodeVisionAVR.

Интегрированная среда CodeVisionAVR представляет собой кросс-компилятор языка С ориентированный на семейство микроконтроллеров AVR и содержит: графическую оболочку для управления ресурсами проекта; текстовый редактор исходного модуля программы; кросс-компилятор; отладчик, программатор; автоматический генератор программного кода; терминал для работы с последовательным интерфейсом RS232C (USART). Полученный в результате компиляции исходного кода программы на языке С исполняемый модуль (файл прошивки) может быть непосредственно записан в память программ микроконтроллера.

Рисунок 5.1 — Окно студии CodeVisionAVR

5.2 Прошивка

микроконтроллер прошивка интерфейс программирование

Прошивка микроконтроллера реализуется с помощью пользовательского интерфейса среды программирования CodeVisionAVR.

Далее необходимо выполнить компиляцию проекта — создать исполняемый программный модуль, пригодный для исполнения микроконтроллером. Для этого необходимо нажать клавишу Shift+F9. При завершении этапа компиляции активизируется окно Information, содержащее информацию о скомпилированном проекте. Если компиляция прошла успешно, то для записи программы в память микроконтроллера необходимо нажать кнопку Program, расположенную в нижней части окна Information. Выявленные в результате компиляции сообщения об ошибках отображаются в левой части главного рабочего окна, где располагаются данные о ресурсах проекта. При активизации сообщения об ошибке компилятор выводит подробные сведения о локализации и возможных причинах ошибки.

Рисунок 5.2 — Окно отображения информации о результатах компиляции проекта

В некоторых случаях для проверки работоспособности загруженной программы необходимо выполнить сброс микроконтроллера (Reset Chip) или удалить программу из памяти (Erase Chip).

Рисунок 5.3 — Окно отображения настроек программатора

5.2 Физическое тестирование

Таблица 5.1 — План тестирования

Воздействие

Ожидаемое

Реальное

Количество очков у игрока 1 больше чем у игрока 2

Индикация: player 1 win

Индикация: player 1 win

Количество очков у игрока 2 больше чем у игрока 1

Индикация: player 2 win

Индикация: player 2 win

Координаты шарика по x и y совпали с координатами ракетки

Шарик отбился

Шарик отбился

Координаты шарика по x и y не совпали с координатами ракетки

Шарик не отбился

Шарик не отбился

Шарик пропущен игроком

Высвечивается победитель раунда и загорается светодиод

Высвечивается победитель раунда и загорается светодиод

Координаты шарика по x или y совпали с координатами границы экрана

Шарик отбился

Шарик отбился

Координаты шарика по x или y не совпали с координатами границы экрана

Шарик не отбился

Шарик не отбился

Количество общих пропущенных очков превышает 8

Определение победителя, завершение и начало новой игры через 10 сек

Определение победителя, завершение и начало новой игры через 10 сек

Рисунок 5.4 — Соединение двух микроконтроллеров в сеть

Рисунок 5.5 — Результат выполнения программы

ВЫВОДЫ

Данный курсовой проект позволил более детально ознакомится с микроконтроллерами типа AVR компании ATMEL. В процессе разработки проекта были получены навыки проектирования, реализации и внедрение проекта в реальную модель.

В проекте не удалось реализовать функцию позволяющую отражать шарик от ракеток игроков и от границ экрана под случайным углом. Эта функция была описана не полностью и требует доработок.

Перемещение ракеток игроков возможно только по строгой последовательности, поскольку для них используется единая система координат.

Не был реализован полностью универсальный код для двух микроконтроллеров, так как это приводило к увеличению кода и ухудшению работы проекта, поэтому были реализованы два кода со специализированными блоками, предназначенными для определённого контроллера.

ПЕРЕЧЕНЬ ССЫЛОК

1. Методические указания к лабораторным работам по курсу «Микроконтроллеры во встроенных системах управления для студентов всех специальностей / Составители Аврунин О. Г., Крук О. Я., Семенец В. В. — ХНУРЭ, 2005. — 105 с.

2. Голубцов М. С., Кириченкова А. В. Микроконтроллеры AVR: от простого к сложному.- М.: СОЛОН-Пресс, 2004. — 304 с.

3. Баранов В. Н. Применение микроконтроллеров AVR: схемы, алгоритмы, программы.- М.: Издательский дом «Додэка-XXI», 2004. — 288 с.

4. Аврунин О. Г.,. Крук О. Я, Семенец В. В. Микроконтроллеры во встроенных системах управления: Учебное пособие — ХНУРЭ, 2005. — 105 с.

5. Техническая документация к микрокрнтроллеру AVR ATmega 128

6. www. atmel. ru/ - описание микроконтроллеров фирмы ATMEL на русском языке.

ПРИЛОЖЕНИЕ

Код программы

#include «graphics. h»

#include «source. h»

unsigned char string[30];

int x=65; //nachalnaja koordinata warika po x

int y=63; //nachalnaja koordinata warika po y

int f=0; //flag

int d=0; //obwie ochki

int g2=0; //ochki player 2

int g1=0; //ochki player 1

int lx1=239,ly1=53; //nachalnue koordinatu player 2

int lx2=5,ly2=53; //nachalnue koordinatu player 1

void game (void)

{

int r;

int t;

UCSR0A=0×00; //установка стандартного режима задания скорости передачи данных

UCSR0B=0×90; //установка 7-го и 4-го битов регистра UCSR0B для инициализации USART0 в режиме приемника и разрешения прерывания по завершению приема кадра

UCSR0C=0×06; // установка формата кадра: 8 бит данных с отключенным режимом четности

UBRR0H=0×00; // установка значения делителя (47) соответствующего

UBRR0L=35; // скорости приема данных 19 200 бит/с

UCSR1A=0×00;

UCSR1B=0×08; // установка 3-го бита регистра UCSR1B для инициализации USART1 в режиме передатчика

UCSR1C=0×06;

UBRR1H=0×00;

UBRR1L=35;

//инициализация отрисовки

init_cpu ();

init_display ();

clear_text ();

clear_graphics ();

while (1)

{

PORTE = 0b11011111;

if (PINE. 0==0 & & ly1+20< 120) //движение ракетки 2 по у

{

ly1=ly1+3;

UDR1 = ly1;

}

PORTE = 0b10111111;

if (PINE. 1==0 & & ly1> 5) //движение ракетки 2 по у

{

ly1=ly1−3;

UDR1 = ly1;

}

PORTE = 0b10111111;

if (ly2+20< 120) //движение ракетки 1 по у

{

//ly2=ly2+3;

//UDR0 = ly2;

}

PORTE = 0b11011111;

if (ly2> 5) //движение ракетки 1 по у

{

//ly2=ly2−3;

//UDR0 = ly2;

}

ly2 = UDR0;

/////////////////////

clear_graphics ();

for (r=0; r<=5;r++)

{

lcd_circle (x, y, r, 1); //шарик

}

///////////////////////////////////////////

///////////отражение///////////////////////

///////////////////////////////////////////

if (x< =0 & & y> =63) //pojavlenie warika v na4alnoj to4ke i na4alnoe dvigenie

{

f=0;

}

if (f==0)

{

x=x+4;

y=y+4;

sprintf (string," «); //stiranie gameover2 player 2

write_string (0, 14, string);

sprintf (string," «); //stiranie gameover1 player 1

write_string (0, 14, string);

sprintf (string," «); //stiranie player 1 or 2 WIN

write_string (10, 7, string);

}

/////////////////////////

if (x< =230 & & y> =120) //yslovie otragenija

{

f=1;

}

if (f==1)//dvigenie

{

x=x+3;

y=y-3;

}

///////////////////

if (x> =lx1 & & x< =lx1+5 & & y> =ly1 & & y< =ly1+20)//коорд отбивания ракетки player 2

{

f=2;

}

if (f==2)//dvigenie

{

x=x-2;

y=y-3;

}

/////////////////////

if (x> =119 & & y< =0) //yslovie otragenija

{

f=3;

}

if (f==3)//dvigenie

{

x=x-3;

y=y+3;

}

////////////////////////

if (y> =120 & & x< =119) //yslovie otragenija

{ f=4; }

if (f==4)//dvigenie

{ x=x-3;

y=y-3; }

////////////////////////

if (x> =lx2 & & x< =lx2+5 & & y> =ly2 & & y< =ly2+20)//коорд отбивания ракетки player 1

{

f=5;

}

if (f==5) //dvigenie

{

x=x+3;

y=y-3;

}

//////////////////////////////

if (y< =0 & & x< =119)//делает нежелателный возврат

{

f=6;

}

if (f==6)//dvigenie

{

x=x+3;

y=y+3;

}

///////////////////////////

if (x> =239) //проиграл player 2 и шарик появляется снова

{

f=7;

}

if (f==7)

{

x=65;

y=63;

f=0;

g2=g2+1; //s4itaet o4ki igroka player 2

d=d+1; //s4itaet o4ki obwie

sprintf (string,"player2 loose");

write_string (0, 14, string);

delay_ms (1000);

}

///////////////////////////

if (x< =0) //проиграл player 1 и шарик появляется снова

{

f=8;

}

if (f==8)

{

x=65;

y=63;

f=0;

d=d+1; //s4itaet o4ki obwie

g1=g1+1; //s4itaet o4ki igroka player 1

sprintf (string,"player1 loose");

write_string (0, 14, string);

delay_ms (1000);

}

////////////////////////////////

if (x> 118 & & y< =5 & & f==5) //otragenie player 1 na svou storony vverh

{

f=0;

}

////////////////////////////////

if (x< 118 & & y< =5 & & f==2) //otragenie player 2 na svou storony vniz

{

f=3;

}

/////////////////////////////

////////ракетки//////////////

/////////////////////////////

for (t=0; t<3;t++)

{

Line (lx1-t, ly1, lx1-t, ly1+20,1); //игрок 1

Line (lx2-t, ly2, lx2-t, ly2+20,1); //игрок 2

}

///////////////////////////////

/////индикация на светодиоды///

///////////////////////////////

if (d==1)

{

PORTD=0b11111110;

}

if (d==2)

{

PORTD=0b11111100;

}

if (d==3)

{

PORTD=0b11111000;

}

if (d==4)

{

PORTD=0b11110000;

}

if (d==5)

{

PORTD=0b11100000;

}

if (d==6)

{

PORTD=0b11000000;

}

if (d==7)

{

PORTD=0b10000000;

}

if (d==8)

{

PORTD=0b00000000;

}

if (d==0 || d==9)

{

PORTD=0b11111111;

}

//////////////////////////

///////вывод текста//////

////////////////////////

sprintf (string,"player 1″); //player 1

write_string (1, 1, string);

sprintf (string,"player 2″); // player 2

write_string (20, 1, string);

//////////////////////////

/////результаты///////////

//////////////////////////

if (d> 8)

{

d=0;

if (g1> g2)// esli player 1 bolwe player 2

{

sprintf (string,"WINNER: player 2″);

write_string (10, 7, string);

delay_ms (10 000);

}

if (g2> g1)// esli player 2 bolwe player 1

{

sprintf (string,"WINNER: player 1″);

write_string (10, 7, string);

delay_ms (10 000);

}

}

}

}

ПоказатьСвернуть
Заполнить форму текущей работой