Выполнение
Цель работы:
Изучение вопросов программирования и применения таймера/счетчика в основных режимах его работы.
Задание:
Разработать программу, обеспечивающую наблюдения эффекта “бегущего огня” на светоизлучающих диодах (СИД) отладочной платы. Вид “бегущего огня” определен вариантом задания.
Вариант |
Тип “бегущего огня” |
1 |
Слева - направо (горит один СИД) |
2 |
Справа – налево (горит один СИД) |
3 |
С изменением направления (горит один СИД) |
4 |
Сходящиеся к центру огни (горят 2 СИД) |
5 |
Расходящиеся от центра огни (горят 2 СИД) |
6 |
|
7 |
|
8 |
|
9 |
|
Пример программы:
$NOMOD51
#include <reg932.h>
Blinking SEGMENT CODE ; segment declaration
; defines a segment with the name 'Blinking' and the memory class CODE
RSEG Blinking ; switch to this code segment
JMP init
ORG 0Bh ; 0BH is address for Timer 0 interrupt
PUSH PSW
PUSH ACC
MOV P2, R7
CJNE R7, #10000000b, shift
MOV R7, #00000001b
JMP next
shift:
MOV A, R7
RL A
MOV R7, A
next:
POP ACC
POP PSW
RETI
init:
MOV P2M1, #00h ; configure Port 2 as Quasi-bidirectional
MOV R7, #00000001b ;
CLR A
MOV DPTR, #0h
MOVX @DPTR, A
MOV TMOD, #01h ; configure Timer 0 in mode 1 (16-bit counter)
; programming interrupt logic
SETB EA ; enable all interrupts
SETB ET0 ; enable interrupt request from T/C0
SETB TR0 ; run timer 0
forever:
JMP forever
END
Правильность функционирования вышеприведенного примера можно проверить в режиме моделирования. Но при реальной работе время переключения СИД будет слишком малым. И из-за свойства инерционности наблюдать эффект “бегущего огня” будет невозможно (будут гореть все СИДы). Поэтому необходимо кроме таймера использовать дополнительную программную задержку. Один из вариантов такой задержки продемонстрирован ниже.
$NOMOD51
#include <reg932.h>
Blinking SEGMENT CODE ; segment declaration
; defines a segment with the name 'Blinking' and the memory class CODE
RSEG Blinking ; switch to this code segment
JMP init
ORG 0Bh ; 0BH is address for Timer 0 interrupt
PUSH PSW
PUSH ACC
MOV P2, R7
DJNZ R6, next
MOV R6, #01000000b
CJNE R7, #10000000b, shift
MOV R7, #00000001b
JMP next
shift:
MOV A, R7
RL A
MOV R7, A
next: POP ACC
POP PSW
RETI
init:
MOV P2M1, #00h ; configure Port 2 as Quasi-bidirectional
MOV R7, #00000001b
MOV R6, #01000000b
MOV TMOD, #01h ; configure Timer 0 in mode 1 (16-bit counter)
; programming interrupt logic
SETB EA ; enable all interrupts
SETB ET0 ; enable interrupt request from T/C0
SETB TR0 ; run timer 0
forever:
JMP forever
END