Пристрій ультразвукового вимірювання дальності

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

Зміст
Вступ 3
Теоретична частина 4
Опис схеми 6
Опис програми 13
Висновок 34
Бібліографічний список 35
Додатки 36

Введення
Курсовий проект призначений для придбання практичних навичок проектування нескладних мікропроцесорних систем різного призначення. Проект базується на теоретичній частині дисципліни «Організація ЕОМ і систем». Завдання на курсовий проект видається керівником проекту.
Курсовий проект виконується з метою закріплення знань з курсу «Організація ЕОМ та систем» і розвитку навичок самостійного проектування мікропроцесорних систем різного призначення.
Завданнями курсового проекту є:
· Практичне оволодіння методикою проектування пристроїв;
· Синтез функціональної схеми мікропроцесорної системи на основі аналізу вихідних даних;
· Отримання навичок розробки апаратного та програмного забезпечення мікропроцесорної системи;
· Подальший розвиток навичок функціонально-логічного, схемотехнічного і конструкторського проектування, оформлення та випуску конструкторської документації відповідно до ГОСТ.
Для вирішення перерахованих завдань необхідні знання не тільки курсу «Організація ЕОМ і систем», а й ряду суміжних дисциплін, а також уміння користуватися нормативно-довідковою інформацією.
Одним з основних напрямів науково-технічного прогресу в даний час є розвиток і широке застосування виробів мікроелектроніки в промисловому виробництві, в пристроях і системах управління найрізноманітнішими об'єктами і процесами.
Одним з прикладів є мікроконтролери, вироблені фірмою Microchip Technology. Це сімейство 8-розрядних мікроконтролерів відрізняється низькою ціною, низьким енеpгопотpебленіем і високою швидкістю. Мікроконтролери мають Встpоенного ЕППЗУ пpогpамм, ОЗУ даних і випускаються в 18 і 28 вивідних коpпуса. Для виробів, пpогpамма яке може мінятися, або содеpжит які-небудь пеpеменной частини, таблиці, паpаметpа калібpовкі, ключі і т.д., випускається електрично стирається і пеpепpогpамміpуемий мікроконтpоллеp PIC16F84. Він також містить електрично пеpепpогpамміpуемое ПЗУ даних. Саме такий контpоллеp і будемо використовувати для розробки пристрою ультразвукового вимірювання дальності.

Теоретична частина
Робота пристрою ультразвукового вимірювання дальності грунтується на явищі поширення звукових хвиль в повітряному середовищі і відображення їх у процесі поширення від інших середовищ (контрольованих тіл).
Інформація про відстань до контрольованого тіла, точніше деякої відбиває зони, що належить поверхні контрольованого тіла, визначається тимчасовим запізнюванням прийнятого сигналу щодо випромінюваного. Приблизно таким же чином кажани орієнтуються у просторі: вони випромінюють вперед спрямований пучок ультразвукових коливань і ловлять відбитий сигнал. Звукові хвилі розповсюджуються в повітряному середовищі з певною швидкістю, тому за затримки приходу відбитого сигналу можна з достатнім ступенем точності судити, на якій відстані знаходиться той предмет, який відбив звук.
Ультразвуковий далекомір проводить вимірювання відстані до контрольованого тіла за схемою луна-локації (див. рис 1).
Рис. 1. Схема луна-локації.
Для вимірювання відстаней в повітряному середовищі використовуються п'єзокерамічні перетворювачі (типу МУП-3 і МУП-4, вироблені "Елпа" м. Зеленоград), що працюють на 40 кГц частоті. Два п'єзокерамічних перетворювача (випромінюючий і прийомний), підібрані так, щоб резонансна частота випромінювання випромінює, збігалася з резонансною частотою прийому приймального, утворюють акустичний блок.
Перевагами використання таких перетворювачів у повітряному середовищі є: порівняльна простота випромінювання і прийому коливань, компактність пріемоізлучающіх елементів апаратури, висока стійкість до шумового, хімічного і оптичному забруднення навколишнього середовища, можливість роботи в агресивних середовищах при високих тисках, можливість значного видалення вторинної апаратури від місця вимірювань , тривалий термін служби, простота у використанні, порівняно мала вартість, практично миттєва готовність до роботи після включення, нечутливість до електромагнітних перешкод, висока надійність, несприйнятливість органів слуху людини до ультразвуку використовуваної частоти (40кГц) і ряд інших.
Прикладами застосування розроблюваного ультразвукового далекоміра можуть служити: контроль дистанції між автотранспортом при його русі в умовах недостатньої видимості на невеликих швидкостях, вимірювання рівня заповнення резервуарів рідким речовиною, рівня завантаження бункерів або кузовів автомобілів сипучим або подрібненим матеріалом, контроль розмірів продукції, вимір дистанції від борту судна до причальної стінки та ін

Опис принципової схеми
Принципова електрична схема проектованого пристрою представлена ​​у додатку. Представлену схему можна розбити на 5 функціональних блоків:
1) блок живлення;
2) блок передавача;
3) блок приймача;
4) блок індикації;
5) блок цифрового управління.
Розглянемо порядок роботи кожного з них.

TV1
Підпис: TV1
Рис. 2. Блок живлення.
Блок живлення представлений на рис. 2. При включенні мережевого вимикача S1 ​​на первинну обмотку трансформатора TV1 надходить змінна напруга величиною в 220В. З вторинної обмотки трансформатора знімається знижене до 7,5 В змінну напругу. Після проходження через діодний міст V1-V4 ми отримуємо випрямлена, незгладжені напруга величиною близько 7В, тому що існує деякий невеликий падіння напруги на діодах. Пульсації отриманого випрямленої напруги згладжує електролітичний конденсатор С2, а керамічний конденсатор С1 призначений для фільтрації високочастотних мережевих перешкод. Потім напруга стабілізується за допомогою інтегрального стабілізатора напруги DA1 і фільтруються високо і низькочастотні перешкоди за допомогою конденсаторів С3 і С4 відповідно. Діодний міст V1-V4 зібраний на кремнієвих низькочастотних діодах допускають напругу до 100В при струмі не більше 10А. Інтегральний стабілізатор напруги DA1 (КР142ЕН5В) має такі характеристики: U вих = 5В - вихідна напруга;
Iмакс = 1,5 А - максимальний струм навантаження;
Pмакс = 10Вт - максимальна потужність;
включення - плюсове - тип підключення.
Дана схема блоку живлення є типовою.

Рис. 3. Блок передавача.
Блок передавача представлений на рис. 3. Представлений блок виконаний за схемою підсилювача із загальним емітером, що працює в ключовому режимі. Струм на висновках мікроконтролера DD2 не повинен перевищувати максимально дозволений струм величиною в 20мА, при напрузі в 5В. Тоді за законом Ома: R = U / I або R = 5 / 0, 020 = 250Ом. Для R14 був обраний резистор номіналом 300Ом для забезпечення більш стабільної роботи схеми. Резистор R15 служить для забезпечення роботи транзистора Т5 по постійному струму, тобто забезпечує заряд паразитної ємності транзистора. Його номінал взято з типової схеми підключення. У якості випромінювача Qz2 використаний пьезокерамический ультразвуковий перетворювач МУП-3, (тому що він володіють достатньо високою ефективністю, по завіреннях виробника) основні характеристики якого представлені в таблиці 1.
Таблиця 1. Характеристики ПКУП МУП-3
Найменування параметра, одиниця виміру
Значення
Частота максимальної передачі, кГц
37 ... 45
Звуковий тиск на відстані 0,3 м при
Uвх = 5В на частоті максимального випромінювання, дБ
100
Чутливість на частоті максимального прийому, мВ / Па
20
Ширина смуги випромінювання по рівню 0,5, кГц
1,8
Ширина смуги прийому за рівнем 0,5, кГц
1,0
Діаграма спрямованості, Град
За рівнем 0,7 макс.
44
За рівнем 0,5 макс.
74
Ємність на частоті 1 кГц, пФ
1300
Вхідний імпеданс на частоті максимального випромінювання, кОм
0,5
Граничне допустиме значення напруги сигналу на вході, В
12
Біполярні транзистори типу npn КТ972 використовуються у схемі мають наступні параметри:
- Uкбоі = 60В - максимально допустимий імпульсна напруга колектор-база;
- Uкеоі = 60В - максимально допустимий імпульсна напруга колектор-емітер;
- Iкmaxі = 4000мА - максимально допустимий імпульсний струм колектора;
- Pкmaxт = 8Вт - максимально допустима постійна розсіює потужність колектора з теплоотводом;
- H21е ≥ 750 - статичний коефіцієнт передачі струму біполярного транзистора в схемі із загальним емітером;
- Iкбо ≤ 1000мкА - зворотний струм колектора;
- Fгр ≥ 200МГц - гранична частота коефіцієнта передачі струму в схемі із загальним емітером;
- Uкен <1,5 В - напруга насичення колектор-емітер.

Рис. 4. Блок приймача.
Блок приймача зображений на рис. 4. Блок приймача виконаний за схемою підсилювача з загальним емітером. Максимальний коефіцієнт підсилення для підсилювача виконаного за схемою з загальним емітером розраховується зі співвідношення резисторів R19 і R22. Тобто 10000/10 = 1000. Резистори R16 і R18 служать для стабілізації робочої точки транзистора. Співвідношення їх номіналів визначає положення робочої точки транзистора Т6. Резистор R13 підтягує вихід приймача до землі, коли немає сигналу з підсилювача. Резистор R17 служить для установки режиму чутливості ультразвукового датчика Qz3. Конденсатори С7 і С8 фільтрують постійну складову. У якості випромінювача Qz3 використаний пьезокерамический ультразвуковий перетворювач МУП-4, (тому що він володіють достатньо високою чутливістю, по завіреннях виробника) основні характеристики якого представлені в таблиці 2.

Таблиця 2. Характеристики ПКУП МУП-4
Найменування параметра, одиниця виміру
Значення
Частота максимальної передачі, кГц
37 ... 45
Звуковий тиск на відстані 0,3 м при
Uвх = 5В на частоті максимального випромінювання, дБ
96
Чутливість на частоті максимального прийому, мВ / Па
30
Ширина смуги випромінювання по рівню 0,5, кГц
0,5
Ширина смуги прийому за рівнем 0,5, кГц
0,5
Діаграма спрямованості, Град
За рівнем 0,7 макс.
45
За рівнем 0,5 макс.
70
Ємність на частоті 1 кГц, пФ
2500
Вхідний імпеданс на частоті максимального випромінювання, кОм
0,2
Граничне допустиме значення напруги сигналу на вході, В
12

Рис. 5. Блок індикації.
Блок індикації представлений на рис. 5. DD1 - дешифратор семи сегментного індикатора. Він перетворює вхідний двійковий код в символи семи сегментного індикатора. Резистор R20 підтягує вхід 3 дозволу роботи дешифратора до напруги +5 В. Резистори R5-R11 служать для обмеження струму через сегменти індикаторів. Резистори R1-R4 служать для обмеження струму через бази транзисторів Т1-Т4 і забезпечують захист виходів мікроконтролера. Транзистори Т1-Т3 призначені для комутації харчування подається на індикатори. Транзистор Т4 комутує включення точки на індикаторах. Світлодіодні індикатори служать для відображення інформації. На вході харчування індикатор має напругу близько 4,5 В, одержуване за рахунок того, що транзистори Т1-Т3 підключені за схемою емітерного повторювача. На переході база-емітер має місце невелике, близько 0,5 В, падіння напруги, тобто 5-0,5 = 4,5 В (напруга на вході харчування індикатора). Струм через висновки мікроконтролера на повинен перевищувати максимально дозволену струм величиною в 20мА, при напрузі в 5В. Тоді за законом Ома маємо: R = U / I або R = 5 / 0, 020 = 250Ом. Для R1-4 був обраний номінал в 300Ом для забезпечення більш стабільної роботи схеми. Згідно документації на індикатори вони повинні мати вхідна напруга не більше 2,5 В при струмі 20 мА. Оскільки ми маємо на вході харчування індикатора напругу в 4,5 В - слід його зменшити. Зайві 2В гасяться за допомогою резисторів R5-R11. Їх номінал: 2В / 0,020 А = 100Ом. Як HL1 ... HL3 вибрані індикатори цифрові червоного кольору світіння КЛЦ202В (арсенід-галію-алюмінію) в пластмасовому корпусі, що складаються з дискретних елементів, виготовлені за епітаксійних-дифузійної технологій. Індикатор має 7 сегментів і децімальную точку, випромінюючі при подачі прямого струму. Різні комбінації елементів, забезпечувані зовнішньої комутацією, дозволяють відтворити будь-яку цифру від 0 до 9 і децімальную крапку. Висота знаку 20 мм. Параметри індикаторів та їхня принципова схема представлені нижче. Біполярні транзистори типу npn КТ3102 використовуються у схемі мають наступні параметри:
- Uкбоі = 50В - максимально допустимий імпульсна напруга колектор-база;
- Uкеоі = 50В - максимально допустимий імпульсна напруга колектор-емітер;
- Iкmaxі = 200мА - максимально допустимий імпульсний струм колектора;
- Pкmaxт = 0,25 Вт - максимально допустима постійна розсіює потужність колектора з теплоотводом;
- H21е ≥ 200 - статичний коефіцієнт передачі струму біполярного транзистора в схемі із загальним емітером;
- Iкбо ≤ 0,05 мкА - зворотний струм колектора;
- Fгр ≥ 150МГц - гранична частота коефіцієнта передачі струму в схемі із загальним емітером;
Таблиця 3. Основні електричні параметри КЛЦ202В
Найменування параметрів, режим виміру, одиниця виміру
Буквене
позначення
Не менш
Не більше
Середня сила світла елемента відображення при Іпр = 20 мА, мкд

0,5
.
Середня сила світла точки при Іпр = 20 мА, мкд

0,07
.
Постійне пряме напруга для елемента при Іпр = 20 мА, У
Uпр
.
2,5
Постійне пряме напруга для точки при Іпр = 20 мА, У
Uпр
.
2,5

Рис. 6. Схема електрична принципова КЛЦ202В.

Рис.7. Блок цифрового управління.
Блок цифрового управління подано на рис. 7. Блок цифрового управління являє собою однокристальний мікроконтроллер PIC16C84 має підключення згідно технічної документації виробника. Між входами живлення мікроконтролера 14 і 5 ставиться керамічний конденсатор С9 забезпечує згладжування пульсацій напруги викликаних роботою схеми. До входів OSC1 і OSC2 мікроконтролера підключений керамічний резонатор QZ1 після якого встановлені конденсатори С5 і С6 необхідні для забезпечення правильного функціонування, згідно з вимогою виробника. Вхід 1 мікроконтролера підтягнуть до землі через резистор R12 номіналом 1кОм, що є типовою захистом від перешкод в тому випадку, коли кнопка S2 розімкнута. Ланцюжок з резистора R21 і конденсатора С10 є типовою схемою підключення входу MCLR мікроконтролера (скидання пам'яті при включенні живлення) та забезпечують необхідну затримку за часом для стабільного запуску мікроконтролера. Керамічний резонатор QZ1 на 4.0 МГц має наступні параметри:
- Резонансна частота, кГц: 4000;
- Точність настройки (при 25 С),%: 0.3;
- Температурний коефіцієнт (в діапазоні -20 ... +80 С),%: 0.3;
- Максимальне резонансне опір, Ом: 30;
- Вбудований конденсатор, пФ: 30;
- Робоча температура, С: -20 ... +80.

Опис програми
Для зручності програма, наведена у додатку, розбита на окремі підпрограми, які взаємодіють один з одним відповідно до наведеної нижче узагальненої блок схемою програми.
Узагальнена блок-схема
SHAPE \ * MERGEFORMAT
початок
список директив
файл
слово CPU
опис змінних
виконується програма
основна програма
підпрограма ініціалізації
підпрограма індикації
підпрограма обчислення
підпрограма натискання кнопки
підпрограма передачі
підпрограма очікування
підпрограма прийому

Рис. 8. Узагальнена блок-схема.
Більш докладно розглянемо кожен блок наведеної на рис. 8. узагальненої блок схеми.
Список директив, файл, слово CPU
Даний блок відповідає наведеній нижче частини програми.
;================================================= =============
; Програма для ультразвукового далекоміра
;================================================= =============
; Список директив
list P = 16C84; директива визначає тип процесора
# Include <P16C84.INC>; файл, що описує специфічні змінні, відповідні процесору
_config b'00000000000001 '; слово конфігурації CPU
;================================================= =============
За допомогою директиви list вказуємо асемблеру тип процесора. Підключаємо відповідний файл опису. Потім треба слово конфігурації CPU, яке при програмуванні мікроконтролера буде розміщено за адресою розташованому за межами пам'яті користувача програм. Слово конфігурації CPU містить 14 біт. Біти 13-8 CP - захист програмного коду (1 = захист відключена, 0 = захист встановлена). Вибираємо 0. Біт 7 DP - захист пам'яті даних EEPROM (1 = захист відключена, 0 = захист встановлена). Вибираємо 0. Біти 6-4 CP - захист програмного коду (1 = захист відключена, 0 = захист встановлена). Вибираємо 0. Біт 3 PWRTE - дозвіл затримки при включенні живлення (1 = затримка відключена, 0 = затримка встановлена). Вибираємо 0. Біт 2 WDTE - дозвіл включення сторожового таймера (1 = сторожовий таймер включено, 0 = сторожовий таймер відключений). Вибираємо 0. Біти 1-0 FOSC1-FOSC0 - вибір режиму тактового генератора (11 = RC-генератор, 10 = HS-резонатор, 01 = XT-резонатор, 00 = LP-резонатор). Вибираємо 01 т.к. використовуємо стандартний керамічний резонатор 4МГц.
Опис змінних
Даний блок відповідає наведеній нижче частини програми.
;================================================= =============
; Опис використовуваних змінних; (призначення адрес комірок для зберігання змінних)
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
;================================================= =============
Вказуємо адресу початку програм, вектор скидання процесора. Обнуляємо значення у вихідних засувках обох портів. Обнуляємо значення таймера. Потім встановивши в 1 біт RP0 регістра STATUS, ми отримуємо доступ до регистровому банку 1. Тепер звертаючись до регістрів PORTA і PORTB, ми звертаємося не до вихідних засувок, а до регістрів стану цих портів, і налаштовуємо частина ліній на введення, а частина ліній на висновок, що відповідає схемі наведеної у додатку. Використовуючи біт 7 RBPU регістру OPTION_REG включаємо вбудовану навантаження порту B, для чого встановлюємо біт в 0. За допомогою біта 5 T0CS вибираємо джерело тактирования для таймера TMR0. Для використання внутрішньої тактової частоти CLKOUT, встановлюємо в 0 цей біт. В кінці встановивши в 0 біт RP0 регістра STATUS, ми отримуємо доступ до регистровому банку 0.
Основна програма main
Даний блок відповідає наведеній нижче частини програми.
;================================================= =============
main; основна програма
call initialization; викликаємо підпрограму ініціалізації
main1 call indication; викликаємо підпрограму індикації
goto divssing; викликаємо підпрограму обробки натиснення кнопки
main2 call transfer; викликаємо підпрограму передачі імпульсів
main3 goto waiting; викликаємо підпрограму очікування відбитого сигналу
main4 goto reception; викликаємо підпрограму прийому відбитого сигналу
main5 call calculation; викликаємо підпрограму обчислення відстані
;================================================= =============
У даній частині використовуються всього два оператори переходу: оператор виклику підпрограми call і оператор безумовного переходу goto. Для наочності наведемо блок-схему основної програми main, в яку додані умови і порядок взаємодії розглядаються далі підпрограм.
Блок-схема наведена на рис. 9.
SHAPE \ * MERGEFORMAT
початок
підпрограма ініціалізації
підпрограма індикації
підпрограма обчислення
підпрограма натискання кнопки
підпрограма передачі
підпрограма очікування
підпрограма прийому
кнопка натиснута
та
немає
переповнення-ня
та
немає
та
немає
сигнал наш
немає
та

Рис. 9. Блок-схема основної програми main.
Підпрограма ініціалізації initialization
Даний блок відповідає наведеній нижче частини програми.
;================================================= =============
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; повернення з підпрограми
;================================================= =============
Тут ми Обнуляємо використовувані змінні, і встановлюємо для них необхідні значення. Кількість переданих імпульсів NUMIMP в сигналі приймаємо рівним 5 (погоджено з викладачем). І т.д.
Підпрограма індикації indication
Даний блок відповідає наведеній нижче частини програми.
;================================================= =============
indication; підпрограма індикації виміряного відстані
;------------------------------------------------- ---- встановлюємо біти підключення індикаторів
bsf DIGIT1, 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 INTCON, TOIF; перевіряємо прапор переривання по переповнення таймера
goto indc3; якщо прапор дорівнює 0 (лічильник не переповнений)-виконуємо перевірку
; Якщо прапор дорівнює 1 (лічильник переповнений) -
;------------------------------------------------- -------------------------------------------------- ------
return; повернення з підпрограми
;================================================= =============
У першій частині підпрограми indication ми встановлюємо «біти точки та харчування» індикаторів відповідно до схеми. У змінній DIGIT1 буде зберігатися значення дециметрів від 0 до 9 тому використовуються у схемі індикатори є семи сегментними з додатковим висновком для десяткового роздільника - точки, в змінній DIGIT2 - значення метрів, у змінній DIGIT3 - значення декаметри відповідно. Таким чином відповідно до схеми для відображення цифр на індикаторах через дешифратор використовується всього чотири лінії порту B: RB0, RB1, RB2, RB3 для передачі бітів 0, 1, 2 і 3 відповідно. Обчислені відображаються значення будуть зберігатися в змінних DIGIT1 ... 3 поразрядно, для цього використовується перші чотири біта кожної змінної. Лінії RB4, RB5 і RB6 порту В ми використовуємо для почергової подачі живлення на індикатори. Лінія RB4 на індикатор декаметри (відображення значення DIGIT3), RB5 на індикатор метрів (відображення значення DIGIT2), RB6 на індикатор дециметрів (відображення значення DIGIT1). Для цього ми використовуємо наступні біти змінних: біт 6 - DIGIT1, біт 5 - DIGIT2 і біт 4 - DIGIT3 відповідно до схеми. Лінія RB7 порту В використовується для подачі сигналу на десяткову точку індикатора метрів (змінна DIGIT2). Таким чином використовується весь порт В і ми можемо, заздалегідь встановивши біти в змінних послати на порт У черзі, відповідно по черзі підключаючи індикатори. Для наочності нижче наведений малюнок 10.
SHAPE \ * MERGEFORMAT
0
DIGIT1
1
0
0
x
x
x
x
7
6
5
4
3
2
1
0
біти
значення
1
DIGIT2
0
1
0
x
x
x
x
7
6
5
4
3
2
1
0
біти
значення
0
DIGIT3
0
0
1
x
x
x
x
7
6
5
4
3
2
1
0
біти
значення
RB7
PORT B
3
2
1
0
лінії
на дешифратор
RB6
RB5
RB4
RB3
RB2
RB1
RB0
Дешифратор
4
2
1
5
вхід
8
4
2
1
висновок
Підпис: RB7Підпис: RB6Підпис: RB5Підпис: RB4Підпис: RB3Підпис: RB2Підпис: RB1Підпис: RB0
Рис. 10. Схема індикації.
Далі виводимо значення DIGIT1 на порт В. Організуємо затримку відображення на індикаторі за допомогою таймера TMR0 на 256 мкс. Потім цю ж процедуру виробляємо для DIGIT2 і DIGIT3 відображаючи їх значення на індикаторах.
Підпрограма натискання кнопки divssing
Даний блок відповідає наведеній нижче частини програми.
;================================================= =============
divssing; підпрограма обробки натиснення кнопки
btfss PORTA, 2; перевіряємо лінію RA2 порту А (кнопку s2),
goto main1; якщо не натиснута повертаємося в програму (на indication)
goto main2; якщо натиснута-повернення з підпрограми
;================================================= =============
При виконанні цієї підпрограми відбувається тестування присутності сигналу (+5 В) на лінії RA2 порту A. Якщо на лінію надходить напруга (кнопка натиснута) - виконується команда переходу в основну програму на відповідну позначку (main2). В іншому випадку (кнопка не натиснута) перехід здійснюється на іншу мітку основної програми (main2).
Підпрограма передачі transfer
Даний блок відповідає наведеній нижче частини програми.
;================================================= =============
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; повернення з підпрограми
;================================================= =============
Ця підпрограма виводить на лінію RA0 порту А мікроконтролера 5 імпульсів частотою 40 кГц. Враховуючи, що ми не підключаємо предделителя для таймера-лічильника TMR0 і в схемі використовується керамічний резонатор частотою 4 МГц маємо тактову частоту мікроконтролера рівну 1 МГц, тобто одна команда виконується за 1 мкс. Отже один імпульс частотою 40 кГц має тривалість 1 / 40000 = 25 мкс. Тобто ми повинні сформувати один імпульс за 25 мкс. Блок-схема цієї підпрограми представлена ​​на рис. 11. Значення для таймера підібрані таким чином, щоб сформувати імпульс на лінії тривалістю близько 25 мкс. В кінці підпрограми встановлюється нове значення для змінної NUMIMP, тому що воно буде потрібно для роботи іншої підпрограми.
SHAPE \ * MERGEFORMAT
початок
формуємо сигнал заданої тривалості
кінець
импуль-сов 5?
та
немає
формуємо затримку заданої тривалості
вважаємо кількість імпульсів

Рис. 11. Блок-схема підпрограми transfer.
Підпрограма очікування waiting
Даний блок відповідає наведеній нижче частини програми.
;================================================= =============
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; повернення з підпрограми (сигнал є)
;================================================= =============
SHAPE \ * MERGEFORMAT
початок
необхідна затримка
запуск
таймера
TIMER1-1
TIMER1 = 100
TIMER2-1
сигнал є?
та
немає
таймер дорахував
та
= 0
немає
≠ 0
TIMER1
= 0
≠ 0
TIMER2
DIGIT1 ... 3 = 9
на indication
на reception

Рис. 12. Блок-схема підпрограми waiting.
У початковій частині підпрограми проводиться невелика затримка початку відліку часу очікування для того, щоб відбулося загасання перешкод викликаних випромінюванням сигналу в попередній підпрограмі. Потім запускається таймер на 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
;------------------------------------------------- -------------------------------------------------- ------
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; продовження очікування сигналу
;================================================= =============
Блок-схема цієї підпрограми представлена ​​на рис. 13. Оскільки перехід в підпрограму здійснюється при наявності сигналу на лінії RA1 порту А мікроконтролера, то спочатку чекаємо закінчення сигналу. Потім виробляємо тестування відсутності сигналу протягом певного часу, якщо до закінчення даного проміжку часу сигнал з'явився, то робимо висновок, що прийнятий не наш сигнал і виходимо з підпрограми і продовжуємо очікування правильного сигналу в підпрограмі waiting. Після цього проводимо тестування наявності сигналу протягом певного часу, якщо до закінчення даного проміжку часу сигнал пропав, то робимо висновок, що прийнятий не наш сигнал і виходимо з підпрограми і продовжуємо очікування правильного сигналу в підпрограмі waiting. Якщо ж протягом певного часу сигналу не було, а потім протягом певного часу сигнал був, то робимо висновок, що був успішно проведений прийом одного імпульсу нашого сигналу, зменшуємо лічильник прийнятих імпульсів на 1 і повертаємося на мітку recp6 розглянутої підпрограми і проводимо всі дії по прийому імпульсу сигналу ще раз. Прийом імпульсів проводиться до тих пір поки лічильник імпульсів NUMIMP не стане дорівнює нулю, і ми можемо вважати, що взяли три імпульси нашого сигналу. Після цього переходимо в підпрограму calculation. Робота підпрограми більш зрозуміла з наведеної блок-схеми.
початок
Блок-схема: знак завершення: початок SHAPE \ * MERGEFORMAT
немає
сигнал є?
на waiting
таймер дорахував
та
та
запускаємо
таймер
немає
запускаємо
таймер
таймер дорахував
немає
та
сигналу немає?
та
немає
немає
таймер дорахував
та
NUMIMP-1
таймер дорахував
немає
та
сигналу немає?
та
немає
немає
та
NUMIMP = 0
на waiting

Рис. 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 від заданої точності ми, все одно будемо її враховувати. Принцип роботи підпрограми ясний з блок-схеми.
початок
Блок-схема: знак завершення: початок SHAPE \ * MERGEFORMAT
обчислюємо TIMER1 ... 2
початкові значення
DIGIT1 +1
TIMER1 +6
TIMER1 +100
TIMER2-1
TIMER1 <0
та
немає
немає
DIGIT1
= 10
LAPSE
= 0
LAPSE-1
кінець
TIMER1-6
TIMER2 <0
та
немає
та
немає
та
LAPSE = 57
TIMER1 +2
DIGIT1-1
DIGIT2 +1
DIGIT2
= 10
та
немає
DIGIT2-1
DIGIT3 +1
DIGIT3
= 10
та
немає
DIGIT3-1

Рис. 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 divssing; викликаємо підпрограму обробки натиснення кнопки
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; повернення з підпрограми
;================================================= =============
divssing; підпрограма обробки натиснення кнопки
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
;================================================= =============
Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Курсова
155.8кб. | скачати


Схожі роботи:
Погодить пристрій для вимірювання чотирьохполюсних радіоелементів
Пристрій для вимірювання температури в індустріальних системах і розробка програми для виведення
Модернізація приладів ультразвукового контролю труб
Маркетингові дослідження ринку ультразвукового обігрівача фірми Невотон
Метод секторального ультразвукового сканування мозку нейросонографія НСГ
Розрахунки вантажообігу і дальності пробігу
Способи визначення дальності стрільби і застосування формули тисячної
Залежність дальності перельоту об`єкта від кута кидання
Способи визначення дальності стрільби і застосування формули тисячної 2
© Усі права захищені
написати до нас