Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовой МПС(last edit).doc
Скачиваний:
13
Добавлен:
01.12.2018
Размер:
587.26 Кб
Скачать

Функциональная спецификация микропроцессорной системы управления бегущей строкой

1) Автоматическая система управления «ультразвуковой дальномер»должен выполнять следующие функции, обладать следующими свойствами:

1.1 Измерение расстояния;

1.2 Запись результатов измерения;

1.3 Отображение результатов;

1.4 Дружественный интерфейс.

2) Средства реализации указанных функций:

2.1 Измерение осуществляется с помощью ультразвуковых датчиков.

2.2 Запись измерения осуществляется во встроенную память. Записываются данные циклично, если память заполнена, то старые данные будут перезаписаны

2.3 Отображение осуществляется с помощью дисплея.

3) Способы взаимодействия системы и пользователя:

3.1 Инициализация измерения от кнопки;

3.2 Просмотр данных осуществляется инкрементным и декрементным методом с помощью кнопок;

3.3 Сброс памяти с помощью кнопки.

4) Входы и Выходы:

4.1 Входы:

- клавиатура;

- K входу устройства подключается принимающий ультразвуковой датчик.

4.2 Выходы:

- К выходу устройства подключается излучающий ультразвуковой датчик.

- Дисплей;

Приложение В

(Обязательное)

Структурная схема микропроцессорной системы контроля расстояний.

Рисунок В1 - Структурная схема микропроцессорной системы управления бегущей строкой.

Эта микропроцессорная система состоит из следующих элементов:

  • МК – микроконтроллер;

  • УВ – ультразвуковые волны;

  • УС1,УС2,УС3 – Устройство сопряжения;

  • - Клавиатура – устройства управления;

  • - Приемник УЗВ – приемник ультразвуковых волн;

Принцип действия:

- При нажатий кнопки “Измерение” МК выдает сигнал “пуск”, который через УС 4 поступает на УЗВ передатчик и одновременно запускает таймер.

- Передатчик излучает УЗВ в направление препятствия. Отраженный от препятствия сигнал попадает на приемник. Приемник выделяет сигнал, которые поступает в контроллер и останавливает таймер. Контролер считывает показания таймера и через таблицу перекодировки определяет расстояния до препятствия.

- Результат измерения выводиться на дисплей, и сохраняется в памяти.

- С помощью клавиатуры можно просматривать сохраненные. измерения.

Приложение Д

(Обязательное)

Принципиальная схема

Рисунок Г1 – Принципиальная схема

Приложение Д

(Обязательное)

Выбор элементной базы и составление перечня элементов

Таблица Д1 – Перечень элементов

Обозначение

Наименование

Кол

Примечание

Микросхемы

DD1

Микросхема ATtiny2313

1

ЦПУ

HG1

LAY

1

дисплей

BA1,BA2

Передатчик, приемник

Полупроводники

VT1-VT5

Транзисторы KT321A

5

VD1,VD2

Диод

2

Ключи

SB1

Кнопка RESET

1

SB2

Кнопка START

1

Конденсаторы

С1,С2,C3,C4,С5

К54 5В 0.1мкФ

4

Разъемы

X1

IDC-10MS

1

X2

Питания

1

Резисторы

R1,R4,R18,

R25,R26

Резистор 10кОм

5

R14-R17,R23

Резистор 1кОм

5

R2-R3,R21

Резистор 20кОм

3

R22

Резистор 200кОм

1

R5-R13

Резистор 300кОм

9

Приложение Е

(Обязательное)

Листинг программы с комментариями

#include <avr/io.h> #include <avr/interrupt.h> #include <math.h> #include <util/delay.h> #define iter 64000UL      // переполнение = 8 мс #define HI(x) ((x)>>8) #define LO(x) ((x)&0xFF) // a f b e d dp c g //                              0    1     2    3    4    5    6     7    8    9    .    volatile unsigned char codes[] = {0xFA,0x22,0xB9,0xAB,0x63,0xCB,0xDB,0xA2,0xFB,0xEB,0x04,0x00}; volatile unsigned char answer[] = {0x00, 0x00, 0x00}; volatile unsigned char flags = 0b0000000; //                                    || //                                    | ----- прерывание ИНТ0 //                                      ------ прерывание ИНТ1 volatile unsigned int ov_count = 0; volatile   unsigned int iteration = 0; volatile   float dist = 0; volatile   unsigned int ans = 0; /* Функция перевода числа в коды, для отображения    на динамической индикации */ void FORMAT(unsigned int val) {    unsigned char a, b, c, temp = 0;        a = val/100;    temp = val - 100*a;    b = temp/10;    c = temp - b*10;        answer[0] = codes[a];    answer[1] = codes[b];    answer[2] = codes[c]; } /* Функция отображения данных на индикаторе */ void DISPLAY() {    PORTB = answer[0];    PORTD |= 0b00010000;    _delay_ms(5);       PORTD &= 0b11101111;           PORTB = answer[1];    PORTD |= 0b00100000;    _delay_ms(5);          PORTD &= 0b11011111;           PORTB = answer[2];    PORTD |= 0b01000000;    _delay_ms(5);             PORTD &= 0b10111111;    } /* Функция отправки пачки УЗ импульсов (10 шт) */ void SENDIMPULSE() {    PORTD |= 0b00000001;    _delay_us(12.5);    PORTD &= 0b11111110;    _delay_us(12.5);       PORTD |= 0b00000001;    _delay_us(12.5);    PORTD &= 0b11111110;    _delay_us(12.5);    PORTD |= 0b00000001;    _delay_us(12.5);    PORTD &= 0b11111110;    _delay_us(12.5);    PORTD |= 0b00000001;    _delay_us(12.5);    PORTD &= 0b11111110;    _delay_us(12.5);    PORTD |= 0b00000001;    _delay_us(12.5);    PORTD &= 0b11111110;    _delay_us(12.5);    PORTD |= 0b00000001;    _delay_us(12.5);    PORTD &= 0b11111110;    _delay_us(12.5);    PORTD |= 0b00000001;    _delay_us(12.5);    PORTD &= 0b11111110;    _delay_us(12.5);    PORTD |= 0b00000001;    _delay_us(12.5);    PORTD &= 0b11111110;    _delay_us(12.5);    PORTD |= 0b00000001;    _delay_us(12.5);    PORTD &= 0b11111110;    _delay_us(12.5);    PORTD |= 0b00000001;    _delay_us(12.5);    PORTD &= 0b11111110;    _delay_us(12.5);    } // Обработчие прерывания от таймера 1 ISR(TIMER1_COMPA_vect) {    ov_count++;    } // Обработчик внешнего прерывания INT1 (пришло эхо) ISR(INT1_vect) {       TCCR1B = 0b00001000; //останавливаем таймер    flags |= 0b00000010;    } // Обработчик внешнего прерывания INT0 (нажата кнопка) ISR(INT0_vect) {    flags |= 0b00000001; } int main() {    cli();   // запрещаем все прерывания        DDRB = 0b11111111;   // все ноги порта В на вывод    DDRD = 0b11110011;  // все кроме инт1 и инт0 на вывод, те на ввод        // даташит с 62 страницы           MCUCR &= 0b11111010;   // прерывания инт1 и инт0 по falling edge    GIMSK = 0b11000000;    // разрешаем прерывание инт1 и инт0        TCCR1A = 0b00000000;   // выбираем режим СТС    TCCR1B = 0b00001000;    // таймер пока остановлен    OCR1AH = HI(iter);      // старший байт    OCR1AL = LO(iter);      // младший байт       TIMSK = 0b01000000; // прерывание по сравнению        sei(); // разрешаем все прерывания                  for(;;)    {       if((flags & 0b00000001) == 1) // если взведен флаг инт0       {          TCCR1B = 0b00001000;   // останавливаем счетчик          ov_count = 0;         // обнуляем переменную переполнения счетчика          TCNT1H = 0;            // обнуляем значения счетчика          TCNT1L = 0;          flags &= 0b11111110;   // очищаем флаг              TCCR1B = 0b00001001;    //запускаем счетчик             SENDIMPULSE();         //начинаем посылать импульсы       }                    if((flags & 0b00000010) == 2) // если взведен флаг инт1       {             cli();               // запрещаем все прерывания                    flags &= 0b11111101;   // очищаем флаг                    iteration = 0;         // обнуляем перменные          dist = 0;          ans = 0;          iteration |= TCNT1H;             iteration <<= 8;          iteration |= TCNT1L;   // прочитали значение счетчика              dist = (iteration * 0.000125 + ov_count) * 16.5;   // посчитали расстояние в см          ans = trunc(dist + 0.5);   // округлили              FORMAT(ans);         // софрмировали ответ для отображения                    sei();               // разрешили все прерывания       }                          DISPLAY();               // отображаем что насчитали    }    return(0); }