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

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

Блок-схема данной подпрограммы представлена на рис. 13. Т.к. переход в подпрограмму осуществляется при наличии сигнала на линии RA1 порта А микроконтроллера, то сначала дожидаемся окончания сигнала. Затем производим тестирование отсутствия сигнала на протяжении определенного времени, если до истечения данного промежутка времени сигнал появился, то делаем вывод, что принят не наш сигнал и выходим из подпрограммы и продолжаем ожидание правильного сигнала в подпрограмме waiting. После этого производим тестирование наличия сигнала на протяжении определенного времени, если до истечения данного промежутка времени сигнал пропал, то делаем вывод, что принят не наш сигнал и выходим из подпрограммы и продолжаем ожидание правильного сигнала в подпрограмме waiting. Если же в течение определенного времени сигнала не было, а затем в течении определенного времени сигнал был, то делаем вывод, что был успешно произведен прием одного импульса нашего сигнала, уменьшаем счетчик принятых импульсов на 1 и возвращаемся на метку recp6 рассматриваемой подпрограммы и производим все действия по приему импульса сигнала еще раз. Прием импульсов проводится до тех пор пока счетчик импульсов NUMIMP не станет равен нулю, и мы можем считать, что приняли три импульса нашего сигнала. После этого переходим в подпрограмму calculation. Работа подпрограммы более понятна из приведенной блок-схемы.

2

Рис. 13. Блок-схема подпрограммы reception.

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

Данный блок соответствует приведенной ниже части программы.

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

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 ;возврат из подпрограммы

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

Блок-схема данной подпрограммы представлена на рис. 14. Поясним некоторые моменты. Принимая скорость звука равной 331,4 м/с, имеем 331,4*1000/1000000 мм/мкс или 0,3314 мм/мкс. Т.к. по условию задания точность измерений составляет 0,1 м, а измеренное нами время составляет двойную величину, то логично вести подсчет промежутками времени за которое ультразвук проходит 0,2 м. Т.е. 200/0,3314=603,5=(600+3,5) мкс. Каждые 600 мкс у нас накапливается погрешность в 3,5 мкс. 57*3,5=199,5?200. Т.е. каждый промежуток времени 57*600 мкс у нас возникает погрешность в 200 мкс. Хотя она и составляет 1/3 от заданной точности мы, все равно будем ее учитывать. Принцип работы подпрограммы ясен из блок-схемы.

2

Рис. 14. Блок-схема подпрограммы calculation. Заключение

В процессе выполнения курсового проекта, было спроектировано устройство ультразвукового измерения дальности. В пояснительной записке представлено подробное описание схемы устройства, описание программного обеспечения.

В приложении представлена принципиальная схема разработанного устройства и приведен листинг программы.

В ходе выполнения курсового проекта были решены следующие задачи:

· синтез и разработка принципиальной схемы устройства;

· разработка программного обеспечения;

· разработка конструкторской документации проекта (пояснительная записка).

Библиографический список

1. В. С. Яценков «Микроконтроллеры Microchip. Практическое руководство».

2. Документация к контроллерам фирмы Microchip.

Приложения

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

программа для ультразвукового дальномера

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

список директив

list P=16C84 ;директива определяющая тип процессора

#include <P16C84.INC> ;файл, описывающий специфические переменные, соответствующие процессору

_config b'00000000000001' ;слово конфигурации CPU

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

описание используемых переменных (назначение адресов ячеекдля хранения переменных)

NUMIMP equ 0x0C ;рабочая переменная для подсчета числа импульсов

TIMER1 equ 0x0D ;рабочая переменная для подсчета времени 1

TIMER2 equ 0x0E ;рабочая переменная для подсчета времени 2

LAPSE equ 0x0F ;рабочая переменная для подсчетапогрешности перевода времени

DIGIT1 equ 0x10 ;рабочая переменная индикатора дециметров

DIGIT2 equ 0x11 ;рабочая переменная индикатора метров

DIGIT3 equ 0x12 ;рабочая переменная индикатора декаметров

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

исполняемая программа

org 0х000 ;вектор сброса процессора, начальный адрес

clrf PORTA ;очистили выходные защелки порта А

clrf PORTB ;и порта В

clrf TMR0 ;очистка таймера TMR0

bsf STATUS, RP0 ;включили банк 1

movlw b'00011110' ;настроили на вывод линию RA0,

movwf PORTA ;остальные линии порта A на ввод

movlw b'00000000' ;настроили на вывод все линии порта B

movwf PORTB ;RB0…RB7

bcf OPTION_REG, 7 ;включили подтягивающие резисторы

bcf OPTION_REG, 5 ;включили режим таймера для TMR0

bcf STATUS, RP0 ;включили банк 0

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

main ;основная программа

call initialization ;вызываем подпрограмму инициализации

main1 call indication ;вызываем подпрограмму индикации

goto pressing ;вызываем подпрограмму обработки нажатия кнопки

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

main3 goto waiting ;вызываем подпрограмму ожидания отраженного сигнала

main4 goto reception ;вызываем подпрограмму приема отраженного сигнала

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

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

initialization ;подпрограмма инициализации и начальных условий

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

clrf PORTA ;очистили выходные защелки порта A

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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