Курсовая работа (т): Разработка схемы микропроцессорной системы

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

2.      Отображение принятых данных на экране;

.        Запись принятых данных на ЖМД;

.        Запись служебных данных на ЖМД.

Всеми вышеприведенными функциями обладает уже созданное программное обеспечение Terminal.

Данная программа позволяет выполнять не только вышеприведенные действия но и некоторые другие, такие как отображение принятой информации в графическом виде, задание различных параметров сопряжения и т.д. Terminal - простая программа эмуляции терминала последовательного порта (COM). Она может использоваться для соединения с различными устройствами, такими как модемы, маршрутизаторы, встроенные uC системы, телефоны GSM... Это очень полезное средство отладки для приложений последовательной передачи.

Данное ПО полностью устраивает требования задания курсового проекта. Поэтому для записи на ЖМД будем использовать её.

Для сопряжения стенда и ПК необходимо задать правильные настройки программы:

·    Com port - порт к которому подключен стенд;

·        Baud rate - скорость передачи данных, выставить в 9600;

·        Data bits - кол-во бит данных, выставить 8;

·        Parity - бит паритета, неиспользуется(none).

Рисунок 19. Главное окно программы Terminal

После того как все настройки были выставлены можно подключаться к стенду, для этого служит кнопка «Connect».

Для того что бы данные записывались на диск нужно нажать кнопку «StartLog», после этого появится окно выбора файла, в который и будут сохраняться принятые данные.

Заключение

В данном курсовом проекте была разработана система накопления данных, которая предназначена для оцифровки данных, поступающих с генератора звуковых частот, и записи их на жесткий магнитный диск. Данные записываются в файл, имя файла задает оператор, со служебной информацией, такой как время начала/конца оцифровки и номера оцифрованного канала. Спроектированная система организована с помощью учебного стенда SDK-1.1 на базе микроконтроллера ADuC812 с ядром MCS51 и расширителя SDX-09.

Разработка проектируемой системы состоит из двух этапов:

1)  описание аппаратной части;

2)  разработка программного обеспечения.

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

На втором этапе был разработан алгоритм управления, который затем был реализован в виде программы на языке C#. Была написана программа непосредственно для стенда и выбрана программа для сохранения получаемых данных на компьютере.

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

1.   Конспект лекций.

2.   Справочные материалы по интегрированной среде программирования keil-C.

3.      С. Бобровский “Самоучитель программирования на языке С++ в системе Borland C++ Builder 4.0 ”, десс inforcom press, Москва 1999

.        П. Киммел и др. “Borland C++ 5”: пер. с англ. - СПб.: BHV - Санкт-Петербург, 1999. - 976 с., ил.

5.      www.sibsitus.nsk.ru/~mavr

.        Микропроцессорный комплекс SDK 1.1. Архитектура и программирование: учебное пособие /Е.В. Бурькова, А.С. Бобровский - Оренбург, ГОУ ОГУ, 2009г - 107с.

Приложение А

Листинг доработанной программы для микроконтроллера

#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;KBTable[]="147*2580369#ABCD"; int NumChanel = 8;// номер канала для оцифровки

unsigned int OldChanel = 8;// номер канала для оцифровки

//***********************************************************//

//Функция записи значения регистра regnum.

/*

входные данные:

*regnum - адрес регистра

val - записываемое значение

возвращаемый результат:

отсутствует

*/

void WriteMax(unsigned char xdata *regnum, unsigned char val)

{char oldDPP=DPP;=MAXBASE;

*regnum=val;

DPP=oldDPP;

}

//Функция чтения значения регистра regnum.

/*

входные данные:

*regnum - адрес регистра

возвращаемый результат:

значения регистра

*/char ReadMax(unsigned char xdata *regnum)

{char oldDPP=DPP;char val=0;=MAXBASE;=*regnum;=oldDPP; val;

}

//**********************************************************//

//Функция реализующая опрос клавиатуры.

/*

входные данные:

*ch - адрес буфера куда будет записан прочитанный результат

возвращаемый результат:

- в случае если нажатия не было

- нажатие было

*/

bit ScanKBOnce(char *ch)

{

unsigned char row,col,rownum,colnum; int i;

//Сканирование производится по "столбцам" клавиатуры, на которые подается

//"бегущий 0".(colnum = 0; colnum < 4; colnum++)

{= 0x1 << colnum; //0001, 0010, 0100, 1000, 0001, ...(KB, ~col); //11111110, 11111101, 11111011, 11110111, 11111110, ...

//При подаче нуля на очередной столбец на каждом из "рядов" проверяется

//наличие нуля (факт замыкания контакта клавишей)

for(rownum = 0; rownum < 4; rownum++)

{= ReadMax(KB) & (0x10 << rownum);( !row ) //Обнаружено нажатие клавиши:

{

for(i = 0; i<10000; i++)continue;//проверка на дребезг контакта:

//через примерно 40мс повтор сканирования той же клавиши

row = ReadMax(KB) & (0x10 << rownum);( !row )

{

*ch = (KBTable[(colnum<<2) + rownum]); 1; //Стабильное нажатие клавиши

}

}

}

}

return 0; //Ни одна клавиша не нажата

}

//********************************************************//

// функция преобразует символ в число

/*

входные данные:

ch - символ, который необходимо преобразовать

возвращаемый результат:

- в случае если передана не цифра(код ошибки)

либо преобразованную цифру(0,1,2...,9)

*/

unsigned int chrtoint(char ch)

{Digits[]="0123456789";int sym;(sym=0;sym<=9;sym++)

{(Digits[sym]==ch)

{sym;

}

}255;// ошибка

}

//***********************************************************//char ReadEXTRAM(unsigned char xdata *adr)

{char oldDPP=DPP;char val=0;=MyData;=*adr;=oldDPP;val;

}WriteEXTRAM(unsigned char xdata *adr,unsigned char val)

{  char oldDPP=DPP;=MyData;// третья страница памяти

*adr=val;

DPP=oldDPP;// возвращаем старое значение

}

// передача данных на ПК

/*

описание:

передает, через UART, массив(conv_val) с сохраненными, в нем до этого, значениями

входные данные:

отсутствуют

возвращаемый результат:

отсутствует

*/WriteToUART(unsigned short count)

{  short i;// счетчикshort tmp=0;("ADC Channel: %d\nData start:\n", NumChanel);// номер канала и служебное слово(i=0;i<=count;i++)

{=ReadEXTRAM(i);

//val=conv_val[i]; ("%d\n", tmp);// передача данных

}

printf ("Data stop\n");// конец вывода данных

}

// запись значения во внешенее ОЗУ

/*

описание:

записывает входное значение в массив,хранящейся во внешнем ОЗУ

входные данные:

Value - записываемое значение

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

отсутствует

*/

void WriteValue(unsigned short Value,unsigned short Channel)

{

if (Channel!=OldChanel)// если был сменен канал нужно вывести данные

{

WriteToUART(--IndexMas);// вывод

IndexMas=0;// данные выведены можно заполнять массив сначала

}

WriteEXTRAM(IndexMas,Value);// пишем во внешнее ОЗУ

//conv_val[IndexMas]=Value;// пишем данные во внешнее ОЗУ

IndexMas++;// увеличиваем индекс

if (IndexMas>=CountMas)// Проверяем не конец ли это массива

{

WriteToUART(--IndexMas);// если массив заполнен выведем данные

IndexMas=0;// данные выведены можно заполнять массив сначала

}

}

//***********************************************************//

/*

описание:

основная часть программы на которую после загрузки попадает управление

входные данные:

отсутствуют

возвращаемый результат:

отсутствует

*/main(void)

{grad = 0; char c=0;char svet = 0;short tmpVal = 0;

//-------Инициализация UART-----------1 = 0xFD;// Скорость 9600 бит/с

TMOD = 0x20;// Таймер 1 в режиме autoreload

TCON = 0x40;// Запуск таймера 1

SCON = 0x50;// 8 bit UART, разрешение приема

PCON &=0x7F;// Отключение удвоения скорости

TI = 1; // Флаги UART

RI  = 1; // Transmit & Recive

// инициализация таймера Т0

TCON &=0xC0; //T0 stop.

TMOD &=0xF0; //сброс настроек T0.

TMOD |=0x01; //установка T0 в режим T 16-bit

TL0 = 0xFE; //задержка

TH0 = 0x32; //

IE = 0x9A; //UART enable

// Настроить A/D to sequentially convert each input channel.= 0x7C;|=0x10; //запуск T0

{ (!TF0);&=0xC0; //остановим T0

//******************************************************//(ScanKBOnce(&c))=chrtoint(c);

/*

зажигаем светодиот соответствующий номеру канала

который в данный момент оцифровываем

*/

if (NumChanel<9)

/*

для объединения бит в одно число использована операция

логического суммирования(|=), а для указания номера бита -

сдвиг(<<) единицы влево на необходимое число разрядов(NumChanel)

*/

svet=(1<<(NumChanel-1));

else

svet=255;// неправильно выбран канал

WriteMax(0x7,svet);//Зажигаем светодиоды

if (NumChanel<9)

{

// начать преобразование и дождаться завершения

ADCCON2 = (ADCCON2 & 0xF0) | NumChanel;

SCONV = 1;(ADCCON3 & 0x80);

// Чтение A/D данных= ADCDATAL | ((ADCDATAH & 0x0F) << 8);

// вывод на терминал (NumChanel==8)// если номер канала равен восьмому

{ // то нужно преобразовать полученное значение в понятное для человека(в температуру)

grad = (675-tmpVal*0.61)/3;

WriteValue(grad,NumChanel);// запишем значение

}else

WriteValue(tmpVal,NumChanel);// запишем значение

}else

printf ("Error selection channel\n");// скажем что неверно выбран канал

OldChanel=NumChanel;// для отслеживания изменения канала

//***********************************************************//

// повторная настройка таймера и его запуск

TL0 = 0xFE; //задержка

TH0 = 0x32; //

TCON |=0x10; //запуск T0

}// do

while(1);// бесконечный цикл

}

ASSEMBLY LISTING OF GENERATED OBJECT CODE

; FUNCTION _WriteMax (BEGIN)

; SOURCE LINE # 28

;---- Variable 'val' assigned to Register 'R5' ----

;---- Variable 'regnum' assigned to Register 'DPTR' ----

8F82 MOV DPL,R7

8E83 MOV DPH,R6

; SOURCE LINE # 29

; SOURCE LINE # 30

;---- Variable 'oldDPP' assigned to Register 'R7' ----

AF84 MOV R7,DPP

; SOURCE LINE # 31

; SOURCE LINE # 32

ED MOV A,R5

A F0 MOVX @DPTR,A

; SOURCE LINE # 33

B 8F84 MOV DPP,R7

; SOURCE LINE # 34

D 22 RET

; FUNCTION _WriteMax (END)

; FUNCTION _ReadMax (BEGIN)

; SOURCE LINE # 42

;---- Variable 'regnum' assigned to Register 'DPTR' ----

8F82 MOV DPL,R7

8E83 MOV DPH,R6

; SOURCE LINE # 43

; SOURCE LINE # 44

;---- Variable 'oldDPP' assigned to Register 'R7' ----

AF84 MOV R7,DPP

; SOURCE LINE # 45

;---- Variable 'val' assigned to Register 'R6' ----

; SOURCE LINE # 46

758408 MOV DPP,#08H

; SOURCE LINE # 47

E0 MOVX A,@DPTR

; SOURCE LINE # 48

A 8F84 MOV DPP,R7

; SOURCE LINE # 49

C FF MOV R7,A

; SOURCE LINE # 50

D ?C0002:

D 22 RET

; FUNCTION _ReadMax (END)

; FUNCTION _ScanKBOnce (BEGIN)

; SOURCE LINE # 60

8B00 R MOV ch,R3

8A00 R MOV ch+01H,R2

8900 R MOV ch+02H,R1

; SOURCE LINE # 61

; SOURCE LINE # 66

;---- Variable 'colnum' assigned to Register 'R4' ----

E4 CLR A

FC MOV R4,A

?C0003:

; SOURCE LINE # 67

; SOURCE LINE # 68

7401 MOV A,#01HCOMPILER V9.00 HELLO 12/30/2010 14:08:56 PAGE 7

A A804 MOV R0,AR4

C 08 INC R0

D 8002 SJMP ?C0045

F ?C0044:

F C3 CLR C

33 RLC A

?C0045:

D8FC DJNZ R0,?C0044

;---- Variable 'col' assigned to Register 'R7' ----

; SOURCE LINE # 69

F4 CPL A

FD MOV R5,A

E4 CLR A

FF MOV R7,A

FE MOV R6,A

120000 R LCALL _WriteMax

; SOURCE LINE # 72

;---- Variable 'rownum' assigned to Register 'R5' ----

B E4 CLR A

C FD MOV R5,A

D ?C0006:

; SOURCE LINE # 73

; SOURCE LINE # 74

D E4 CLR A

E FF MOV R7,A

F FE MOV R6,A

120000 R LCALL _ReadMax

7410 MOV A,#010H

A805 MOV R0,AR5

08 INC R0

8002 SJMP ?C0047

A ?C0046:

A C3 CLR C

B 33 RLC A

002C ?C0047:

C D8FC DJNZ R0,?C0046

002E 5F ANL A,R7

F FF MOV R7,A

;---- Variable 'row' assigned to Register 'R7' ----

; SOURCE LINE # 75

7036 JNZ ?C0008

; SOURCE LINE # 76

; SOURCE LINE # 77

;---- Variable 'i' assigned to Register 'R2/R3' ----

FB MOV R3,A

FA MOV R2,A

?C0010:

?C0012:

0B INC R3

BB0001 CJNE R3,#00H,?C0048

0A INC R2

?C0048:

BA27F8 CJNE R2,#027H,?C0010

C BB10F5 CJNE R3,#010H,?C0010

F ?C0011:

; SOURCE LINE # 79

F E4 CLR A

FF MOV R7,A

FE MOV R6,A

120000 R LCALL _ReadMax

7410 MOV A,#010H

A805 MOV R0,AR5COMPILER V9.00 HELLO 12/30/2010 14:08:56 PAGE 8

08 INC R0

A 8002 SJMP ?C0050

C ?C0049:

C C3 CLR C

D 33 RLC A

004E ?C0050:

E D8FC DJNZ R0,?C0049

0050 5F ANL A,R7

; SOURCE LINE # 80

7015 JNZ ?C0008

; SOURCE LINE # 81

; SOURCE LINE # 82

EC MOV A,R4

25E0 ADD A,ACC

25E0 ADD A,ACC

2D ADD A,R5

2400 R ADD A,#LOW KBTable

B F8 MOV R0,A

005C E6 MOV A,@R0

D AB00 R MOV R3,ch

005F AA00 R MOV R2,ch+01H

A900 R MOV R1,ch+02H

120000 E LCALL ?C?CSTPTR

; SOURCE LINE # 83

D3 SETB C

22 RET

; SOURCE LINE # 84

; SOURCE LINE # 85

; SOURCE LINE # 86

?C0008:

0D INC R5

BD04B1 CJNE R5,#04H,?C0006

; SOURCE LINE # 87

C ?C0005:

C 0C INC R4

D EC MOV A,R4

E 6404 XRL A,#04H

7096 JNZ ?C0003

?C0004:

; SOURCE LINE # 88

C3 CLR C

; SOURCE LINE # 89

?C0014:

22 RET

; FUNCTION _ScanKBOnce (END)

; FUNCTION _chrtoint (BEGIN)

; SOURCE LINE # 99

8F00 R MOV ch,R7

; SOURCE LINE # 100

; SOURCE LINE # 101

7800 R MOV R0,#LOW Digits

7C00 R MOV R4,#HIGH Digits

7D00 MOV R5,#00H

7BFF MOV R3,#0FFH

A 7A00 R MOV R2,#HIGH _?ix1000

C 7900 R MOV R1,#LOW _?ix1000

000E 7E00 MOV R6,#00H

7F0B MOV R7,#0BH

0012 120000 E LCALL ?C?COPY

; SOURCE LINE # 103

;---- Variable 'sym' assigned to Register 'R6/R7' ----COMPILER V9.00 HELLO 12/30/2010 14:08:56 PAGE 9

E4 CLR A

FF MOV R7,A

FE MOV R6,A

?C0015:

; SOURCE LINE # 104

; SOURCE LINE # 105

7400 R MOV A,#LOW Digits

A 2F ADD A,R7

B F8 MOV R0,A

C E6 MOV A,@R0

D B50001 R CJNE A,ch,?C0017

; SOURCE LINE # 106

; SOURCE LINE # 107

22 RET

; SOURCE LINE # 108

; SOURCE LINE # 109

?C0017:

0F INC R7

0022 BF0001 CJNE R7,#00H,?C0051

0E INC R6

0026 ?C0051:

EF MOV A,R7

640A XRL A,#0AH

4E ORL A,R6

A 70EC JNZ ?C0015

C ?C0016:

; SOURCE LINE # 110

C 7E00 MOV R6,#00H

E 7FFF MOV R7,#0FFH

; SOURCE LINE # 111

?C0019:

22 RET

; FUNCTION _chrtoint (END)

; FUNCTION _ReadEXTRAM (BEGIN)

; SOURCE LINE # 113

;---- Variable 'adr' assigned to Register 'DPTR' ----

8F82 MOV DPL,R7

8E83 MOV DPH,R6

; SOURCE LINE # 114

; SOURCE LINE # 115

;---- Variable 'oldDPP' assigned to Register 'R7' ----

AF84 MOV R7,DPP

; SOURCE LINE # 116

;---- Variable 'val' assigned to Register 'R6' ----

; SOURCE LINE # 117

758403 MOV DPP,#03H

; SOURCE LINE # 118

E0 MOVX A,@DPTR

; SOURCE LINE # 119

A 8F84 MOV DPP,R7

; SOURCE LINE # 120

C FF MOV R7,A

; SOURCE LINE # 121

D ?C0020:

D 22 RET

; FUNCTION _ReadEXTRAM (END)

; FUNCTION _WriteEXTRAM (BEGIN)

; SOURCE LINE # 122

;---- Variable 'val' assigned to Register 'R5' ----

;---- Variable 'adr' assigned to Register 'DPTR' ----COMPILER V9.00 HELLO 12/30/2010 14:08:56 PAGE 10

8F82 MOV DPL,R7

8E83 MOV DPH,R6

; SOURCE LINE # 123

; SOURCE LINE # 124

;---- Variable 'oldDPP' assigned to Register 'R7' ----

AF84 MOV R7,DPP

; SOURCE LINE # 125

758403 MOV DPP,#03H

; SOURCE LINE # 126

ED MOV A,R5

A F0 MOVX @DPTR,A

; SOURCE LINE # 127

B 8F84 MOV DPP,R7

; SOURCE LINE # 128

D 22 RET

; FUNCTION _WriteEXTRAM (END)

; FUNCTION _WriteToUART (BEGIN)

; SOURCE LINE # 138

8E00 R MOV count,R6

8F00 R MOV count+01H,R7

; SOURCE LINE # 139

; SOURCE LINE # 141

E4 CLR A

F500 R MOV tmp,A

F500 R MOV tmp+01H,A

; SOURCE LINE # 142

7BFF MOV R3,#0FFH

B 7A00 R MOV R2,#HIGH ?SC_0

D 7900 R MOV R1,#LOW ?SC_0

F 850000 E MOV ?_printf?BYTE+03H,NumChanel

850000 E MOV ?_printf?BYTE+04H,NumChanel+01H

120000 E LCALL _printf

; SOURCE LINE # 143

E4 CLR A

F500 R MOV i,A

B F500 R MOV i+01H,A

D ?C0022:

D D3 SETB C

E E500 R MOV A,i+01H

9500 R SUBB A,count+01H

E500 R MOV A,i

9500 R SUBB A,count

5025 JNC ?C0023

; SOURCE LINE # 144

; SOURCE LINE # 145

AE00 R MOV R6,i

A AF00 R MOV R7,i+01H

C 120000 R LCALL _ReadEXTRAM

F 750000 R MOV tmp,#00H

8F00 R MOV tmp+01H,R7

; SOURCE LINE # 147

7BFF MOV R3,#0FFH

7A00 R MOV R2,#HIGH ?SC_29

7900 R MOV R1,#LOW ?SC_29

A 850000 E MOV ?_printf?BYTE+03H,tmp

D 850000 E MOV ?_printf?BYTE+04H,tmp+01H

120000 E LCALL _printf

; SOURCE LINE # 148

0500 R INC i+01H

E500 R MOV A,i+01H

70D4 JNZ ?C0022COMPILER V9.00 HELLO 12/30/2010 14:08:56 PAGE 11

0500 R INC i

B ?C0052:

B 80D0 SJMP ?C0022

D ?C0023:

; SOURCE LINE # 149

D 7BFF MOV R3,#0FFH

F 7A00 R MOV R2,#HIGH ?SC_33

7900 R MOV R1,#LOW ?SC_33

020000 E LJMP _printf

; FUNCTION _WriteToUART (END)

; FUNCTION _WriteValue (BEGIN)

; SOURCE LINE # 162

8E00 R MOV Value,R6

8F00 R MOV Value+01H,R7

;---- Variable 'Channel' assigned to Register 'R4/R5' ----

; SOURCE LINE # 163

; SOURCE LINE # 164

ED MOV A,R5

6500 R XRL A,OldChanel+01H

7003 JNZ ?C0053

EC MOV A,R4

A 6500 R XRL A,OldChanel

C ?C0053:

C 6014 JZ ?C0026

; SOURCE LINE # 165

; SOURCE LINE # 166

E E500 R MOV A,IndexMas+01H

1500 R DEC IndexMas+01H

Источник: https://www.bibliofond.ru/detail.aspx?id=724323