Консультация № 184719
08.12.2011, 21:48
66.66 руб.
0 3 1
Здравствуйте! У меня возникли сложности с таким вопросом:Нужно написать программу для учебного лабораторного комплекса SDK-1.1, обеспечивающую поочередное «зажигание» светодиодов через один и их «гашение» в том же порядке, с частотой 1Гц. Процессор 8051.Буду очень вам благодарен,если вы сумеете мне помочь.

Обсуждение

Неизвестный
08.12.2011, 21:49
общий
Вот методичка по данному заданию
Прикрепленные файлы:
ff8ac5af4b4360aad6f0d1ad01b4ac73.pdf
Неизвестный
08.12.2011, 21:50
общий
А вот вариант номер 6 из данной методички
Прикрепленные файлы:
4c4071fc7560163112150ca1ec92b6da.rar
давно
Посетитель
7438
7205
09.12.2011, 01:59
общий
это ответ
Здравствуйте, Дмитрий!
Вот Вам программа.
Для отработки поочередного «зажигания» и «гашения» использовал табличное задание данных.

[code h=207]#include <ADuC812.h>
NAME Primer_10
SV EQU 7h ; адрес порта светодиодов в ПЛИС
PROG_WM SEGMENT CODE
PROG_T0 SEGMENT CODE
BITVAR SEGMENT BIT
STACK SEGMENT IDATA

RSEG STACK
DS 10H ; 16 Bytes Stack

; Обработчик прерывания при перезагрузки МК
CSEG AT 0h
jmp START

; Вектор прерывания от таймера 0
CSEG AT 0Bh
jmp Timer0

; Вектор прерывания от таймера 0 в пользовательской таблице SDK
CSEG AT 200Bh
jmp Timer0

; Подпрограмма обработчика прерывания от таймера 0
RSEG PROG_T0
Timer0: push PSW
djnz r4,Timer0ret ;20*50мс = 1сек
mov r4,#20 ;заряжаем на отсчет следующей 1 сек
setb IRQ_T0 ;взводим флаг
Timer0ret:
clr tr0 ;остановим таймер
mov th0,#high(0ffffh-50000) ;заряжаем таймер на 50000 мкс
mov tl0,#low(0ffffh-50000)
setb tr0 ;запускаем таймер
pop PSW
RETI

; Основная программа
CSEG AT 2100h
USING 0
START: mov SP,#STACK-1 ; инициализация стека
; Настройка таймера 0 как 16-разрядного в режиме автоперезагруз-ки
mov tmod,#00000001b ;таймер 0 - 16-битный счетчик
mov th0,#high(0ffffh-50000) ;заряжаем таймер на 50000 мкс
mov tl0,#low(0ffffh-50000)
mov r4, #20 ;счетчик прерываний таймера 20*50 = 1 сек
setb tr0 ;запускаем таймер
setb ea ;разрешаем все прерывания
setb et0 ;разрешаем прерывание от таймера 0

mov R1,#SV ;адрес регистра светодиодов
mov R7,#0fh ;индекс в таблице, после +1 и and 0fh будет 0
mov dptr,#table ;адрес таблицы

wait: jnb IRQ_T0,wait ;ждем бит
clr IRQ_T0 ;сбросим его

mov a,r7 ;индекс
inc a ;на следующий
anl a,#0fh ;оставим 4 мл бита (0-0fh), у нас 16 значений
mov r7,a ;сохраним

movc a,@a+dptr ;читаем из таблицы значение
call Wr_Max ;и на светодиоды!

jmp wait ;ждем 1 секунду

;данные для индикации на светодиодах
table: db 00000001b, 00000101b, 00010101b, 01010101b
db 01010100b, 01010000b, 01000000b, 00000000b
db 00000010b, 00001010b, 00101010b, 10101010b
db 10101000b, 10100000b, 10000000b, 00000000b

; Подпрограмма работы с регистрами ПЛИС (Запись в рег. ПЛИС)
RSEG PROG_WM
; R1 - адрес регистра ПЛИС, ACC - записываемое значение
Wr_Max: mov R3,DPP ;сохраним старое значение
mov DPP,#8h ;перейдем в банк 8
movx @R1,A ;пишем в регистр
mov DPP,R3 ;восстановим банк
RET

; Переменные в битовой области
RSEG BITVAR
IRQ_T0: DBIT 1 ;бит для отработки в основном цикле

END
[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа