Урок 23
Часть 12
Собираем часы на DS1307 и LED индикаторе
В прошлой части нашего занятия мы написали код для работы будильника, только будильник у нас пока не звенит и не пищит, а только зажигает светодиод.
Это тоже очень хорошо. Хорошо тем, что код у нас успешно работает, но под светодиод вряд ли кто проснётся.
Поэтому сегодня мы подключим пищалку и научим её пищать при совпадении значений установленного времени в будильнике с реальным временем.
Пищалку мы подключим чуть позже, а пока добавим ещё одну переменную для текущего режима будильника в main.h и button.c
unsigned char clockeditmode,clockincmode,alarmmode,alarmcmp,alarmbeep;
extern unsigned char clockeditmode,clockincmode,alarmbeep;
Инициализируем её в функции main()
alarmcmp=0;
alarmbeep=0;
В конце бесконечного цикла включим в условие проверку данного флага
if((alarmcmp==1)&&(alarmbeep==1))
{
alarm();
}
Сделаем отключение флага по короткому нажатию кнопки в модуле button.c
if((button_cnt>3)&&(button_cnt<=60)) //если будет до 3 — то считаем это дребезгом
{
clockincmode=MODEINC;//включаем прибавление значения показателя
if(clockeditmode==MODENONEEDIT) alarmbeep=0;//отключим будильник
}
Теперь нам нужно где-то этот флаг включить. Сделаем это при совпадении показателей в бесконечном цикле функции main()
if((alarmmin==min)&&(alarmhour==hour)&&(clockeditmode==MODENONEEDIT))
{
//добавим условие, чтобы не включить повторно после короткого нажатия кнопки
if(alarmcmp==0) alarmbeep=1;
alarmcmp=1;
}
Для работы будущей пищалки добавим некоторый код в функцию alarm()
void alarm(void)
{
PORTC |= (1<<PORTC1); //логическая 1
_delay_ms(15);
PORTC&=~(1<<PORTC1); //логический 0
}
Подключим пищалку по следующей схеме вместо светодиода
А практически всё это будет выглядеть вот так
Так как пищалка подключена в режиме инвертора, немного подправим код для ножки PC1 в функции инициализации портов, иначе у нас она будет постоянно пищать
DDRC |= (1<<DDRC1); // ножку PORTC1 на выход
PORTC |= (1<<PORTC1); //логическая 1
Также в функции alarm() поменяем местами строки
PORTC&=~(1<<PORTC1); //логический 0
_delay_ms(15);
PORTC |= (1<<PORTC1); //логическая 1
Также изменим код в самом низу бесконечного цикла
PORTC |= (1<<PORTC1); //логическая 1
}
Теперь можно собрать код, прошить контроллер и проверить.
Показать я звук писка будильника не смогу на картинке, слышно это в видеоверсии урока, которая прикреплена внизу страницы.
Можно ещё немного улучшить код, чтобы пищалка пищала не постоянно, а отрывисто
void alarm(void)
{
if(sec%4!=0) PORTC&=~(1<<PORTC1); //логический 0
_delay_ms(15);
PORTC |= (1<<PORTC1); //логическая 1
}
Теперь логический ноль у нас будет включаться в течении трех секунд, а одну будет отключен.
Ещё раз проверим наш код и убедимся, что всё у нас работает.
Ну вот мы наконец и завершили наш урок по часам со светодиодным четырёхразрядным индикаоторм с одной кнопкой.
Как мы помним, мы в первой ячейке памяти EEPROM собирались хранить статус будильника, задействован он у нас или нет. Также для этого мы завели отдельную переменную alarmmode.
Мы данной переменной практически не воспользовались и это дело я оставляю как домашнее задание. Я думаю, вы справитесь. Напишите свои варианты в комментариях.
Подсказка: можно завести ещё один режим редактирования и в данном режиме например отображать что-то типа A0 или A1 в зависимости от задействованности будильника и по кнопке менять данный режим.
Предыдущая часть Программирование МК AVR Следующий урок
Программатор, модуль RTC DS1307 с микросхемой памяти и индикатор можно приобрести здесь:
Программатор USBASP USBISP с адаптером USBASP USBISP 3.3 с адаптером
Модуль RTC DS1307 с микросхемой памяти
Семисегментный чертырехразрядный индикатор красный (с общим анодом или катодом на выбор) 10 шт
Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)
Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)
Добавить комментарий