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
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;
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
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 |