
- •Задание №1:
- •Программа на c:
- •Программа на ассемблере:
- •Листинг:
- •Задание №2:
- •Программа наC:
- •Программа на ассемблере:
- •Листинг:
- •Задание №3:
- •Программа на c:
- •Программа на ассемблере:
- •Листинг:
- •Задание №4:
- •Программа на c:
- •Программа на ассемблере:
- •Листинг:
- •Задание №5:
- •Программа на c:
- •Программа на ассемблере:
- •Листинг:
- •Задание №6:
- •Программа на c:
- •Программа на ассемблере:
- •Листинг:
- •Задание №7:
- •Программа на c:
- •Программа на ассемблере:
- •Листинг:
Задание №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)