Начнем с алгоритма работы наших бегущих огней!

Напишем пять программ мигания 7 светодиодов HL1, HL2, HL3, HL4, HL5, HL6, HL7, первые три уже с учетом полученных ранее знаний из видеоролика создание проекта в Atmel Studio, первая программа, мигаем светодиодом Atmega8  и Светофор Atmega8 программа на СИ, а 4 и 5 программу с использованием цикла for и пары переменных, которое значительно упрощают написание программы, также в этом материале научимся писать время задержки с помощью имени.

1. Первая программа, включаем светодиоды HL1, HL2, HL3 на 3 секунды -- задержка 1 секунда -- выключаем и включаем HL5, HL6, HL7 на 3 секунды.

2. Вторая программа, включаем светодиоды HL1 и HL7 на 1 секунду -- выключаем -- включаем светодиоды HL2 и HL6 на 1 секунду -- выключаем -- включаем светодиоды HL3 и HL5 на 1 секунду.

3. Третья программа, включаем светодиоды HL3 и HL5 на 1 секунду -- выключаем -- включаем светодиоды HL2 и HL6 на 1 секунду -- выключаем -- включаем светодиоды HL1 и HL7 на 1 секунду.

4. Четвертая программа, зажигаем поочередно все светодиоды с интервалом в 1 секунду с сдвигом влево.

5. Пятая программа, зажигаем поочередно все светодиоды с интервалом в 1 секунду с сдвигом вправо.

6. Далее цикл повторяется.

Перейдем к написанию программы и рисованию электрической схемы!

1. Создаем новый проект в Atmel Studio 7 по пути File > New > Projec..., выбираем C/C++ и тип проекта GCC C Executable Project, вводим название проекта (Name: и Solution name:).

2. Выбираем тип микроконтроллера с которым будем работать, в нашем случае Atmega8.

Программа нам выдает код в файле main.c*

Приводим его к читабельному виду, удаляем лишние комментарии.

Рисуем электрическую схему наших бегущих огней:

И так схема у нас есть, на ней обозначены микроконтроллер, источник напряжения 5В, 7 резисторов, 7 светодиодов, а также обозначены выводы для подключения программатора, вернемся к программе.

Светодиоды у нас подключены к порту РD, настроим в программе ножки порта РD на выход, допишем в программе DDRD = 0b111111111;. Чтобы наши светодиоды замигали, добавим в программу библиотеку задержек #include <util/delay.h>, а для мигания будем использовать функцию _delay_ms(), далее с помощью оператора #define укажем программе, что наш контроллер будет работать от внутреннего генератора с частой 8МГц допишем в код #define F_CPU 8000000UL.

Вот такой получился код:

В программе будем использовать задержки равные одной и трем секундам, чтобы каждый раз не писать цифрами время задержки в скобках команды _delay_ms(), присвоим директиве #define имена S и T которые будут хранить данные о задержке на 1 секунду S и 3 секунды T, #define S 1000 и #define T 3000 соответственно.

Запишем в наш бесконечный цикл while код первых трех программ:

С этой частью программы я думаю вопросов не возникнет, измененные цифры времени задержки описаны выше. Для того чтобы реализовать 4 и 5 программу наших бегущих огней, добавим в код две переменные m и r которые будут отвечать за сдвиг включения портов вправо и влево соответственно:

Для сдвига включения портов с интервалом в одну секунду будем использовать оператор цикла for — (цикл с заданным числом повторений).

Цикл четвертой программы будет выполняться пока число не достигнет 7, число 7 выбрано потому что задействуем 7 портов микроконтроллера, увеличиваем число на 1 и двигаем с задержкой _delay_ms(S); 1 секунда, пятая программа будет выполняться точно так же, но в обратной последовательности. Это простой пример как можно разными способами добиться включения и отключения портов микроконтроллера.

Исходный код программы Скачать архив