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

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

В качестве примера ниже приведена программа, реализующая измеритель напряжения с использованием алгоритма аналого-цифрового преобразования по методу дифференциального кодирования с индикацией полученного результата на статических индикаторах стенда. Поскольку в стенде использован восьми разрядный ЦАП на который подано опорное напряжение 5,12 В, вес младшего значащего разряда составляет 5,12 / 256 = 0,02 В. Поэтому после выполнения аналого-цифрового преобразования, для получения достоверных результатов, полученный код перед выводом на индикаторы необходимо масштабировать результат: умножить на 0,02 В.

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

;*****Программа изучения аналого-цифрового преобразования *********

; Реализуется способ следящего АЦП

; с последующим преобразованием результата в BCD формат для

; вывода на индикацию на статич. индикаторах HG1.1, HG1.2, HG1.3

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

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

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

ADC: ; программа преобразования напряжения в 8-ми разр. дв. код

;результат преобразования в регистре R0

mov A,R0 ; переслать в акк. содерж. регистра преобр.

mov DPTR,#0F000h ; переслать в DPTR адрес ЦАПа

movx @DPTR,A ; переслать содержимое регистра преобр. в регистр ЦАПа

; т.е. произвести перобразование код-напряжение

call delay ; вызвать п-п задержки для ожидания окончания переходных

; процессов в ЦАПе

jnb P1.7, decr ; если сработал компаратор, подключенный выходом к порту

;Р1.7, а входами к ЦАП и преобр. напряжению переход к уменьш.

; на "1" содерж. в рег. R0

cjne A,#0FFh,i1 ; сравнение содерж. акк с FFh и переход если не равно

; (блокировка переполнения регистра)

sjmp i2 ;абсолютный переход на сегмент индикации без увеличения

; содержимого регистра

i1: inc A ; увеличение содержимого акк. на "1" т. к. компаратор

; не сработал

i2: mov R0,A ; пересылка акк. в регистр преобр.

sjmp ind ; абсолютный переход на сегмент индикации

decr:

cjne A,#000h,i3 ; сравнение содерж. акк. с 00h и переход если не равно

; (блокировка переполнения регистра)

sjmp i4 ; абсолютный переход на сегмент индикации без уменьшения

; содержимого регистра

i3: dec A ; уменьшение содержимого акк. на "1"

i4: mov R0,A ; пересылка акк. в регистр. преобр.

sjmp ind ; абсолютный переход на сегмент индикации

ind: ; сегмент индикации R1-упакованные единицы (ст. тетрада)

; и десятки, R2 - сотни ст. тетрада

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

; в упакованный BCD формат

mov A,#00100001b ; подготовка включения трех левых разр. стат. инд. и

; второй слева точки

mov DPTR,#0A004h ; адрес анодов и точек индикаторов в DPTR

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

mov A,R1 ; единицы и десятки в акк.

mov DPTR,#0B000h ; адрес двух правых инд. в DPTR

movx @DPTR,A ; высветить десятки и единицы

mov A,R2 ; сотни в акк.

mov DPTR,#0A000h ; адрес двух левых индикаторов в DPTR

movx @DPTR,A ; высветить сотни

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

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

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

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

delay:

mov R3,#200 ;* организация 200 машинных циклов

djnz R3,$ ;* переход на саму себя с уменьшением содержимого R3 на «1»

ret

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

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

;Подпрограмма умножения на 2 и преобразования 8-ми разрядного

; двоичного кода

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

; разряды

;числа в R2 (старшую тетраду) – старший

preobr:

mov A,R0 ; код АЦП в акк.

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

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

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

rl A ; умножаем на 2 код сотен

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

; разряд) в регистр R2 мл. тетрада (код сотен)

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

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

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

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

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

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

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

rl A ; умножение на 2 кода десятков

mov R4,A ; запоминание кода десятков во вспомогат. регистре R4

mov A,R1 ; пересылка в акк. кода единиц

rl A ; умножение на 2 кода единиц

mov B,#10 ;* формирование переноса в байт десятков, если число

;* превышает «9»

div AB ;* деление кода единиц на «10»

mov R1,B ;* пересылка остатка (фактический код единиц)

;* в регистр кода ед.

add A,R4 ; прибавление переноса к коду десятков

; (перенос содержится в акк.)

mov B,#10 ;* формирование переноса в байт сотен,

;* если код десятков превышает «9»

div AB ;* деление кода десятков на «10»

mov R4,B ;* запоминание фактического кода десятков во вспом. регистре

add A,R2 ; прибавление переноса к коду сотен

mov R2,A ; запоминание фактического кода сотен

mov A,R4 ; пересылка в акк. фактического кода десятков для упаковки

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

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

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

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

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

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

; - код единиц

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

; десятков и единиц

ret

end