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

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


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

Пример 1

Исходные данные. Выполнить организацию счета от 0 до F (в шестнадцатеричной системе счисления) на семисегментном индикаторе с частотой переключения 1 Гц при нажатии на кнопку Start. При нажатии на кнопку Stop работа прекращается, но при дальнейшем нажатии на кнопку Start возобновляется с того же момента. Параллельно переключению с той же частотой должен моргать диод. При нажатии на кнопку Reset микроконтроллер перезапускается.

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

Рис. 1. Схема в Proteus
Рис. 2. Пример работы (анимация кликабельна)

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

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

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

      LED	bit 	P3.0
      Start	bit 	P1.0
      Stop	bit	P1.1

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

Return:
      reti

Init:
      setb 	EA
      setb	ES
      setb 	IT0
      setb 	EX0
      mov	R6, #0h

Wait_Start:
      jb	Start, Wait_Start

Loop:
      setb 	IT0
      setb 	EX0
      jnb	Stop, Wait_Start
      cjne	R6, #0Bh, Set_0
      mov	R6, #0
      
      Set_0:
	 cjne	R6, #0, Set_1
	 mov 	P2, #01000000b
	 jmp	Blink
	 
      Set_1:
	 cjne	R6, #1, Set_2
	 mov 	P2, #01111001b
	 jmp	Blink
	 
      Set_2:
	 cjne	R6, #2, Set_3
	 mov 	P2, #00100100b
	 jmp	Blink
	 
      Set_3:
	 cjne	R6, #3, Set_4
	 mov 	P2, #00110000b
	 jmp	Blink
	 
      Set_4:
	 cjne	R6, #4, Set_5
	 mov 	P2, #00011001b
	 jmp	Blink    
	 
      Set_5:
	 cjne	R6, #5, Set_6
	 mov 	P2, #00010010b
	 jmp	Blink
	 
      Set_6:
	 cjne	R6, #6, Set_7
	 mov 	P2, #00000010B
	 jmp	Blink
	 
      Set_7:
	 cjne	R6, #7, Set_8
	 mov 	P2, #01111000B
	 jmp	Blink
	 
      Set_8:
	 cjne	R6, #8, Set_9
	 mov 	P2, #00000000B
	 jmp	Blink
	 
      Set_9:
	 cjne	R6, #9, Set_A
	 mov 	P2, #00010000B
	 jmp	Blink
	 
      Set_A:
	 mov 	P2, #00001000B	 
      
      Blink:
	 mov 	R3, #5
	 Blink_LED:
	    setb 	LED
	    acall	Delay
	    clr 	LED
	    acall 	Delay
	 inc 	R6
	 jmp 	loop
	 
      org 0200h
Delay:
      mov 	TMOD, #1
      mov	TH0, #03Ch
      mov 	TL0, #0B0h
      mov	R7, #0
      setb 	TR0
      Delay500:
      	 jnb 	TF0, Delay500
	 mov 	TH0, #03Ch
	 mov 	TL0, #0B0h
	 clr 	TF0
	 inc 	R7	
	 cjne 	R7, #0Bh, Delay500
      ret

Инициализируем внешнее прерывание[1] для того, чтобы устранить дребезг контактов при его появлении (при реализации в Proteus отсутствует). Мигание светодиода реализовано через задержку на таймерах: константы подобраны таким образом, чтобы получалась необходимая задержка в 500 мс.

Пример 2

Исходные данные. Выполнить организацию счета от 0 до 9 на семисегментном индикаторе с частотой переключения 1 Гц и 3 Гц (частота изменяется с помощью ключа). Работа начинается при нажатии на кнопку Start. При нажатии на кнопку Stop работа прекращается, но при дальнейшем нажатии на кнопку Start возобновляется с того же момента. Параллельно переключению с той же частотой должен моргать соответствующий диод. При нажатии на кнопку Reset микроконтроллер перезапускается.

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

Рис. 3. Схема в Proteus
Рис. 4. Пример работы (анимация кликабельна)

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

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

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

START 	BIT P1.0
STOP	BIT P1.1
F1HZ	BIT P1.2
VD1	BIT P2.0
VD2	BIT P2.1

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

ORG 0000H
LJMP MAIN
ORG 0040H
MAIN:

   MOV R6,#00H

   WAIT_START:
      JB START,WAIT_START
      
   LOOP:
      JNB STOP,WAIT_START
      
      INC R6
      CJNE R6,#0AH,S0
      MOV R6,#00H
      
      S0:
	 CJNE R6,#0H,S1
	 MOV P0,#01000000B
	 JMP BLINK
      S1:
	 CJNE R6,#1H,S2
	 MOV P0,#01111001B
	 JMP BLINK
      S2:
	 CJNE R6,#2H,S3
	 MOV P0,#00100100B
	 JMP BLINK
      S3:
	 CJNE R6,#3H,S4
	 MOV P0,#00110000B
	 JMP BLINK
      S4:
	 CJNE R6,#4H,S5
	 MOV P0,#00011001B
	 JMP BLINK
      S5:
	 CJNE R6,#5H,S6
	 MOV P0,#00010010B
	 JMP BLINK
      S6:
	 CJNE R6,#6H,S7
	 MOV P0,#00000010B
	 JMP BLINK
      S7:
	 CJNE R6,#7H,S8
	 MOV P0,#01111000B
	 JMP BLINK
      S8:
	 CJNE R6,#8H,S9
	 MOV P0,#00000000B
	 JMP BLINK
      S9:
	 MOV P0,#00010000B
      
      BLINK:
	 JB F1HZ,BLINK_VD2
	 
	 BLINK_VD1:
	    CLR VD1
	    ACALL DELAY
	    SETB VD1
	    ACALL DELAY
	    JMP LOOP
	    
	 BLINK_VD2:
	    CLR VD2
	    ACALL DELAY
	    SETB VD2
	    ACALL DELAY
	    JMP LOOP
	 
   
DELAY:
   MOV C,F1HZ
   MOV TMOD,#01H
   MOV TH0,#3CH
   MOV TL0,#0B0H
   MOV R7,#00H
   SETB TR0
   JC DEL166
   DEL500:
      JNB TF0,DEL500
      MOV TH0,#3CH
      MOV TL0,#0B0H
      CLR TF0
      INC R7	
      CJNE R7,#0AH,DEL500
      RET
   DEL166:
      JNB TF0,DEL166
      MOV TH0,#3CH
      MOV TL0,#0B0H
      CLR TF0
      INC R7	
      CJNE R7,#3H,DEL166
      RET

Суть примерно та же, что и в Примере 1. Специфичность данного примера в реализации переключения частоты моргания двух светодиодов.

Пример 3

Исходные данные. Организовать счет и индикацию на индикаторах в двоично-десятичной системе до 16. Нажатие кнопки Start начинает счет, нажатие кнопки Stop останавливает счет. При нажатии кнопки Reset происходит сброс. При переключении тумблера меняются частоты счета и мигающий диод, первый диод мигает с частотой 1 Гц, второй - с частотой 2 Гц.

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

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

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

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

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

start_ bit P1.0
stop_ bit P1.1
RES bit P1.2
power bit P1.3
ind_1 bit P3.0
ind_2 bit P3.1
val_seg_1 data P0
val_seg_2 data P2
REG data 30h

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

init:
      clr a
      mov REG, a
      mov val_seg_1, #11000000b
      mov val_seg_2, #11000000b
      setb ind_1
      setb ind_2
      jmp Start
First:
      jnb stop_, stop_count
      jnb start_, count
      jnb RES, Restart
      jmp Start

  
Restart:
      clr a
      mov REG, a
      mov val_seg_1, #11000000B
      mov val_seg_2, #11000000B
      setb ind_1
      setb ind_2
      jmp Start

stop_count:
      setb ind_1
      setb ind_2
      ljmp First
      
Count:
      jmp poweron
 Nxt:     
      jnb stop_, stop_count
      jnb RES, Restart
      mov a, REG
      inc a
      mov REG, a
      jmp check_0
   
poweron:
      jb power, poweron_2
      clr ind_1
      ACall dalay_1
      setb ind_1
      ACall dalay_1
      jmp Nxt 
   
poweron_2:
      clr ind_2
      ACall dalay_2
      setb ind_2
      ACall dalay_2
      jmp Nxt 
      
dalay_1:
   MOV TMOD,#01H
   MOV TH0,#3CH		
   MOV TL0,#0B0H
   MOV R7,#00H		
   SETB TR0
   DEL500:
      JNB TF0,DEL500
      MOV TH0,#3CH
      MOV TL0,#0B0H
      jnb stop_, stop_count
      jnb RES, Restart
      CLR TF0
      INC R7	
      CJNE R7,#0AH,DEL500 
      RET 
 
dalay_2:
   MOV TMOD,#01H
   MOV TH0,#3CH		
   MOV TL0,#0B0H
   MOV R7,#00H	
   SETB TR0
   DEL250:
      JNB TF0,DEL250
      MOV TH0,#3CH
      MOV TL0,#0B0H
      jnb stop_, stop_count
      jnb RES, Restart
      CLR TF0
      INC R7	
      CJNE R7,#5H,DEL250 
      RET 
      
check_0:   
      cjne a, #0, check_1 
      mov val_seg_1, #11000000B
      mov val_seg_2, #11000000B
      jmp Count
      
check_1:   
      cjne a, #1, check_2
      mov val_seg_1, #11000000B 
      mov val_seg_2, #11111001B
      jmp Count
      
check_2:   
      cjne a, #2, check_3 
      mov val_seg_1, #11000000B
      mov val_seg_2, #10100100B
      jmp Count
      
check_3:   
      cjne a, #3, check_4 
      mov val_seg_1, #11000000B 
      mov val_seg_2, #10110000B
      jmp Count
      
check_4:   
      cjne a, #4, check_5 
      mov val_seg_1, #11000000B
      mov val_seg_2, #10011001B
      jmp Count
      
check_5:   
      cjne a, #5, check_6 
      mov val_seg_1, #11000000B
      mov val_seg_2, #10010010B
      jmp Count
      
check_6:   
      cjne a, #6, check_7
      mov val_seg_1, #11000000B 
      mov val_seg_2, #10000010B
      jmp Count
      
check_7:   
      cjne a, #7, check_8 
      mov val_seg_1, #11000000B
      mov val_seg_2, #11111000B
      jmp Count
      
check_8:   
      cjne a, #8, check_9 
      mov val_seg_1, #11000000B
      mov val_seg_2, #10000000B
      jmp Count
      
check_9:   
      cjne a, #9, check_10
      mov a, #15
      mov REG, a 
      mov val_seg_1, #11000000B
      mov val_seg_2, #10010000B
      jmp Count
      
check_10:   
      cjne a, #16, check_11
      mov val_seg_1, #11111001B
      mov val_seg_2, #11000000B
      jmp Count
check_11:   
      cjne a, #17, check_12
      mov val_seg_1, #11111001B
      mov val_seg_2, #11111001B
      jmp Count
      
check_12:   
      cjne a, #18, check_13 
      mov val_seg_1, #11111001B
      mov val_seg_2, #10100100B
      jmp Count

check_13:   
      cjne a, #19, check_14 
      mov val_seg_1, #11111001B 
      mov val_seg_2, #10110000B
      jmp Count
   
check_14:   
      cjne a, #20, check_15
      mov val_seg_1, #11111001B
      mov val_seg_2, #10011001B
      jmp Count
           
         
check_15:   
      cjne a, #21, check_16
      mov val_seg_1, #11111001B
      mov val_seg_2, #10010010B
      jmp Count
      
check_16:
      mov val_seg_1, #11111001B
      mov val_seg_2, #10000010B
      mov a, #255
      mov REG, a
      jmp Count
      
  INITINT0:
   SETB IT0
   SETB EX0
   SETB EA
   CLR IE0
   RETI

Примечания