- •Техническое задание
- •Введение
- •2.1. Общие сведения
- •2.2. Обзор литературы, методов, схемных решений
- •Структурная схема устройства
- •3.1. Выбор и обоснование
- •3.2. Описание принципа действия устройства
- •Выбор, обоснование и расчет отдельных узлов
- •4.1. Выбор микросхемы овм х51
- •4.2. Выбор микросхем дешифраторов и схем индикации
- •4.3. Расчет и выбор элементов звуковой сигнализации
- •Описание полной принципиальной схемы
- •Оценка нормируемых параметров
- •6.1. Оценка временных параметров
- •6.2. Оценка потребляемой мощности
- •6.3. Оценка потребляемого тока
- •6.4. Рабочие температуры
- •Алгоритм работы программы
- •7.1. Алгоритм работы главного цикла
- •7.2. Алгоритм работы таймера 0
- •7.3. Алгоритм работы таймера 1
- •7.4. Алгоритм работы подпрограммы внешнего прерывания по кнопке (плюс/первый игрок)
- •7.5. Алгоритм работы подпрограммы внешнего прерывания по кнопке (плюс/первый игрок)
- •7.6. Алгоритм работы подпрограммы динамическая индикация
- •Приложение 1. Принципиальная схема устройства Приложение 2. Перечень элементов
- •Приложение 3. Текст программы
Приложение 1. Принципиальная схема устройства Приложение 2. Перечень элементов
Приложение 3. Текст программы
.list on
; ******** именуем константы и внешние выводы
Tik equ 5000 ; длительность импульса в мкс
RazmerIndicachii equ 5 ; количество индикаторов
KnopkaPlus reg P3.3 ; кнопки
KnopkaMinus reg P3.2
Igra reg P3.0
Ustanovka reg P3.1
Pik reg P3.7 ; сигнал
; *****************
; ***************** это макрос установки длительности
LoadTimer0macroDlitTi
Clr TF0
Clr TR0
Mov TH0, #>(-DlitTi)
Mov TL0, #<(-DlitTi)
SetB TR0
.endm
; *****************
; ***************** макрос для таймера1
LoadTimer1 macro DlitT
Clr TF1
Clr TR1
Mov TH1, #>(-DlitT)
Mov TL1, #<(-DlitT)
SetB TR1
.endm
; *****************
.ABSOLUTE
.DATA ; распределяем ячеки ОЗУ
.ORG 20h
Flags ds 1 ; 1 байт под битовые переменные
First reg Flags.0 ; первый игрок
Second reg Flags.1 ; второй игрок
StartTime reg Flags.2 ; начало счёта
FirstUstan reg Flags.3 ;первая установка для обнуления,вместо прерывания
Count5ms ds 1 ; для счета времени по 5 мс
CountZn ds 1 ; знакоместо. от 0 до 5
t11 ds 1
t12 ds 1
t13 ds 1
t21 ds 1 ;цифры счёта
t22 ds 1
t23 ds 1
Digites ds 6 ; цифры индикации
EndVarBeginStack ds 1 ; последняя ячейка, дальше стек.
.RELATIVE
.CODE
.ORG 0
;************** векторы прерываний
Jmp Start
.ORG 3 ; внешнее прерывание 0
Jmp ProcInt0
.ORG 0bh ; прерывание по таймеру 0
Jmp IntT0
.ORG 13h ; внешнее прерывание 1
Jmp ProcInt1
.ORG 1bh ; прерывание по таймеру 1
Jmp IntT1
.ORG 23h ; прерывание по посл. порту
RetI
;**************
.ORG 40h
;************** начало программы
Start:
Mov SP, #(EndVarBeginStack) ; начальный указатель стека
Mov Count5ms, #0
Mov CountZn, #0
Mov Digites, #0
Mov t11, #0
Mov t12, #0
Mov t13, #0
Mov t21, #0
Mov t22, #0
Mov t23, #0
Clr First
Clr Second
Clr StartTime
ClrPik
SetB Ustanovka ; чтобы было определено заранее
SetB FirstUstan
Mov TMod, #00010001b ;оба таймера на 16 бит.
LoadTimer0 Tik
LoadTimer1 TikForPik ; заносим в таймер1 значение соот-щее 500Гц
SEtB IT0 ; разрешение прерывания по перепаду
SetB ET0 ; разрешить прерывание от таймера0
SetB EA ; разрешить работу контроллера прерываний
;************** основной цикл программы
mainloop:
; всё важное происходит здесь
JNB Ustanovka,mainloop ; не считаем при установке
JNB StartTime,mainloop ; не запущены часы
Mov A, Count5ms
CJNE A, #200, metka ; прошла одна секунда
Mov Count5ms, #0
JB First,Perviy
JB Second,Vtoroy
Jmp metka
Perviy:
CALL FirstSchet
Jmp Vnesenie
Vtoroy:
CALL SecondSchet
Jmp Vnesenie
Vnesenie:
;внесение значений в индикацию
Mov A,t13
Mov Digites,A
Mov A,t12
Mov (Digites+1),A
Mov A,t11
Mov (Digites+2),A
Mov A,t23
Mov (Digites+3),A
Mov A,t22
Mov (Digites+4),A
Mov A,t21
Mov (Digites+5),A
metka:
Jmp mainloop
;**************
;************** счёт на пнрвом индикаторе
FirstSchet:
Mov A,t11
CJNE A,#0,Umensh11
Mov A,t12 ;Mov A,#9 Mov t11,A
CJNE A,#0,Umensh12
Mov A,t13
CJNE A,#0,Umensh13
CALL Signalisation ; звуки
Jmp ExitFS
Umensh13:
Dec t13
Mov A,#9
Mov t12,A
Mov A,#9
Mov t11,A
Jmp ExitFS
Umensh12:
Dec t12
Mov A,#9
Mov t11,A
Jmp ExitFS
Umensh11:
Dec t11
ExitFS:
Ret
;**************
;************** счёт на втором индикаторе
SecondSchet:
Mov A,t21
CJNE A,#0,Umensh21
Mov A,t22 ;Mov A,#9 Mov t21,A
CJNE A,#0,Umensh22
Mov A,t23
CJNE A,#0,Umensh23
CALL Signalisation ; звуки
Jmp ExitSS
Umensh23:
Dec t23
Mov A,#9
Mov t22,A
Mov A,#9
Mov t21,A
Jmp ExitSS
Umensh22:
Dec t22
Mov A,#9
Mov t21,A
Jmp ExitSS
Umensh21:
Dec t21
ExitSS:
Ret
;**************
;************** сигнал динамика
Signalisation:
Mov R1,#5
SetBET1 ; разрешаем прерывание по таймеру1
Ups:
Mov A, Count5ms
CJNE A, #200, metka ; прошла 1 секунда
Mov Count5ms, #0
Dec R1
CJNE R1,#0,Ups
ClrET1 ; запрещаем прерывание по таймеру1
ClrPik; для отсутствия сигнала.
ClrStartTime; остановка, и отсутствие дальнейших вычислений
Clr First
Clr Second
Ret
;**************
;************** процедура прерывания по переполнению таймера 0
IntT0:
Push PSW
Push Acc
LoadTimer0 Tik
Inc Count5ms ; счет времени
JNB FirstUstan,Dalee
JBUstanovka,Dalee; режим установки и при первом запуске
Call Prerivanie
Dalee:
Call DinamicIndication
Pop Acc
Pop PSW
RetI
;**************
;************** процедура прерывания по переполнению таймера 1
IntT1:
Push PSW
Push Acc
LoadTimer1 TikForPik
Cpl Pik ; подаём сигналы
Pop Acc
Pop PSW
RetI
;**************
;************** процедура внешнего прерывания 0 (кнопка минус/первый ходил)
ProcInt0:
Push PSW
Push Acc
JNB Ustanovka,Minusik
JNB Igra,Perehod
Minusik:
Mov A,t12
SUBB A,#6
JNC Zaem ; если в разряде цифра меньше 6
Mov t12,A
JMP ExitPr0
Zaem: ; в разряде цифра меньше 6
Mov A,t12
Add A,#4 ; вычитание цифры 6
Mov t12,A
Mov A,t13
CJNE A,#0,Sbros ; меньше нельзя
Dec A
Mov t13,A
JMP ExitPr0
Sbros:
Mov A,t12
Mov A,#6
Mov t12,A
JMP ExitPr0
Perehod:
SetB StartTime
SetB Second
SetB FirstUstan ; что бы при изменении пошел обнуление
Clr First
JMP ExitPrInd0
ExitPr0:
Mov A,t12 ; на двуx индикатораx вместе
Mov t22,A
Mov A,t13
Mov t23,A
ExitPrInd0:
Pop Acc
Pop PSW
REtI
;**************
;************** процедура внешнего прерывания 1 (кнопка плюс/второй ходил)
ProcInt1:
Push PSW
Push Acc
JNB Ustanovka,Plusik
JNB Igra,Perehod1
Plusik:
Mov A,t12
Add A,#6
SUBB A,#9 ;проверка принадлежности 0-9
JNC Tot ;не больше 9
Dec A
Mov t12,A
MovA,t13 ; так как вычитаем 9
Add A,#1
CJNE A,#10,Norm ;следит за непереполнением cтаршего разряда индикации
Mov t13,#9
Mov t12,#6
JMP ExitPr1
Norm:
Mov t13,A
JMP ExitPr1
Tot: ;не больше 9
Mov A,t12
Add A,#6
Mov t12,A
JMP ExitPr1
Perehod1:
SetB StartTime
SetB First
SetB FirstUstan
Clr Second
JMP ExitPrInd1
ExitPr1:
Mov A,t12
Mov t22,A
Mov A,t13
Mov t23,A
ExitPrInd1:
Pop Acc
Pop PSW
REtI
;**************
;************** динамическая индикация
DinamicIndication:
Mov A, CountZn
Add A,#Digites
Mov R0, A
Mov A, @R0
Swap A
ORL A, CountZn
Swap A
Mov P1, A
Inc CountZn
Mov A,CountZn
CJNE A,#RazmerIndicachii, ExitInd
Mov CountZn,#0
ExitInd:
Ret
;**************
;*******************псевдо прерывание обнуления
Prerivanie:
Mov t11, #0
Mov t12, #0
Mov t13, #0
Mov t21, #0
Mov t22, #0
Mov t23, #0
Clr StartTime
Clr First
Clr Second
Clr FirstUstan
Ret
;*******************
END