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