Страница 1 из 1

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

Добавлено: Пт дек 24, 2010 20:05:20
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           ;Выдаем в порт
Вот алгоритмы счета времени и опроса кнопок:
Изображение Изображение
Буду рад, если кто-то напишет небольшой пример динамической индикации с подробными комментариями. Ну и любым замечаниям и предложениям тоже буду рад)

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

Добавлено: Пт дек 24, 2010 20:25:41
ARV
посмотрите по этой ссылке: там есть схема и программное обеспечение для нее, много всего - от 1-wire до I2C, в том числе и динамическая индикация. проанализируйте и сделайте свой вариант, комментариев там достаточно.