Программирование интеллектуального преобразователя сигнала

Автор работы: Пользователь скрыл имя, 22 Июня 2012 в 16:50, курсовая работа

Описание

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

Содержание

1. Интеллектуальные системы управления
Демо-пример Fuzzy Logic
2. Директивы и инструкции macro Assembler
Директива размещения данных (mov)
Директива арифметические операции (add, div, mul)
Директивы условных переходов macro Assembler (.IF, .ENDIF, ELSE)
Операторы цикла (Loop)
3. Проектирование интеллектуального преобразователя сигнала
3.1 Прототип программы на языке VBA
3.2 Прототип программы на языке С ++

Работа состоит из  1 файл

курсовая Н.Н.Н.Н.адо_2.doc

— 956.50 Кб (Скачать документ)


 

 

 

Курсовая работа

Дисциплина: «Системное программирование измерительных устройств»

Тема: «Программирование интеллектуального преобразователя сигнала»

 

Выполнил:

Студент гр.6-41(608546)

Земсков А.В.

Проверил:

Смуров Н.Н.

 

 

 

Содержание:

1.    Интеллектуальные системы управления

Демо-пример Fuzzy Logic

2.    Директивы и инструкции macro Assembler

Директива размещения данных (mov)

Директива арифметические операции (add, div, mul)

Директивы условных переходов macro Assembler (.IF, .ENDIF, ELSE)

Операторы цикла (Loop)

3.    Проектирование интеллектуального преобразователя сигнала

         3.1 Прототип программы на языке VBA

         3.2 Прототип программы на языке С ++

 

 

 

 

 

 

 

 

 

 

 

Введение

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

Задачи

1)     Разработка прототипа на языке VBA и C++

2)     Реализация программы на языке Assembler

3)     Анализ возможности создания комбинированной программы на языке C и Assembler

РАЗДЕЛ 1.

Современные интеллектуальные системы, основанные на правилах и их использование в технике.

Пример системы

Как видно из приведенной схемы данная система управления (следящая система) работает на следующих правилах:

Правило №1

Если уровень в норме заслонка регулятора без изменений.

Правило№2

Если уровень низкий заслонка регулятора полностью открыта.

Правило№3

Если уровень высокий, то заслонка регулятора полностью закрыта.

Правило №4

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

Правило№5

Если уровень в норме, но слегка уменьшается, то заслонку слегка открыть.

Как видно из примера в правилах участвуют лингвистические (словесные) значения переменных.

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

рис 1.

 

Рис 2.

На рис 2 изображено полученный результат математических  вычислений в отладчике ассемблер.

На рис 1 графически  изображен  результат математических  вычислений в виде графика exel. 

 

 

Результат вычислений

В данном проекте демо-системы используется центроидный метод дефозификации (приведение к одному числу) суть которого заключается в следующем: результаты отдельных вычислений агрегируются методом максимума. Например: рис вверху и находится центр тяжести полученной фигуры. В данном случае результат агрегирования есть один или несколько фигур треугольного вида, центр тяжести которых находится по формуле:

;

Площадь треугольников входящих в состав фигуры вычисляется по формуле:

;

Поскольку основания всех треугольников равны В1=В2=В3, тогда формулу можно преобразовать к виду:

;

Высоты треугольников проектируются по результатам вычислений входных величин. Как видно из условий нашего примера, сумма всех высот при любом входном сигнале равна 1. Окончательно формула преобразуется к виду:

;

Код VBA

 

Private Sub CommandButton1_Click()

Dim Simple(11), column1(11), column2(11), column3(11), i As Integer

For i = 0 To 10

Simple(i) = i

Cells(i + 1, 1) = Simple(i)

If Simple(i) < 5 Then

  column1(i) = 10 - 2 * Simple(i)

  Else

  column1(i) = 0

  End If

  Cells(i + 1, 2) = column1(i)

  Next i

  For i = 0 To 10

  Simple(i) = i

  If Simple(i) < 6 Then

  column2(i) = Simple(i) * 2

  Else

  column2(i) = 20 - 2 * Simple(i)

  End If

  Cells(i + 1, 3) = column2(i)

  Next i

  For i = 0 To 10

  Simple(i) = i

  If Simple(i) < 6 Then

  column3(i) = 0

  Else

  column3(i) = -(10 - 2 * Simple(i))

  End If

  Cells(i + 1, 4) = column3(i)

  Next i

End Sub

 

Код ассемблера, соответствующий вычислению результата:

.data

----------------

Xcenter db BSIZE dup(?)

x1 db 1

x2 db 3

x3 db 5

s1x1 db ?

s2x2 db ?

s3x3 db ?

mov ecx,BSIZE

mov bl, 0

mov edi, 0

nxt3:

mov ax,0

mov al,column1[edi]

mul x1

mov r,ax

mov al,byte PTR r

mov s1x1,al

mov al,column2[edi]

mul x2

mov r,ax

mov al,byte PTR r

mov s2x2,al

mov al,column3[edi]

mul x3

mov r,ax

mov al,byte PTR r

mov s3x3,al

mov al,s1x1

add al,s2x2

add al,s3x3

mov Xcenter[edi],al

add edi, 1

loop nxt3

 

 

 

Asembler

 

.386; процессор с системой команд не ниже 368

.model flat,stdcall; плоская модель памяти

option  casemap:none

BSIZE equ 11; константа

.data; раздел данных

simple db BSIZE dup(?); резервирование в памяти 11 байт и пометить меткой simple(с нулевым смещением в сегменте данных) числовое значение входной величины

k1=(0-1)*10/(5-0); целочисленные выражения (смотри в описании на стр. 7)

a1=10

k21=(1-0)*10/(5-0)

a21=0

k22=(0-1)*10/(10-5)

a22=(0-1)*10*(-5)/(10-5)+10

k33=2

a33=-10

r dw 0;означает, что при трансляции в окне данных, 2 пары цифр пропускается(далее данные колумн1)

column1 db BSIZE  dup(?); функция сампл (у1)

column2 db BSIZE dup(?); функция сампл (у2)

column3 db BSIZE dup(?); функция сампл (уз)

Xcenter db BSIZE dup(?)

x1 db 1

x2 db 3

x3 db 5

s1x1 db ?

s2x2 db ?

s3x3 db ?

.code; раздел кодов

start:

mov ecx,BSIZE; переместить в регистр есх значение константы bsize для организации цикла (смотри оператор loop)

mov bl,0; переместит 0 в младший байт регистра b, обнуляем младший байт регистра

mov edi,0; обнуление индексного регистра

nxt: ; метка возврата цикла для организации цикла с оператором LOOP NXT

mov simple[edi],bl; перемещаем bl в память помеченную меткой SIMPLE с дополнительным смещением edi

.IF bl<5; условие содержимое bl < 5, если меньше 5, то выполняется следующий оператор, иначе операторы после слова ELSE

mov al, k1; переместить в младший байт регистра a значение целочисленного выражения kl

mul bl; полученное выше умножаем на младший байт регистра b

mov r,ax;результат умножения байта на байт, дает размер слова (2 байта), поэтому результат помещается в 16ти разрядный регистра ах

mov al,byte PTR r; поместить младший байт регистра а из памяти помеч меткой r,  размером байт

add al,a1; добавить к содержимому регистра al значение целочисленного значения a1

mov column1 [edi],al; переместить COLUMN1 с дополнительным смещением [edi] в al

.else; директива цикла «иначе»

mov column1[edi],0

.ENDIF; директива окончания цикла

inc bl; оператор inc увеличивает операнду bl на единицу

.IF bl<5; условие содержимое bl < 5, если меньше 5, то выполняется следующий оператор, иначе операторы после слова ELSE

mov al, k21;переместить в младший байт регистра a значение целочисленного выражения  k21

mul bl; полученное выше умножаем на младший байт регистра b

mov r,ax; результат умножения байта на байт, дает размер слова (2 байта), поэтому результат помещается в 16ти разрядный регистра ах

mov al,byte PTR r; поместить младший байт регистра а из памяти помеч меткой r,  размером в байт

add al,a21; добавить к содержимому регистра al значение целочисленного выражения  а21

mov column2[edi],al; переместить в column2 с дополнительным смещением [edi] в al

.else; директива цикла “иначе”

mov al, k22;переместить в младший байт регистра a значение целочисленного выражения  k22

mul bl; полученное выше умножаем на младший байт регистра b

mov r,ax; результат умножения байта на байт, дает размер слова (2 байта), поэтому результат помещается в 16ти разрядный регистра ах

mov al,byte PTR r; поместить младший байт регистра а из памяти помеч меткой r,  размером в байт

add al,a22;добавить к содержимому регистра al значение целочисленного выражения  а22

mov column2 [edi],al; переместить COLUMN2 с дополнительным смещением [edi] в al

.ENDIF; директива окончания цикла

inc bl; оператор inc увеличивает операнда bl на единицу

add edi,1; переход к следующему числу

loop nxt; “метка” оператор цикла уменьшаем содержимое регистра есх на единицу и проверяем равно ли содержимое есх нулю, если не равен то переходит на метку, если равно то выходит из цикла

mov ecx,BSIZE

mov bl, 0

mov edi, 0

nxt2:

.IF bl < 5

mov column3[edi],0

.ELSE

mov al,k3

mul bl

mov r,ax

mov al,byte PTR r

add al,a3

mov column3[edi],al

.EndIf

inc bl

add edi, 1

loop nxt2

mov ecx,BSIZE

mov bl, 0

mov edi, 0

nxt3:

mov ax,0

mov al,column1[edi]

mul x1

mov r,ax

mov al,byte PTR r

mov s1x1,al

mov al,column2[edi]

mul x2

mov r,ax

mov al,byte PTR r

mov s2x2,al

mov al,column3[edi]

mul x3

mov r,ax

mov al,byte PTR r

mov s3x3,al

mov al,s1x1

add al,s2x2

add al,s3x3

mov Xcenter[edi],al

add edi, 1

loop nxt3

ret; выход

end start

 

 

 

 

 

Simple(i)

column1

column2

column3

xcenter

0

10

0

0

5

2

8

2

0

7

4

6

4

0

9

6

4

6

0

11

8

2

8

0

13

5

0

10

0

15

6

0

8

2

17

7

0

6

4

19

8

0

4

6

21

9

0

2

8

23

10

0

0

10

25

 

 

 

РАЗДЕЛ 2.

 

Директивы и инструкции Assembler используемые в курсовой работе

 

Целочисленные выражения используются для вычисления перед трансляцией, результат вычисления подставляется в соответствующие места программы.

Целочисленное выражение (integer expression) — это математическое выражение, составленное из целочисленных значений и арифметических операторов. В процессе вычисления такого выражения всегда получается целое 32-разрядное число, т.е. его значение находится в диапазоне 0—FFFFFFFFh. В таблице перечислены арифметические операторы с учетом порядка их выполнения — от старшего (1) к младшему (4).

                      Арифметические операции

Оператор              Название                 Порядок выполнения

   (   )                         Скобки                                                                      1

+ или -                   Унарный плюс или минус                            2

* или /                   Умножение или деление                            3

  MOD                   Остаток от деления                                          3

+ или -                   Сложение или вычитание                                 4

Пример из программы:

k21=(1-0)*10/(5-0)

a21=0

...

Из цикла:

MOV al,k21

MUL bl

MOV r,ax ; результат умножения байта на байт даёт размер 2 байта, ;поэтому этот результат помещается в 16 разрядный регистр ах

MOV al,BYTE PTR r ; поместить в младший байт регистра а из памяти ;помеченной меткой r размером в байт

ADD al,a21

MOV COLUMN2[edi],al

 

2.1 Директива размещения данных (mov)

MOV AX, BX    ; мнемокод с двумя операндами

Команда пересылки данных MOV копирует данные из одного операнда в другой, поэтому такие команды называются пересылкой данных.

Используются следующие формы команды MOV

MOV  reg, reg

MOV  mem, reg

MOV  mem, immed

MOV  reg, immed

где:

reg – любой регистр,

mem – указатель на место памяти

immed –непосредственное значение

В команде MOV нельзя использовать два операнда памяти. Для этого применяются регистры:

Пример: Перенести данные из переменной памяти var1 в переменную var2

MOV AX, var1

MOV var2,AX.

Размеры обоих операндов должны быть одинаковыми. Например, 16-разрядный регистр может быть послан только в 16-разрядный блок памяти.

Информация о работе Программирование интеллектуального преобразователя сигнала