Рефераты. Устройство ультразвукового измерения дальности

устанавливаем значения используемых переменных

movlw         d'5'    ;помещаем значение "5" для NUMIMP в аккумулятор

movwf        NUMIMP    ;помещаем значение из аккумулятора в NUMIMP

movlw         d'100' ;помещаем значение "100" для TIMER1 в аккумулятор

movwf        TIMER1     ;помещаем значение из аккумулятора в TIMER1

movlw         d'100' ;помещаем значение "100" для TIMER2 в аккумулятор

movwf        TIMER2     ;помещаем значение из аккумулятора в TIMER2

movlw         d'57'  ;помещаем значение "57" для LAPSE в аккумулятор

movwf        LAPSE       ;помещаем значение из аккумулятора в LAPSE

return          ;возврат из подпрограммы

;==============================================================

indication    ;подпрограмма индикации измеренного расстояния

;-----------------------------------------------------устанавливаем биты подключения индикаторов

bsf              IGIT1, 6      ;устанавливаем бит 6 переменной DIGIT1 в 1

bsf     DIGIT2, 7   ;устанавливаем бит 7 (точка) переменной DIGIT2 в 1

bsf     DIGIT2, 5   ;устанавливаем бит 5 переменной DIGIT2 в 1

bsf     DIGIT3, 4   ;устанавливаем бит 4 переменной DIGIT3 в 1

;-----------------------------------------------------выводим значение DIGIT1 на индикатор

movf  DIGIT1, 0   ;помещаем значение переменной DIGIT1 в аккумулятор

movwf        PORTB      ;выводим значение в порт В

устанавливаем задержку отображения

clrf    TMR0         обнуляем таймер и

bcf    INTCON, TOIF   ;устанавливаем в 0 флаг прерывания по его переполнению

indc1 btfss  INTCON, TOIF   ;проверяем флаг прерывания по переполнению таймера

goto   indc1 если флаг равен 0 (счетчик не переполнен)-выполняем проверку если флаг равен 1 (счетчик переполнен) - переходим к следующему индикатору

;-----------------------------------------------------выводим значение DIGIT2 на индикатор

movf  DIGIT2, 0   ;помещаем значение переменной DIGIT1 в аккумулятор

movwf        PORTB      ;выводим значение в порт В

устанавливаем задержку отображения

clrf    TMR0         ;обнуляем таймер и

bcf    INTCON, TOIF   ;устанавливаем в 0 флаг прерывания по его переполнению

indc2 btfss  INTCON, TOIF   ;проверяем флаг прерывания по переполнению таймера

goto   indc2 если флаг равен 0 (счетчик не переполнен)-выполняем проверку если флаг равен 1 (счетчик переполнен) - переходим к следующему индикатору

;-----------------------------------------------------выводим значение DIGIT3 на индикатор

movf           DIGIT3, 0   ;помещаем значение переменной DIGIT3 в аккумулятор

movwf        PORTB      ;выводим значение в порт В

;устанавливаем задержку отображения

clrf    TMR0         ;обнуляем таймер и

bcf    INTCON, TOIF   ;устанавливаем в 0 флаг прерывания по его переполнению

indc3 btfss           NTCON, TOIF     ;проверяем флаг прерывания по переполнению таймера

goto   indc3 ;если флаг равен 0 (счетчик не переполнен)-выполняем проверку если флаг равен 1 (счетчик переполнен)-

;---------------------------------------------------------------------------------------------------------

return          ;возврат из подпрограммы

;==============================================================

pressing      ;подпрограмма обработки нажатия кнопки

btfss  PORTA, 2  ;проверяем линию RA2 порта А (кнопку s2),

goto   main1          ;если не нажата возвращаемся в программу (на indication)

goto   main2          ;если нажата-возврат из подпрограммы

;==============================================================

transfer        ;подпрограмма передачи импульсов

;---------------------------------------------------------------------------------------------------------

movlw         d'5'    ;помещаем значение "5" для NUMIMP в аккумулятор

movwf        NUMIMP    ;помещаем значение из аккумулятора в NUMIMP

;-----------------------------------------------------передача сигнала

tran1  bsf     PORTA, 0  ;устанавливаем в 1 линию RA0 порта А

movlw         d'249' ;помещаем значение "249" для таймера в аккумулятор

movwf        TMR0         ;помещаем значение из аккумулятора в таймер

bcf    INTCON, TOIF   ;устанавливаем в 0 флаг прерывания по переполнению таймера

tran2  btfss  INTCON, TOIF   ;проверяем флаг прерывания по переполнению таймера

goto   tran2  ;если флаг равен 0 (счетчик не переполнен)-выполняем проверку

если флаг равен 1 (счетчик переполнен)-

;-----------------------------------------------------задержка сигнала

bcf    PORTA, 0  ;устанавливаем в 0 линию RA0 порта А

movlw         d'251'          ;помещаем значение "251" для таймера в аккумулятор

movwf        TMR0         ;помещаем значение из аккумулятора в таймер

bcf    INTCON, TOIF   ;устанавливаем в 0 флаг прерывания по переполнению таймера

tran3  btfss  INTCON, TOIF   ;проверяем флаг прерывания по переполнению таймера

goto   tran3  ;если флаг равен 0 (счетчик не переполнен)-выполняем проверку

если флаг равен 1 (счетчик переполнен)-

;-----------------------------------------------------считаем импульсы

decfsz         NUMIMP, 1         ;уменьшаем зачение NUMIMP на "1"если NUMIMP не равен "0" (передано<5импульсов)-

goto   tran1  ;переходим в начало подпрограммы на tran1 если NUMIMP равен "0"

;-----------------------------------------------------(передано 5 импульсов)-

movlw         d'3'    ;помещаем значение "3" для NUMIMP в аккумулятор

movwf        NUMIMP    ;помещаем значение из аккумулятора в NUMIMP

;---------------------------------------------------------------------------------------------------------

return          ;возврат из подпрограммы

;==============================================================

waiting        ;подпрограмма ожидания отраженного сигнала

;-----------------------------------------------------задержка начала приема сигнала

movlw         d'151' ;помещаем значение "151" для таймера в аккумулятор

movwf        TMR0         ;помещаем значение из аккумулятора в таймер

bcf    INTCON, TOIF   ;устанавливаем в 0 флаг прерывания по переполнению таймера

wait1  btfss  INTCON, TOIF   ;проверяем флаг прерывания по переполнению таймера

goto   wait1  если флаг равен 0 (счетчик не переполнен)-выполняем проверку

если флаг равен 1 (счетчик переполнен)-

;-----------------------------------------------------начинаем счет времени

ожидание приема (по 100 мкс)

wait3  movlw         d'161' ;помещаем значение "161" для таймера в аккумулятор

movwf        TMR0         ;помещаем значение из аккумулятора в таймер

bcf    INTCON, TOIF   ;устанавливаем в 0 флаг прерывания по переполнению таймера

wait2  btfsc  PORTA, 1  ;проверяем наличие сигнала на линии RA1 порта А

goto   wait4  ;если сигнал есть-переходим на метку wait4

если сигнала нет-продолжаем счет времени

btfss  INTCON, TOIF   ;проверяем флаг прерывания по переполнению таймера

goto   wait2  если флаг равен 0 (счетчик не

;-----------------------------------------------------переполнен)-выполняем проверку

decfsz         TIMER1, 1  ;если флаг равен 1 (счетчик переполнен)-уменьшаем TIMER1 на 1

goto   wait3  ;если TIMER1 не равен "0"

;-----------------------------------------------------продолжаем ожидание если TIMER1 равен "0"-

movlw         d'100'          ;помещаем значение "100" для TIMER1 в аккумулятор

movwf        TIMER1     ;помещаем значение из аккумулятора в TIMER1

decfsz         TIMER2, 1  ;уменьшаем значение TIMER2 на 1

goto   wait3  ;если TIMER2 не равен "0"

;-----------------------------------------------------продолжаем ожидание

если TIMER2 равен "0" (сигнал уже не вернется)-заполняем ;значения DIGIT1..3

movlw         d'9'    ;помещаем значение "9" для переменной DIGIT1 в аккумулятор

movwf        DIGIT1       ;помещаем значение из аккумулятора в DIGIT1

movlw         d'9'    ;помещаем значение "9" для переменной DIGIT2 в аккумулятор

movwf        DIGIT2       ;помещаем значение из аккумулятора в DIGIT2

movlw         d'9'    ;помещаем значение "9" для переменной ;DIGIT3 в аккумулятор

movwf        DIGIT3       ;помещаем значение из аккумулятора в DIGIT3

;---------------------------------------------------------------------------------------------------------

goto   main1          ;возврат из подпрограммы (сигнала нет)

wait4  goto   main4          ;возврат из подпрограммы (сигнал есть)

;==============================================================

reception     ;подпрограмма приема отраженного сигнала

;---------------------------------------------------------------------------------------------------------

ожидание окончания сигнала

recp1 btfsс  PORTA, 1  ;проверяем наличие сигнала на линии RA1 порта А

goto   recp1 ;если сигнала есть-продолжаем ожидание

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

recp6          movlw         d'251'          ;помещаем значение "251" для таймера в аккумулятор

movwf        TMR0         ;помещаем значение из аккумулятора в таймер

bcf    INTCON, TOIF   ;устанавливаем в 0 флаг прерывания по переполнению таймера

recp1 btfss  INTCON, TOIF   ;проверяем флаг переполнения таймера

если таймер не переполнен-

btfsc  PORTA, 1  ;проверяем отсутствие сигнала на линииRA1 порта А

если таймер переполнен или есть

goto   recp2          ;сигнал-идем на метку recp2

;если таймер не переполнен и нет  

goto   recp1 ;сигнала-идем на метку recp1

;-----------------------------------------------------проверяем флаг переполнения таймера

recp2 btfss  INTCON, TOIF   ;если таймер не переполнен-

goto   recp3 ;сигнал не наш-идем на метку recp3

;---------------------------------------------------------------------------------------------------------    

movlw         d'252' ;помещаем значение "252" для таймера в аккумулятор

movwf        TMR0         помещаем значение из аккумулятора в таймер

bcf    INTCON, TOIF   ;устанавливаем в 0 флаг прерывания по переполнению таймера

recp4 btfss  INTCON, TOIF   ;проверяем флаг переполнения таймера если таймер не переполнен-

btfss  PORTA, 1  ;проверяем наличие сигнала на линии RA1 порта А

если таймер переполнен или нет

goto   recp5 ;сигнала-идем на метку recp5

;если таймер не переполнен и есть

goto   recp4 ;сигнал-идем на метку recp4

;-----------------------------------------------------проверяем флаг переполнения таймера

recp5 btfss           INTCON, TOIF   ;если таймер не переполнен-

goto   recp3          сигнал не наш-идем на метку recp3

;---------------------------------------------------------------------------------------------------------    

decfsz         NUMIMP, 1         ;уменьшаем значение NUMIMP на "1"

goto   recp6 ;если NUMIMP не равен "0"-продолжаем проверку

goto   main5          ;если NUMIMP равен "0"-возврат из подпрограммы

recp3 goto   main3          ;продолжение ожидания сигнала

;==============================================================

calculation   ;подпрограмма вычисления расстояния

;инвертируем значения TIMER1 и

;-----------------------------------------------------TIMER2

movf  TIMER1,0   ;записываем значение переменной TIMER1 в аккумулятор

clrf    TIMER1     ;обнуляем значение TIMER1

sublw          d'100'          ;из числа 100 вычитаем значение аккумулятора

movwf        TIMER1     ;записываем полученное значение в переменную TIMER1

movf  TIMER2,0   ;записываем значение переменной TIMER2 в аккумулятор

clrf    TIMER2     ;обнуляем значение TIMER2

sublw d'100' ;из числа 100 вычитаем значение аккумулятора

movwf        TIMER2     ;записываем полученное значение в переменную TIMER2

;-----------------------------------------------------устанавливаем значения для LAPSE и DIGIT1..3

clrf    LAPSE       ;обнуляем значение LAPSE

movlw         d'57'  ;записываем в аккумулятор значение "57"

movwf        LAPSE       ;записываем значение аккумулятора в переменную LAPSE

clrf    DIGIT1       обнуляем значение DIGIT1

clrf    DIGIT2       ;обнуляем значение DIGIT2

clrf    DIGIT3       ;обнуляем значение DIGIT3

;-----------------------------------------------------записываем в аккумулятор вычитаемое

calc3           movlw         d'6'    ;"6"

subwf                   TIMER1, 1  ;вычитаем из переменной TIMER1 значение аккумулятора

проверяем флаги регистра STATUS

btfss  STATUS, C                   ;флаг Z-нулевого результата

btfsc  STATUS, Z                   ;и флаг C-переноса

goto   calc4  ;если флаги Z и C не равны 0

goto   calc1  ;если Z=0 и C=0 значит результат отрицательный

;-----------------------------------------------------меняем значения DIGIT1…3 и LAPSE

calc4           incf    DIGIT1, 1   ;увеличиваем переменную DIGIT1 на "1"

movlw         d'10'  ;записываем в аккумулятор значение "10"

subwf                   DIGIT1, 0            ;вычитаем значение аккумулятора из переменной DIGIT1

btfss  STATUS, Z                   ;проверяем результат на "0"

goto   calc2  ;если результат не "0" идем на метку

;-----------------------------------------------------calc2

decf   DIGIT1, 1   ;если результат равен "0" уменьшаем переменную DIGIT1 на "1"

incf    DIGIT2, 1   ;увеличиваем переменную DIGIT2 на "1" (переносим разряд)

movlw         d'10'  ;записываем в аккумулятор значение "10"

subwf                   DIGIT2, 0   ;вычитаем значение аккумулятора из переменной DIGIT2

btfss  STATUS, Z                   ;проверяем результат на "0"

goto   calc2  ;если результат не "0" идем на метку

;-----------------------------------------------------calc2

decf   DIGIT2, 1   ;если результат равен "0" уменьшаем переменную DIGIT2 на "1"

incf    DIGIT3, 1   ;увеличиваем переменную DIGIT3 на "1" (переносим разряд)

movlw         d'10'  ;записываем в аккумулятор значение "10"

subwf                   DIGIT3, 0   ;вычитаем значение аккумулятора из переменной DIGIT3

btfss  STATUS, Z                   ;проверяем результат на "0"

goto   calc2  ;если результат не "0" идем на метку calc2

decf            DIGIT3, 1   ;если результат равен "0" уменьшаем переменную DIGIT3 на "1"

goto            calc5  выходим из подпрограммы т.к. достигнуто значение 99,9

;-----------------------------------------------------корректируем погрешность перевода

calc2  decfz           LAPSE, 1    ;уменьшаем значение LAPSE на 1

goto   calc3  ;если переменная LAPSE не равна "0"-идем на метку calc3

movlw         d'57'  ;записываем в аккумулятор значение "57"

movwf        LAPSE       ;записываем значение аккумулятора в переменную LAPSE

movlw         d'2'    ;записываем в аккумулятор значение "2"

addwf                   TIMER1, 1  ;прибавляем к переменной TIMER1 значение аккумулятора

goto   calc3  ;идем на метку calc3

;-----------------------------------------------------корректируем переменные TIMER1 и TIMER2

calc1  addwf                   TIMER1, 1  ;прибавляем к переменной TIMER1 значение аккумулятора

movlw         d'100' записываем в аккумулятор значение "100"

addwf                   TIMER1, 1  ;прибавляем к переменной TIMER1 значение аккумулятора

decf   TIMER2     уменьшаем значение переменной TIMER2 на "1"

проверяем флаги регистра STATUS

btfss  STATUS, C                   ;флаг C-переноса

btfsc  STATUS, Z                   ;и флаг       Z-нулевого результата

goto   calc4  ;если результат не отрицательный-;продолжаем

если Z=0 и C=0 значит результат отрицательный-

;---------------------------------------------------------------------------------------------------------calc5         return          возврат из подпрограммы

;==============================================================

end

;==============================================================


Страницы: 1, 2, 3, 4, 5, 6



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.