Библиографический список
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 movlw d'57' ;помещаем значение "57" для LAPSE в аккумулятор movwf LAPSE ;помещаем значение из аккумулятора в LAPSE return ;возврат из подпрограммы ;============================================================== indication ;подпрограмма индикации измеренного расстояния ;-----------------------------------------------------устанавливаем биты подключения индикаторов bsf IGIT1, 6 ;устанавливаем бит 6 переменной DIGIT1 в 1 bsf DIGIT2, 7 ;устанавливаем бит 7 (точка) переменной DIGIT2 в 1 bsf DIGIT2, 5 ;устанавливаем бит 5 переменной DIGIT2 в 1 bsf DIGIT3, 4 ;устанавливаем бит 4 переменной DIGIT3 в 1 ;-----------------------------------------------------выводим значение DIGIT1 на индикатор movf DIGIT1, 0 ;помещаем значение переменной DIGIT1 в аккумулятор movwf PORTB ;выводим значение в порт В устанавливаем задержку отображения clrf TMR0 обнуляем таймер и bcf INTCON, TOIF ;устанавливаем в 0 флаг прерывания по его переполнению indc1 btfss INTCON, TOIF ;проверяем флаг прерывания по переполнению таймера goto indc1 если флаг равен 0 (счетчик не переполнен)-выполняем проверку если флаг равен 1 (счетчик переполнен) - переходим к следующему индикатору ;-----------------------------------------------------выводим значение DIGIT2 на индикатор movf DIGIT2, 0 ;помещаем значение переменной DIGIT1 в аккумулятор movwf PORTB ;выводим значение в порт В устанавливаем задержку отображения clrf TMR0 ;обнуляем таймер и bcf INTCON, TOIF ;устанавливаем в 0 флаг прерывания по его переполнению indc2 btfss INTCON, TOIF ;проверяем флаг прерывания по переполнению таймера goto indc2 если флаг равен 0 (счетчик не переполнен)-выполняем проверку если флаг равен 1 (счетчик переполнен) - переходим к следующему индикатору ;-----------------------------------------------------выводим значение DIGIT3 на индикатор movf DIGIT3, 0 ;помещаем значение переменной DIGIT3 в аккумулятор movwf PORTB ;выводим значение в порт В ;устанавливаем задержку отображения clrf TMR0 ;обнуляем таймер и bcf INTCON, TOIF ;устанавливаем в 0 флаг прерывания по его переполнению indc3 btfss NTCON, TOIF ;проверяем флаг прерывания по переполнению таймера goto indc3 ;если флаг равен 0 (счетчик не переполнен)-выполняем проверку если флаг равен 1 (счетчик переполнен)- ;--------------------------------------------------------------------------------------------------------- return ;возврат из подпрограммы ;============================================================== pressing ;подпрограмма обработки нажатия кнопки btfss PORTA, 2 ;проверяем линию RA2 порта А (кнопку s2), goto main1 ;если не нажата возвращаемся в программу (на indication) goto main2 ;если нажата-возврат из подпрограммы ;============================================================== transfer ;подпрограмма передачи импульсов ;--------------------------------------------------------------------------------------------------------- movlw d'5' ;помещаем значение "5" для NUMIMP в аккумулятор movwf NUMIMP ;помещаем значение из аккумулятора в NUMIMP ;-----------------------------------------------------передача сигнала tran1 bsf PORTA, 0 ;устанавливаем в 1 линию RA0 порта А movlw d'249' ;помещаем значение "249" для таймера в аккумулятор movwf TMR0 ;помещаем значение из аккумулятора в таймер bcf INTCON, TOIF ;устанавливаем в 0 флаг прерывания по переполнению таймера tran2 btfss INTCON, TOIF ;проверяем флаг прерывания по переполнению таймера goto tran2 ;если флаг равен 0 (счетчик не переполнен)-выполняем проверку если флаг равен 1 (счетчик переполнен)- ;-----------------------------------------------------задержка сигнала bcf PORTA, 0 ;устанавливаем в 0 линию RA0 порта А movlw d'251' ;помещаем значение "251" для таймера в аккумулятор movwf TMR0 ;помещаем значение из аккумулятора в таймер bcf INTCON, TOIF ;устанавливаем в 0 флаг прерывания по переполнению таймера tran3 btfss INTCON, TOIF ;проверяем флаг прерывания по переполнению таймера goto tran3 ;если флаг равен 0 (счетчик не переполнен)-выполняем проверку если флаг равен 1 (счетчик переполнен)- ;-----------------------------------------------------считаем импульсы decfsz NUMIMP, 1 ;уменьшаем зачение NUMIMP на "1"если NUMIMP не равен "0" (передано<5импульсов)- goto tran1 ;переходим в начало подпрограммы на tran1 если NUMIMP равен "0" ;-----------------------------------------------------(передано 5 импульсов)- movlw d'3' ;помещаем значение "3" для NUMIMP в аккумулятор movwf NUMIMP ;помещаем значение из аккумулятора в NUMIMP ;--------------------------------------------------------------------------------------------------------- return ;возврат из подпрограммы ;============================================================== waiting ;подпрограмма ожидания отраженного сигнала ;-----------------------------------------------------задержка начала приема сигнала movlw d'151' ;помещаем значение "151" для таймера в аккумулятор movwf TMR0 ;помещаем значение из аккумулятора в таймер bcf INTCON, TOIF ;устанавливаем в 0 флаг прерывания по переполнению таймера wait1 btfss INTCON, TOIF ;проверяем флаг прерывания по переполнению таймера goto wait1 если флаг равен 0 (счетчик не переполнен)-выполняем проверку если флаг равен 1 (счетчик переполнен)- ;-----------------------------------------------------начинаем счет времени ожидание приема (по 100 мкс) wait3 movlw d'161' ;помещаем значение "161" для таймера в аккумулятор movwf TMR0 ;помещаем значение из аккумулятора в таймер bcf INTCON, TOIF ;устанавливаем в 0 флаг прерывания по переполнению таймера wait2 btfsc PORTA, 1 ;проверяем наличие сигнала на линии RA1 порта А goto wait4 ;если сигнал есть-переходим на метку wait4 если сигнала нет-продолжаем счет времени btfss INTCON, TOIF ;проверяем флаг прерывания по переполнению таймера goto wait2 если флаг равен 0 (счетчик не ;-----------------------------------------------------переполнен)-выполняем проверку decfsz TIMER1, 1 ;если флаг равен 1 (счетчик переполнен)-уменьшаем TIMER1 на 1 goto wait3 ;если TIMER1 не равен "0" ;-----------------------------------------------------продолжаем ожидание если TIMER1 равен "0"- movlw d'100' ;помещаем значение "100" для TIMER1 в аккумулятор movwf TIMER1 ;помещаем значение из аккумулятора в TIMER1 decfsz TIMER2, 1 ;уменьшаем значение TIMER2 на 1 goto wait3 ;если TIMER2 не равен "0" ;-----------------------------------------------------продолжаем ожидание если TIMER2 равен "0" (сигнал уже не вернется)-заполняем ;значения DIGIT1..3 movlw d'9' ;помещаем значение "9" для переменной DIGIT1 в аккумулятор movwf DIGIT1 ;помещаем значение из аккумулятора в DIGIT1 movlw d'9' ;помещаем значение "9" для переменной DIGIT2 в аккумулятор movwf DIGIT2 ;помещаем значение из аккумулятора в DIGIT2 movlw d'9' ;помещаем значение "9" для переменной ;DIGIT3 в аккумулятор movwf DIGIT3 ;помещаем значение из аккумулятора в DIGIT3 ;--------------------------------------------------------------------------------------------------------- goto main1 ;возврат из подпрограммы (сигнала нет) wait4 goto main4 ;возврат из подпрограммы (сигнал есть) ;============================================================== reception ;подпрограмма приема отраженного сигнала ;--------------------------------------------------------------------------------------------------------- ожидание окончания сигнала recp1 btfsс PORTA, 1 ;проверяем наличие сигнала на линии RA1 порта А goto recp1 ;если сигнала есть-продолжаем ожидание ;-----------------------------------------------------если сигнала нет-начинаем проверку recp6 movlw d'251' ;помещаем значение "251" для таймера в аккумулятор movwf TMR0 ;помещаем значение из аккумулятора в таймер bcf INTCON, TOIF ;устанавливаем в 0 флаг прерывания по переполнению таймера recp1 btfss INTCON, TOIF ;проверяем флаг переполнения таймера если таймер не переполнен- btfsc PORTA, 1 ;проверяем отсутствие сигнала на линииRA1 порта А если таймер переполнен или есть goto recp2 ;сигнал-идем на метку recp2 ;если таймер не переполнен и нет goto recp1 ;сигнала-идем на метку recp1 ;-----------------------------------------------------проверяем флаг переполнения таймера recp2 btfss INTCON, TOIF ;если таймер не переполнен- goto recp3 ;сигнал не наш-идем на метку recp3 ;--------------------------------------------------------------------------------------------------------- movlw d'252' ;помещаем значение "252" для таймера в аккумулятор movwf TMR0 помещаем значение из аккумулятора в таймер bcf INTCON, TOIF ;устанавливаем в 0 флаг прерывания по переполнению таймера 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 ;продолжение ожидания сигнала ;============================================================== 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 возврат из подпрограммы ;============================================================== end ;==============================================================
Популярное: Почему люди поддаются рекламе?: Только не надо искать ответы в качестве или количестве рекламы... Модели организации как закрытой, открытой, частично открытой системы: Закрытая система имеет жесткие фиксированные границы, ее действия относительно независимы... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (127)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |