Подпрограмма обслуживания 8-и разрядного семисегментного индикатора.
Подпрограмма работает от прерывания таймера 0 и выводит на индикатор содержимое ячеек РПД по адресам 31h-38h. Ячейка 39h используется подпрограммой
ORG 030H MAS DS 9 NUMB DS 1 ORG 0C00BH JMP TIMERENT ORG 0C100H MOV NUMB,#8 ORL TMOD,#00000010B;Установка режим 2 таймера 0 MOV TL0,#0; Загрузка таймера MOV TH0,#0 SETB TR0; Старт Т/С0 SETB IE.1; Разрешение прерывания от Т/С0 SETB EA; Разрешение прерываний JMP $ TIMERENT: PUSH ACC; Запоминание в стеке необх. регистров PUSH 0 PUSH DPH PUSH DPL PUSH PSW MOV DPTR,#8000H MOV A,#0 MOVX @DPTR,A; Гашение сегментов DEC P1 DJNZ NUMB,NEXT MOV NUMB,#8 MOV P1,#0F7H NEXT: MOV A,#MAS; Вычисление адреса символа ADD A,NUMB MOV R0,A MOV A,@R0 MOVX @DPTR,A; Вывод следующего знакоместа POP PSW POP DPL POP DPH POP 0 POP ACC RETI END
Задания. Создать файл с программой на языке ассемблер: ORG 0С100H MOV A,#21H INC A ADDC A,#11H MOV B,#5 MUL AB END 1. Запустить транслятор и проверить программу на наличие ошибок. 2. Выполнить пошаговую трассировку и убедиться в ее работоспособности. 3. После выполнения программы в регистре А должно быть число FFh, в В – 00h.
Контрольные вопросы 1. Какими типами информационных объектов может оперировать АЛУ ИК51. 2. Дать описание формата слова состояния программы (PSW). 3. Охарактеризовать флаги PSW. 4. Какую емкость имеют резидентные ПЗУ и ОЗУ микроконтроллера МК51. 5. Для каких целей используется аккумулятор при работе контроллера. 6. Дать общую характеристику регистров специальных функций МК51. 7. Охарактеризуйте основные этапы программирования и отладки программного обеспечения для МК51. ЛАБОРАТОРНАЯ РАБОТА №2.
КОМАНДЫ ПЕРЕСЫЛКИ ДАННЫХ.
Практическая часть. I. Простые примеры использования программ передачи данных.
1. Записать в резидентную память данных (РПД) в ячейки с адресами 41H и 42H число 1С3АH: MOV R0, #41H; Загрузка в R0 указателя РПД MOV @R0, #1CH; Запись в РПД числа 1СН INC R0; Продвижение указателя адреса РПД MOV @R0, #3AH; Запись в РПД числа 3AH
2. Передать содержимое буфера УАПП в РПД по косвенному адресу из R0: MOV @R0,SBUF; Передача принятого по последовательному каналу байта в РПД
3. Загрузить в указатель данных начальный адрес 7F00H массива данных, расположенного в внешней памяти данных (ВПД): MOV DPTR,#7F00H; Загрузка начального значения указателя данных
4. Загрузить управляющее слово в регистр управления таймером: MOV TCON,#00000101B
5. Обмен данными: XCH A,R0;Обмен аккумулятора с регистром XCHD A,@R0;Обмен младшей тетрады аккумулятора с младшей тетрадой байта РПД
6. Cбросить все флаги пользователя (область РПД с адресами 20H-2FH): MOV R0,#20H; Задание начального адреса области флагов MOV R1,#0FH; Счетчик (длина области флагов) L: MOV @R0,#0; Сброс одного байта (8 флагов) INC R0; Переход к следующему байту DJNZ R1,L; Цикл
II. Обращение к памяти программ. 1. Часто необходимо иметь в памяти программ таблицы готовых решений. Для возможности работы с такими таблицами, хранящимися в резидентной памяти программ (РПП) и внешней памяти программ (ВПП), имеются специальные команды обращения к памяти – MOVC. Поясним использование этих команд на следующем примере. Требуется составить подпрограмму вычисления синуса угла Х (00<X<890 с дискретностью 10). Наиболее быстрое вычисление функции можно получить путем выборки готового значения синуса из таблицы. Такая таблица для диапазона 00 - 890 займет 90 байтов с погрешностью 0,4%. Исходным параметром для подпрограммы служит значение угла Х, находящееся в аккумуляторе: ; Вычисления Sin(x) по таблице
; Вход: В (А) – X в пределах от 0 до 89 градусов ; Выход: (А) – дробная часть значения синуса
SINX: INC A; Инкремент аккумулятора MOVC A,@A+PC; Загрузка значения синуса из таблицы RET; Возврат
; Таблица значений синуса SINUS: DB 0; SIN(0)=0 DB 00000100B; SIN(1)=0.017 DB 00001001B; SIN(2)=0.035 … Формирование временной задержки на основе таймера. В качестве примера рассмотрим организацию временной задержки в 50мс. Предполагается, что бит IE.7 установлен.
;организация перехода к метке NEXT при переполнении Т/С0 ORG 0С00BH; Адрес вектора прерывания от Т/С0 CLR TCON.4; Останов Т/С0 RETI; Выход из подпрограммы обработки прерывания ORG 0С100H; Начальный адрес программы MOV TMOD,#01H; Настройка Т/С0 MOV TL0,#LOW 50000-1; Загрузка таймера MOV TH0,#HIGH 50000-1 SETB TCON.4; Старт Т/С0 SETB IE.1; Разрешение прерывания от Т/С0
MOV A,PCON; Перевод МК51 в режим холостого хода SETB A.0 MOV PCON,A
NEXT: … Считывание текущего состояния таймера без нарушения процесса синхронизации. Все регистры таймеров/счетчиков микроЭВМ могут читаться или записываться в процессе работы, однако для этого надо соблюдать меры предосторожности. Предположим, что подпрограмма RDTIME должна возвращать 16-разрядное значение в регистры R1 и R0, отражающее содержимое таймера 0. Существует опасность, что при считывании двух половин числа переполнение младшего регистра может перейти на одержимое старшего регистра, так что две возвращаемых половины слова окажутся "не в фазе". Решение этой проблемы заключается в том, чтобы читать сначала старший байт, а затем - младший, после чего выдать подтверждение того, что старший байт не изменился. Если изменение имело место, то следует повторить процесс сначала.
RDTIME: MOV А,ТН0; Выборка содержимого таймера Т0 MOV R0,TL0 CJNE A,TH0,RDTIME MOV R1,A RET
Измерение длительности сигнала. Подпрограмма для измерения длительности «положительного» сигнала будет выглядеть так:
MOV TMOD,#00001001B; Настройка Т/С0 MOV TH0,#0; Сброс таймера MOV TL0,#0 SETB TCON.4; Старт Т/С0 Задание 2 1. При первом нажатии на кнопку INT1 увеличивать код на светодиодах на единицу, при втором-на двойку и т.д. 2. По каждому второму нажатию кнопки INT1 сдвигать код на светодиодах на один разряд влево.
3. По нажатию на кнопку INT1 циклически сдвигать код на светодиодах на один разряд вправо. 4. По троекратному нажатию на INT1 минвертировать состояние светодиодов. 5. Подсчитывать число нажатий на INT1 (от 0 до 63)и отображать на светодиодах в восьмеричном коде (переключение цифр-тумблером). 6. По первому нажатию на INT1 считать первое значение с тумблеров, по второму-второе и сумму вывести на светодиоды. 7. При нажатии на кнопку INT1 первый раз сдвинуть информацию на светодиодах влево, второй раз –вправо, третий раз- уменьшить на 1. 8. Мигать левым светодиодом с частотой 1-2 Гц, а по нажатию INT1 считать с переключателей адрес и заполнить 10 ячеек ОЗУ, начиная с этого адреса, последовательно числами от 0 до 9. 9. При включении левого переключателя подсчитывать количество нажатий на кнопку INT1, при выключении количество вывести на светодиоды. 10. Реализовать кодовый замок, где шифр набирается тумблерами, а для ввода шифра используется кнопка INT1. В случае правильного набора зажигаются светодиоды, иначе-мигают с частотой 1-2 Гц. 11. Написать программу, последовательно передающую через порт 3 содержимое участка памяти ЗЗН ¸ ЗАН. Передачу каждого байта сопроводить единичным стробом на линии 5 порта 3. Начало передачи каждого нового байта определяется появлением среза внешнего строб-сигнала, заведенного на линию Р3.3 и выявленного по прерыванию. Контрольные вопросы. 2. Какие порты существуют в i8051? 3. Для чего может быть использован каждый из портов? 4. Опишите особенности работы при байтовых и битовых операциях. 5. Опишите, как осуществляется работа с универсальным асинхронным приемопередатчиком (УАПП).
ЛАБОРАТОРНАЯ РАБОТА №8 ТАЙМЕР Практическая часть.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|