Цифровые часы на микроконтроллере avr. Многофункциональные цифровые часы на микроконтроллере Attmega8

Недавно спаял схему электронных часов с будильником, выполненных на популярном среди радиолюбителей . В них используется светодиодный индикатор для отображения времени. Мне надоели всевозможные ЖКИ и хочется иметь возможность видеть время из любой точки комнаты в том числе в темноте, а не только прямо с хорошим освещением. Схема содержит минимум деталей и имеет отличную повторяемость.

Схема электронных часов на микроконтроллере

Микроконтроллер является единственной микросхемой, используемой в данном устройстве. Для задания тактовой частоты используется кварцевый резонатор на 4 МГц. Для отображения времени использованы индикаторы красного цвета с общим анодом, каждый индикатор состоит из двух цифр с десятичными точками. Можно применить любые индикаторы с общим анодом, лишь бы каждая цифра имела собственный анод. Чтоб электронные часы были хорошо видны в темноте и с большой дистанции - старайтесь выбрать АЛС-ки чем покрупнее.

Индикация в часах осуществляется динамически. В данный конкретный момент времени отображается лишь одна цифра, что позволяет значительно снизить потребление тока. Аноды каждой цифры управляются микроконтроллером PIC16F628. Сегменты всех четырех цифр соединены вместе и через токоограничивающие резисторы R1 … R8 подключены к выводам порта МК. Поскольку засвечивание индикатора происходит очень быстро, мерцание цифр становится незаметным.

Для настройки минут, часов и будильника - используются кнопки без фиксации. В качестве выхода для сигнала будильника используется вывод 10, а в качестве усилителя - каскад на транзисторах VT1,2. Звукоизлучателем является пьезоэлемент типа ЗП. Для улучшения громкости вместо него можно поставить небольшой динамик. Питаются часы от стабилизированного источника напряжением 5 вольт. В часах реализовано 9 режимов индикации. Переход по режимам осуществляется кнопками "+" и "-". Перед выводом на индикацию самих показаний, на индикаторы выводится короткая подсказка названия режима. Длительность вывода подсказки примерно секунда.

Кнопкой "Коррекция " часы переводятся в режим настроек. При этом кратковременная подсказка выводится на пол секунды, после чего корректируемое значение начинает мигать. Коррекция показаний осуществляется кнопками "+" и "-". При длительном нажатии на кнопку, включается режим автоповтора, с заданной частотой. Все значения, кроме часов, минут и секунд, записываются в память и восстанавливаются после выключения питания. Если в течение нескольких секунд ни одна из кнопок не нажата, то электронные часы переходят в режим отображения времени. Нажатием на кнопку "Вкл/Выкл " включается или выключается будильник, это действие подтверждается коротким звуком. При включенном будильнике светится точка в младшем разряде индикатора. Вот прошивка и рисунок платы часов.

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

Конструкция собрана на микроконтроллере и часов реального времени DS1307 . В качестве индикатора текущего времени использован четырехразрядный семисегментный светодиодный индикатор (ультраяркий, голубого цвета свечения, что неплохо смотрится в темное время, и, заодно, часы играют роль ночника). Управление часами происходит двумя кнопками. Благодаря использованию микросхемы часов реального времени DS1307, алгоритм программы получился довольно простым. Общение микроконтроллера с часами реального времени происходит по шине I2C, и организованно программным путем.

Схема часов:

К сожалению, в схеме есть ошибка:
— выводы МК к базам транзисторов нужно подключать:
РВ0 к Т4, РВ1 к Т3, РВ2 к Т2, РВ3 к Т1
или поменять подключение коллекторов транзисторов к разрядам индикатора:
Т1 к DP1 ….. Т4 к DP4

Детали, используемые в схеме часов:

♦ микроконтроллер ATTiny26:

♦ часы реального времени DS1307:

♦ 4-разрядный семисегментный светодиодный индикатор – FYQ-5641UB -21 с общим катодом (ультраяркий, голубого цвета свечения):

♦ кварц 32,768 кГц, с входной емкостью 12,5 пф (можно взять с материнской платы компьютера), от этого кварца зависит точность хода часов:

♦ все транзисторы — NPN-структуры, можно применить любые (КТ3102, КТ315 и их зарубежные аналоги), я применил ВС547С
♦ микросхемный стабилизатор напряжения типа 7805
♦ все резисторы мощностью 0,125 ватт
♦ полярные конденсаторы на рабочее напряжение не ниже напряжения питания
♦ резервное питание DS1307 – 3 вольтовый литиевый элемент CR2032

Для питания часов можно использовать любое ненужное зарядное устройство сотового телефона (в этом случае, если напряжение на выходе зарядного устройства в пределах 5 вольт ± 0,5 вольта, часть схемы — стабилизатор напряжения на микросхеме типа 7805, можно исключить)
Ток потребления устройством составляет — 30 мА.
Батарейку резервного питания часов DS1307 можно и не ставить, но тогда, при пропадании напряжения в сети, текущее время придется устанавливать заново.
Печатная плата устройства не приводится, конструкция была собрана в корпусе от неисправных механических часов. Светодиод (с частотой мигания 1 Гц, от вывода SQW DS1307) служит для разделения часов и минут на индикаторе.

Установки микроконтроллера заводские: тактовая частота — 1МГц, FUSE-биты трогать не надо.

Алгоритм работы часов (в Algorithm Builder):

1. Установка указателя стека
2. Настройка таймера Т0:
— частота СК/8
— прерывания по переполнению (при такой предустановленной частоте вызов прерывания происходит каждые 2 миллисекунды)
3. Инициализация портов (выводы РА0-6 и РВ0-3 настраиваются на выход, РА7 и РВ6 на вход)
4. Инициализация шины I2C (выводы РВ4 и РВ5)
5. Проверка 7-го бита (СН) нулевого регистра DS1307
6. Глобальное разрешение прерывания
7. Вход в цикл с проверкой нажатия кнопки

При первом включении, или повторном включении при отсутствии резервного питания DS307, происходит переход в первоначальную установку текущего времени. При этом: кнопка S1 – для установки времени, кнопка S2 – переход к следующему разряду. Установленное время – часы и минуты записываются в DS1307 (секунды устанавливаются в ноль), а также вывод SQW/OUT (7-й вывод) настраивается на генерацию прямоугольных импульсов с частотой 1 Гц.
При нажатии кнопки S2 (S4 — в программе) происходит глобальный запрет прерываний, программа переходит в подпрограмму коррекции времени. При этом, кнопками S1 и S2 устанавливаются десятки и единицы минут, затем, с 0 секунд, нажатием кнопки S2 происходит запись уточненного времени в DS1307, разрешение глобального прерывания и возвращение в основную программу.

Часы показали хорошую точность хода, уход времени за месяц — 3 секунды.
Для улучшения точности хода, кварц рекомендуется подключать к DS1307, как указано в даташите:

Программа написана в среде «Algorithm Builder».
Вы можете, на примере программы часов, ознакомиться с алгоритмом общения микроконтроллера с другими устройствами по шине I2C (в алгоритме подробно прокомментирована каждая строчка).

Фотография собранного устройства и печатная плата в формате.lay от читателя сайта Анатолия Пильгук, за что ему огромное спасибо!

В устройстве применены: Транзисторы — СМД ВС847 и ЧИП резисторы

Приложения к статье:

(42,9 KiB, 3 233 hits)

(6,3 KiB, 4 183 hits)

(3,1 KiB, 2 662 hits)

(312,1 KiB, 5 932 hits)


Второй вариант программы часов в АБ (для тех у кого нескачивается верхний)

(11,4 KiB, 1 947 hits)

Предлагаю для повторения схемы электронных часов на микроконтроллере ATmega 8, с отображением информации большими светодиодами. Часы рабочие, проверенные. Прошивки на данный момент дорабатываются. Делается больше табло, которое будет на удалении от основного блока, метров 5. На основном блоке тоже будет индикация - дублировать большое табло. Принципиальная схема светодиодных часов показана на рисунке - клик для увеличения.

Описание прибора

1. Функции.
1.1 Часы. Формат отображения времени 24-х часовый. Цифровая коррекция точности хода.


1.2 Термометр. Измерение температуры с двух датчиков в диапазоне -55,0 оС - 125,0 оС.


1.3 Поочередный вывод информации на индикатор.
1.4 Контроль основного источника питания.
1.5 Использование энергонезависимой памяти микроконтроллера для сохранения настроек и установок при отключении питания.
1.6 Три кнопки для установки и настройки: PLUS , MINUS , SET .

Работа устройства

При первом включении на дисплее рекламная заставка в течении 1 сек. Потом отображение времени.
Нажатие на SET_TIME переводит индикатор по кругу из основного режима часов (отображение текущего времени):
– режим отображения минут и секунд. Если в этом режиме одновременно нажать на кнопку PLUS и MINUS , то произойдет обнуление секунд.
– установка минут текущего времени.
– установка часов текущего времени.
– величина ежесуточной коррекции точности хода часов. Символ c и значение коррекции. Пределы установки -25?25 сек. Выбранная величина будет ежесуточно в 0 часов 0 минут и 30 секунд прибавлена/вычтена из текущего времени.
– символ t . Настройка продолжительности отображения часов.
– символ i . Время отображения символов индикации внутренней температуры (int ).
– символ d . установка времени индикации температуры с внутреннего датчика.
– символ o . Время отображения символов индикации внешней температуры (out ).
– символ u . установка времени индикации температуры с внешнего датчика.
– символ P . установка времени индикации рекламной заставки.
Пределы установки для времени отображения 0-60 сек. Если установлен 0, данный параметр на индикатор не выводится. Если все параметры установить в 0 – на индикаторе будут часы.

Настройка часов

3.1 Во всех режимах удержанием кнопок PLUS /MINUS производится ускоренная установка.
3.2 Если производились изменения настроек, через 10 секунд от последнего изменения новые значения запишутся в энергонезависимую память (EEPROM) и будут считаны оттуда при повторном включении питания. Индикатор перейдет в основной режим времени.
3.3 Новые настройки вступают в силу по ходу установки.

Контроль питания

Микроконтроллер отслеживает наличие основного питания. При его отключении питание прибора осуществляется от внутреннего источника. Для уменьшения тока потребления отключаются индикатор, датчики и кнопки. Часы продолжают отсчитывать время. При появлении питания от основного источника все функции восстанавливаются.


На данный момент разрабатываются печатные платы, проводится корекция схемы, можно и коллективно. Если будут идеи и пожелания по усовершенствованию часов - пишите на форуме. Авторы конструкции: Александрович & SOIR (Soir&C.E.A)

Схема принципиальная электрическая

В одном устройстве объединено две функции: собственно измерение температуры и времени (часы). Индикация производится попеременно, сменяясь через десять секунд. Для настройки часов используется две кнопки, аналогично простым китайским электронным часам: одна отвечает за выбор параметра, вторая за его изменение. Питается устройство от сети с помощью постоянного стабилизированного источника тока напряжением пять вольт (плата от зарядного устройства телефона).

Датчиком температуры является микросхема DS18B20. Так как в устройстве «Часы-термометр» нет своей батареи, при пропадании питания естественно показания будут сбиваться. И что бы это не явилось причиной какого-нибудь опоздания человека на жизненно важные дела, имеется интересная «фишка» - при подаче питания вместо времени на дисплее будут отображаться прочерки, пока не нажмёшь одну из двух кнопок настройки.

Корпусом самодельного измерителя температуры послужила подходящая коробочка от запонок. В неё была помещена сама плата часов-термометра и плата вытащенная из телефонного зарядника. Датчик DS18B20 сделан выносным и подсоединяется через разъём.

Список необходимых деталей

  • Микроконтроллер Atmega8 - 1шт.
  • Кварц 32768 Гц - 1 шт.
  • Датчик температуры DS18B20 - 1шт.
  • Семи сегментный индикатор(4 - разряда) - 1 шт.
  • Резисторы SMD типоразмера 0805:
  • 620 Ом - 8шт.
  • 0 Ом (перемычка) - 1шт.
  • 4,7 кОм - 1шт.
  • Тактовые кнопки - 2 шт.

Видео работы устройства на Ютуб-канале

Урок 23

Часть 1

Собираем часы на DS1307 и LED индикаторе

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

Но, несмотря на все наши знания урок не обещает быть коротким, а наоборот будет очень обширным, так как сборка часов на таких индикаторах требует решение очень многих дополнительных задач особенно потому, что у нас не 32 знакоместа, как на нашем LCD, а всего 4 и точка или двоеточие. И все показания надо выводить будет в порядке определённой очереди, а также потребует от нас умения организовать изменение показаний (перевода) с помощью кнопок, а может быть вообще с помощью одной только кнопки в рамках использования всего четырех цифр.

Но мы не боимся трудностей, с ними даже интереснее.

Поэтому начнём что-нибудь выдумывать.

Индикатор будет вот такого вот типа, из них именно типа с общим анода

А вот так индикатор выглядит вживую

Судя по клеточкам размером 5 милиметров несложно оценить его размеры.

Вот его вид с обратной стороны

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

Вот они оба для сравнения

Вот маркировка маленького индикатора

Также мы можем использовать раздельные индикаторы для каждой цифры, подключив их соответствующим образом, результат будет тот же. Данный тип подключения обычно используется, когда требуются часы с большими цифрами и тяжело найти совмещённый индикатор больших размеров. Способ подключения наглядно демонстрируеся в нашей схеме в протеусе, так как я нашёл в протеусе и совмещённый индикатор, но он у меня, почему-то должным образом не заработал (нажмите на картинку для увеличения изображения)

Данную схему мы хорошо помним из урока по . Только там было всего 2 индикатора, поэтому подключим ещё два, также будут использованы ещё два транзисторных ключа, на базу которых пойдут команды через токоограничивающие резистора на 2 килоома от ножек портов PB2 и PB4 . Третью ножку порта B мы пропустим в целях её дальнейшего использования в другом альтернативном качестве, в качестве ножки аппаратного ШИМ для регулировки яркости свечения индикатора.

Создадим проект с именем MyClock1307LED , а код весь в главный модуль возьмём как раз из урока по динамической индикации, из проекта Test08 . В ту пору у нас пока не было модульного программирования и весь полезный код содержался в одном главном модуле.

Для начала соберём наш проект, подключим контроллер и его прошьём и посмотрим для интереса результат работы кода

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

Для начала для этого мы добавим ещё две переменные для двух неиспользуемых разрядов

unsigned int i ;

unsigned char R1 =0, R2 =0, R3 =0, R4 =0 ; //цифры разрядов индикатора

Объявим ещё соответствующие данным анодам ножки порта на выход в функции port_ini(), также включая и ножку для ШИМ

DDRB = 0b000111 11;

Также добавим код в функцию ledprint

void ledprint ( unsigned int number )

R1 = number %10;

R2 = number %100/10;

R3 = number %1000/100;

R4 = number /1000;

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

Переменные мы рассчитали, осталось их как-то отобразить на индикаторе.

Для этого мы изменим код в обработчике прерывания от таймера

ISR ( TIMER1_COMPA_vect )

if ( n_count ==0) { PORTB &=~(1<< PORTB0 ); PORTB |=(1<< PORTB1 )|(1<< PORTB2 )|(1<< PORTB4 ); segchar ( R1 );}

if ( n_count ==1) { PORTB &=~(1<< PORTB1 ); PORTB |=(1<< PORTB0 )|(1<< PORTB2 )|(1<< PORTB4 ); segchar ( R2 );}

if ( n_count ==2) { PORTB &=~(1<< PORTB2 ); PORTB |=(1<< PORTB0 )|(1<< PORTB1 )|(1<< PORTB4 ); segchar ( R3 );}

if ( n_count ==3) { PORTB &=~(1<< PORTB4 ); PORTB |=(1<< PORTB0 )|(1<< PORTB1 )|(1<< PORTB2 ); segchar ( R4 );}

N_count ++;

If ( n_count >3 ) n_count =0;

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

С этим всё.

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

OCR1AH = 0b00001111 ; //записываем в регистр число для сравнения

OCR1AL =0b01000010 ;

Ну и сделаем возможность нашему счётчику считать не до 99, а до 9999 для этого в цикле мы напишем не 100, а 10000

for ( i =0; i < 10000 ; i ++)

И также уменьшим задержку, иначе с такой скоростью мы четвёртой цифры долго не дождёмся

Delay_ms (10 );

Соберём код, прошьём контроллер и посмотрим результат нашей работы

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

5 542