АСВТ 2 семестр ЛР №1

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 11:14, 11 октября 2018.


Часть 1.1. Реализация булевой функции (i8051)

Исходные данные

Задание: реализовать подсчет заданной булевой функции .

Заданная функция:

Исходные переменные:

Как видно из заданной функции, переменные Y и C не используются.

Составим блок-схему из функциональных элементов для функции Q:

Рис. 1. Блок-схема

Использование битовых операций

Задание: реализовать подсчет булевой функции с использованием битовых операций двумя способами: опрос каждого бита и регистр аккумулятор (А) с использованием логических инструкцийanl и orl.

Опрос каждого бита

Для реализации задания используются стандартные инструкции ассемблера для микроконтроллеров серии i8051 (см. здесь и здесь)[1]. Непосредственно при данной реализации используются инструкции jb и jnb, вспомогательный флаг переноса C (Auxilary Carry Flag), метки ассемблера.

Реализация программы на ассемблере:

      Q BIT P3.3
      U BIT 20h.4
      V BIT P1.2
      W BIT 20h.0
      X BIT 28h.0
      Z BIT P2.7
      G BIT 28h.7
      E BIT 22h.5
      D BIT P3.7

 Start:      
      mov C, P0.0
      mov U, C
      mov C, P0.3
      mov W, C
      mov C, P0.6
      mov X, C
      mov C, P1.4
      mov G, C
      mov C, P1.7
      mov E, C

 test_v:
      jnb V, test_x
      jb W, set_q

 test_x:
      jnb X, test_u
      jnb Z, set_q

 test_u:
      jnb U, test_d
      jnb G, set_q

 test_d:
      jnb D, test_b
      jb D, set_q

 test_b:
      jb E, set_q

 clr_q:
      clr Q
      jmp Loop

 set_q:
      setb Q

 Loop:	
      jmp Start
      END

Схема в Proteus:

Рис. 2. Схема в Proteus

Использование логических инструкций anl и orl

Инструкции anl и orl немного отличаются от привычных логических И и ИЛИ. Подробнее см. здесь (anl) и здесь (orl).

Реализация на ассемблере:

      Q BIT P3.3
      U BIT 20h.4
      V BIT P1.2
      W BIT 20h.0
      X BIT 28h.0
      Z BIT P2.7
      G BIT 28h.7
      E BIT 22h.5
      D BIT P3.7

 Start:      
      mov C, P0.0
      mov U, C
      mov C, P0.3
      mov W, C
      mov C, P0.6
      mov X, C
      mov C, P1.4
      mov G, C
      mov C, P1.7
      mov E, C
      
      mov C, V		; V -> C
      anl C, W		; V*W
      mov F0, C		; Res -> F0
      mov C, X		; X -> C
      anl C, /Z		; X*/Z
      orl C, F0		; V*W + X*/Z
      mov F0, C		; Res -> F0
      mov C, U		; U -> C
      anl C, /G		; U*/G
      orl C, E		; U*/G + E
      orl C, D		; E + U*/G + D
      orl C, F0		; Func
      mov Q, C		; Res
      
      jmp Start
      END

Итоговая схема ничем не отличается от представленной выше на Рис. 2. Изменена только прошивка МК.

Использование байтовых операций

Принципиальным и, пожалуй, единственным отличием байтовых операций от битовых является использование аккумулятора A (RAM_E0) вместо флага переноса C (RAM_D0.7)

Опрос аккумулятора

Значения заданных переменных, содержащихся в побитно адресуемой RAM (#W, X, G), не снимаются напрямую с портов контроллера, как это было реализовано выше, а маскируются с определенными значениями в зависимости от расположения бита, а затем добавляются к аккумулятору. Для проверки бит используются инструкции jz и jnz, осуществляющие проверку аккумулятора A на ноль.

      Q BIT P3.3
      U BIT 20h.4
      V BIT P1.2
      W BIT 20h.0
      X BIT 28h.0
      Z BIT P2.7
      G BIT 28h.7
      E BIT 22h.5
      D BIT P3.7

 test_v:
      mov A, P1
      anl A, #4h
      jz test_x
      mov A, 20h
      anl A, #1h
      jnz set_q
 test_x:
      mov A, 28h
      anl A, #1h
      jz test_u
      mov A, P2
      cpl A
      anl A, #80h
      jnz set_q
 test_u:
      mov A, 20h
      anl A, #20h
      jz test_d
      mov A, 28h
      cpl A
      anl A, #80h
      jz set_q
 test_d:
      mov A, P3
      anl A, #80h
      jz test_e
      jnz set_q
 test_e:
      mov A, 22h
      anl A, #20h
      jnz set_q
 clr_q:
      mov A, P3
      rl A
      swap A
      anl A, #0h
      rrc A
      mov Q, C
      jmp Loop
 set_q:
      mov A, P3
      rl A
      swap A
      orl A, #1h
      rrc A
      mov Q, C
 Loop:	
      jmp Loop
      END
Рис. 3. Схема в Proteus

Использование логических инструкций anl, orl, cpl, rrc, rlc, swap

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

      Q BIT P3.3
      U BIT 20h.4
      V BIT P1.2
      W BIT 20h.0
      X BIT 28h.0
      Z BIT P2.7
      G BIT 28h.7
      E BIT 22h.5
      D BIT P3.7
 Start:      
      mov C, P0.0
      mov U, C
      mov C, P0.3
      mov W, C
      mov C, P0.6
      mov X, C
      mov C, P1.4
      mov G, C
      mov C, P1.7
      mov E, C
      
      
      mov A, P3
      mov 58h, A
      mov A, 20h
      mov 51h, A
      mov 53h, A
      mov A, P1
      mov 52h, A
      mov A, 28h
      mov 54h, A
      mov 56h, A
      mov A, P2
      mov 55h, A
      mov A, 22h
      mov 57h, A
      
      mov A, 58h	; D
      swap A		
      rl A
      swap A
      mov 58h, A
      
      mov A, 51h	; U
      swap A
      mov 51h, A
      
      mov A, 52h	; V
      rr A
      rr A
      mov 52h, A
      
      mov A, 55h	; Z
      swap A
      rl A
      swap A
      mov 55h, A
      
      mov A, 56h	; G
      swap A
      rl A
      swap A
      mov 56h, A
      
      mov A, 57h	; E
      rr A
      swap A
      mov 57h, A
      
      mov A, #1h	; Mask
      anl 51h, A
      anl 52h, A
      anl 53h, A
      anl 54h, A
      anl 55h, A
      anl 56h, A
      anl 57h, A
      anl 58h, A
      
      mov A, 53h		; W -> Acc
      anl A, 52h		; W*V
      mov 70h, A		; Res -> 70h
      mov A, 55h		; Z -> Acc
      cpl A		; /Z
      anl A, 54h		; /Z*X
      orl A, 70h		; /Z*X + W*V
      mov 71h, A		; Res -> 71h
      mov A, 56h		; G -> A
      cpl A		; /A
      anl A, 51h		; /A*U
      orl A, 57h		; /A*U + E
      orl A, 58h		; E + /A*U + D
      orl A, 71h		; Func
      anl A, #1h		; Mask
      rrc A		; Save value in Carry
      mov Q, C		; Res
     	
      jmp Start
      END

Схема аналогична той, что изображена на Рис. 2.

Часть 1.2. Автомобильная индикация и подсчет перегоревших лампочек (i8051)

Задание. Реализовать схему автомобильной световой индикации. Функционал модели сигналов автомобильной панели должен включать в себя следующее:

  • Имеется 6 ламп (выходные сигналы) – левая и правая передние лампы, левая и правая задние лампы, левый и правый указатель на панели.
  • Имеется 4 входных сигнала – аварийный сигнал, педаль тормоза, переключатель правого поворота и переключатель левого поворота.
  • Рычаг поворотов на колонке рулевого управления является трехходовым переключателем; в центральном положении все контакты разомкнуты, замыкание контакта в одно из крайних положений представляет из себя активацию одного из режимов поворота (правого или левого соответственно).
  • Когда замыкается аварийный переключатель, зажигаются все шесть ламп.
  • Нажатие тормозной педали включает немигающий задний свет, если в это время не происходит поворот, при котором сохраняется мигание заднего указателя поворота.
  • Каждая из внешних сигнальных ламп является также ослабленным светом габаритных указателей на стоянке.

Введем в модель также дополнительный функционал – кроме вышеперечисленных функций она должна выполнять функцию «выявления ошибки» - обнаруживать дефекты в цепях ламп. Это отображается на семисегментном индикаторе на схеме.

Реализация. Примерный вариант реализации с разбором отдельных кусков кода взят из книги Боборыкина А.В. "Однокристальные микроЭВМ"[2] Схема выглядит следующим образом:

Рис. 4. Схема в Proteus

Листинг на Ассемблере:

Переопределение переменных для дальнейшей удобной работы с ними:

BRAKE 	BIT P1.0
EMERG 	BIT P1.1
PARK 	BIT P1.2
L_TURN	BIT P1.3
R_TURN	BIT P1.4

L_FRNT	BIT P0.0
R_FRNT	BIT P0.1
L_DASH	BIT P0.2 
R_DASH	BIT P0.3
L_REAR	BIT P0.4
R_REAR	BIT P0.5

DIM 	BIT PSW.1

SUB_DIV	DATA 20H

HI_FREQ	BIT SUB_DIV.0
LO_FREQ	BIT SUB_DIV.7

FAULT_V	DATA 21H
FAULT_C DATA 31H

Прерывание по таймеру (Timer 0 Interrupt) (по спецификации на i8051 находится по смещению 0x000B):

ORG 	000Bh
      ACALL	TIMER0_TICK
      RETI

Основное тело программы:

Start:	
      MOV	FAULT_C, #01H
      MOV	TMOD, #00000001B
      MOV	TL0, #0
      MOV	TH0, #-16
      MOV	SUB_DIV, 244
      SETB	ET0
      SETB	EA
      SETB	TR0
      MOV 	P3, #00000000B
      
Loop:	
      jmp Loop
      
TIMER0_TICK:      
      MOV	TH0, #-16
      PUSH	PSW
      PUSH	ACC
      PUSH	B
      DJNZ	SUB_DIV, T0_SERV
      MOV	SUB_DIV, #244
      MOV 	P3, #00000000B
      MOV	FAULT_V, #00H

CHECK_0:
      JB	P2.0, CHECK_1
      SETB	FAULT_V.0

CHECK_1:
      JB	P2.1, CHECK_2
      SETB	FAULT_V.1

CHECK_2:  
      JB	P2.2, CHECK_3
      SETB 	P3.0
      SETB	FAULT_V.2

CHECK_3: 
      JB	P2.3, CHECK_4
      SETB	FAULT_V.3

CHECK_4: 
      JB	P2.4, CHECK_5
      SETB	FAULT_V.4

CHECK_5:
      JB	P2.5, FAULT
      SETB	FAULT_V.5

FAULT:
      MOV	A, FAULT_V
      MOV	P3, #00H
      JZ 	T0_SERV

FAULT_C0:
      MOV	A, FAULT_V
      ORL	A, FAULT_C
      MOV	B, A
      MOV	A, FAULT_C
      RL	A
      MOV	FAULT_C, A
      CJNE	A, #80H, FAULT_C1
      MOV	FAULT_C, #01H

FAULT_C1:
      MOV	A, B
      CJNE	A, FAULT_V, FAULT_C0
      MOV	P3, FAULT_C
      
T0_SERV:
      MOV	C, PARK
      ANL	C, HI_FREQ
      MOV	DIM, C
      
      MOV	C, L_TURN
      ORL	C, EMERG
      ANL	C, LO_FREQ
      MOV	L_DASH, C
      
      MOV	F0, C
      ORL	C, DIM
      MOV	L_FRNT, C
      
      MOV	C, BRAKE
      ANL	C, /L_TURN
      ORL	C, F0
      ORL	C, DIM
      MOV	L_REAR, C
      
      MOV	C, R_TURN
      ORL	C, EMERG
      ANL	C, LO_FREQ
      MOV	R_DASH, C
      
      MOV	F0, C
      ORL	C, DIM
      MOV	R_FRNT, C
      
      MOV	C, BRAKE
      ANL	C, /R_TURN
      ORL	C, F0
      ORL	C, DIM
      MOV	R_REAR, C
      
      POP	B
      POP	ACC
      POP	PSW
      RET

Примечания