Двоичные часики на atmega8

Двоичные часики на ATmega8

Двоичные часы – это часы показывающие время в двоичном (бинарном) виде.

В двоичной системе счисления используются лишь два числа (0 и 1), в отличии от десятичной, которой принято пользоваться людьми.

Так, например, время 11:33.06 в двоичной системе счисления будет выглядеть так: 1011 : 100001 : 000110

Индикация времени в данных часах осуществляется светодиодами,

при этом свечение светодиода означает 1, а отсутствие свечения — 0.

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

Вот и у меня идея изготовить подобные часы возникла тогда, когда у моего сына, в школе, появился такой предмет как информатика. Чтобы как-то не навязчиво заинтересовать его данным предметом, а не скучным переводом из одной формы счисления в другую и объяснения принципа представления двоичных чисел я решил изготовить сей девайс.

Так как у меня завалялось около десятка микросхем ATmega8 в DIP-корпусе, её было и решено использовать в этом устройстве.

Принципиальная схема представлена на следующем рисунке:

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

Для питания часов я решил использовать зарядное устройство с USB-разъемом, с напряжением на выходе 5 Вольт.

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

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

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

Дабы не травмировать психику пользователей и не оторвать чего либо во время разборки данной конструкции фото “потрохов” я выкладывать не буду, а приведу лишь фото и видео работы законченного устройства. Часики были повешены вертикально на стену, над компьютерным столом ребенка.

Ну и в заключении расскажу как установить правильное время, все очень просто,

после нажатия кнопки “mode”, светодиоды, отвечающие за показания часов, начнут мигать. Кнопкой “set” необходимо установить нужное время. Последующие нажатия на кнопку “mode” приведут к редактированию показаний минут и далее секунд.

В часиках имеется функция авто-выхода из режима установки времени, устройство выходит из этого режима по истечении 30сек. если при этом не одна из кнопок не нажимается.

Если микроконтроллер новый, то фьюзы можно оставить по умолчанию.

Он тактируется от встроенного RC-генератора на частоте 1МГц.

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

В прилагаемом архиве содержится исходный код в WinAVR, файл прошивки и проект в программе Proteus.

Список радиоэлементовОбозначение
Тип
Номинал
Количество
ПримечаниеМагазинМой блокнот

U1
МК AVR 8-битATmega8A-AU1
Q1-Q3
Биполярный транзисторS85503
X1
Кварцевый резонатор32768 Гц1
C1, C3
Конденсатор100 нФ2
C2
Электролитический конденсатор47 мкФ1
R1-R3
Резистор4.7 кОм3
R4
Резистор10 кОм1

Простые бинарные часы на микроконтроллере. Схема

Возможно, кто-то еще помнит, как выглядели панели управления первых электронно-вычислительных машин (ЭВМ). Сегодня их можно увидеть только на архивных фотографиях. Длинные ряды лампочек, которые мелькали на первый взгляд хаотично – завораживали энтузиастов электроники тех лет.

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

Принципиальная схема простых бинарных часов показана на рисунке 1. Схема построена на базе микроконтроллера ATmega48. В схеме часов нет внешнего модуля реального времени (RTC), что в свою очередь несколько снижает стоимость устройства.

При возможном сбое питания от внешнего источника, отсчет времени поддерживается встроенной батарей типа CR2032, при этом светодиоды отключаются. Для обнаружения питающего напряжения от внешнего блока питания используется схема с транзистором VT1 (BC847).

Если на клеммах разъема питания есть напряжение, то оно проходит через диод D1 в результате чего транзистор входит в состояние насыщения, а на вход PC0 микроконтроллера подается логический ноль, который запускает работу светодиодов.

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

Просмотр осуществляется только в формате 24 часа. Для отображения количества минут и секунд необходимо 6 светодиодов, а для часов 5 светодиодов.

Микроконтроллер ATmega48V-10AU способен работать при пониженном питании вплоть до 1,8В, что является большим преимуществом. Кроме того, ATmega48V-10AU потребляет меньший ток. Частота тактового сигнала стабилизируется кварцевым резонатором на 4 МГц, который одновременно является эталоном для отсчета времени.

Установка текущего времени (часы и минуты) осуществляется с помощью кнопок SW2 и SW1 соответственно. Счетчик секунд обнуляется при нажатии на любую из кнопок.

Стоит отметить, что эти кнопки неактивны при работе от резервной батареи, чтобы предотвратить возможность непреднамеренного изменения времени. Часы собраны на односторонней печатной плате размером 103мм×67мм.

При программировании микроконтроллера, необходимо установить работу микроконтроллера от внешнего кварцевого резонатора 4 МГц и отключить деление тактовой частоты на 8 (этот бит называется CKDIV8).

Читайте также:  Компания stmicroelectronics представила новую экономичную линейку микроконтроллеров stm32

После правильной сборки часы начинают работать сразу и должны показать 00:00:00.

Питание схемы осуществляется от источника питания с напряжением +5 В. Резервное питание – батарея типа CR2032 не является обязательной, она только поддерживает отсчет времени после пропадания питания от сети.

Потребление тока от батареи составляет около 1,5 мА. При емкости аккумулятора порядка 200 мАч, ее должно хватить на 5 и более дней работы микроконтроллера, что является достаточным в типичных ситуациях.

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

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

Пример чтения времени показан на рисунке ниже.

Верхний ряд — это часы, средний минуты и нижний секунды.

Текущее время 21:14:59

Часы = 16 + 4 + 1 = 21

Минуты = 8 + 4 + 2 = 14

Секунды = 32 + 16 + 8 + 2 + 1 = 59

Скачать рисунок печатной платы и прошивку (65,7 KiB, скачано: 359)

Двоичные часики на atmega8

:1000000012C018951895189530C21895189518951E
:10001000189511C118951895189518951895189553
:100020001895189518958FE58DBFC0E4E8E34E2E1E
:1000300084E08EBFD4E0F4E05F2EEEEFF3E0A0E6C4
:10004000B0E0A89584B7082E877F84BF88E1992700
:1000500081BD91BD88278D933197E9F766248FEF95
:1000600087BB8FEF81BBA398AD9AAC9AEAE0F3E02F
:1000700081D181E080936000009160000A3010F02F
:1000800009F013C07AD1A0E6B0E0AD90BB24A4E69D
:10009000B0E0AA0DBB1DD5D10C926CD1A0E6B0E0AA
:1000A0008C918F5F8C9308F4E7CF88E082BD85E068
:1000B00085BD89B7806489BF80E08093790080E046
:1000C00080937A0080E080937B0082E083BF80E0B1
:1000D0008FBD87E08EBD789489B7816089BFA49871
:1000E000A1E9B0E09C9197FF04C09C9B0EC09F7754
:1000F0009C939C990AC08EE19F93992789D19F91E7
:100100009C9903C090689C9305D1A598A1E9B0E0A3
:100110009C9196FF04C09D9B0EC09F7B9C939D99D4
:100120000AC08EE19F93992773D19F919D9903C037
:1001300090649C930FD1ABE7B0E00D91112744E69A
:1001400050E075D1A3E6B0E00D931C93A3E6B0E0B8
:100150000D911C91AAE7B0E04D915527040F151F92
:10016000A3E6B0E00D931C9381E0809360000091C2
:100170006000043010F009F05BC0A3E6B0E00D9120
:100180001C914AE050E001D1A0E6B0E0AD90BB2464
:10019000ADE6B0E0AA0CBB1CAA0DBB1D0D931C93D1
:1001A000A0E6B0E0AD90BB24ADE6B0E0AA0CBB1C6D
:1001B000AA0DBB1D0D911C91003050E0150709F0F0
:1001C0000FC08AE090E0A0E6B0E0AD90BB24ADE6C1
:1001D000B0E0AA0CBB1CAA0DBB1D8D939C9316C04E
:1001E000A3E6B0E00D911C91A0E6B0E0AD90BB2479
:1001F000ADE6B0E0AA0CBB1CAA0DBB1D4D915C91F5
:10020000041B150BA3E6B0E00D931C93A3E6B0E02E
:100210000D911C914AE050E0B8D0A3E6B0E04D93B8
:100220005C93A0E6B0E08C918F5F8C9308F49FCF35
:1002300056CFF894FFCF0F921F922F923F924F927A
:100240005F927F92AF92BF920F931F932F933F9332
:100250004F935F936F937F938F939F93AF93BF93CE
:10026000CF93DF93EF93FF938FB78F93A1E6B0E027
:100270008C918F5F8C938FEF88BBA1E6B0E0AD903F
:10028000BB24ADE6B0E0AA0CBB1CAA0DBB1DAD9013
:10029000BC90A4E6B0E0AA0DBB1D8C9182BB929AE3
:1002A0000091610041E0041BA2E6B0E00C93A2E6DD
:1002B000B0E08C91A8E3B0E0D2D0C7D08C91892374
:1002C0008C9300916100043009F003C080E08093BA
:1002D00061008F918FBFFF91EF91DF91CF91BF911F
:1002E000AF919F918F917F916F915F914F913F91CE
:1002F0002F911F910F91BF90AF907F905F904F9083
:100300003F902F901F900F90189588B3BAD87A7BA2
:10031000A8FBFAEBAAE7B0E08C918F5F8C93009179
:100320007A000C3309F008C080E080937A00ABE7D4
:10033000B0E08C918F5F8C9300917B00073110F0BF
:1003400009F001C003C080E080937B0080E08093CF
:1003500079000895ABE7B0E08C918F5F8C930091AA
:100360007B00073110F009F001C003C080E08093EA
:100370007B0008958E2E9F2E0895E82DF92D089567
:1003800008D055D000FC10D0089503D01ED001F83D
:10039000F9CF0024E89457FF02C009D0689400F810
:1003A0000BD010F80124089502D009D0089550957B
:1003B00040954F5F5F4F0895E89417FF08950095AB
:1003C00010950F5F1F4F68940895352F242FE894E0
:1003D000452B11F468940895512F402F00271127C1
:1003E00080E1440F551F001F111F021B130B4160BA
:1003F00018F4020F131F4E7F8A9599F708953197CD
:10040000F1F70895689462F80895E89462F8089501
:10041000EF93FF93EE27E82BE92B31F0E0EDF7E0C7
:100420003197F1F70197D1F7FF91EF9108950F926E
:10043000B801469F8001479F100D569F100D0F90E9
:100440000895C89531960020089591E0882321F001
:100450008894991F8A95E9F7892F90950895883097
:1004600018F011968850FBCF0895AF93BF930F9368
:100470009F938F938FB78F93A9E7B0E08C9183956B
:100480008D938C3309F03DC088278E9311968C9103
:1004900083958D938C3309F034C088278E93119601
:1004A0008C9183958D93883161F588278E93119671
:1004B0008C9183958D939C910EE1943089F09630C8
:1004C00079F0993069F09B3059F00CE1923039F4B1
:1004D00011969C911197937019F4039501C00FE147
:1004E000801778F071F081E08E9311968C9183954E
:1004F0008D938D3031F481E08E9311968C9183959C
:100500008C938F918FBF8F919F910F91BF91AF91DE
:0205100018953C
:00000001FF

Сохраните при помощи Notepad++ в формате .hex

Все получилось.еще один вопрос,область еепром должна быть пустой?в моем дампе одни нули.

Часы, будильник, термометр (ATmega8).

Автор: Soir. Опубликовано в Часы

1. Функции.

– часы, формат отображения времени 24-х часовый, часы:минуты.

– цифровая коррекция точности. Возможна ежесуточная коррекция ±25 сек. Установленное значение в 1 час 0 минут 30 сек будет прибавлено/вычтено из текущего времени.

– будильник. В заданное время в течении одной минуты раздаются короткие двойные сигналы. Отключить звук досрочно можно нажатием на любую из кнопок. Когда работа будильника разрешена, при отображении времени в младшем разряде индицируется точка.

– термометр. Диапазон измеряемой температуры -55,0 ÷ 125,0 о С. Если температура выше 99,9 или ниже -9,9 о С десятые доли градуса не отображаются.

– настраиваемая анимация смены показаний.

– использование энергонезависимой памяти микроконтроллера для сохранения настроек при отключении питания.

– если в основном режиме нажать на кнопку PLUS , то на индикаторы выводится время, если нажать на MINUS – температура. При отпускании кнопок возобновляется автоматическая смена показаний.

– автоматическая регулировка яркости индикатора в зависимости от освещенности.

2. Настройка.

2.1. При включении питания часы в основном режиме.

2.2. Нажатием на кнопку MENU производится вход в режим настроек и выбора группы параметров для установки. В пределах группы выбор параметра для установки производится кнопкой SET . По-очереди доступны для установки:

Группа CLOC :

– секунды (обнуляются при нажатии на кнопки PLUS или MINUS );

– величина коррекции. В старшем разряде символ “с“.

Группа ALAr :

– активация будильника. На индикаторе ” On “, если работа будильника разрешена, ” OFF “, если запрещена;

– минуты срабатывания будильника;

– часы срабатывания будильника.

Группа diSP :

– время индикации текущего времени. В старших разрядах символы ” tc “. Диапазон установки 0÷99 сек. Если установлен 0, то время отображаться не будет;

– время индикации температуры. В старших разрядах символы ” tt “. Диапазон установки 0÷99 сек. Если установлен 0, то температура отображаться не будет;

– выбор эффекта анимации. В старших разрядах символы ” EF “. Если установлен 0, смена информации будет проводиться без эффектов , если выбран автоматический режим (символ “А“), то будет производиться поочередная смена эффектов. Если выбран режим r , то смена эффектов будет производиться случайным образом.

– выбор скорости анимации. В старшем разряде символ ” P “. Диапазон установки 0÷99. Одна единица соответствует примерно 2 мсек, чем выше величина, тем медленнее идет анимация.

Группа LiGH :

– включение автоматического управления яркостью индикатора. В старшим разряде символ ” A “, в младших ” On “, если автоматическое регулирование разрешено, ” OF “, если яркость устанавливается вручную;

– минимальный порог яркости для автоматического режима. В старших разрядах символы ” L _ “.

– максимальный порог яркости для автоматического режима. В старших разрядах символы ” L ¯ “.

– уровень яркости в ручном режиме. В старших разрядах символы ” L “.

2.3. Устанавливаемый параметр мигает.

2.4. Удержанием кнопок PLUS / MINUS производится ускоренная установка параметра.

3. Примечания.

1. Для минимального и максимального порогов яркости диапазон установки 0 ÷ 99, но программой вводятся ограничения: минимальный не может быть больше либо равным максимальному и наоборот.

2. При установке параметров яркости информация на индикаторе отображается с выбранной величиной яркости.

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

4. Особенности схемы.

1. Если предполагается использовать функцию автоматической регулировки яркости индикатора, то вместо RV 1 устанавливается фоторезистор. А значение резистора R 17 следует подобрать для получения нужной чувствительности системы.

2. Датчик температуры может работать и по 2-х проводной схеме подключения. Если планируется измерять температуру в помещении, где установлены часы, то датчик все равно следует выносить за корпус часов.

3. Пищалка BUZ 1 должна быть со встроенным генератором. В зависимости от тока потребления возможно придется установить усилитель (транзисторный ключ).

Читайте также:  Гаражный выпрямитель гв-3

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

5. При прошивке МК следует установить FUSE для работы от внутреннего тактового генератора частотой 8 МГц. Пример установки FUSE для программы PONYPROG на скриншоте.

6. В проекте (это по сути уже схема) не показаны выводы питания микросхем.

7. Файл screen.png является скриншотом проекта на тот случай, если Proteus не установлен.

Для обсуждения материалов статьи создана тема.

Видео работы программы, о т пользователя wolf2000.

Сообщества › Электронные Поделки › Блог › Часы-термометр-будильник на Atmega8 ИВ-11 (разработка)

У давно хотел собрать что то оригинальное. И нашёл очень интересный проект Часы, будильник, термометр (ATmega8) на 4-х ИВ-12. И всё загорелся идеей собрать подобные часики в подарок любимой тёщи на Новый Год.
Нарисовал свою схему.

Все необходимые детали уже есть. Осталось только сделать трансформатор.

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

Решил немного доработать схему.
В качестве разделительной точки у меня будет индикатор ИВ-3А будет мигать верхнее колечко (сегменты ABFG). А если задействован будильник нам будет показывать нижний штрих (сегмент D). И в качестве нижних ключей думаю применить туже микросхему ULN2003.

Вот последний вариант схемы.

Плату уже начал разводить, под свои компоненты и свой корпус.

Конечный проект выложу как только соберу часики.

Метки: ив-11, atmega8, часы

Комментарии 51

Накал индикаторов нужно правильно организовать. Обмотку накала сделать с отводом от середины и подвесить этот отвод через стабилитрон 4,7…7,5 В к земле. Тогда засветок соседних сегментов не будет.

Правая схема (вариант II, с ключами нижнего уровня) — ваш вариант запитки:

спасибо. Трансформатор надо перемотать, хорошо что ещё не собрал.

Накал индикаторов нужно правильно организовать. Обмотку накала сделать с отводом от середины и подвесить этот отвод через стабилитрон 4,7…7,5 В к земле. Тогда засветок соседних сегментов не будет.

Правая схема (вариант II, с ключами нижнего уровня) — ваш вариант запитки:

а можно не перематовать, просто тот что на землю провод подключить через стабилитрон?

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

Можно поставить на выводы накала делитель напряжения из двух одинаковых резисторов (100…220 Ом) и их средний вывод посадить на стабилитрон, либо просто на шину +5 В, что равнозначно.

Кстати, изменяя напряжение на этой (средней точке), можно очень просто регулировать яркость свечения сегментов индикатора. При низком напряжении яркость будет максимальной. При увеличении напряжения яркость будет падать. Можно, например, среднюю точку подсоединять либо к +5 В шине (ярко), либо к шине +12 В (тускло).

А можно даже собрать на фоторезисторе автоматическую регулировку яркости, чтобы ночью яркость свечения снижалась, а при ярком внешнем виде — повышалась до максимума…

(В примере ниже “землёй” индикатора является напряжение -20,8 В, поэтому электролит запаян обратной полярностью.)

Спасибо за конструктивный ответ. Я понял нужно создать запирающее напряжение. Чтобы не переделывать плату и не перематывать трансформатор. Подключу стабилитрон через делитель на землю как в вашем прошлом примере. Я полагал что при нижнем запирающее напряжение не нужно.
Вот про это здесь есть radiokot.ru/circuit/digital/home/215/

Понял вашу идею по регулировке свечения индикаторов. Например как тут.

Да, всё верно понимаете. Теперь, думаю, и без меня прекрасно справитесь! Успехов!

вот нашёл ещё одну статью в ней несколько вариантов питания ламп. electro-tehnyk.narod.ru/docs/BISMC.html

Ага, всё собрано в одном месте! Но суть везде одинаковая — поднять напряжение на нити накала (катода), выше напряжения запирания сеток и анодов (превратить его в отрицательное). Это вы поняли сами.

Вот про эту схему управления яркостью я говорил выше electro-tehnyk.narod.ru/d…/BISMC.files/image015.jpg

Теперь мне сё понятно. спасибо.

Ага, всё собрано в одном месте! Но суть везде одинаковая — поднять напряжение на нити накала (катода), выше напряжения запирания сеток и анодов (превратить его в отрицательное). Это вы поняли сами.

Вот про эту схему управления яркостью я говорил выше electro-tehnyk.narod.ru/d…/BISMC.files/image015.jpg

Стабилитрон Д814 подойдёт?

С буквой А только:
Д814А — разброс напряжения стабилизации: 7… 8,5 В при Iст 5 мА

Я бы предусмотрел на ZQ1 корректировочные конденсаторы на массу от каждой пластины. Точность хода — важный параметр в часах. Вы сможете подобрать кварц с частотой в плюс — например 32770 Гц, и подбором пикофарадных конденсаторов скорректировать ход с +30-40 сек. до + 2-3 сек. в месяц. А подобрать кварц, точно генерирующий 32768 тактов — нереально) Подумайте, пока печатку не изготовили.

Я собрал на ds1307 четверо часов, кварцев перебрал штук двадцать. И новые из разных магазинов, и новые с китайских модулей и старые из всяких разных часов, и с разных (новых и старых) материнских плат снимал. И один хрен часы убегали на 5-40 секунд за сутки. Я пришел к выводу, что сами микрухи гуано редкое. И одни часы собрал на ds3231, уже почти год ходят секунда в секунду!

Я тоже не одну козу е.ал в этой жизни, но все же любые микрухи, будь то к176ие12, ие18 или еще древнее на базе гамна мамонтенка — тупо считают и делят такты, подаваемые внешним частотозадающим элементом, т.е. заданную частоту кварцевого резонатора. И если этих тактов у резонатора 32800 — часы спешат, а если 32700 — отстают. Вина кварца. Их добротность зависит от многих параметров, в т.ч и от температуры, есть резонаторы разных классов точности и диапазонов.Это легко проверить на примитивном стенде для кварцевых резонаторов, собирается такой на коленке за 20 минут, подключается к осциллографу или частотомеру. Это справедливо и для RTC на DS3231. Но частоту можно корректировать. Частота китайского кварца 32768 может иметь погрешность в +/- несколько Герц. Положительный уход можно откорректировать конденсаторами, отрицательный — нет.
Не зная этой простой истины, вы можете еще 150 часов собрать с тем же результатом, угадав случайно точный кварц из кучи в 10 случаев из 100, но не понимая почему так произошло. Это понятно хоть?
Вы имеете что то возразить или будете дальше впечатлять меня необыкновенным опытом сборки китайских часов?

Читайте также:  Как заменить проводку в квартире своими руками?

Максим, отличный девайс будет! Только если прошивку будете писать сами то лучше возьмите DS3231 вместо DS1307, она в разы стабильнее(сам с этим сталкивался) и из нее можно данные температуры считывать. И термо датчик лучше выбрать какой нибудь другой, лучше с i2c шиной. Просто 1-ware очень медленный, с его обработкой могут выйти накладки в основной программе. Но это все актуально, только при условии, что прошивку будете писать с нуля сами.

Двоичные часики на atmega8

Доброго времени суток,товарищи! У меня к вам вопросик возник. Вторую неделю мучаюсь с часами, то спешат, то отстают. Так вот. Во-первых. Используется внутренний генератор на 8МГц. Недавно прочитал, что он нестабильно ведёт себя при изменении питания/температуры. Даст ли положительный результат использование внешнего кварца? Во-вторых. Какую лучше сделать программную корректировку? Кварц тоже не идеален( С использованием задержки или через определённый интервал времени добавлять секунды? Если отстают. И как “красивее” это сделать? Вот исходник:

#include
#include // подключаем библиотеку задержки

unsigned char sek; // переменная сек.
unsigned char min; // пересенная мин.
unsigned char hour; // переменная часов
unsigned char Dig[10];
char Disp6, Disp7;

// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void) // таймер выставлен на частоту 1 Гц
<
// Place your code here
TCNT1H=0;
TCNT1L=0;
sek++; // инкрементируем секунду
PORTD=128;
PORTB=253; // выводим точку

// роботаем с кнопками
if (PINC.0==0) // если нажата первая кнопка
<
hour++; // к значению часы добавляем единицу
>
if (PINC.1==0) // если нажата вторая кнопка
<
hour–; // к значению часы вычитаем единицу у
>
if (PINC.2==0) // если нажата третья кнопка
<
min++; // к значению минуты добавляем единицу
>
if (PINC.3==0) // если нажата четвертая кнопка
<
min–; // к значению минуты вычитаем единицу
>
if (PINC.4==0) // кнопка RESET
<
sek=0;
>

// Declare your global variables here

void Display (unsigned int Number) //Ф-ция для разложения десятичного цисла
<
unsigned char Num2, Num3;
Num2=0;
while (Number >= 10) //десятичную
<
Number -= 10;
Num2++;
>
Num3 = Number; //остаток
Disp6 = Dig[Num2];
Disp7 = Dig[Num3];
>
void Dig_init() //Массив для отображения цыфр на семисегментном индикаторе
<
Dig[0] = 95; // Сейчас у нас схема с общим катодом
Dig[1] = 24;
Dig[2] = 109;
Dig[3] = 124;
Dig[4] = 58;
Dig[5] = 118;
Dig[6] = 119;
Dig[7] = 28;
Dig[8] = 127;
Dig[9] = 126;
>

void main(void)
<
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0xFF;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0xFF;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0xFF;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 7,813 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x1E;
OCR1AL=0x85;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// LCD module initialization

// Global enable interrupts
#asm(“sei”)
Dig_init(); //инициализация массива с двоичным кодом
while (1)
if(sek==60) // если сек = 60
<
min++; // добавляем 1 к переменной “минута”
sek=0; // зануляем переменную “секунда”
>
if(min==60) // если мин = 60
<
hour++; // добавляем 1 к переменной “час”
min=0; // зануляем переменную “минута”
sek=0;
>
if (hour==24) // так как у нас часы имеют 24 часовый формат
< // при достыжении 24 часов, онулируем все переменные.
hour=0;
min=0;
sek=0;
>
// защита переполнения переменной, она нужна для того чтобы в моментах когда время не переходило в минус.
if (hour==255)
hour=0;
if (min==255)
min=0;
// выводим переменные (стробирование)
Display(hour); //разложили “часы” на 2 цифры и отобразили по очереди
PORTB=254; //даем лог 0 для катода 1 разряда
PORTD=Disp6; //1 цифра
delay_ms(1);
PORTB=253; //даем лог 0 для катода 2 разряда
PORTD=Disp7; //2 цифра
delay_ms(1);
Display(min); //разложили “минуты” на 2 цифры и отобразили по очереди
PORTB=251; //даем лог 0 для катода 3 разряда
PORTD=Disp6; //3 цифра
delay_ms(1);
PORTB=247; //даем лог 0 для катода 4 разряда
PORTD=Disp7; //4.
delay_ms(1);
>;
>

Где взял, извините не помню(
А было бы совсем приятно, если бы кто-нибудь поделился хорошо работающей схемой) Только желательно без DS13.. Мне нужны просто часы, без всяких наворотов)

_________________
Очень жаль, когда люди упираются лбом в что-то, хотя это и не логично совсем. А свою логику не объясняют.

Рейтинг
( Пока оценок нет )
Загрузка ...
Adblock
detector