Мегаобучалка Главная | О нас | Обратная связь


Библиографический список



2020-03-19 127 Обсуждений (0)
Библиографический список 0.00 из 5.00 0 оценок




 

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

;==============================================================



2020-03-19 127 Обсуждений (0)
Библиографический список 0.00 из 5.00 0 оценок









Обсуждение в статье: Библиографический список

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (127)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.006 сек.)