Консультация № 184724
09.12.2011, 11:25
63.05 руб.
0 11 2
Здравствуйте! Прошу помощи в следующем вопросе:Здравствуйте! У меня возникли сложности с таким вопросом:Нужно написать программу для учебного лабораторного комплекса SDK-1.1, 5. Написать программу, обеспечивающую поочередное «гашение» светодиодов, расположенных на учебном макете,от середины к краям. Вторя половина линейки должны быть инверсией первой. Интервал «гашения» 1сек. Процессор 8051.Буду очень вам благодарен,если вы сумеете мне помочь.

Обсуждение

Неизвестный
09.12.2011, 11:25
общий
Вот методичка
Прикрепленные файлы:
385ddfeb561121c84ee63c53335b3647.pdf
давно
Посетитель
7438
7205
09.12.2011, 11:53
общий
это ответ
Здравствуйте, Дмитрий!
Вот наглядное преимущество табличного задания выводимых значений!
Подправил таблицу из вопроса № 184719 и готово решение для данного вопроса!
Программа постоянно сначала засвечивает светодиоды от центра к краям, потом их гасит.
Вот такая получается "красота".

[code h=207]#include <ADuC812.h>
NAME Primer_5
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,#07h ;индекс в таблице, после +1 и and 07h будет 0
mov dptr,#table ;адрес таблицы

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

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

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

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

;данные для индикации на светодиодах
table: db 00011000b, 00111100b, 01111110b, 11111111b
db 11100111b, 11000011b, 10000001b, 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]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
09.12.2011, 11:58
общий
09.12.2011, 12:27
Если не надо постоянное засвечивание и гашение, а только гашение, скажите, сделаем только 4 шага гашения и останов.
Но, по-моему, получившаяся "гирлянда" симпатичнее...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
09.12.2011, 12:30
общий
Подправил начальное значение регистра r7 (в том примере было 16 байт, тут 8)
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
10.12.2011, 04:21
общий
это ответ
Здравствуйте, Дмитрий!

Ниже представлена программа - адресация памяти 2000H до 7FFFH.
зажигание светодиодов через 1 секунду
.equ locat, 0x2000 ;Точка входа



;82C55 адресация портов - если необходимо
.equ port_a, 0xF800 ;port A
.equ port_b, 0xF801 ;port B
.equ port_c, 0xF802 ;port C
.equ port_abc_pgm, 0xF803 ;конфигурация in/out для 3 портов выше
.equ port_d, 0xF900 ;port D
.equ port_e, 0xF901 ;port E
.equ port_f, 0xF902 ;port F
.equ port_def_pgm, 0xF903 ;конфигурация in/out для 3 портов выше


.equ cout, 0x0030
.equ cin, 0x0032
.equ phex, 0x0034
.equ phex16, 0x0036
.equ pstr, 0x0038
.equ esc, 0x003E
.equ newline, 0x0048
.equ pint8u, 0x004D
.equ pint16u, 0x0053


.org locat
.db 0xA5,0xE5,0xE0,0xA5
.db 35,255,0,0
.db 0,0,0,0
.db 0,0,0,0
.db 0,0,0,0
.db 0,0,0,0
.db 0,0,0,0
.db 255,255,255,255
.db "Blink LEDs",0
.org locat+64



startup:
mov dptr, #port_def_pgm
mov a, #128
movx @dptr, a
begin:
mov dptr, #table

loop:
clr a
movc a, @a+dptr
acall update
inc dptr
lcall esc
jc exit
clr a
movc a, @a+dptr
jz begin
acall delay
inc dptr
sjmp loop
exit: ljmp 0





update:
push dph
push dpl
mov dptr, #port_e
movx @dptr, a
pop dpl
pop dph
ret




delay:
mov r0, a
dly2: mov r1, #250
dly3: nop
nop
nop ;6 NOPs + DJNZ is 4.34 us
nop ;при условии что используется 22.1184 MHz кристалл
nop
nop
djnz r1, dly3
djnz r0, dly2
ret



;здесь при необходимости можно менять последовательность зажигания светодиодов.
table: .db 01111111b, 90
.db 00111111b, 70
.db 00011111b, 50
.db 10001111b, 40
.db 11000111b, 40
.db 11100011b, 40
.db 11110001b, 40
.db 11111000b, 50
.db 11111100b, 70
.db 11111110b, 90
.db 11111100b, 70
.db 11111000b, 50
.db 11110001b, 40
.db 11100011b, 40
.db 11000111b, 40
.db 10001111b, 40
.db 00011111b, 50
.db 00111111b, 70
.db 255,0


вот в принципе и все вы можете использовать эту программу универсально
только измените последовательность в таблице
УДАЧИ


давно
Посетитель
7438
7205
11.12.2011, 20:30
общий
Здравствуйте. Вы смотрели методичку?
Светодиоды в SDK-1.1 управляются несколько по-другому
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
11.12.2011, 20:52
общий
А, вообще, я рад новым лицам
Желаю удачи на нашем портале!
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
12.12.2011, 00:39
общий
ой извените методику не смотрела точнее не знала что она есть
давно
Посетитель
7438
7205
12.12.2011, 02:28
общий
Спешить не стоит.
Надо обязательно открывать вопрос браузером.
Вполне может быть, что будет дополнительная информация, или чужой ответ,
или есть необходимость что-то уточнить в мини-форуме.
На первый случай, даю Вам сутки на исправление программы.
Дайте правильную версию в мини-форуме, я заменю в ответе.
Если не будет, то буду вынужден удалить Ваш ответ.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
12.12.2011, 04:07
общий
да я поняла теперь через методичку что написала муру мягко говоря но меня смутил поставленный вопрос МИКРОКОНТРОЛЛЕР 8051 И СТАЛО БЫТЬ ЕГО АССЕМБЛЕР логически это ведь так
давно
Посетитель
7438
7205
12.12.2011, 10:30
общий
Так, да не совсем. Программы под микроконтроллеры очень редко пишутся абстрактно. Практически всегда под конкретную среду.
Если бы не было сказано о SDK-1.1, то следовало бы уточнить способ взаимодействия с перифирией.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа