Автор работы: Пользователь скрыл имя, 28 Января 2014 в 22:02, курсовая работа
На сегодняшний день производители микропроцессоров все больше и больше сближают их с однокристальными микроконтроллерами, сочетая в одном кристалле вычислительную мощь и возможность реализации функций контроля и управления. Использование микроконтроллеров в оборудовании позволяет повысить производительность, качество работы, помогает снизить затраты некоторых ресурсов. Даёт возможность решать сложные проблемы программного регулирования, существенно улучшает технические и экономические характеристики автоматизированного оборудования.
Введение 6
1 Обзор литературы. 7
2 Анализ технического задания. 12
3 Разработка структурной схемы системы и ее описание. 21
4 Разработка функциональной схемы системы и ее описание 24
4.1 Микроконтроллер ADuC812 24
4.2 Внешняя память E2PROM 25
4.3 Матричная клавиатура AK1604A-WWB 26
4.4 Жидкокристаллический индикатор WH1602B-NGK-CP 28
4.5 Часы реального времени PCF8583P 29
4.6 ПЛИС PM3064ATC100 30
4.7 Интерфейс RS232 (COM порт) 32
4.8 Интерфейс процессора с памятью 33
5 Разработка схемы электрической принципиальной системы и ее описание 36
6 Разработка программного обеспечения. 37
6.1 Разработка программы для микроконтроллера 37
6.1.1 Создание нового проекта 38
6.1.2 Резидентный загрузчик НЕХ202 38
6.1.3 Загрузка программ в лабораторный стенд SDK-1.1 39
6.1.4 Описание основной части кода программы для микроконтроллера 40
6.2 Разработка программы для ПК 42
Заключение. 44
Список использованных источников. 45
При включении питания происходит инициализация всех регистров специального назначения их значениями по умолчанию и на ЖКИ выводится надпись «SDK-1.1, 2001 ©LMT Ltd». Одновременно на звуковой излучатель выдается короткий сигнал.
После процедуры инициализации системы последовательный канал настраивается в режим 9600 бит/сек, 8 бит данных, 1 стоп-бит, нет контроля четности и в него выдается строчка «НЕХ202-ХХ», где XX — номер версии загрузчика. Далее с интервалом примерно в 200мс выдается символ ‘.’ и ожидается ответ программы-загрузчика, запускаемой на компьютере. После успешной загрузки программы управление передаётся этой программе.
Все передаваемые из лабораторного стенда символы можно наблюдать в терминальном режиме загрузчика T167.exe.
6.1.3 Загрузка программ в лабораторный стенд SDK-1.1
Для облегчения работы с
загрузчиком в директории проекта
создан пакетный файл RUN_T167.BAT. Этот файл
выполняет все необходимые
При выполнении этого командного файла в конец загрузочного файла, который обязательно должен быть в hex-формате, дописывается строка, обеспечивающая запуск программы с адреса 2100h. Затем открывается последовательный порт компьютера и настраивается для работы в 8-ми битном режиме работы на скорости обмена 9600 бит/с и загружается полученный в предыдущем пункте загрузочный файл во внешнюю память лабораторного стенда. Последнее, что выполняет командный файл RUN_T167.BAT – это переводит программу T167.exe в терминальный режим, в котором отображает на экране компьютера всю информацию, получаемую от лабораторного стенда по последовательному порту.
Для выхода из терминального режима загрузчика нужно нажать на кнопку клавиатуры компьютера ‘Esc’.
6.1.4 Описание основной части
кода программы для
Минимальная программа, не выполняющая никаких действий, для микроконтроллера выглядит следующим образом:
#include <ADuC812.h>
void main(void)
{
}
Возьмем данный код за основу нашего приложения и добавим в него необходимые функции.
Инициализация АЦП, таймеров и UART будет выполнена один раз, поэтому она не будет входить в основной цикл программы, а будет расположена сразу перед ним:
//-------Инициализация UART---
TH1 = 0xFD; // Скорость 9600 бит/с
TMOD = 0x20;// Таймер 1 в режиме autoreload
TCON = 0x40;// Запуск таймера 1
SCON = 0x50;// 8 bit UART, разрешение приема
PCON &= 0x7F;// Отключение удвоения скорости
TI = 1; // Флаги UART
RI = 1; // Transmit & Recive
EA =0x0;// UART interrupts only
// Настроить A/D to sequentially convert each input channel.
ADCCON1 = 0x7C; // 0111 1100
Так как микроконтроллер
не имеет своей операционной системы,
возникает необходимость
do
{
…// здесь будет расположена большая часть кода
}
While(1)
В основном цикле программы будут выполняться следующие действия:
Это минимально необходимые
действия для нормального
unsigned int conv_val = 0;
unsigned char channel = 0;
unsigned char c=0;
if (ScanKBOnce(&c))
NumChanel=chrtoint(c);
if (NumChanel>8)// каналы больше 8го не обрабатываем
NumChanel=255;
if (NumChanel!=255)// 255 - ошибка выбора канала
{
// начать преобразование и дождаться завершения
ADCCON2 = (ADCCON2 & 0xF0) | NumChanel;
SCONV = 1;
while (ADCCON3 & 0x80);
// Чтение A/D данных
channel = ADCDATAH >> 4;
conv_val = ADCDATAL | ((ADCDATAH & 0x0F) << 8);
// вывод на терминал
if (NumChanel==8)
{
value2= (675-conv_val*0.61)/3;
printf ("ADC Channel %d = %f C\n", NumChanel,value2);
}else
{
printf ("ADC Channel %d = 0x%X\n", NumChanel,conv_val);
}
}else
{
printf("Error selection channel\n");
}
// выведем оцифрованное значение
/*
зажигаем светодиот соответствующий номеру канала
который в данный момент оцифровываем
*/
svet=convert(NumChanel,0);
WriteMax(0x7,svet);//вывод на светодиды
for(pause=0;pause<=64000;
Полный листинг программы, а также доработанная версия с использованием таймера/счетчика (с подробными комментариями описания каждого участка программы) приведены в приложении А.
6.2 Разработка программы для ПК
Компьютерная программа должна выполнять следующие функции:
Всеми вышеприведенными
функциями обладает уже созданное
программное обеспечение Termin
Данная программа позволяет выполнять не только вышеприведенные действия но и некоторые другие, такие как отображение принятой информации в графическом виде, задание различных параметров сопряжения и т.д.
Terminal - простая программа эмуляции терминала последовательного порта (COM). Она может использоваться для соединения с различными устройствами, такими как модемы, маршрутизаторы, встроенные uC системы, телефоны GSM... Это очень полезное средство отладки для приложений последовательной передачи.
Данное ПО полностью устраивает требования задания курсового проекта. Поэтому для записи на ЖМД будем использовать её.
Для сопряжения стенда и ПК необходимо задать правильные настройки программы:
Рисунок 19. Главное окно программы Terminal
После того как все настройки были выставлены можно подключаться к стенду, для этого служит кнопка «Connect».
Для того что бы данные записывались на диск нужно нажать кнопку «StartLog», после этого появится окно выбора файла, в который и будут сохраняться принятые данные.
Заключение.
В данном курсовом проекте была разработана система накопления данных, которая предназначена для оцифровки данных, поступающих с генератора звуковых частот, и записи их на жесткий магнитный диск. Данные записываются в файл, имя файла задает оператор, со служебной информацией, такой как время начала/конца оцифровки и номера оцифрованного канала. Спроектированная система организована с помощью учебного стенда SDK-1.1 на базе микроконтроллера ADuC812 с ядром MCS51 и расширителя SDX-09.
Разработка проектируемой системы состоит из двух этапов:
Результатом первого этапа разработки является принципиальная электрическая схема системы сбора данных. В процессе этого этапа первоначально была разработана структурная и функциональная схемы и изучена элементная база для построения требуемой системы.
На втором этапе был разработан алгоритм управления, который затем был реализован в виде программы на языке C#. Была написана программа непосредственно для стенда и выбрана программа для сохранения получаемых данных на компьютере.
Список использованных источников.
Приложение А
Листинг доработанной программы для микроконтроллера
#include <ADuC812.h>
#include <stdio.h>
#define MAXBASE 0x8
#define MyData 0x3
#define KB 0x0
/*
То, что эта ячейка памяти находится во внешней
памяти данных показывает уточняющее слово “xdata”,
*/
unsigned int xdata conv_val[127] = 0;// массив из 128 элементов
unsigned short CountMas = 127;// кол-во элементов в массиве
unsigned int IndexMas = 0;
char KBTable[]="147*2580369#ABCD";
unsigned int NumChanel = 8;// номер канала для оцифровки
unsigned int OldChanel = 8;// номер канала для оцифровки
//****************************
//Функция записи значения регистра regnum.
/*
входные данные:
*regnum - адрес регистра
val - записываемое значение
возвращаемый результат:
отсутствует
*/
void WriteMax(unsigned char xdata *regnum, unsigned char val)
{
unsigned char oldDPP=DPP;
DPP=MAXBASE;
*regnum=val;
DPP=oldDPP;
}
//Функция чтения значения регистра regnum.
/*
входные данные:
*regnum - адрес регистра
возвращаемый результат:
значения регистра
*/
unsigned char ReadMax(unsigned char xdata *regnum)
{
unsigned char oldDPP=DPP;
unsigned char val=0;
DPP=MAXBASE;
val=*regnum;
DPP=oldDPP;
return val;
}
//****************************
//Функция реализующая опрос клавиатуры.
/*
входные данные:
*ch - адрес буфера куда будет записан прочитанный результат
возвращаемый результат:
0 - в случае если нажатия не было
1 - нажатие было
*/
bit ScanKBOnce(char *ch)
{
unsigned char row,col,rownum,colnum;
unsigned int i;
//Сканирование производится по "столбцам" клавиатуры, на которые подается
//"бегущий 0".
for(colnum = 0; colnum < 4; colnum++)
{
col = 0x1 << colnum; //0001, 0010, 0100, 1000, 0001, ...
WriteMax(KB, ~col); //11111110, 11111101, 11111011, 11110111, 11111110, ...
//При подаче нуля на очередной столбец на каждом из "рядов" проверяется
//наличие нуля (факт замыкания контакта клавишей)
for(rownum = 0; rownum < 4; rownum++)
{
row = ReadMax(KB) & (0x10 << rownum);
if( !row ) //Обнаружено нажатие клавиши:
{
for(i = 0; i<10000; i++)continue;//проверка на дребезг контакта:
//через примерно 40мс повтор сканирования той же клавиши
row = ReadMax(KB) & (0x10 << rownum);
if( !row )
{
*ch = (KBTable[(colnum<<2) + rownum]);
return 1; //Стабильное нажатие клавиши
}
}
}
}
return 0; //Ни одна клавиша не нажата
}
//****************************
// функция преобразует символ в число
/*
входные данные:
ch - символ, который необходимо преобразовать
возвращаемый результат:
255 - в случае если передана не цифра(код ошибки)
либо преобразованную цифру(0,1,2...,9)
*/
unsigned int chrtoint(char ch)
{
char Digits[]="0123456789";
unsigned int sym;
for (sym=0;sym<=9;sym++)
{
if (Digits[sym]==ch)
{
return sym;
}
}
return 255;// ошибка
}
//****************************
unsigned char ReadEXTRAM(unsigned char xdata *adr)
{
unsigned char oldDPP=DPP;
unsigned char val=0;
DPP=MyData;
val=*adr;
DPP=oldDPP;
return val;
}
void WriteEXTRAM(unsigned char xdata *adr,unsigned char val)
{
unsigned char oldDPP=DPP;
DPP=MyData;// третья страница памяти
*adr=val;
DPP=oldDPP;// возвращаем старое значение
}
// передача данных на ПК
/*
описание:
передает, через UART, массив(conv_val) с сохраненными, в нем до этого, значениями
входные данные:
отсутствуют
возвращаемый результат:
отсутствует
*/
void WriteToUART(unsigned short count)
{
unsigned short i;// счетчик
unsigned short tmp=0;
printf ("ADC Channel: %d\nData start:\n", NumChanel);// номер канала и служебное слово
for (i=0;i<=count;i++)
{
tmp=ReadEXTRAM(i);
//val=conv_val[i];
printf ("%d\n", tmp);// передача данных
}
printf ("Data stop\n");// конец вывода данных
}
// запись значения во внешенее ОЗУ
/*
описание:
записывает входное значение в массив,хранящейся во внешнем ОЗУ
входные данные:
Value - записываемое значение
Channel - номер канала с которого было получено значение,
необходимо для вывода сохраненных до этого значений при смене канала оцифровки
возвращаемый результат:
отсутствует
<p class="dash041e_0431_044b_