Читайте также:
|
|
В качестве примера ниже приведена программа, реализующая измеритель напряжения с использованием алгоритма аналого-цифрового преобразования по методу дифференциального кодирования с индикацией полученного результата на статических индикаторах стенда. Поскольку в стенде использован восьми разрядный ЦАП на который подано опорное напряжение 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, в результате в акк.
; в мл. тетраде хранится код десятков
; в ст. тетраде нули
; а в рег. В в мл. тетраде –код единиц
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
Дата добавления: 2015-07-20; просмотров: 44 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
К- аналоговый компаратор, РС- реверсивный счетчик, ГТИ- генератор тактовых импульсов, ЦАП- цифро-аналоговый преобразователь. | | | ГРУЗОВЫЕ ПЕРЕВОЗКИ |