Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУ к цифрам.doc
Скачиваний:
28
Добавлен:
06.05.2019
Размер:
2.08 Mб
Скачать

2. Пример выполнения работы

В качестве примера ниже приведена программа, реализующая секундомер на таймере TC1, с использованием преобразования данных в BCD формат с помощью команды деления div AB и динамической индикацией полученного результата.

;*******ЛАБОРАТОРНАЯ РАБОТА 11*************

;*****Программа изучения преобразования BCD*********

; Производится динамическая индикация числа

; хранящегося в регистре R1(секунды)

; с предварительным преобразованием

; в двоично-десятичный формат в двух правых разрядах

; индикатора стенда HL2

; циклически с интервалом 1 сек значение регистра R1 увеличивается на 1

; по достижении числа 3Ch(60) регистр сбрасывается и счет начинается заново

; интервал 1 сек реализован с использованием прерывания от таймера Т1

; вектор переполнения 001Bh

; составил А. Н. Алаев

; ********************************************************

.ORG 0 ; установка указателя сч команд для ассемблера на 0

clr IE.7 ;глобальный запрет прерываний

mov TMOD,#00010001b ;запретить упр. Т0,T1 от вн. вывода, уст. Т0,T1

; в 16-ти разр режим с синхр. от внутр. генератора

mov TL1,#175 ;запись в мл. регистр Т1 начального условия

;мл. байт дополняющего кода числа 50000

mov TH1,#60 ;запись в ст. регистр Т1 начального условия

;ст. байт дополняющего кода числа 50000

setb tcon.6 ;запуск таймера Т1

ljmp ind ;безусловный переход на ПП индикации ind

;**********************************************************

.ORG 001Bh ; установка указателя сч. для ассемблера на вектор прерывания

; от переполнения таймера T1

ljmp schet ; безусловный перход на ПП обработки прерывания

;***************************************************************

ind: ; основная подпрограмма счета и динамической индикации

setb IE.3 ; разрешение прерываний по переполнению таймера Т1

ind1:

;**********************************************************

call preobr ; вызов подпрограммы преобразования в BCD формат

;************************************************************

clr IE.7 ; глобальный запрет прерываний

mov A,R3 ; пересылка в акк. индицируемого числа

anl A,#00001111b ;обнуление старшей тетрады (поготовка инд. младшей)

call decod ; вызов подпрограммы преобразования в семисегм. код

; мл тетрады

mov R2,A ; запоминание преобразованного результата в R2

mov DPTR,#8001h ; устанавливаем в DPTR адрес регистра сегм дин. индикатора

mov A,#00h ; обнуление акк.

movx @DPTR,A ; гашение всех сегментов

mov DPTR,#8002h ; устанавливаем в DPTR адреса регистра анодов дин. индикатора

mov A,#00000011b ; запись кода дешифр. включения крайнего правого разр. инд.

movx @DPTR,A ; включение крайнего правого разряда инд.

mov A,R2 ; пересылка семисегм. кода правой цифры

mov DPTR,#8001h ; устанавливаем в DPTR адрес регистра сегм дин. индикатора

movx @DPTR,A ; высвечивание крайней правой цифры

;****************************************************

call delay ; вызов подпрограммы задержки на 10 мс

;**********************************************************

mov A,R3 ; пересылка в акк. индицируемого числа

anl A,#11110000b ;обнуление младшей тетрады (поготовка инд. старшей)

swap A ;обмен тетрад аккумулятора

call decod ; вызов подпрограммы преобразования в семисегм код

; ст тетрады

mov R2,A ; запоминание преобразованного результата в R2

mov DPTR,#8001h ; устанавливаем в DPTR адрес регистра сегм дин. индикатора

mov A,#00h ; обнуление акк.

movx @DPTR,A ; гашение всех сегментов

mov DPTR,#8002h ; устанавливаем в DPTR адреса регистра анодов дин. индикатора

mov A,#00000010b ; запись кода дешифр. включения второго справа разр. инд.

movx @DPTR,A ; включение второго справа разряда инд.

mov A,R2 ; пересылка семисегм. кода левой цифры

mov DPTR,#8001h ; устанавливаем в DPTR адрес регистра сегм дин. индикатора

movx @DPTR,A ; высвечивание второго справа разр.

setb IE.7 ; разрешили прерывания от таймера после вывода на инд.

;************************************************************************

call delay ; вызов ПП задержки на 10 мс

;*************************************************************************

sjmp ind1 ; абсолютный переход на начало программы

;*************************************************************************

;ПОДПРОГРАММА ПРЕОБРАЗОВАНИЯ ЧИСЛА В СЕМИСЕГМЕНТНЫЙ КОД

;*************************************************************************

decod:

mov DPTR,#tablecod ; занесение в DPTR начального адреса массива таблицы ниже

movc A,@A+DPTR ; пересылка в акк. преобр. в семисегм. код числа

; ранее хранившегося в акк.

ret

;-------------------------------------------------------------------------

tablecod: ; формирование массива для преобразования двоичного кода

; в семисегментный

; PGFEDCBA -сегм.

db 00111111b ; 0h числа

db 00000110b ; 1h

db 01011011b ; 2h

db 01001111b ; 3h

db 01100110b ; 4h

db 01101101b ; 5h

db 01111101b ; 6h

db 00000111b ; 7h

db 01111111b ; 8h

db 01101111b ; 9h

db 01110111b ; Ah

db 01111100b ; Bh

db 00111001b ; Ch

db 01011110b ; Dh

db 01111001b ; Eh

db 01110001b ; Fh

;----------------------------------------------------------------

;****************************************************************

;**************************************************************

;ПОДПРОГРАММА ЗАДЕРЖКИ НА 10 мс

;****************************************************************

delay:

clr tcon.4 ; остановка таймера Т0

mov TL0,#239 ;запись в мл. регистр Т0 начального условия

;мл. байт дополняющего кода числа 10000

mov TH0,#216 ;запись в ст. регистр Т0 начального условия

;ст. байт дополняющего кода числа 10000

setb tcon.4 ; запуск счета таймера Т0

jnb TF0,$ ; ожидание переполнения счетчиков таймера Т0

; через 10 мс по флагу

clr TF0 ; сброс флага переполнения

clr tcon.4 ; останов таймера

ret

;********************************************************************

;****************************************************************

ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЙ

;******************************************************************

schet:

push DPH ; сохранение в стеке DPTR

push DPL

push PSW ; сохранение в стеке PSW

push ACC ; сохранение в стеке аккумулятора

clr tcon.6 ; остановка таймера Т1

clr IE.7 ; глобальный запрет прерываний

mov TL1,#175 ;запись в мл. регистр Т1 начального условия

;мл. байт дополняющего кода числа 50000

mov TH1,#60 ;запись в ст. регистр Т1 начального условия

;ст. байт дополняющего кода числа 50000

djnz R5,d1 ; анализ прохождения интервала 1 сек

; и переход если прошло 20 х50 мс циклов

mov R5,#20 ; запись множителя 20 для формирования интервала

; 20х50 мс после окончания очередного интервала

inc R1 ; увеличение на '1' содержимого рабочего регистра

cjne R1,#3Ch,d1 ; сравнение содержимого рабочего регистра с 60

; и переход на метку d1 если не равно

mov R1,#00h ; сброс рабочего регистра

d1: pop ACC ; пересылка из стека в аккумулятор

pop PSW ; пересылка из стека PSW

pop DPL ; DPTR

pop DPH

clr TF1 ; сброс флага прерываний от таймера Т1

setb tcon.6 ; запуск таймера Т1

setb IE.7 ;глобальное разрешение прерываний

reti

;*********************************************************************

;*********************************************************************

;Подпрограмма преобразования 8-ми разрядного двоичного кода в двоич-

;но десятичный (BCD) упакованный, в R3 записываются младшие разряды числа

; в R4 (младшую тетраду) - старший

preobr:

mov B,#100 ; заносим во вспомогательный регистр делитель

mov A,R1 ; заносим в акк. преобразуемое число

div AB ;делим преобр. число на 100

mov R4,A ;переписываем частное от деления (старший двоично десятин.

;разряд) в регистр R4 (код сотен)

mov A,B ;переписываем в акк. остаток от деления

mov B,#10 ;заносим во вспомогательный регистр делитель

div AB ;делим на 10, в результате в акк. в мл. тетраде хранится код десятков

;в ст. тетраде нули

; а в рег. В в мл. тетраде -код единиц

mov R0,B ; переписываем код единиц в регистр R0

swap A ; меняем местами ст. и мл. тетраду акк.

; в результате в ст. тетраде хранится код десятков

; в мл. записаны нули

xrl A,R0 ; логическое суммирование регистров

; в результате получили упакованный BCD в акк.

; - в ст. тетраде находится код десятков, а в мл.

; - код единиц

mov R3,A ; переписываем результат в регистр для индикации десятков и единиц

ret

end