$MOD812 ;присоединение модуля символов АDuC812
ADR EQU 5000H ;начальный адрес массива XRAM
LED EQU P3.4 ;биту P3.4 порта Р3 присваивается имя LED
CHAN EQU 0 ;номер входного канала АЦП = 0
RPL1 EQU 20H ;вспомогательная переменная
RPH1 EQU 21H ;вспомогательная переменная
VIB EQU 6 ;число выборок
;------------------------------------------------------------------------------------
;В программе используются следующие ячейки памяти:
;Ячейка 20Н используется макрокомандами PU и PO.
;Область XRAM (адреса 5000Н – 500ВН) используется для
;записи байтов выборок, читаемых из файла ADCdata.adc
;------------------------------------------------------------------------------------
;Определения макрокоманд
PU MACRO REG ;макрокоманда PU сохранения в стеке
MOV 20H,REG ;содержимого регистра
PUSH 20H
ENDM ;конец макроопределения
PO MACRO REG ;макрокоманда РО извлечения из стека
POP 20H ;содержимого регистра
MOV REG,20H
ENDM ;конец макроопределения
;------------------------------------------------------------------------------------
CSEG ;сегмент памяти программ
ORG 0000 ;начальный адрес сегмента 0000Н
JMP MAIN ;переход к главной программе
;------------------------------------------------------------------------------------
; Подпрограмма (ПП) обработки прерываний АЦП по адресу 0033Н.
;Управление сюда передается каждый раз после завершения очередного
;процесса преобразования Uвх АЦП. В ПП результаты преобразования АЦП
;выводятся во внешнее ОЗУ XRAM. В скобках указано число тактов выполнения
;каждой команды ПП обработки прерываний.
ORG 0033H
MOV A,ADCDATAL ;A = мл. байт результата преобразования АЦП (1)
MOVX @DPTR,A ;переслать результат преобразования в XRAM (2)
INC DPTR ;следующий адрес XRAM (2)
MOV A,ADCDATAH ;A = ст. 4 бита результата преобразования (1)
;АЦП (биты 3-0) и номер канала АЦП (биты 7-4)
MOVX @DPTR,A ;переслать результат преобразования в XRAM (2)
INC DPTR ;следующий адрес XRAM (2)
DJNZ R0,RTRN ;пока не сделаны все выборки, продолжить (2)
JMP SUM ;переход к вычислению среднего значения (2)
RTRN: RETI ;возврат из подпрограммы прерывания (2)
;------------------------------------------------------------------------------------
;Главная программа MAIN
ORG 004BH
MAIN: MOV DPTR,#ADR ;DPTR = начальный адрес массива в CSEG
MOV R0,#VIB ;R0 = начальное знач. счетчика числа выборок
;------------------------------------------------------------------------------------
;Установка конфигурации АЦП
;В регистре ADCCON1 задаются следующие режимы работы:
;Нормальный режим АЦП (биты 7,6 = 01).
;Коэффициент деления тактовой частоты АЦП = 4 (биты 5,4 =10).
;Число тактов задержки запуска АЦП = 1 (биты 3,2 = 00).
;Для запуска АЦП используется сигнал переполнения Т2 (бит 1 = 1).
;Внешний запуск АЦП по входу CONVST/ запрещен (бит 0 = 0).
MOV ADCCON1,#62h ;ADCCON1 = 62Н = 01100010
;В регистре ADCCON2 задаются следующие режимы работы:
;Режим ПДП запрещен (бит 6=0).
;Циклический (бит 5=0) и однократный (бит 4=0) запуски АЦП запрещены.
;Устанавливается 0-й канал преобразования (биты 3,2,1,0 = 0).
MOV ADCCON2,#CHAN ;ADCCON2 = 00Н - выбор канала и
;режима преобразования
;-------------------------------------------------------------------------------
;Инициализация таймера Т2
;Регистры перезагрузки RCAP2L и RCAP2Н, а также регистры TL2 и TН2 таймера 2
;загружаются начальными значениями для получения выдержки времени 1,665 мс = 1665 мкс.
;При загрузке Т2 числом FA01h период его перезагрузки равен расчетному значению ;выдержки времени 1665 мкс:
;Т2пер = (10000h-FA01h)*1.085 мкс = 05FF*1.085 мкс = 1535*1.085 мкс = 1665 мкс
MOV RCAP2L,#01h
MOV RCAP2H,#0FAh
MOV TL2,#01h
MOV TH2,#0FAh
;Разрешение прерываний и запуск Т2
SETB EA ;разрешить прерывания ADuC812
SETB EADC ;разрешить прерывания АЦП
SETB TR2 ;запуск Т2
;==============================================
;Фоновая программа
AGAIN: CPL LED ;инвертировать бит Р3.4
CALL DELAY ;задержка 100 мс
JMP AGAIN ;повторить цикл
;-------------------------------------------------------------------
;Вычисление суммы выборок Uвх
;Сумма находится в R3 (ст.байт) и R2 (мл. байт)
SUM: MOV DPTR,#ADR ;адрес первой выборки
MOV R0,#VIB ;число выборок
LCALL SUMMA
;--------------------------------------------------------------------
;Вычисление среднего значения Uвх за полупериод
;Среднее значение находится в R5 (ст.байт) и R4 (мл. байт)
;Остаток деления отбрасывается
MOV B,#VIB ;В = число выборок
LCALL DI1616
PU R4 ;сохранить значения R5 и R4 в
PU R5 ;стеке, используя макрокоманду РU
;-------------------------------------------------------------------
;Вычисление действующего значения Uвх
;Действующее значение находится в R7 и R6
MOV B,#10
MOV R7,5
MOV R6,4 ;сохранить ср. знач. в R7 и R6
MOV R3,5
MOV R2,4
LCALL DI1616 ;деление Uср/10
;Результат деления - в R5 и R4
;Сложение: Uд = Uср + 0,1*Uср = 1,1*Uср
MOV A,R6
ADD A,R4
MOV R6,A
MOV A,R7
ADDC A,R5
MOV R7,A ;R7, R6 - действующее значение
РО R5 ;восстановить из стека значения
РО R4 ;R5 и R4, используя макрокоманду РО
JMP $ ;останов программы
;==============================================
; Подпрограммы
;==============================================
;ПП SUMMA нахождения суммы выборок в ОЗУ
;Вход: DPTR = адрес начала выборок в ОЗУ
; R0 = число выборок
;Выход: R3 (ст. байт), R2 (мл. байт) суммы
;----------------------------------------------------------------
SUMMA: PUSH ACC
PUSH PSW
MOV R2,#0 ;мл. байт суммы
MOV R3,#0 ;ст. байт суммы
SM: MOVX A,@DPTR ;читать мл. байт
ADD A,R2
MOV R2,A ;R2=сумма мл. байтов
INC DPTR
MOVX A,@DPTR ;читать ст. байт
ANL A,#0FH ;выделить мл. тетраду байта
ADDC A,R3 ;сумма ст. байтов с учетом переносов
MOV R3,A ;R3=сумма ст. байтов
INC DPTR
DJNZ R0,SM
POP PSW
POP ACC
RET
;--------------------------------------------------------
;ПП DELAY, дающая задержку времени 100 мс
DELAY: MOV R7,#2
DLY1: MOV R6,#2
DJNZ R6,$ ;230*2.17 мкс = 500 мкс
DJNZ R7,DLY1 ;200*500 мкс = 100 мс
RET
;--------------------------------------------------------
;ПП DEDPTR декремента регистра DPTR
DEDPTR: PUSH ACC
PUSH PSW
MOV A,DPL
CLR C
SUBB A,#1
MOV DPL,A
MOV A,DPH
SUBB A,#0
MOV DPH,A
POP PSW
POP ACC
RET
;---------------------------------------------------
;ПП RP2 удвоения 16-разрядного слова
;Вход: RPL1-мл. байт
; RPH1-ст. байт
;Выход: RPL1-мл. байт
; RPH1-ст. байт
;-----------------------------------------------------
RP2: PUSH ACC
MOV A,RPL1
ADD A,RPL1
MOV RPL1,A
MOV A,RPH1
ADDC A,RPH1
MOV RPH1,A
POP ACC
RET
;------------------------------------------------------
;ПП DI1616 деления целых двоичных чисел без знака
;формата 16:8 = (16,8) и без проверки делителя на 0
;Вход: R3,R2 = делимое
; B = делитель
;Выход: R5,R4 = частное
; R3 = остаток
;При работе использует ПП RP2 и DEDPTR
;------------------------------------------------------
DI1616: PUSH ACC
PUSH PSW
PUSH 09
PUSH RPH1
PUSH RPL1
PUSH DPH
PUSH DPL
;Проверка случая "Делимое<делителя"
CJNE R3,#0,DI10
MOV A,R2
CLR C
SUBB A,B
JNC DI10
;Делимое<делителя
MOV R5,#0
MOV R4,#0
MOV 0BH,0AH ;R3<--(R2)
LJMP D7
DI10: MOV A,B
MOV R1,#8
CLR C
DI1: RLC A
INC R1
JNC DI1
RRC A
MOV B,A
DEC R1
MOV A,R1
SUBB A,#8
PUSH ACC
PUSH PSW
DI2: CLR A
CLR C
ADD A,R3
JB ACC.7,DI11
;Удвоение (R3,R2)
MOV RPH1,R3
MOV RPL1,R2
LCALL RP2
MOV R3,RPH1
MOV R2,RPL1
DEC R1
SJMP DI2
DI11: MOV R5,#0
MOV R4,#0
CLR C
SUBB A,B
MOV DPH,R5
MOV DPL,R4
INC DPTR
MOV R5,DPH
MOV R4,DPL
JNC D3I
MOV DPH,R5
MOV DPL,R4
LCALL DEDPTR
MOV R5,DPH
MOV R4,DPL
ADD A,B
D3I: MOV R3,A
CLR A
CLR C
ADD A,R1
JZ KOH
DI:
MOV RPH1,R5
MOV RPL1,R4
LCALL RP2
MOV R5,RPH1
MOV R4,RPL1
MOV RPH1,R3
MOV RPL1,R2
LCALL RP2
MOV R3,RPH1
MOV R2,RPL1
MOV A,R3
JC D4
CLR C
SUBB A,B
JNC D5I
ADD A,B
MOV R3,A
SJMP D6
D4: CLR C
SUBB A,B
D5I: MOV R3,A
MOV DPH,R5
MOV DPL,R4
INC DPTR
MOV R5,DPH
MOV R4,DPL
D6: DJNZ R1,DI
KOH: POP PSW
POP ACC
JZ D7
MOV B,A
CLR A
CLR C
ADD A,R3
DI3: RRC A
DJNZ B,DI3
MOV R3,A
D7: POP DPL
POP DPH
POP RPL1
POP RPH1
POP 09
POP PSW
POP ACC
RET
;-------------------------------------------------------------
END