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



Рис. 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 от заданной точности мы, все равно будем ее учитывать. Принцип работы подпрограммы ясен из блок-схемы.

Рис. 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

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



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