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
|