Таймер на 51-м микроконтроллере.

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Аватара пользователя
WayToReason
Родился
Сообщения: 2
Зарегистрирован: Вс апр 25, 2010 10:59:04
Откуда: Украина, Одесса

Таймер на 51-м микроконтроллере.

Сообщение WayToReason »

Доброго времени суток! Недавно начал изучать микроконтроллеры, решил начинать с семейства х51. Первое устройство, которое решил сделать - это обычный кухонный таймер. От 1 до 99 минут, в конце отсчета пищит зуммер. 3 кнопки: "+1 минута", "+10 минут" и "Старт". Динамическая индикация на 2-х семисегментных индикаторах с общим анодом. (Сегменты управляются нулем). Кнопки замыкаются на землю. Решил что для моих целей вполне подойдет микроконтроллер AT89S2051.

Нарисовал схемку, номиналы резисторов (и транзисторов) пока не знаю, подберу их уже после того как куплю индикаторы.
Изображение
Порт P1 используется для управления сегментами, P3.0 и P3.1 для управления первым и вторым индикатором соответственно. Кнопки "+1", "+10", "Старт" цепляются к выводам порта Р3.2, Р3.3, Р3.4. Зуммер к Р3.5. Программу счета времени я написал, а вот как осуществить вывод на экран не знаю. Про динамическую индикацию читал, но код написать не получается( Не понимаю, как написать цикл, который динамически выводил бы на каждый индикатор свое число.
Вот подпрограмма счета времени, вызывается каждый раз при срабатывании таймера 0, который настроен на секундную задержку. R1 - количество секунд, R2 - количество единиц минут, R3 - количество десятков минут.

Код: Выделить всё

;##################################################################
;Подпрограмма счета времени. Вызывается по прерыванию от таймера 0.
;##################################################################

CHECK_SEC:		;Проверяем равно ли количество секунд нулю
	MOV A, R1
	JZ CHECK_MIN	;Если равно, то переходим к проверке ед. минут
	DEC R1		;Если не равно, уменьшаем кол-во секунд на 1

CHECK_MIN:		;Проверяем равно ли количество единиц минут нулю
	MOV A, R2
	JZ CHECK_T_MIN	;Если равно, то переходим к проверке дес. минут
	DEC R2		;Если не равно, то уменьшаем кол-во ед. минут на 1
	MOV R1, #59	;и устанавливаем количество секунд равным 59

CHECK_T_MIN:		;Проверяем равно ли количество дес. минут нулю
	MOV A, R3
	JZ BEEP		;Если равно - то время истекло, включаем зуммер
	DEC R3		;Если нет, уменьшаем кол-во дес. минут на 1
	MOV R2, #9	;устанавливаем количество ед. минут равным 9
	MOV R1, #59	;Устанавливаем количество секунд равным 59

BEEP:			;Включение зуммера
	SETB P3.5
Частоту обновления каждого индикатора я планирую 100 Гц, соответственно 2-х индикаторов 200 Гц. Выводить цифры на сегмент я планирую так: создать таблицу с константами для каждого числа, а потом в выбирать из таблицы значение и выдавать в порт. Понимаю что нужно нужно использовать таймер 1 настроенный на прерывание 200 раз в секунду, но как при этом выводить сначала минуты на один индикатор, а десятки минут на другой? Отображать буду только минуты, вместо секунд будет точка мигать наверно.

Код: Выделить всё

Symbols: ;a b c d e f g DP
	DB 00000011b ;0
	DB 10011111b ;1
	DB 00100101b ;2
	DB 00001101b ;3
	DB 10011001b ;4
	DB 01001001b ;5
	DB 01000001b ;6
	DB 00011111b ;7
	DB 00000001b ;8
	DB 00001001b ;9

Зажигание индикатора:
	
        MOV             A, R2           ;Заносим в аккумулятор нужное значение
        MOV             DPTR, #Symbols  ;Уст. указ. на таблицу
        MOVC            A,@A+DPTR       ;Выбираем из таблицы значение для вывода на индикатор
        MOV             P1, A           ;Выдаем в порт
Вот алгоритмы счета времени и опроса кнопок:
Изображение Изображение
Буду рад, если кто-то напишет небольшой пример динамической индикации с подробными комментариями. Ну и любым замечаниям и предложениям тоже буду рад)
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18591
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Таймер на 51-м микроконтроллере.

Сообщение ARV »

посмотрите по этой ссылке: там есть схема и программное обеспечение для нее, много всего - от 1-wire до I2C, в том числе и динамическая индикация. проанализируйте и сделайте свой вариант, комментариев там достаточно.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»