Кухонный таймер и простые часы

 

     Вашему  вниманию  предлагается  схема  кухонного  таймера,  представленная  на  Рис.1.  Устройство  спроектировано  на  основе  микроконтроллера  ATtiny2313,  тактовая  частота  которого  (1024 КГц)  стабилизирована  при  помощи  кварцевого  резонатора. В  режим  установки  устройство  вводится  при  помощи  кнопки  S1  (установка).  При  помощи  кнопки  S2  (увеличение)  значение  минут  увеличивается,  а  при  помощи  S5 (уменьшение)  соответственно  уменьшается.  С  помощью  кнопки  S3  (выход  из  цикла)  происходит  выход  микроконтроллера  из  режима  установки  и  запуск  счёта  таймера.

 

 

Рис. 1 - Схема кухонного таймера

     Индикация  заданного  и  текущего  значения  минут  происходит  на  жидкокристаллическом  индикаторе  (ЖКИ),  имеющим  встроенный  контроллер  HD44780  и  обладающим  двумя  рядами  по  шестнадцать  знакомест  в  каждом.  Тип  индикатора – ITM1602ATR  или  MT-16S2H.  Сам  индикатор  крепится  на  корпусе  устройства,  а  его  выводы  распаиваются  на  печатном  разъёме  платы  Х1 – Х10  в  соответствии  со  схемой.

     Микроконтроллер  имеет  также  разъём  для  внутрисхемного  программирования  ХР1.  Связь  микроконтроллера  с  терминалом  персонального  компьютера  может  осуществляться  при  помощи  переходника  USB – TTL  (USB – UART),  который  подключается  к  четырёх – штырьковому  разъёму  (PLS)  X13 – X16.  Питание  таймера  осуществляется  от  обычного  широко  доступного  блока  питания  на  12В,  0,5А,  которое  преобразуется  и  стабилизируется  (5В)  с  помощью  микросхемы  78L05.  При  достижении  установленного  значения  минут,  включается  звуковой  генератор,  выполненный  на  логических  элементах  микросхемы  DD2 – DD2.3,  DD2.4  (CD4011B),  ключе  на  транзисторе  VT1,  который  нагружен  на  звуковой  излучатель  HCM 12-12.   

     Программа  микроконтроллера  состоит  из  основного  цикла,  подпрограммы  установки  значения  минут, а  также  подпрограммы  обработки  прерывания  по  совпадению,  которая  позволяет  получить  количество  отсчётов  таймера1  общей  длительностью  одна  секунда, что  в  свою  очередь  позволяет  вести  последовательный  отсчёт  секунд  и  минут.
     Текст  программы  «Timer.bas»  приведён  ниже:

'Программа позволяет контролировать
'интервал времени от 1 до 59 минут.
'Время задаётся с помощью кнопок.
'Отображение времени на ЖКИ LCD 16*2
$regfile = "attiny2313a.dat"       'настройки микроконтроллера
$crystal = 1024000                 'внешний кварц 1024 КГц
$hwstack = 40
$swstack = 16
$framesize = 32
'$sim

'таймер считает в пределах 1-59 мин
Config Timer1 = Timer , Prescale = 1024 , Clear Timer = 1       'пред.дел=1024 и сброс при этом
Stop Timer1                        'останов таймера
Timer1 = 0
Config Int0 = Falling              'прерывание по спаду импульса
Ddrd = &B00001000                  'все входа, PORTD.3- выход на звуковой генератор                         

Portd = &B01110100                 'подтяжки РВ2-INT0,PD4-увеличение, PD5-уменьшение, PD6-выход из цикла
Config Debounce = 75               'защита от дребезга

'определение переменных:
Dim Minut As Byte                  'минуты
Dim Sec As Byte                    'секунды
Dim Mins As Byte                   'заданное значение минут

Const Count = 1000                 'при тактовой частоте=1024 КГц и делителе=1024, 1000 отсчётов=1сек
 On Int0 Ustanov                   'определение подпрограммы обр. внеш. прерывания (установка)
 On Compare1a Compare              'определение прерываний по совпадению

 Compare1a = Count                 'запись в регистр сравнения

Enable Interrupts                  'разрешение прерываний
Enable Int0                        'вешние прерывания
Enable Compare1a                   'прерывания по совпадению

Do                                 'основной цикл

  Cls                              'очистка дисплея
  Locate 1 , 4                     '1-я строка, 4-е знакоместо
  Lcd ; Minut ; ":" ; Sec          'индикация мин и сек
  Locate 2 , 6                     'индикация заданного значения минут во 2-м ряду, 6-е знакоместо
  Lcd "Minutes=" ; Mins
  Wait 100                         'задержка 100 мс
Loop

Ustanov:                           'подпрог.обраб.прерывания INT0
Do
  Waitms 75                        'защита от дребезга
  Stop Timer1
  If Portd.4 = 0 Then              'условие увеличения минут
  Wait 1                           'задержка 1 сек
   Incr Mins                       'увеличение минут
  If Mins => 60 Then               'предел увеличения
   Mins = 0
  End If
  End If
  If Portd.5 = 0 Then              'условие уменьшения минут
  Wait 1
   Decr Mins                       'уменьшение минут
   If Mins =< 0 Then               'предел уменьшения
   Mins = 0
  End If
  End If
  Cls
  Lcd "INPUT MINUTES:" ; Mins      'индикация установленных минут
  If Portd.6 = 0 Then              'выход из цикла
   Exit Do
  End If
Loop
Sec = 0
Start Timer1                       'запуск таймера1
Return

Compare:                           'подпрограмма обр.прерывания по совпадению
Stop Timer1                        'останов таймера1
  Incr Sec                         'инкр.секунд
If Sec => 60 Then                  'условие инкр.минут
  Sec = 0
  Incr Minut
If Minut = Mins Then               'условие достижения заданного значения минут
 Stop Timer1
 Timer1 = 0
 Set Portd.3                       'включение звукового генератора
 Return
 End If
 End If
Start Timer1
Return

End                                'end program

     Для  создания  простейших  часов используется  та же  схема,  что  и  для  таймера,  за  исключением  звукового  генератора.  Программа  для  часов  также  подобна  программе  для  таймера, только  в  подпрограмме  задания  значений  помимо  минут  задаются  и  часы.  Соответственно  на ЖКИ индуцируются  значения  часов  и  минут.
    Ниже  приведён  текст программы  для  часов  «Clock.bas»:

'Программа часов, которые устанавливаются с помощью кнопок.
'Индикация на ЖКИ LCD 16*2
$regfile = "attiny2313a.dat"       'настройки микроконтроллера
$crystal = 1024000                 'внешний кварц=1024КГц
$hwstack = 40
$swstack = 16
$framesize = 32

'Config Portd.3 = Output            'выход звукового генератора
Reset Portd.3
Config Pind.2 = Input              'режим установки значений часов и минут
Set Portd.2
Config Int0 = Falling              'прерывание по спаду импульса
Config Pind.4 = Input              'увеличение знач.минут или часов
Set Portd.4
Config Pind.5 = Input              'уменьшение знач.
Set Portd.5
Config Pind.6 = Input              'выход из режима установки знач.
Set Portd.6
Config Timer1 = Timer , Prescale = 1024 , Clear Timer = 1       'конфиг. таймер1,предделитель=1024, сброс и очистка таймера
Config Debounce = 75               'защита от дребезга

'определение переменных:
Dim Minut As Byte                  'минуты
Dim Heoer As Byte                  'часы
Dim Sec As Byte                    'секунды

On Int0 Stand                      'подрограмма установки минут и часов
On Compare1a Pulse                 'подпрограмма обработки прерывания по совпадению

Const Count = 1000                 'кол-во отсчётов таймера1 = 1сек
Compare1a = Count                  'запись в регистр сравнения

Enable Interrupts                  'разрешение прерываний
Enable Int0
Enable Compare1a

Do                                 'основной цикл
  Cls                              'очистка ЖКИ
  Locate 1 , 4                     'первый ряд, четвёртое знакоместо (LCD 16x2)
  Lcd ; Heoer ; ":" ; Minut        'индикация часов и минут
  Waitms 250                       'задержка 250 мс
Loop

Stand:                             'подпрог. обработки внешнешних прер. INT0
Do                                 'цикл задания минут
  If Portd.4 = 0 Then              'условие увеличения минут
   Incr Minut                      'инкрименирование минут
  If Minut => 60 Then              'условие ограничения увеличения минут
   Minut = 0
  End If
  End If
  If Portd.5 = 0 Then              'условие уменьшения минут
   Decr Minut                      'декрименирование минут
  If Minut <= 0 Then               'условие ограничения уменьшения минут
  Minut = 0
  End If
  End If
  Cls
  Lcd "Input Minutes:" ; Minut     'индикация значений минут
  If Portd.6 = 0 Then              'условие выхода из цикла
   Exit Do
  End If
Loop
Do                                 'цикл задания часов
  If Portd.4 = 0 Then              'условие увеличения
   Incr Heoer
  If Heoer => 24 Then              'условие ограничения
   Heoer = 0
  End If
  End If
  If Portd.5 = 0 Then              'условие уменьшения
   Decr Heoer
  If Heoer <= 0 Then               'условие ограничения
   Heoer = 0
  End If
  End If
  Cls
  Lcd "Input Heoers:" ; Heoer      'индикация часов
  If Portd.6 = 0 Then
   Exit Do                         'условие выхода из цикла
  End If
Loop
Sec = 0                            'обнуление секунд
Start Timer1
Return

Pulse:                             'подпрог. обраб. прерываний по совпадению
Stop Timer1
Incr Sec                           'увеличение секунд
If Sec => 60 Then                  'условие увеличения минут
 Sec = 0
 Incr Minut
If Minut => 60 Then                'условие увеличения минут
 Sec = 0
 Minut = 0
 Incr Heoer
If Heoer => 24 Then                'условие увеличения часов
 Sec = 0
 Minut = 0
 Heoer = 0
End If
End If
End If
Start Timer1
Return

End                                'end program

     Установку  значений  часов  и  минут  можно  осуществить  и  с  терминала  Bascom  при  помощи  переходника  USB - TTL,  используя  функцию  «эхо».  При  этом  кнопки  устройства - S1, S5, S3  становятся  ненужными,  а  сама  программа  значительно  сокращается.

     Задание  значений  будет  теперь  происходить  в  подпрограмме  обработки  прерываний  по  приёму  (Urxc).  Для  этого  необходимо  нажать  любую  кнопку  на  клавиатуре  ПК  и  ввести,  соответственно,  значения  минут  и  часов  (ввод – с  помощью  кнопки  «ENTER»)  см. Рис.2. 

 

 

 Рис. 2 - Симуляция программы часов

Текст программы  «clockterm.bas»  приведён  ниже:

'Программа часов
'Часы устанавливаются с терминала Bascom
'Индикация на ЖКИ LCD 16*2
$regfile = "attiny2313a.dat"       'настройки микроконтроллера
$crystal = 1024000                 'внешний кварц=1024КГц
$hwstack = 40
$swstack = 16
$framesize = 32
'$sim

Config Pind.0 = Output             'UART-RXC
Config Pind.1 = Input              'UART-TXD
Config Timer1 = Timer , Prescale = 1024 , Clear Timer = 1       'конфиг. таймер1, предделитель=1024, сброс и очистка таймера
Stop Timer1
Timer1 = 0

'определение переменных:
Dim Minut As Byte                  'минуты
Dim Heoer As Byte                  'часы
Dim Sec As Byte                    'секунды

On Urxc Stand                      'подрограмма установки минут и часов
On Compare1a Pulse                 'подпрограмма обработки прерывания по совпадению

Const Count = 1000                 'кол-во отсчётов таймера1, период= 1сек
Compare1a = Count                  'запись в регистр сравнения

Enable Interrupts                  'разрешение прерываний
Enable Urxc
Enable Compare1a

Do                                 'основной цикл
  Cls                              'очистка ЖКИ
  Locate 1 , 4                     'первый ряд, четвёртое знакоместо (LCD 16x2)
  Lcd ; Heoer ; ":" ; Minut        'индикация часов и минут
  Waitms 100                       'задержка 100 мс
Loop

Stand:                             'подпрог. обработки внешнешних прер. по приёму
Stop Timer1
Timer1 = 0
Input "Ведите значение минут:" , Minut       'ввод значений минут
Input "Введите значение часов:" , Heoer       'ввод значений часов
Sec = 0                            'обнуление секунд
Start Timer1
Return

Pulse:                             'подпрог. обраб. прерываний по совпадению
Stop Timer1
Incr Sec                           'увеличение секунд
If Sec => 60 Then                  'условие увеличения минут
 Sec = 0
 Incr Minut
If Minut => 60 Then                'условие увеличения часов
 Sec = 0
 Minut = 0
 Incr Heoer                        'увеличение часов
If Heoer => 24 Then                'предел увеличения часов
 Sec = 0
 Minut = 0
 Heoer = 0
End If
End If
End If
Start Timer1
Return

End                                'end program


     Плата  устройства  (60х60 мм)  выполнена  в  PCAD  и  находится  в  папке  «FILE  PCAD».  Откомпилированные  программы  находятся  в  папке  «Kitchen_Timer_prog».

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

      Автор andre