birmaga.ru
добавить свой файл

1
;Аналого-цифровое преобразование методом последовательных приближений

begin:


mov R5,#8 ; счетчик цикла

mov R4,#1 ; бегущая единица

mov R3,#0 ; искомая цифровая величина

loop:


mov ACC,R4

rr A ; Сдвиг вправо на 1 бит

mov R4,A

orl A,R3 ; взвешивание текущего результата

mov P1, ACC

jb P2.0, OK ; Если бит установлен, то результат больше, чем необходимо

mov R3,A ; иначе результат меньше и его нужно сохранить

OK: djnz R5, loop

END;
;Аналого-цифровое преобразование методом последовательного счета

begin:


mov R3,#0 ; искомая цифровая величина

loop:


inc R3 ; Последовательно увеличивается число, Uцап тоже увеличивается

mov P1, R3

jnb P2.0, loop

END;
;Аналого-цифровое преобразование следящего типа

begin:

mov R3,#10 ; искомая цифровая величина



loop:

jb P2.0, decr

inc R3 ; увеличивается число, Uцап тоже увеличивается

mov P1, R3

jmp loop

decr:


dec R3 ; c уменьшением R3 уменьшается Uцап

mov P1, R3

jmp loop

END;
;Аналого-цифровое преобразование методом двойного интегрирования

begin:

mov TH0,#0



mov TL0,#0

mov TMOD,#9h ; Установка бита GATE, режим работы 16 разрядный счетчик

setb P1.0 ; подача опорного напряжения

C1: jb P3.2, C1 ; Ждем отрицательного уровня

clr P1.0 ; подача Uвх

setb TCON.4 ; Запуск таймера 0

C2: jnb TCON.5, C2 ; Ждем пока пройдет интервал времени Т1 (переполнится таймер)

setb P1.0 ; подача опорного напряжения, начало обратного интегрирования

C3: jb P3.2, C3 ; Ожидание момента T2

clr TCON.4 ; Останов таймера 0

clr TCON.5 ; сброс флага TF0

mov B, TH0

mov ACC,TL0 ;Сохранение результата преобразования

END;


; Программа счетчик импульсов

DSEG

counter EQU 30h

CSEG


org 200

clr P1.1


mov counter,#0h

C1: jnb P1.1, C1

inc counter

mov A, counter

jnz C2

inc (counter+1)



C2: jb P1.1, C2

jmp C1


END;
Программа измерения частоты импульсов считает число импульсов, пришедшее за 65535 мкс

DSEG


counter EQU 30h

CSEG


org 200

mov TMOD, #10101B ; 16 разрядный таймер Т1, 16 разрядный счетчик Т0 от внешнего сигнала

mov TH0, #0 ; Обнуление регистров T/C1 и T/C0

mov TL0,#0

mov TL1,#0

mov TH1,#0

setb TCON.4 ; Запуск обоих Т/С

setb TCON.6 ;

C1: jnb TCON.7 ,C1 ; Пока не переполнится таймер Т1

clr TF1


mov A,TH0

rrc A


mov (counter+1), A

mov A,TL0

rrc A

mov counter, A



END;
Программа генерации последовательности импульсов формирует сигналы на P1.0

DSEG


counter EQU 40 ; обозначает начало массива

CSEG


begin:

mov R4,#4

mov counter,#2Fh

mov (counter+1),#70h

mov (counter+2),#30h

mov (counter+3),#0F0h

mov (counter+4),#5Fh

org 200


loop:

lcall impulse

djnz R4, loop

jmp begin

impulse:

push ACC


push PSW

mov A, #counter

add A, R4

mov R0, A

mov A,@R0

mov R3,A


setb P1.0

C1: djnz R3,C1

clr P1.0

pop PSW


pop ACC

ret


END;
/*Подсчет числа импульсов*/

#include "reg52.h"

long COUNTER;

void timer0 (void) interrupt 0 using 2

{

COUNTER++;



P3|=0x4; //Воздействие на источник прерывания

// IE0=0;

}

int main(void)



{

int i,j;


TL0=0;

TH0=0;

TMOD =5; //Устанавливается флаг С/Т0=1 - работа счетчика от внешних сигналов. М0=1, М1=0 режим работы - 16 разрядный счетчик

IT0=0; //Тип прерывания: уровень

EA =1; //Разрешение всех разрешенных прерываний

EX0=1; //Разрешение прерывания от таймера 0 прерывания

TR0=1; //запуск таймера

COUNTER =0;

while(1)

{

;


}

return 0;

}
/*Измерение длительности импульсов*/

#include "reg52.h"

int counter =0; //длительность импульсов

void timer0 (void) interrupt 0 using 2

{

counter = TH0*256+TL0;



TH0=0;

TL0=0;


}

int main(void)

{

int i,j;


P3=0x0;

TL0=0;


TH0=0;

TMOD =0x9; //Устанавливается флаг GATE =1 для измерения длительности импульса; М0=1, М1=0 режим работы - 16 разрядный таймер

IT0=1; //Тип прерывания: срез

EA =1; //Разрешение всех разрешенных прерываний

EX0=1; //Разрешение прерывания от таймера 0

TR0=1; //запуск таймера

while(1)

{

}



return 0;

}
/*Измерение периода следования импульсов*/

#include "reg52.h"

int counter =0; //период

void timer0 (void) interrupt 0 using 2

{

TR0=0; //Остановка таймера



counter = TH0*256+TL0;

TH0=0;


TL0=0;

TR0=1;//Запуск

}

int main(void)



{

TL0=0;


TH0=0;

TMOD =0x1; // М0=1, М1=0 режим работы - 16 разрядный таймер

IT0=1; //Тип прерывания: срез

EA =1; //Разрешение всех разрешенных прерываний

EX0=1; //Разрешение прерывания от таймера 0

while(!INT0) //Пока нет 0 таймер остановлен

;

while(1)


{

}

return 0;



}
/*Измерение разности фаз*/

#include "reg51f.h" // Регистры процессора 80C51FA

int counter1 =0; // хранится длительность сигнала, приходящийся на 0 модуль PCA

int counter0 =0; // хранится длительность сигнала, приходящийся на 1 модуль PCA

int result =0; //результат

bit m1 =0;

bit m0 =0;

void pca(void) interrupt 6 using 2

{

if(CCF0) //если произошло прерывание в 0 модуле PCA

if(m0) //если это конец фазы

{

counter0 = 256*CCAP0H + CCAP0L - counter0;



m0=0;

CCF0=0;


}

else // если начало фазы

{

counter0 = 256*CCAP0H + CCAP0L;



m0=1; CCF0=0;

}

if(CCF1)



if(m1)

{

counter1 = 256*CCAP1H + CCAP1L - counter1;



m1=0;

CCF1=0;


}

else


{

counter1 = 256*CCAP1H + CCAP1L;

m1=1;

CCF1=0;


}

if((!m0)&&(!m1))

if(counter1>=counter0)

{

result = counter1-counter0;



}

else


{ result = counter0-counter1; }

}

int main(void)



{

CL=0;


CH=0;

CMOD =0x3; // Частота работы PCA Ф/4

/*Настройка модулей PCA массива - захват по спаду на CEXn*/

CCAPM0 = 0x11;

CCAPM1= 0x11;

EA =1; //Разрешение всех разрешенных прерываний

EC=1; //Разрешение прерывания от PCA

CR = 1; //Запуск таймера PCA массива

while(1)

{

}



return 0;

}
/*ШИМ*/

#include "reg51f.h" // Регистры процессора 80C51FA

int main(void)

{

CL=0;


CH=0;

CMOD =0x3; // Частота работы PCA Ф/4

/*Настройка модуля PCA массива - ШИМ. Величина скважности в CCAP0L*/

CCAP0H = 0x7D; // Значение из этого регистра перезагружается в CCAP0L

CCAP0L = 0x7D;

CCAPM0 = 0x42;

CR = 1; //Запуск таймера PCA массива

while(1)


{

}

return 0;



}
Программа ЧИМ для микропроцессора КР580

FF ;Длина периода

8001 begin:

mvi A, #0h

out FB ; Настройка ППИ: режим работы асинхронный вывод

MainLoop: lda 0080 ; Загрузка в аккумулятор значения из памяти

stc ;

cmc ; Очистка флага Carry


ral ; Циклический сдвиг вправо

mov C, A ; половина периода - длина импульса

push C ; cохранение регистра С

mvi A,#1 ;

out F9 ; Посылает 1 на регистр B ППИ

Loop1: dcr C

jnz Loop1 ; Формируется импульс

mvi A,#0


out F9

pop C


Loop2: dcr C ; Формируется скважность

jnz Loop2

jmp MainLoop

Программа ШИМ для микропроцессора КР580

70 ;Длина скважности

8001 begin:

mvi A, #0h

out FB ; Настройка ППИ: режим работы асинхронный вывод

MainLoop: lda 0080 ; Загрузка в аккумулятор значения из памяти

mov C, A ; длина скважности

push C ; cохранение регистра С

xri #FF ; вычисление длины импульса

mov C,A ; пересылка длины импульса в С

mvi A,#1

out F9 ; Посылает 1 на регистр B ППИ

Loop1: dcr C

jnz Loop1 ; Формируется импульс

mvi A,#0

out F9


pop C ; Восстановление длины скважности

Loop2: dcr C ; Формируется скважность



jnz Loop2

jmp MainLoop