Скачиваний:
31
Добавлен:
09.05.2014
Размер:
604.16 Кб
Скачать

Задание №3:

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

Хранение и обработка битовых данных, реализуемых в системе команд булевского процессора MCS51, позволяет организовать компактные и эффективные программы.

Битовые данные MCS51:

128 адресуемых (0-1f) битов данных в памяти Data (0x20-0x2f ячейки) и 128 бит в регистрах SFR,включая 2 бита пользователя F1,F2 в PSW.

Непосредственно к битовым данным применимы логические команды

Anl c,{bit,/bit}, xrl c,{bit,/bit}, где С- бит PSW, используемый как аккумулятор булевского ALU, bit – прямой адрес бита , /bit – инверсия бита.

Вычислить вектор значений булевской ф-ии 4х переменных z = !y1 | !y2 & (x1 & y1 | !x2).

Всего у нас 4 переменные со значениями 0 или 1  у нас 16 вариантов из различных аргументов  мы должны вычислить 16 значений ф-ии. Первые восемь значений запишем в каждый бит порта P0, и еще восемь – в порт P1. Вычисления на ассемблере можно разложить по приоритетам операций\скобок и свести к последовательному вычислению значения.

Программа на c:

#include <reg51.h>

unsigned char bdata value = 0;

unsigned char bdata temp;

sbit x1 = value^0;

sbit x2 = value^1;

sbit y1 = value^2;

sbit y2 = value^3;

sbit z = temp^0;

void main()

{

unsigned char counter, counter2;

value = 0;

for(counter = 2; counter > 0; counter--)

{

temp = 0;

for(counter2 = 8; counter2 > 0; value++, counter2--)

{

temp <<= 1;

z = !y1 | !y2 & (y1 & x1 | !x2);

}

if(counter == 2)P0 = temp;

else P1 = temp;

}

}

Программа на ассемблере:

cseg at 0

jmp start

codeseg segment code

rseg codeseg

value equ 20h

z bit acc.0

x1 bit value.0

x2 bit value.1

y1 bit value.2

y2 bit value.3

start:

;r6 - counter

;r7 - helper

mov r6, #2

mov value, #0

portCounterLoop:

clr a

mov r7, #8

mainLoop:

rl a

mov c, x1

anl c, y1

orl c, /x2

anl c, /y2

orl c, /y1

mov z, c

inc value

djnz r7, mainLoop

endMainLoop:

cjne r6, #2, storeP1

mov p0, a

djnz r6, portCounterLoop

storeP1:

mov p1, a

end

Листинг:

; FUNCTION main (BEGIN)

; SOURCE LINE # 11

; SOURCE LINE # 12

; SOURCE LINE # 14

0000 E4 CLR A

0001 F500 R MOV value,A

; SOURCE LINE # 15

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

0003 7F02 MOV R7,#02H

0005 ?C0001:

; SOURCE LINE # 16

; SOURCE LINE # 17

0005 E4 CLR A

0006 F500 R MOV temp,A

; SOURCE LINE # 18

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

0008 7E08 MOV R6,#08H

000A ?C0004:

; SOURCE LINE # 19

; SOURCE LINE # 20

000A E500 R MOV A,temp ;эффективнее вместо temp использовать аккумулятор

000C 25E0 ADD A,ACC

000E F500 R MOV temp,A

; SOURCE LINE # 21

0010 A200 R MOV C,x1

0012 8200 R ANL C,y1

0014 A000 R ORL C,/x2

0016 B000 R ANL C,/y2

0018 A000 R ORL C,/y1

001A 9200 R MOV z,C

; SOURCE LINE # 22

001C 0500 R INC value

001E DEEA DJNZ R6,?C0004

0020 ?C0005:

; SOURCE LINE # 23

0020 BF0205 CJNE R7,#02H,?C0007

0023 850080 R MOV P0,temp

0026 8003 SJMP ?C0003

0028 ?C0007:

; SOURCE LINE # 24

0028 850090 R MOV P1,temp

; SOURCE LINE # 25

002B ?C0003:

002B DFD8 DJNZ R7,?C0001

; SOURCE LINE # 26

002D ?C0009:

002D 22 RET

; FUNCTION main (END)