Кухонный таймер и простые часы
Вашему вниманию предлагается схема кухонного таймера, представленная на Рис.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 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.
Текст программы «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».
Разумеется, программу часов можно несколько усложнить, добавив будильник . Т.е. в подпрограмму установки добавить цикл установки будильника, а в подпрограмму обработки прерываний по совпадению вставить условия равенства текущего значения времени и заданного, при выполнении которого будет включаться генератор звуковой частоты. Однако, эту задачу читателю предлагается решить самостоятельно.