Подпрограмма вычисления 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.
В процессе выполнения курсового проекта, было спроектировано устройство ультразвукового измерения дальности. В пояснительной записке представлено подробное описание схемы устройства, описание программного обеспечения. В приложении представлена принципиальная схема разработанного устройства и приведен листинг программы. В ходе выполнения курсового проекта были решены следующие задачи: · синтез и разработка принципиальной схемы устройства; · разработка программного обеспечения; · разработка конструкторской документации проекта (пояснительная записка).
Популярное: Как выбрать специалиста по управлению гостиницей: Понятно, что управление гостиницей невозможно без специальных знаний. Соответственно, важна квалификация... Генезис конфликтологии как науки в древней Греции: Для уяснения предыстории конфликтологии существенное значение имеет обращение к античной... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (115)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |