s 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; повернення з підпрограми (сигнал є)
; ============================================== ================
В
Рис. 12. Блок-схема підпрограми waiting. br/>
У початковій частині підпрограми виробляється невелика затримка початку відліку часу очікування для того, щоб відбулося затухання перешкод викликаних випромінюванням сигналу в попередній підпрограмі. Потім запускається таймер на 100 мкс. Т.к. ми будемо вважати проміжки часу по 100 мкс. Блок-схема підпрограми представлена ​​на рис. 12. Таким чином максимальний період очікування складе 100 * 100 * 100 = 1000000 мкс, що складає 1с. Приймаючи швидкість поширення звуку рівної 331,4 м/с - це більш ніж достатньо, тому що за умовою завдання максимальна вимірювана дальність пристрою складе 99,9 метра.
Підпрограма прийому reception
Даний блок відповідає наведеній нижче частини програми.
; ============================================== ================
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
p> 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
p> decfsz NUMIMP, 1; зменшуємо значення NUMIMP на "1"
goto recp6; якщо NUMIMP НЕ дорівнює "0"-продовжуємо перевірку
goto main5; якщо NUMIMP дорівнює "0"-повернення з підпрограми
recp3 goto main3; продовження очікування сигналу
; ============================================== ================
Блок-схема даної підпрограми представлена ​​на рис. 13. Т.к. перехід в підпрограму здійснюється за наявності сигналу на лінії RA1 порту А мікроконтролера, то спочатку...