Автор работы: Пользователь скрыл имя, 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 Прототип программы на языке С ++
Курсовая работа
Дисциплина: «Системное программирование измерительных устройств»
Тема: «Программирование интеллектуального преобразователя сигнала»
Выполнил:
Студент гр.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-разрядный блок памяти.
Информация о работе Программирование интеллектуального преобразователя сигнала