Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Пример выполнения работы. В качестве примера ниже приведена программа, реализующая секундомер на таймере TC1

Режим 3 | Использование таймера в качестве частотомера. | Перевести таймер T0 в шестнадцатиразрядный режим ; | Пример выполнения работы | Краткие теоретические сведения | Регистр приоритетов прерываний | Начальные адреса прерываний | Краткие теоретические сведения | Структура регистра IE | Адреса векторов прерывания |


Читайте также:
  1. Fill in the missing numerals in the following sentences as in the example given for the first sentence. (Вставьте пропущенное имя числительное как в примере.)
  2. Gt; Часть ежегодно потребляемого основного напитала не должна ежегодно воз­мещаться в натуре. Например, Vu стойкости машины в течение года перенесена на
  3. I. ЗАДАНИЯ ДЛЯ АУДИТОРНОЙ РАБОТЫ
  4. I. Итоговая государственная аттестация включает защиту бакалаврской выпускной квалификационной работы
  5. I. Цель работы
  6. I. Цель работы
  7. I. Цель работы

В качестве примера ниже приведена программа, реализующая секундомер на таймере 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


Дата добавления: 2015-07-20; просмотров: 42 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Регистр приоритетов прерываний| Краткие теоретические сведения

mybiblioteka.su - 2015-2024 год. (0.013 сек.)