Секундомер на базе микроконтроллера МК51
В данном курсовом проекте разработан секундомер на базе микроконтроллера МК51. Проанализированы алгоритмы работы устройства и микроконтроллера. По алгоритму работы микроконтроллера на языке Ассемблер написана программа и разработана принципиальная электрическая схема устройства.
ВВЕДЕНИЕ
Секундомер – прибор для измерения промежутков времени (в секундах и долях секунды, минутах, часах); механические или электронные часы с кнопочно-рычажной системой для пуска и остановки механизма и возврата указателя (стрелки, цифрового индикатора) в исходное положение.
В данном проекте разработан секундомер на базе микроконтроллера МК51. Проанализировано техническое задание, разработаны алгоритмы работы устройства и микроконтроллера. На основе алгоритма работы микроконтроллера написана программа на языке Ассемблер. Также построена принципиальная схема и рассчитаны ее элементы.
1 АНАЛИЗ ТЕХНИЧЕСКОГО ЗАДАНИЯ
В данной работе требуется разработать секундомер на основе микроконтроллера серии МК51. Микроконтроллер обеспечивает отсчёт временного интервала с отображением на индикаторах.
В соответствии с техническим заданием разрабатываемое устройство должно отображать на индикаторах минуты, секунды и сотые доли секунд. Ограничимся временем счета 100 минут. Поэтому в качестве устройства отображения информации целесообразно использовать 6 семисегментных индикаторов.
Согласно техническому заданию блок управления должен состоять из 4 кнопок.
Кнопка “Старт” используется для включения секундомера в режим счета, кнопка “Сброс” – для перехода секундомера в начальный режим (на индикаторах высвечиваются нули, память обнуляется), кнопка “Стоп” – для остановки счета (на индикаторах высвечивается время остановки счета), кнопка “Промежуточный результат” – для вывода на индикаторы текущего времени (секундомер продолжает счет).
СТРУКТУРНАЯ СХЕМА УСТРОЙСТВА
По результатам анализа технического задания построим структурную схему разрабатываемого устройства. Структурная схема устройства изображена на рисунке 1.

Рисунок 1 – Структурная схема устройства
Блок управления состоит из четырех кнопок. С блока управления информация о нажатой кнопке подается на микроконтроллер. Микроконтроллер обрабатывает полученный сигнал и начинает выполнять определенную последовательность действий, соответствующих нажатой клавише.
Микроконтроллер ведет отсчет времени, путем счета тактовых импульсов. Данные, полученные в процессе работы микроконтроллера, передаются на устройство отображения информации.
При нажатии кнопки “Сброс” происходит сброс счетчика в ноль, при этом на индикаторах высвечиваются нули.
При нажатии кнопки “Старт” микроконтроллер начинает отсчет времени, при этом информация о текущем состоянии выводится на устройство отображения.
При нажатии кнопки “Стоп” происходит остановка счета, и вывод текущего времени на индикаторы.
При нажатии кнопки “Промежуточный результат” информация о моменте нажатия кнопки выводится на устройство отображения, счет продолжается.
АЛГОРИТМ РАБОТЫ УСТРОЙСТВА
Опираясь на структурную схему устройства и анализ технического задания, построим алгоритм работы заданного устройства (рисунок 2).

Рисунок 2 – Алгоритм работы секундомера
АЛГОРИТМ РАБОТЫ МИКРОКОНТРОЛЛЕРА
На основе полученного алгоритма работы устройства необходимо описать алгоритм работы микроконтроллера.
В основной программе необходимо провести инициализацию переменных и таймеров-счетчиков.
Для организации необходимых задержек необходимо воспользоваться двумя встроенными таймерами-счетчиками. Таймер-счетчик TC0 будет использоваться для организации счета, а таймер-счетчик TC1 – для динамической индикации.
Чтобы при динамической
индикации не было заметно мерцание,
необходимо частоту смены кадров выбрать
более 50 Гц. Выберем частоту смены
изображения 50 Гц. Так как, согласно
анализу технического задания, в модуле
индикации будут применяться шесть
разрядов, то частота переключения всех
разрядов составит
Гц. Именно с такой частотой таймер-счетчик
TC1
должен формировать прерывания, то есть
каждые 3,3 мс.
Оба таймера-счетчика настроим в качестве шестнадцатиразрядных таймеров (режим работы 1 таймеров-счетчиков), для этого необходимо в регистр TMOD записать значение #00010001b.
Частота процессора
fтакт
= 11,0592 МГц. Поскольку машинный цикл
состоит из 12 периодов частоты синхронизации
fтакт,
то частота счета будет равна fтакт
/12. Таким образом, на вход таймеров-счетчиков
будут поступать импульсы с частотой
МГц.
Так как таймеры-счетчики
настроены как 16-разрядные таймеры, то
максимальное значение в них равно 65535,
что соответствует максимальному времени
мс.
Чтобы таймер-счетчик
TC1
обнулялся каждые 3,3 мс, необходимо, чтобы
отсчитал
раза. Поэтому, начальное значение,
заносимое в этот таймер-счетчик должно
быть равно 65535 – 3042 = 62493 или F41Dh
в шестнадцатеричной системе.
Таймер счетчик TC0
должен обеспечивать счет времени с
точностью 0,01 с. Таким образом, прерывания
должны формироваться каждую сотую долю
секунды. Поэтому необходимо, чтобы
таймер-счетчик отсчитал
.
Начальное значение, заносимое в TC0
должно быть равно 65535 – 9126 = 56409 или DC59
в шестнадцатеричной системе.
Используемые переменные приведены в таблице 1.
Таблица 1 – Список используемых переменных
|
Переменная |
Назначение |
Пределы изменения |
|
start |
Определяет состояние кнопки “Старт” |
0,1 |
|
stop |
Определяет состояние кнопки “Стоп” |
0,1 |
|
sbros |
Определяет состояние кнопки “Сброс” |
0,1 |
|
pr_rez |
Определяет состояние кнопки “Промежуточный результат” |
0,1 |
|
doli |
Счетчик сотых долей секунды |
00..99 |
|
sek |
Счетчик секунд |
00..59 |
|
min |
Счетчик минут |
00..99 |
|
sch_doli |
Переменные для вывода данных в режиме “Промежуточный результат” |
00.99 |
|
sch_sek |
00..59 |
|
|
sch_min |
00..99 |
|
|
chislo |
Символ, который нужно вывести на индикатор |
0..9 |
|
vihod |
Порт вывода информации на блок индикации |
|
|
ml |
Нулевой разряд переменной nomer_ind |
0,1 |
|
sr |
Второй разряд переменной nomer_ind |
0,1 |
|
st |
Третий разряд переменной nomer_ind |
0,1 |
|
nomer_ind |
Номер индикатора, на который необходимо вывести данные |
0..5 |
|
ch0..ch9 |
Данные,
которые необходимо передать на vihod
для отображения соответствующей
цифры |
Алгоритм основной программы представлен на рисунке 3.

Рисунок 3 – Алгоритм основной программы
Алгоритм подпрограммы indicator представлен на рисунке 4.
Рисунок 4 – Алгоритм подпрограммы indicator
Алгоритм прерывания таймера-счетчика TC0 представлен на рисунке 5.

Рисунок 5 – Алгоритм прерывания таймера-счетчика TC0
Алгоритм прерывания таймера-счетчика TC1 представлен на рисунке 6.

Рисунок 6 – Алгоритм прерывания таймера-счетчика TC1
ЛИСТИНГ ПРОГРАММЫ ДЛЯ МИКРОКОНТРОЛЛЕРА
org 00h
jmp nachalo ;переход на инициализацию
org 0bh
sjmp int0 ;прерывание Т/С0
org 1bh
jmp int1 ;прерывание Т/С1
org 30h
;Объявление переменных
start equ p2.0
stop equ p2.1
sbros equ p2.2
pr_rez equ p2.3
st equ p3.2
sr equ p3.5
ml equ p3.1
vihod equ p1
doli equ 40h
sek equ 41h
min equ 42h
nomer_ind equ 43h
chislo equ 44h
sch_doli equ 45h
sch_sek equ 46h
sch_min equ 47h
TH0_znach set 0DCh ;определение начальных значений
TL0_znach set 059h ;Т/С0 и Т/С1
TH2_znach set 0F4h
TL1_znach set 01Dh
ch0 set 11000000b
cH2 set 11111001b
cH3 set 10100100b
ch3 set 10110000b
ch4 set 10011001b
ch5 set 10010010b
ch6 set 10000010b
ch7 set 11111000b
ch8 set 10000000b
ch9 set 10010000b
;Основная программа
nachalo:
mov doli,#00h ;обнуление сотых долей секунд
mov sek,#00h ;обнуление секунд
mov min,#00h ;обнуление минут
setb EA ;разрешение прерываний
setb ET0 ;разрешение прерывания от Т/С0
setb ET1 ;разрешение прерывания от Т/С1
mov TMOD,#00010001b ;задание режима работы Т/С0 и Т/С1
;как таймеров
setb TR1 ;разрешение счета Т/С1
mov TH0,#TH0_znach ;задание начальных значений
mov TL0,#TL0_znach ;Т/С0 и Т/С1
mov TH2,#TH2_znach
mov TL1,#TL1_znach
jmp schitiv ;переход на метку schitiv
;Подпрограмма обработки прерывания таймера-счетчика ТС0
int0:
mov TH0, #TH0_znach ;задание начального значения
mov TL0, #TL0_znach ;Т/С0
inc doli ;увеличение на сотую долю секунды
mov A,doli
cjne A,#100d,int0_end ;сравнение с максимальным
;значением, в случае неравенства
;переход на метку int0_end
mov doli,#00d ;иначе - обнуление
inc sek ;увеличение на 1 секунду
mov A,sek
cjne A,#60d,int0_end ;сравнение с максимальным
;значением, в случае неравенства
;переход на метку int0_end
mov sek,#00d ;иначе - обнуление
inc min ;увеличение на 1 минуту
mov A,min
cjne A,#100d,int0_end ;сравнение с максимальным
;значением, в случае неравенства
;переход на метку int0_end
mov min,#00d ;иначе - обнуление
int0_end:
reti
;Подпрограмма обработки прерывания таймера-счетчика ТС1
int1:
mov TH2, #TH2_znach ;задание начального значения
mov TL1, #TL1_znach ;Т/С1
mov doli,sch_doli
mov sek,sch_sek
mov min,sch_min
mov A,nomer_ind
rrc A
mov st,C
rrc A
mov sr,C
rrc A
mov ml,C
mov B,#10d
jb ml,viv_doli
jb sr,viv_sek
viv_min:
mov A,min
div AB
jnb st,viv_min_dr
mov chislo,B
sjmp viv_end
viv_min_dr:
mov chislo,A
sjmp viv_end
viv_sek:
mov A,sek
div AB
jnb st,viv_sek_dr
mov chislo,B
sjmp viv_end
viv_sek_dr:
mov chislo,A
sjmp viv_end
viv_doli:
mov A,doli
div AB
jnb st,viv_doli_dr
mov chislo,B
sjmp viv_end
viv_doli_dr:
mov chislo,A
sjmp viv_end
viv_end:
acall indicator
inc nomer_ind
mov A,nomer_ind
cjne A,#6d, int1_end
mov nomer_ind,#00d
int1_end:
reti
;Подпрограмма “indicator”
indicator:
mov A,chislo
n0: cjne A,#0d,n1 ;вывод на индикаторы цифры “0”
mov vihod,#ch0
sjmp end_ind
n1: cjne A,#1d,n2 ;вывод на индикаторы цифры “1”
mov vihod,#cH2
sjmp end_ind
n2: cjne A,#2d,n3 ;вывод на индикаторы цифры “2”
mov vihod,#cH3
sjmp end_ind
n3: cjne A,#3d,n4 ;вывод на индикаторы цифры “3”
mov vihod,#ch3
sjmp end_ind
n4: cjne A,#4d,n5 ;вывод на индикаторы цифры “4”
mov vihod,#ch4
sjmp end_ind
n5: cjne A,#5d,n6 ;вывод на индикаторы цифры “5”
mov vihod,#ch5
sjmp end_ind
n6: cjne A,#6d,n7 ;вывод на индикаторы цифры “6”
mov vihod,#ch6
sjmp end_ind
n7: cjne A,#7d,n8 ;вывод на индикаторы цифры “7”
mov vihod,#ch7
sjmp end_ind
n8: cjne A,#8d,n9 ;вывод на индикаторы цифры “8”
mov vihod,#ch8
sjmp end_ind
n9: mov vihod,#ch9 ;вывод на индикаторы цифры “9”
end_ind:
ret
;Считывание нажатой кнопки
schitiv:
mov p2,#00h
setb p2.4
mov A,p2
;START
cjne A,#10001000b, schitiv1
setb TR0
sjmp schitiv
schitiv1:
;STOP
cjne A,#01001000b, schitiv2
clr TR0
sjmp schitiv
schitiv2:
;SBROS
cjne A,#00101000b, schitiv3
sjmp nachalo
schitiv3:
;PR_REZ
cjne A,#00011000b, schitiv
mov sch_doli,doli
mov sch_sek,sek
mov sch_min,min
sjmp schitiv
end
ОПИСАНИЕ ПРИНЦИПИАЛЬНОЙ ЭЛЕКТРИЧЕСКОЙ СХЕМЫ УСТРОЙСТВА
Схема электрическая принципиальная разработанного устройства представлена в документе К.201208.000 Э3
Основой устройства является микроконтроллер фирмы Atmel АТ89C51, полностью совместимый с MCS-51 и имеющий 4 кБ перепрограммируемой памяти, что вполне достаточно для записи разработанной программы.
Цепь сброса служит для начальной установки всех внутренних систем процессора в момент включения питания. Стандартная схема начального сброса приведена на рисунке 7.

Рисунок 7 – Схема начального сброса
При включении питания конденсатор С начинает заряжаться. При этом на вход Reset микроконтроллера поступит положительный импульс, длительность которого определяется временем зарядки конденсатора. Для этой схемы типовые значения емкости 10 мкФ, резистора – 1...10 кОм (берем 8,2 кОм).
Кварцевый резонатор служит для стабилизации частоты колебаний внутреннего тактового генератора и определяет тактовую частоту работы процессора. Для работы с последовательным портом микроконтроллера удобно взять частоту резонатора 11,0592 МГц. Стандартная схема подключения внешнего кварцевого к микроконтроллеру показана на рисунке 8.

Рисунок 8 – Схема включения кварцевого резонатора
Значения емкостей рекомендуется брать 3310 пФ.
Кроме перечисленных элементов в устройстве необходимо установить блокировочные конденсаторы в цепях питания. Номиналы блокировочных конденсаторов 10 мкФ (электролитический) и 0.1 мкФ (керамический).
Транзисторы для
реализации ключей в схеме выбираются
так, чтобы ток коллектора транзистора
превосходил ток свечения сегмента (Iк
20 мА). Так
схема включения используемого индикатора
- с общим анодом, и активным является
низкий уровень сигнала, то используется
p-n-p
транзистор. Исходя из этих условий
используется транзистор KT345А.
В качестве семисегментных индикаторов используются индикаторы крас-ного цвета АЛС333Б с общим анодом, ток сегмента которого 20 мА, а падение напряжения 2В. Высота знака индикатора 11 мм.
В качестве регистра для передачи данных к индикаторам используем регистр К555ИР27, его параметры:
![]()
![]()
![]()
В качестве дешифратора используем схему К155ИД4 со следующими параметрами:
![]()
![]()
Сопротивления R2 – R9 рассчитываются следующим образом. Так напряжение насыщения база-эмиттер транзистора равно 0,3 В, а падение напряжения на светодиоде – 2 В, падение напряжения на всей цепи 5В и ток светодиода равен 20 мА, то
![]()
=135
Ом
Таким образом, номиналы сопротивлений R2 – R9 имеют стандартное значение 130 Ом.
Расчет сопротивлений в цепи транзисторного ключа представлен ниже.

Рисунок 9 – Эквивалентная схема ключа
Из рисунка 9 видно, что общее входное сопротивление транзистора h11э определяется как параллельное соединение двух резисторов:
.
Транзистор должен открываться по низкому уровню. Чтобы транзистор открылся, потенциал эмиттера должен превышать потенциал базы больше чем на 0,6 В, т.е. напряжение база-эмиттер должно быть больше 0,6 В, оно падает на входном сопротивлении транзистора.
Для низкого уровня,
которому соответствует выходное
напряжение дешифратора 0,4 В (ТТЛ логика),
разность потенциалов составит 5 – 0,4 =
4,6 В, а это падение напряжения на R1
и на
.
Напряжение насыщения база-эмиттер
транзистора в справочнике составляет
0,92 – 1,1 В (на
).
Пусть оно будет равно 1 В, тогда на R1
напряжение будет 4,6 – 1 = 3,6 В.
Получаем,
что R1
и
относятся, как 3,6 к 1.
В случае если на выходе дешифратора единица, т.е. высокий логический уровень – более 2,4 В. В этом случае разность потенциалов составит 5 – 2,4 = 2,6 В.
Так R1
и
относятся, как 3,6 к 1, то на
падает напряжение 0,56 В. А этого напряжения
недостаточно, для того чтобы транзистор
открылся. Таким образом, выбранное
соотношение сопротивлений верно.
Найдем значение номиналов сопротивлений R1 и R2 по этому соотношению. Входное сопротивление транзистора KT345А 600 Ом. Пусть сопротивление резистора R1 составляет 2 кОм. Из соотношения определим R2:
![]()
Получим R2 равным 7,5 КОм.
Получим номиналы сопротивлений R10, R12, R14, R16, R18 и R20 равны 2 кОм, а сопротивлений R11, R13, R15, R17, R19 и R21 - 7,5 кОм.
ЗАКЛЮЧЕНИЕ
В данном проекте разработан секундомер, соответствующий требованиям, указанным в техническом задании.
В ходе выполнения данного проекта был выполнен анализ технического задания, описана структурная схема и алгоритм работы устройства. Также рассмотрен и описан на языке Ассемблер алгоритм работы для микроконтроллера, построена и рассчитана принципиальная схема устройства, составлен перечень необходимых элементов.
СПИСОК ЛИТЕРАТУРЫ
Юшин А.М. Цифровые микросхемы для электронных устройств. Справочник: -М: Высшая школа, 1993 г., 176 с.;
Электронный справочник по цифровым микросхемам и индикаторным устройствам, 2000г.;
Конспект лекций по микроконтроллерам MCS-51.