Цифровые часы на микроконтроллере avr. Простые часы на микроконтроллере
Описание прибора
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)
Данные часы уже несколько раз обозревались, но я надеюсь, что мой обзор будет тоже Вам интересным. Добавил описание работы и инструкцию.
Конструктор покупался на ebay.com за 1.38 фунтов (0.99+0.39 доставка), что эквивалентно 2.16$. На момент покупки это самая низкая цена из всех предложенных.
Доставка заняла около 3х недель, набор пришел в обычном полиэтиленовом пакетике, который в свою очередь был упакован в небольшой «пупырчатый» пакет. На выводах индикатора был небольшой кусочек пенопласта, остальные детали были без какой либо защиты.
Из документации только небольшой листочек формата А5 со списком радиодеталей с одной стороны и принципиальной электрической схемой с другой.
1. Принципиальная электрическая схема, используемые детали и принцип работы

Основой или «сердцем» часов является 8-ми разрядный КМОП микроконтроллер AT89C2051-24PU оснащенный Flash программируемым и стираемым ПЗУ объемом 2кб.
Узел тактового генератора собран по схеме (рис.1) и состоит из кварцевого резонатора Y1 двух конденсаторов C2 и С3, которые образуют вместе параллельный колебательный контур.

Изменением емкости конденсаторов можно в небольших пределах изменять частоту тактового генератора и соответственно точность хода часов. На рисунке 2 показан вариант схемы тактового генератора с возможностью регулировки погрешности часов.
Узел начального сброса
служит для установки внутренних регистров микроконтроллера в начальное состояние. Он служит для подачи после подключения питания на 1 вывод МК единичного импульса длительностью не менее 1 мкс (12 периодов тактовой частоты).
Состоит из RC цепочки, образуемой резистором R1 и конденсатором C1.
Схема ввода состоит из кнопок S1 и S2. Программно сделано так, что при одиночном нажатии любой из кнопок в динамике раздается одиночный сигнал, а при удержании двойной.
Модуль индикации
собран на четырехразрядном семисегментном индикаторе с общим катодом DS1 и резистивной сборке PR1.
Резистивная сборка представляет собой набор резисторов в одном корпусе:
Звуковая часть
схемы представляет собой схему собранную на резисторе R2 10кОм, pnp транзисторе Q1 SS8550(выполняющего роль усилителя) и пьезоэлемента LS1.
Питание подается через разъем J1 с подключенным параллельно сглаживающим конденсатором C4. Диапазон питающих напряжений от 3 до 6В.
2. Сборка конструктора
Сборка трудностей не вызвала, на плате подписано, куда какие детали паять.Много картинок - сборка конструктора спрятана под спойлером
Я начал с панельки, так как она единственная не является радиодеталью:
Следующим шагом я припаял резисторы. Перепутать их невозможно, они оба на 10кОм:
После этого установил на плату соблюдая полярность электролитический конденсатор, резисторную сборку (также обращая внимание на первый вывод) и элементы тактового генератора - 2 конденсатора и кварцевый резонатор
Следующим шагом припаиваю кнопки и конденсатор фильтра питания:
После этого очередь за звуковым пьезоэлементом и транзистором. В транзисторе главное установить правильной стороной и не перепутать выводы:
В последнюю очередь припаиваю индикатор и разъем питания:
Подключаю к источнику напряжением 5В. Все работает!!!
3. Установка текущего времени, будильников и ежечасового сигнала.
После включения питания дисплей находится в режиме («ЧАСЫ: МИНУТЫ») и отображает время по умолчанию 12:59. Ежечасный звуковой сигнал включен. Оба будильника включены. Первый установлен на время срабатывания 13:01, а второй – 13:02.
При каждом кратковременном нажатии на кнопку S2 дисплей будет переключаться между режимами («ЧАСЫ: МИНУТЫ») и («МИНУТЫ: СЕКУНДЫ»).
При длительном нажатии кнопки S1 происходит вход в меню настроек, состоящее из 9 подменю, обозначенных буквами A, B, C, D, E, F, G, H, I. Подменю переключаются кнопкой S1, значения изменяются кнопкой S2. После подменю I следует выход из меню настроек.
А: Установка показаний часов текущего времени
При нажатии кнопки S2 значение часов изменяется от 0 до 23. После установки часов необходимо нажать S1 для перехода в подменю B.
B: Установка показаний минут текущего времени

C: Включение ежечасного звукового сигнала
По умолчанию включено (ON) – каждый час с 8:00 до 20:00 подается звуковой сигнал. При нажатии кнопки S2 значение изменяется между ON (Вкл.) и OFF (Выкл.). После установки значения необходимо нажать S1 для перехода в подменю D.
D: Включение\выключение первого будильника
По умолчанию будильник включен (ON). При нажатии кнопки S2 значение изменяется между ON (Вкл.) и OFF (Выкл.). После установки значения необходимо нажать S1 для перехода в следующее подменю. Если будильник выключен, то подменю E и F пропускаются.
E: Установка показаний часов первого будильника
При нажатии кнопки S2 значение часов изменяется от 0 до 23. После установки часов необходимо нажать S1 для перехода в подменю F.
F: Установка показаний минут первого будильника
При нажатии кнопки S2 значение минут изменяется от 0 до 59. После установки минут необходимо нажать S1 для перехода в подменю С.
G: Включение\выключение второго будильника
По умолчанию будильник включен (ON). При нажатии кнопки S2 значение изменяется между ON (Вкл.) и OFF (Выкл.). После установки значения необходимо нажать S1 для перехода в следующее подменю. Если будильник выключен, то подменю H и I пропускаются и происходит выход из меню настроек.
H: Установка показаний часов второго будильника
При нажатии кнопки S2 значение часов изменяется от 0 до 23. После установки часов необходимо нажать S1 для перехода в подменю I.
I: Установка показаний минут второго будильника
При нажатии кнопки S2 значение минут изменяется от 0 до 59. После установки минут необходимо нажать S1 для выхода из меню настроек.
Коррекция секунд
В режиме («МИНУТЫ: СЕКУНДЫ») необходимо удержать кнопку S2 для обнуления секунд. Далее коротким нажатием на кнопку S2 запустить отсчет секунд.
4. Общие впечатления от часов.
Плюсы:+ Низкая цена
+ Легкая сборка, минимум деталей
+ Удовольствие от самостоятельной сборки
+ Достаточно низкая погрешность (у меня за сутки отстали на несколько секунд)
Минусы:
- После отключения питания не держит время
- Отсутствие какой либо документации, кроме схемы (данная статья частично решила этот минус)
- Прошивка в микроконтроллере защищена от считывания
5. Дополнительно:
1) На безграничных просторах интернета нашел инструкцию к этим часам на английском языке и перевел ее на русский. Скачать ее можноУрок 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 Этот вариант часов сделан таким образом, чтобы максимально упростить схему, снизить энергопотребление, и в итоге получить прибор, который легко помещается в кармане. Выбрав миниатюрные аккумуляторы для питания схемы, SMD - монтаж и миниатюрный динамик (например от нерабочего мобильного телефона), Вы можете получить конструкцию, размером чуть больше спичечного коробка.Применение сверхъяркого индикатора позволяет снизить ток, потребляемый схемой. Снижение тока потребления также достигается в режиме "LoFF" - индикатор погашен, при этом включена только мигающая точка младшего разряда часов.
Индикация
Регулируемая
яркость индикаторов позволяет выбрать наиболее комфортное отображение
показаний (и опять же снизить энергопотребление).
В
часах реализовано 9 режимов индикации. Переход по режимам
осуществляется с помощью кнопок "плюс" и "минус". Перед выводом на
индикацию самих показаний, на индикаторы выводится короткая подсказка
названия режима. Длительность вывода подсказки - одна секунда.
Применение кратковременных подсказок позволило достичь хорошей
эргономичности часов. При переходах по режимам отображения (которых
получилось достаточно много, для такого простого прибора, как обычные
часы) не возникает путаницы, и всегда понятно, какие именно показания
выведены на индикатор.
Коррекция
показаний, выведенных на индикатор включается при нажатии на кнопку
"Коррекция". При этом кратковременная подсказка выводится на 1/4
секунды, после чего корректируемое значение начинает мигать с частотой 2
Гц. Корректируются показания кнопками "плюс" и "минус". При длительном
нажатии на кнопку, включается режим автоповтора, с заданной частотой.
Частоты автоповтора нажатия кнопки составляют: для часов, месяцев и дня
недели - 4 Гц; для минут, года и яркости индикатора - 10 Гц; для
корректирующего значения - 100 Гц.
Все
откорректированные значения, кроме часов, минут и секунд, записываются в
EEPROM и восстанавливаются после выключения - включении питания.
Секунды при коррекции обнуляются. Из всех режимов, кроме часы-минуты,
минуты-секунды и LoFF организован автоматический возврат. Если в течение
10 секунд ни одна из кнопок не нажата, то часы переходят в режим
отображения часов - минут.
Нажатием
на кнопку "Вкл/Выкл буд." включается/выключается будильник. Включение
будильника подтверждается коротким двухтональным звуком. При включенном
будильнике светится точка в младшем разряде индикатора.
В режиме "Corr" на индикатор выведена корректирующая константа,
начальное значение которой 5000 микросекунд в секунду. При отставании
часов константу увеличиваем на величину отставания, вычисленное в
микросекундах за одну секунду. Если часы спешат, то константу уменьшаем
по тому же принципу.
Схема
![]()
Наверное, даже не просто простые часы на микроконтроллере , а даже очень простые. Этот проект на микроконтроллере Attiny2313 наверно можно назвать проектом одного дня, поскольку на создание данных часов с начало и до конца ушло чуть больше одного дня.
Для создания данных часов нам понадобятся:
- Кварцевый резонатор на 16 МГц – 1 шт;
- Микроконтроллер Attiny2313 -1 шт;
- Конденсатор от 22 пф до 27 пф — 2 шт;
- Конденсатор 220 н — 1 шт;
- Стабилизатор 7805 – 1 шт;
- Транзистор – 4 шт;
- Индикатор SA15-11GWA — 4 шт (можно любой другой с общим анодом);
- Кнопка – 2 шт;
- Резистор 100 Ом – 8 шт;
- Резистор 200 Ом – 4шт;
- Резистор 10 кОм – 1 шт.
- Питание осуществляется от простого .
Описание работы простых часов на Attiny2313
Тактируется кварцевым резонатором с рабочей частотой 16 МГц. В качестве счетчика времени, в схеме микроконтроллера Attiny2313 запущен 16 битный таймер с предделителем 256, сконфигурированный на создание прерывания по достижении счетчиком значения 625. Следовательно, получилось прерывания 100 раз в секунду.
Временной интервал находится в глобальных переменных, и при каждом прерывании необходимо увеличить значение миллисекунд на 1. В том случае если число миллисекунд доходит до 100, то необходимо увеличить на 1 величину секунд, а величину миллисекунд сбросить. И далее в той же последовательности до десятков часов, которые сбрасываются по достижении 24 без прибавления следующего разряда. Часы на микроконтроллере Attiny2313 максимально простые, поэтому они не отображают ни дату, ни переход на зимнее/летнее время и т.д.
Таким образом, получаем величину текущего времени записанного в глобальных переменных. Теперь необходимо вывезти эти значения. Поскольку количество портов микроконтроллера не так много, то используем такую особенность зрения как инерционность. Катоды всех четырех индикаторов часов соединены параллельно, а аноды управляются раздельно, что позволяет в каждый момент времени отобразить цифру на любой индикатор.
Быстро переключая порт B микроконтроллера, к которому подключены катоды и быстро переключая аноды, можем организовать видимость, что отображаются все 4 цифры, несмотря на то, что единовременно работает всего лишь одна. Другими словами, если текущее время 10:43, то выводим цифру 1 на первый индикатор часов, через небольшой интервал времени (порядка 1 мс) выводим цифру 0 на второй индикатор, через 1 мс отображаем 4 на 3 индикатор, спустя 1 мс отображаем 3 на 4 индикатор и снова по кругу.