на тему рефераты Информационно-образоательный портал
Рефераты, курсовые, дипломы, научные работы,
на тему рефераты
на тему рефераты
МЕНЮ|
на тему рефераты
поиск
Устройство ультразвукового измерения дальности
p align="left">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



© 2003-2013
Рефераты бесплатно, курсовые, рефераты биология, большая бибилиотека рефератов, дипломы, научные работы, рефераты право, рефераты, рефераты скачать, рефераты литература, курсовые работы, реферат, доклады, рефераты медицина, рефераты на тему, сочинения, реферат бесплатно, рефераты авиация, рефераты психология, рефераты математика, рефераты кулинария, рефераты логистика, рефераты анатомия, рефераты маркетинг, рефераты релиния, рефераты социология, рефераты менеджемент.