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

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


Работа и управление периферийными устройствами (i8051)

Пример 1

Исходные данные. Организовать сложение двух чисел и индикацию младшей тетрады результата на семисегментном индикаторе HG2. На блоке управления располагаются кнопки и тумблеры. Кнопки SB2, SB3 представляют собой младшие разряды первого слагаемого, т.е. возможен набор чисел от 0 до 3. Тумблеры SA4, SA5 представляют собой соответственно 2-й и 3-й разряды 2-го слагаемого, т.е. возможен набор десятичных чисел 0, 4, 8, 12. На индикаторе высвечивать результат в шестнадцатеричном формате, т. е. 0…F.

Реализация. Схема реализована с использованием кнопок, ключей и семисегментного индикатора:

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

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

Переопределение переменных. Т.к. требуется реализация отображения чисел 0..F, каждая кнопка отвечает за нужный бит:

;====================================================================
; DEFINITIONS
;====================================================================

      L0 	BIT 	P1.0
      L1 	BIT 	P1.1
      H0 	BIT 	P1.2
      H1 	BIT 	P1.3

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

Start:

Zero:	
      jnb 	L0, One
      jnb 	L1, Two
      jnb 	H0, Four
      jnb 	H1, Eight
      mov 	A, #11000000b
      mov 	P2, A
      jmp 	Loop
      
One:
      jnb 	L1, Three
      jnb 	H0, Five
      jnb 	H1, Nine
      mov 	A, #11111001b
      mov 	P2, A
      jmp 	Loop

Two:
      jnb 	H0, Six
      jnb 	H1, Ten
      mov 	A, #10100100b
      mov 	P2, A
      jmp 	Loop

Three:
      jnb 	H0, Seven
      jnb 	H1, Eleven
      mov 	A, #10110000b
      mov	P2, A
      jmp 	Loop
      
Four:
      jnb 	H1, Twelve
      mov 	A, #10011001b
      mov 	P2, A
      jmp 	Loop
      
Five:
      jnb 	H1, Thirteen
      mov 	A, #10010010b
      mov 	P2, A
      jmp 	Loop
      
Six:
      jnb 	H1, Fourteen
      mov 	A, #10000010b
      mov 	P2, A
      jmp 	Loop
      
Seven:
      jnb 	H1, Fifteen
      mov 	A, #11111000b
      mov 	P2, A
      jmp 	Loop
      
Eight:
      mov 	A, #10000000b
      mov 	P2, A
      jmp 	Loop
      
Nine:
      mov 	A, #10010000b
      mov 	P2, A
      jmp 	Loop
      
Ten:
      mov 	A, #10001000b
      mov 	P2, A
      jmp 	Loop
      
Eleven:
      mov 	A, #10000011b
      mov 	P2, A
      jmp 	Loop
      
Twelve:
      mov 	A, #11000110b
      mov 	P2, A
      jmp 	Loop
      
Thirteen:
      mov 	A, #10100001b
      mov	P2, A
      jmp 	Loop
      
Fourteen:
      mov 	A, #10000110b
      mov 	P2, A
      jmp 	Loop
      
Fifteen:
      mov 	A, #10001110b
      mov 	P2, A
      jmp 	Loop
      
Loop:	
      jmp	Start

Выполняется банально проверкой наличия/отсутствия бита на порте с помощью условных операторов[1]. Результат передается на семисегментный индикатор в соответствии с общепринятой нумерацией сегментов (см. здесь). При защите работы может возникнуть вопрос о наличии и устранении дребезга контактов. В теории - он есть, показать его "теоретически" можно, подключив осциллограф к кнопкам и зафиксировав показания осциллографа при нажатии кнопки. В работе же дребезг отсутствует, но для успешной защиты бороться с ним можно следующим образом: вывести кнопки на порты внешних прерываний P3.2/INT0, P3.3/INT1, которые будут срабатывать при наличии нулевого сигнала на порте, а обработчик прерываний будет ждать появления единичного сигнала на порте (jb bit, $).

Пример 2

Исходные данные. Организовать счет числа нажатий кнопок SB5 и SB6. При подаче питания и нажатия кнопки SB1 "Reset" на индикаторах HG1 и HG2 горит число 00. При каждом очередном нажатии на кнопку SB5 число на индикаторах увеличивается на единицу. Счет возможен до 20. Если счет достиг 20, то дальнейшие нажатия кнопки SB5 число не меняют. При каждом очередном нажатии на кнопку SB6 число на индикаторах уменьшается на единицу. При достижении числа 00 дальнейшие нажатия кнопки SB6 не влияют на схему. Нажатие кнопки SB4 обнуляет индикаторы.

Реализация. Схема реализована с использованием кнопок и семисегментного индикатора:

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

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

Переопределение переменных:

;====================================================================
; DEFINITIONS
;====================================================================

SB5	BIT P0.0
SB6	BIT P0.1
SB4	BIT P0.2
CSB5	BIT 20H.0
CSB6	BIT 20H.1
CSB4	BIT 20H.2

CC	DATA 30H

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

Start:	
      MOV	P0, #0FFh
      MOV	P2, #0101001B
      MOV	P3, #0101001B
      MOV	CC, #0
      CLR	CSB4
      CLR	CSB5
      CLR	CSB6
      
      MOV	40H, #3FH
      MOV	41H, #06H
      MOV	42H, #5BH
      MOV	43H, #4FH
      MOV	44H, #66H
      MOV	45H, #6DH
      MOV	46H, #7DH
      MOV	47H, #07H
      MOV	48H, #7FH
      MOV	49H, #6FH

LOOP:    
      NOP

TEST_5:
      JNB	SB5, CLR_5
      JB	CSB5, TEST_6
      INC	CC
      SETB	CSB5
      JMP	TEST_6

CLR_5:
      CLR	CSB5
      
TEST_6:
      JNB	SB6, CLR_6
      JB	CSB6, TEST_4
      DEC	CC
      SETB	CSB6
      JMP	TEST_4

CLR_6:
      CLR	CSB6

TEST_4:
      JNB	SB4, CLR_4
      JB	CSB4, TEST_L
      MOV	CC, #0
      SETB	CSB4
      JMP	TEST_L

CLR_4:
      CLR	CSB4

TEST_L:
      MOV	A, CC
      CJNE	A, #21, TEST_S
      MOV	CC, #20

TEST_S:
      CJNE	A, #-1, OUT
      MOV	CC, #0    
      
OUT:
      MOV	A, CC
      MOV	B, #10
      DIV	AB      
      ADD	A, #40H
      MOV	R1, A
      MOV	A, @R1
      MOV	P3, A
      
      MOV	A, B
      ADD	A, #40H
      MOV	R1, A
      MOV	A, @R1
      MOV	P2, A      
      
      JMP LOOP

Ситуация с дребезгом контактов аналогична Примеру 1.

Примечания