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

Автор работы: Пользователь скрыл имя, 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 Кб (Скачать документ)

Примеры команды MOV со всеми типами операндов:

.386

.model  flat,stdcall

.DATA

  count  DB    10

  total    DW   4125h

  bigVal  DD   12345678H

.code

start:

   MOV  AL, BL                ; 8-ми разрядный регистр в регистр.

   MOV  BL,count              ; 8-ми разрядный блок памяти в регистр.

   MOV  count, 26              ; 8  разрядов непосредственно в память.

   MOV  BL, 1                    ; 8  разрядов непосредственно в регистр..

   MOV  DX, CX                ; 16-ми разрядный регистр в регистр

   MOV  BX, 8FE2h           ; 16  разрядов непосредственно в регистр

   MOV  total, 1000h          ; 16  разрядов непосредственно в память

   MOV  EAX, EBX           ; 32-ми разрядный регистр в регистр

   MOV  EDX, bigval         ; 32-ми разрядный блок памяти в регистр

ret

end start

 

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

Команда ADD

Команда add складывает операнд-отправитель и операнд-получатель одинакового размера. Команда имеет следующий синтаксис.

ADD операнд-получатель, операнд-отправитель

Исходный операнд-отправитель не изменяется в процессе выполнения команды, а целевому операнду-получателю присваивается значение суммы. Размеры операндов должны быть одинаковыми, и только один операнд может быть операндом памяти.
ADD CL,AL              ; Суммирует два 8-разрядных регистра.

ADD EAX,EDX              ; Суммирует 32-разрядные регистры.

ADD BX,1000h              ; Суммирует непосредственное значение с 16-разрядным ;регистром.

ADD varl,AX              ; Суммирует 16-разрядный регистр с операндом в памяти.

ADD DX,varl              ; Суммирует 16-разрядный операнд в памяти с регистром.

ADD varl,10              ; Суммирует непосредственную величину с ;операндом  в ;памяти.

ADD DWORD PTR memVal, ECX

Оператор DWORD PTR определяет 32-разрядный операнд в памяти.

С помощью команды ADD складываются операнды только одинакового размера.

                                                                    Деление

                                           Инструкции процессора div <операнд>.

div  выполняет несколько различных операций деления. Все зависит от типа аргумента инструкции div, то есть делителя. Если аргументом служит байт, как, например, в инструкции div bl, то процессор поделит число в регистре ах на bl и запишет частное от деления в регистр al, а остаток — в регистр ah.

Если аргумент команды div— слово (например, div bx), то процессор поделит число, старшие биты которого хранит регистр dx, а младшие — ах. После деления частное окажется в регистре ах, а остаток — в регистре dx.

И наконец, если делитель — двойное слово, как в инструкции div ebx, то процессор считает, что делимое хранится в двух двойных словах. Старшие биты делимого он возьмет из edx, младшие — из еах, а после деления частное окажется в еах, а остаток — в edx.

                                                              Умножение               

                                          Инструкции процессора mul <операнд>.

mul  выполняет несколько различных операций умножения. Все зависит от типа операнда инструкции mul. Если операнд  байт, как, например, в инструкции mul bl, то процессор умножит число операнд на  аl и запишет результат в регистр aх.

Если аргумент команды— слово (например, mul bx), то процессор умножит операнд на ах, а результат поместит в регистр еаx.

И наконец, если операнд — двойное слово, как в инструкции mul ebx, то процессор поместит результат в edx:eax. Старшие биты в  edx, а младшие — из еах.

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

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

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

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

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

Ветвление с помощью условных директив .IF , .ELSE , .ENDIF

Таких инструкций процессора не существует. Встретив эти директивы, ассемблер превратит их в команды процессора - cmp, jnz, jmp. Эти директивы часто встречаются во многих исходных текстах и в целом не нарушают однозначного соответствия между исходным текстом на ассемблере и последовательностью инструкций процессора

Условия в директиве .IF:

!=              не равно

>              больше

>=              больше или равно

<              меньше

<=              меньше или равно

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

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

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

MUL bl

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

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

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

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

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

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

MUL bl

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

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

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

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

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

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

                                           Инструкция lоор <метка>.

При выполнении инструкции loop процессор уменьшает на единицу регистр сх и проверяет, не равен ли он нулю. Если сх = 0, выполняется следующая после lоор инструкция. Если нет — процессор переходит к указанной метке.

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

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

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

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

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

MUL bl

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

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

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

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

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

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

MUL bl

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

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

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

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

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

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

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

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

 

 

 

 

 

РАЗДЕЛ 3.

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

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

Private Sub CommandButton1_Click()

Dim Simple(11), column1(11), column2(11), column3(11), Xc(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)

  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)

  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)

  Xc(i) = (5 * column1(i) + 15 * column2(i) + 25 * column3(i)) _

  / (column1(i) + column2(i) + column3(i))

Cells(i + 1, 5) = Xc(i)

  Next i

  End Sub

 

Интеллектуальный преобразователь использует следующую систему правил

1.           Если входной сигнал низкий, то выходной сигнал низкий.

2.           Если входной сигнал средний, то выходной сигнал средний.

3.           Если входной сигнал высокий, то выходной сигнал высокий.

Понятие низкий, средний и высокий для входного сигнала описывается функциями, представленными на графике.

График функции принадлежности некоторого входного сигнала некоторому понятию.

Пример:

Входной сигнал равный 0,75 не принадлежит понятию низкий, а принадлежит понятиям средний и высокий со значением функции принадлежности 0,5.

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

 

 

 

 

 

 

 

 

0            5           10           15         20          25         30

 

Алгоритм работы системы правил:

 

 

 

 

 

 

 

 

Примеры работы системы правил:

1)Если входная величина равняется единице, то задействуется только правило «высокий», что даст в проекции центр тяжести равный 25.

2) Если входная величина равняется нулю, то задействуется только правило «низкий», что даст в проекции центр тяжести равный 5.

3) Если входная величина равняется 0,75 , то задействуются правила «средний» и «высокий», что даст в проекции центр тяжести равный 20.

 

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

 

Для программаторов с языка «C» программа может быть построена следующим образом:

В среде программирования C++ Builder выбирается консольный режим программирования. По цепочке File -> New -> Other -> Console Wizard -> C++.

 

 

Устанавливаются параметры работы в консольном режиме:

 

Программа на языке C++ представлена на рисунке ниже:

 

 

 

 

 

 

 



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