Рис. 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
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" (переносим разряд)
subwf DIGIT2, 0 ;вычитаем значение аккумулятора из переменной DIGIT2
goto calc2 ;если результат не "0" идем на метку
decf DIGIT2, 1 ;если результат равен "0" уменьшаем переменную DIGIT2 на "1"
incf DIGIT3, 1 ;увеличиваем переменную DIGIT3 на "1" (переносим разряд)
subwf DIGIT3, 0 ;вычитаем значение аккумулятора из переменной DIGIT3
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"
movlw d'2' ;записываем в аккумулятор значение "2"
addwf TIMER1, 1 ;прибавляем к переменной TIMER1 значение аккумулятора
goto calc3 ;идем на метку calc3
;-----------------------------------------------------корректируем переменные TIMER1 и TIMER2
calc1 addwf TIMER1, 1 ;прибавляем к переменной TIMER1 значение аккумулятора
movlw d'100' ;записываем в аккумулятор значение "100"
decf TIMER2 ;уменьшаем значение переменной TIMER2 на "1"
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 NUMCH ;обнуляем значение NUMCH
Страницы: 1, 2, 3, 4, 5, 6