Твитнуть
Моя жена попросила меня найти другой таймер для использования в кухне. Она получила одна уже с аналоговыми параметрами, но ее не хватает одного типоразмера АА батареи. Цифровая настройка может не легко для человеческого интерфейса. Однако я сделаю это для легкой установки времени. Когда я свободен я изменить его, чтобы быть аналоговое задание. Может быть, я могу использовать 555 моностабильный для POT чтении. Так я получил свою лабораторию в домашних условиях нахождения старых досок и частей на полке. Я нашел MAX7219, 8-разрядный светодиодный модуль дисплея и два зуммеры. MAX7219 потребностей последовательный интерфейс, как и SPI. Это позволяет мне использовать 20-контактный 89C4051 MCU, так как контактный рассчитывает на I / O порт является весьма ограниченным. 8-разрядный светодиодный позволяет мне иметь четыре таймера, каждый будет иметь две цифры. Я могу установить скажем, 00-99mins или 0-99Hrs. Результат должен быть открытый коллектор с моей любимой 7407!
Рисунок 1: прототип xTiemr V1.0.
Светодиодный модуль с MAX7219 является готовой, имеющих 10-контактный разъем для легкого плагин для 4051 доске. Как показано на рис. 1, четыре клавиши используются для установки времени для каждого таймера. Каждый таймер будет иметь две цифры СИД. Правой стороны, таймер 1 и таймера 2, для подсчета минут, левой рукой, таймер 3 и 4, таймер на час подсчета.
Для удобства настройки с переключателями, она заданного значения времени, что широко используется, например, -1, 0, 3, 5, 10, 15, 20, 25.
Если тайм-аут, дисплей будет показывать 0, и выходной бит включен. Дополнительно два зуммеры предназначены для timer1 и Timer2 тревоги. Я сделал этот вывод сигнала на кухне использования.
Оборудование Схема
Полная схема приведена на рис 2. MCU является AT89C4051 с 11.0592MHz XTAL. MAX7219 требует только трех сигналов, CLK, DIN и нагрузки. Эти сигналы программного обеспечения сгенерированный код сборки. Вы можете узнать, как код сборки интерфейс с C от прошивки. Так как при включении питания, все порту биты высокий логический уровень, поэтому я выбрал 7407, открытый коллектор обеспечить NPN O / C выход. Эти выходные биты подходят для вождения-изолятор опто. Модуль вывода образец оптико-симистор, MC3040. Входной цепи просто с текущего режима движения, говорят 15mA достаточно для MC3040. Выход симистор с ZCS дисков 220 катушки электромеханического реле. Так как контакт реле обеспечивает НЗ и НР, поэтому мы можем обеспечить две функции переменного тока зажигания, т. е. задержка для NO и задержка выключения для контактов реле.
Рисунок 2: Работа с аппаратным схема xTimer V1.0.
Вы можете заметить, что у нас есть кнопка сброса, чтобы проснуться MCU! Эта версия не имеет главный выключатель для включения и выключения совета. Вместо этого он использует MCU и MAX7219 режим выключения питания. Мы увидим примеры кода, которые ставят MCU и MAX7219, чтобы выключить режим. Когда все светодиоды свет, DC ток около 90mA @ +5 V, и, когда режим выключения питания, то он будет ок. 10 мА. Схема MAX7219 возобновляется по сведению заявление MAXIM, это простые аппаратные и большинство настройки выполняются программным обеспечением управления.
Программное обеспечение
Главная Программа проста навсегда петли с 10ms галочку цикла. Все задачи будут работать каждый тик в круглых образом Робин. Тик был подготовлен в файле начальной загрузки, как показано ниже, он был объявлен как cputick и модификатор ехЬегп указывает эта переменная была объявлена во внешнем файле.
Внешние неподписанных регистр символов cputick;
Вот основные программы, мы увидим, подробно для каждой задачи ниже.
в то время как (1) { в то время как (! cputick) / / Выполнить следующие задачи каждые 10 мс ; cputick = 0; set_timer (); / / проверяем нажатой клавишу run_timer (); / запуск четырех таймеров key_release (); / / проверяем, если ключ был освобожден updatedisplay (); / / отправить данные на MAX7219 ring1 (); / / дополнительный зуммер ALARM1 ring2 (); / / дополнительный зуммер ALARM2 }
set_timer () будет проверить входной бит. Эти входные бит P3.2, P3.3, P3.4 и P3.7. Проверка осуществляется с помощью логических и заданный бит с байта маски, например, для P3.2 мы будем проверять бит 2 P3 с маской байт 0x04. Заявление будет (P3 & 0x04), если результат будет 0, то множество Flag1 бит 0 от одного года до указывает, что key1 была нажата. Затем проверьте index1 больше или равна 9, если это правда, сброс index1 до 0. Timer1 перезагрузится с preset_timer1 [index1 + +].
Preset_timer1 [] массив заданного значения для timer1. Образец ниже.
символ preset_timer1 [] = {-1,0,3,5,10,15,20,25,30};
/ / Перезагрузки заданное значение времени от заданного массива для каждого нажатия клавиши
set_timer () { если ((Flag1 & 1) == 0) / / ввести только тогда, когда ключи были освобождены { если ((P3 & 0x04) == 0) { Flag1 | = 1; если (index1> = 9) index1 = 0; timer1 = preset_timer1 [index1 + +]; } если ((P3 & 0x08) == 0) { Flag1 | = 1; если (index2> = 9) index2 = 0; Таймер 2 = preset_timer2 [index2 + +]; }
Вы можете увидеть каждый ключ проверки, Flag1 бит 0 будет множество. Этот флаг будет сигнал установить таймер задачи, что ключевые была нажата, поэтому при входе она будет проверять, если этот бит = 1, то не буду повторять работает.
Задача, что сбросить этот бит будет проверить, если все ключи были освобождены показано ниже. использование логических и P3 с 0x3c. Если все биты '1 ', то ясно бит 0 Flag1.
key_release () { если ((P3 и 0x3c) == 0x3c) Flag1 & = 1; }
run_timer () может быть одной второй резолюции, поэтому мы поместили это работает каждый второй с помощью приращение one_second переменной. Все четыре таймеры будет работать каждый второй, то. Выключения задача также работает каждый второй. Позже мы увидим, для выключения подробно.
run_timer () { если (+ + one_sec> = 100) { one_sec = 0; run_timer1 (); run_timer2 (); run_timer3 (); run_timer4 (); выключения (); / / выключения проверки выполнения каждого второго } }
Теперь посмотрим на пример кода, который работает timer1.
если (+ + timer1_clk> = 60) / / timer1 является одним мин основан! { timer1_clk = 0; timer1 -; } } зе / / timer1 == 0, то огонь выходной { clrbit (OUTPUT 1) / / OUTPUT 1 пожар buzzer1 = ON; Flag1 & = 0x02; flag2 & = 0x01; } } еще { Flag1 & = 0x02; / / нет мигать при timer1 == -1 flag2 & = 0x01; buzzer1 = OFF; } }
У нас есть три государства, которые будут выполнены. Ниже таблица показывает действий для каждого государства. Обратите внимание, что timer7 является таймер, который мы использовали для отключения тайм-аута. Flag1 бит 1 для точка мигает сигнал флага.
Как было показано выше выключения задача также проживали в одной второй резолюции же, как таймер работает. Timer7 будут сбрасываться каждый timer1 не равно 0. Однако, когда пользователь установит все таймеры выключен, или все значения timer1-timer4 будет -1, то отключение будет выполняться задача. Тайм-аут в 10 секунд, вы можете видеть, что при тайм-аут, MAX7219 будет установлен в режим отключения и немного ЧР в PCON будет установлен в один с тем чтобы выключить! На чипе останавливает генератор!, И дисплей покажет пустой. Там не будет ответа от любую клавишу нажать, то. Чтобы проснуться MCU и включите его, кнопку RESET поможет выйти из режима выключения питания!
выключения () { если ((timer1 и Timer2 и timer3 и timer4) == -1) { timer7 + +; если (timer7> = 10) / / 10 секунд тайм-аут { сдвиг (0x0c00); / / включить режим отключения АНМ "CLR IE.7"; АНМ "MOV PCON, # 2" / / ввести режим выключения питания } } }
Обновление дисплей отправить последовательных данных буфера [] массива MAX7219. Вы можете изучить код, как преобразовать двоичные данные в-сегментный дисплей 7 в moveTimetobuffer () функцию.
SDCC версия прошивки
Снова причина, почему я написал новую версию прошивки, просто для удовольствия и тратить свое свободное время на изучение новых вещей. Я получил проблема с большой электромеханических реле, в основном производители только производить NO контакт. Образца схема приведена на рис 2. имеет реле схема, которая использует Опто симистор вождения НО / НЗ реле! Так что я должен изменить прошивку, чтобы выход включается при Запустить таймер и выключить, когда время вышло. Чтобы сделать такие изменения, необходимо модифицировать исходный код и перекомпилировать его. Я подумал, почему бы не попробовать с SDCC. Люди могут изменять исходный код и сделать сам ".
Пусть получить SDCC для DOS командной строки, SDCC для 8051 . Распакуйте пакет и сохранить на диск C. Я сделал папку приложений (прикладных программ), на мой исходный код. Вот новый код для SDCC, xtimer1.c
Timer4 теперь изменены, чтобы быть задержки с выходом. Подсчета теперь основан на минуту же, как timer1 и 2. Timer3 прежнему час подсчет основан. Я сделал опто-реле для больших переключения нагрузки.
Рисунок 3: оптико-реле для OUTPUT4 (активный низкий).
Оптико-транзистор может быть любого типа. Обычно некоторые оптико выход может управлять реле напрямую, но я думаю, лучше использовать Дарлингтон-транзистор, говорит ULN2003, ULN2803 управлять реле. При использовании этого метода нет гальванический контакт между ВН и цифровой доске. EMI производится из индуктивной нагрузкой отключения будет распространяться только на плате управления по индукции и излучения. Эта конструкция достаточно сохранить для цифровой пульт управления.
Теперь вернемся к Ран SDCC, ниже шаги показывают, как использовать SDCC для компиляции исходного кода. После SDCC установил на диске С:, мы должны установить путь, чтобы DOS знаю, где папке EXE файлы SDCC. Для компиляции только тип SDCC program.c. Если все ОК, то мы получим машинный код в шестнадцатеричной файл. Однако шестнадцатеричный файл, созданный SDCC имеет *. ihx расширения. Мы можем преобразовать его в шестнадцатеричный файл с шестигранной *. просто программа packihx. См. пример ниже.
Hex файл, созданный SDCC только 1877 байт! Вы можете использовать 89C2051 вместо 89C4051 для U2!