Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Записка_КП_Зданович.docx
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
1.93 Mб
Скачать

Заключение

В ходе выполнения курсового проекта был разработан алгоритм работы, структура и принципиальная схема устройства, предназначенного для приема данных с заданной скоростью, индицируемой на светодиодах, обработки данных, вывода результата. Система осуществляет ввод двоично-десятичных данных в последовательном формате, преобразует их в двоичный код, выбирает максимальный элемент среди них и выводит его в параллельном формате в два приемника по прерыванию.

Программа была написана в среде разработки CodeVisionAVR C Compiler на языке С и отлажена с помощью пакета Proteus Version 7 Professional.

ОМК работает на частоте 8 МГц, требуемый объем ПЗУ – 2252 байт, объем ОЗУ – 59 байт, время работы подпрограммы инициализации ОМК – 0,796 мс, подпрограммы выбора скорости последовательного канала – 5,5 мкс, подпрограмма считывания одного значения из последовательного канала – 45м мкс, подпрограмма обработки массива и нахождения максимума – не более 46,072 мс, подпрограмма вывода результата в параллельный порт – 769 мкс.

Список использованных источников

  1. Иоффе, В. Г. Структурная организация однокристальных микроконтро-ллеров [Текст]/ В. Г. Иоффе. – Самара: Издательство СГАУ, 2011. – 65с.

  2. Иоффе, В. Г. Методические указания к курсовому проектированию по дисциплине «Микропроцессорные средства систем автоматизации» [Текст]/ В. Г. Иоффе. – Самара: Издательство СГАУ, 2012. – 21с.

  3. Преимущества CodeVisionAVR C Compiler [Электронный ресурс]. – http://cxem.net/software/codevisionavr.php

  4. Достоинства среды Proteus 7 Professional [Электронный ресурс]. – http://www.gaw.ru/html.cgi/txt/soft/avr/Proteus.htm

  5. Микроконтроллеры семейства AVR [Электронный ресурс]. – http://www.gaw.ru/html.cgi/txt/ic/Atmel/micros/avr/start.htm

  6. Отладка МПУ [Электронный ресурс]. – http://dfe.petrsu.ru/koi/posob/microcpu/proekt1.html

  7. Тестирование ПЗУ [Электронный ресурс]. – http://iit.my1.ru/load/0-0-0-98-20

Приложение а

Принципиальная схема представлена на рисунке 18.

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

Приложение б

Таблица 2 – Спецификация элементов

Номер микросхемы

Тип

Количество

Описание

U1

ATmega8

1

Однокристальный микроконтроллер

D1-D5

Led-Blue

5

Светодиод

C1

1

Конденсатор

R1-R8

1

Резистор

Приложение в

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

#include <mega8.h>

#include <delay.h>

#include <stdio.h>

unsigned char max[2];

bit input_finished = 0;

unsigned char i = 0;

unsigned char j = 0;

volatile unsigned char mode = 0;

char uart_data[16][3];

// Обработчик прерывания от INT0

interrupt [EXT_INT0] void ext_int0_isr(void)

{

GICR|=0x00; // запрет прерываний от внешних источников

DDRD=0xFF;

UCSRB=0x90;

PORTB = max[0]; //вывод данных на порт

switch (mode) {

case 1: PORTB.6 = 1; break;

case 2: PORTB.5 = 1; break;

case 3: PORTB.4 = 1; break;

case 4: PORTB.3 = 1; break;

case 5: PORTB.2 = 1; break;

};

PORTD = max[1];

PORTB.7 = 1;

delay_ms(1000);

PORTB.1 = 0;

PORTB.0 = 0;

PORTB.7 = 0;

PORTD=0xFF;

DDRD=0x00;

UCSRB=0x98;

GICR|=0xC0;

GIFR=0xC0;

}

// Обработчик прерывания от INT1

interrupt [EXT_INT1] void ext_int1_isr(void)

{

GICR|=0x00; // запрет прерываний от внешних источников

DDRD=0xFF;

UCSRB=0x90;

PORTB = max[0]; //вывод данных на порт

switch (mode) {

case 1: PORTB.6 = 1; break;

case 2: PORTB.5 = 1; break;

case 3: PORTB.4 = 1; break;

case 4: PORTB.3 = 1; break;

case 5: PORTB.2 = 1; break;

};

PORTD = max[1];

delay_ms(1000);

PORTB.1 = 0;

PORTB.0 = 0;

PORTB.7 = 0;

PORTD=0xFF;

DDRD=0x00;

UCSRB=0x98;

GICR|=0xC0;

GIFR=0xC0;

}

#ifndef RXB8

#define RXB8 1

#endif

#ifndef TXB8

#define TXB8 0

#endif

#ifndef UPE

#define UPE 2

#endif

#ifndef DOR

#define DOR 3

#endif

#ifndef FE

#define FE 4

#endif

#ifndef UDRE

#define UDRE 5

#endif

#ifndef RXC

#define RXC 7

#endif

#define FRAMING_ERROR (1<<FE)

#define PARITY_ERROR (1<<UPE)

#define DATA_OVERRUN (1<<DOR)

#define DATA_REGISTER_EMPTY (1<<UDRE)

#define RX_COMPLETE (1<<RXC)

#define RX_BUFFER_SIZE 8

char rx_buffer[RX_BUFFER_SIZE];

#if RX_BUFFER_SIZE <= 256

unsigned char rx_wr_index,rx_rd_index,rx_counter;

#else

unsigned int rx_wr_index,rx_rd_index,rx_counter;

#endif

bit rx_buffer_overflow;

// Обработка прерывания от последовательного канала

interrupt [USART_RXC] void usart_rx_isr(void)

{

char status,data;

status=UCSRA;

data=UDR;

if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)

{

rx_buffer[rx_wr_index++]=data;

#if RX_BUFFER_SIZE == 256

if (++rx_counter == 0)

{

#else

if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;

if (++rx_counter == RX_BUFFER_SIZE)

{

rx_counter=0;

#endif

rx_buffer_overflow=1;

}

}

// Запись данных с порта в массив

uart_data[i][j]=data;

j++;

if(j>2)

{

j=0;

i++;

if(i<=15) printf(".\rВведите %dй элемент ", i+1);

};

if(i>15)

{

i=0;

input_finished = 1;

};

}

#ifndef _DEBUG_TERMINAL_IO_

// Get a character from the USART Receiver buffer

#define _ALTERNATE_GETCHAR_

#pragma used+

char getchar(void)

{

char data;

while (rx_counter==0);

data=rx_buffer[rx_rd_index++];

#if RX_BUFFER_SIZE != 256

if (rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;

#endif

#asm("cli")

--rx_counter;

#asm("sei")

return data;

}

#pragma used-

#endif

void main(void)

{

volatile unsigned int tmp = 0;

volatile unsigned char mult = 100;

volatile unsigned int maxim = 0;

// инициализация параллельных портов

PORTB=0x00;

DDRB=0xFF;

PORTC = 0x00;

DDRC=0b00100000;

PORTD=0xFF;

DDRD=0x00;

// инициализация прерываний

GICR|=0xC0;

MCUCR=0x0A;

GIFR=0xC0;

// Инициализация USART

UCSRA=0x00;

UCSRB=0x98;

UCSRC=0x86;

UBRRH=0x00;

UBRRL=0x33;

#asm("sei")

while (1)

{

// опрос порта С, настройка скорости работы USART

if(mode == 0) {

switch(PINC) {

case 0b01000001: UBRRH=0x01; UBRRL=0xA0; PORTB.5 = 0; PORTB.4 = 0; PORTB.3 = 0; PORTB.2 = 0; PORTB.6 = 1; mode = 1; break; //19200 б/с

case 0b01000010: UBRRL=0xCF; PORTB.6 = 0; PORTB.4 = 0; PORTB.3 = 0; PORTB.2 = 0; PORTB.5 = 1; mode = 2; break; //9600 б/с

case 0b01000100: UBRRL=0x67; PORTB.5 = 0; PORTB.6 = 0; PORTB.3 = 0; PORTB.2 = 0; PORTB.4 = 1; mode = 3; break; //4800 б/с

case 0b01001000: UBRRL=0x33; PORTB.5 = 0; PORTB.4 = 0; PORTB.6 = 0; PORTB.2 = 0; PORTB.3 = 1; mode = 4; break; //2400 б/с

case 0b01010000: UBRRL=0x19; PORTB.5 = 0; PORTB.4 = 0; PORTB.3 = 0; PORTB.6 = 0; PORTB.2 = 1; mode = 5; break; //1200 б/с

};

if(mode != 0) {

printf("Если вы видите символы на русском языке,\rто скорость терминала равна заданной скорости USART ОМК.\rНачался ввод данных. Возможно введение только трехзначных чисел.\rВведите 1й элемент ");

};

};

if(input_finished == 1) { //ввод даных завершен

printf("\rВвод завершен. Обработка начата.");

for(i = 0;i<16;i++) {

for(j = 0;j<3;j++) { //приведение к двоичному виду

tmp = tmp+ mult*(uart_data[i][j] - 0x30);

mult = mult/10;

};

maxim = max[0]*256+max[1];

if(tmp>maxim) { //сравнение с уже имеющимся максимальным

max[1] = tmp; // замена текущего максимального

tmp = tmp >> 8;

max[0] = tmp;

};

tmp = 0;

mult = 100;

};

printf("\rОбработка завершена. Ожидается прерывание.\r");

input_finished = 0;

};

}

}