Бегущая строка на базе Intel 8051

Микроконтроллеры созданы для использования в специализированных системах, в которых им выделяется какая-то вполне определенная роль. Сделаем систему, которая будет управлять светодиодными индикаторами (LED индикаторы). Точнее, сделаем бегущую строку. Intel 8051 вполне подходит для этого.ВВЕДЕНИЕ

Микроконтроллеры созданы для использования в специализированных системах, в которых им выделяется какая-то вполне определенная роль. Сделаем систему, которая будет управлять светодиодными индикаторами (LED индикаторы). Точнее, сделаем бегущую строку. Intel 8051 вполне подходит для этого.

СХЕМА УСТРОЙСТВА

Микроконтроллер сам по себе мигать не может. У нас будет применяться вот такое устройство:

Бегущая строка на базе Intel 8051

Схема устройства

Устройство состоит из центрального процессора (Intel 8051; на схеме обозначен как XP1), 4 LED индикаторов (HG1..HG4), 4 транзисторов (VT1..VT4), 16 резисторов (R1..R16), регистра (DD1) и дешифратора (DD2).

ПРИНЦИП РАБОТЫ ПРОГРАММЫ

Программа разделена на 4 модуля.
В модуле 1 определяются исходные значения на портах микроконтроллера (связь с внешними устройствами идет через порты), описывается схема работы таймеров и время срабатывания.
Модуль 2 представляет из себя просто бесконечный цикл. Во время работы цикла программа работает в режиме ожидания прерываний.
Модуль 3 описывает работу программы во время прерываний. Прерываний в нашей программе 2, по одному на каждый таймер. Таймер 0 выполняет задержку на 0.5 с (цифры-буквы на LED индикаторах сменяются каждые полсекунды), а таймер 1 предназначен для контроля над «миганием» индикаторов с частотой 400 Гц. Данные на выход микроконтроллера передаются в обработчике прерывания от таймера 1.
Модуль 4 описывает текстовую строку, передающуюся на LED индикаторы. А что выводить на экран будем? Да номер моей универовской группы ))).
Таким образом, основная работа происходит в обработчиках прерываний. Это не удивительно :).

КОД ПРОГРАММЫ

Модуль 1. Задаем исходные данные программы, настраиваем таймеры и порты
Здесь мы указываем, какие прерывания будут работать в программе (TC_0, TC_1), настраиваем несколько начальных переменных (хранятся в регистрах R0, R1, R2), порт P3 и устанавливаем рабочий режим таймеров TC_0 и TC_1.

;-------Описание адресов расположения модулей программы
            ORG    00h
             JMP    START;переход на инициализацию
            ORG    0Bh
            JMP    TC_0;переход по прерыванию на обработчик таймера T/C 0
            ORG    1Bh            
            JMP    TC_1;переход по прерыванию на обработчик таймера T/C 1
            ORG    30h
;-------Описание адресов расположения модулей программы

START:
;-------Начальные описания
            CLR    P3.2; Выбор 1-го индикатора
            CLR    P3.3; Обнуление строба записи в регистре
            CLR    P3.4; Сброс разрешения переключения дешифратора
            CLR    P3.5            
            SETB    P3.4; Разрешаем работу дешифратора

            MOV    R0,#0h; Инициализация итерационной переменной R0
; 7 прерываний = 0,5с.
            MOV    R1,#0h; Инициализация итерационной переменной R1,
; где R1=0..3 - так осуществляется выбор индикатора
            MOV    R2,#0h; Инициализация итерационной переменной R2
; (отсчитывает цикл смещения в строке STROKA)
;-------Начальные описания

;-------Описание работы таймеров
            MOV    TH0,#0h; Установка времени срабатывания таймера 0 на
            MOV    TL0,#0h; максимально возможное значение (71 мс)
            MOV    TH1,#0F6h; Установка времени срабатывания
            MOV    TL1,#0FFh; таймера 1 на 2,5 мс (400 Гц)
            MOV    TMOD,#00010001b; Определяем таймеры/счетчики в качестве таймеров
            MOV    IP,#00000010b; Устанавливаем приоритет T/C_0 = 1, T/C_1 = 0
            MOV    IE,#10001010b; Разрешаем прерывания
            MOV    TCON,#01010000b; Включение таймеров
;-------Описание работы таймеров

После задания дефолтных значений программа переходит к модулю 2.

Модуль 2. Бесконечный цикл, ожидание прерываний от таймеров
Бесконечный цикл. Оператор NOP выполняется за 1 цикл. Если происходит очередное прерывание, оно начинает выполняться после NOP. Потом происходит возврат в бесконечный цикл ).

    TSIKL:;-------Цикл без операторов, в нем происходит ожидание прерывания от таймеров
            NOP; Если бы тут были какие-то операторы, то выполнялись бы именно они
    JMP TSIKL

Модуль 3. Обработка прерываний от таймеров
Первый таймер считает 7 раз до 77 мс (т.е. 77мс*7 = 0.5с), после этого вызывает сдвиг символов на 1 индикатор второй считает до 2.5мс и отправляет данные на индикаторы (бегущую строку надо все время обновлять, иначе она не будет «гореть» постоянно).

TC_0:;-------Подпрограмма обработки прерывания таймера 0
; Таймер 0 выполняет задержку на 0.5 с
            INC    R0; Увеличение на 1 итерационной переменной R0
            CJNE    R0,#7h,TC_0_END; Если R0==7, то R0 сбрасываем
            MOV    R0,#0h; если нет, то выходим из прерывания                                                
            INC    R2; Увеличение на 1 итерационной переменной R2
            CJNE    R2,#0Ch,TC_0_END; Если R2==11, то
            MOV R2,#0h;; R2 сбрасываем, если нет, то выходим из прерывания
    TC_0_END:    RETI;; Выход из прерывания

;--------Конец подпрограммы обработки прерывания таймера 0

TC_1:;--------Подпрограмма обработки прерывания таймера 1
; Таймер 1 выполняет "мигание" индикаторов с частотой 400 Гц
            MOV       TCON,#00010000b; Останавливаем таймер 1 на время установки времени
; срабатывания
            MOV    TH1,#0F6h; Установка времени срабатывания
              MOV    TL1,#0FFh; таймера 1 на 2.5 мс (400 Гц)
            MOV    TCON,#01010000b; Включение таймера 1
            CJNE    R1,#4h, METKA1; Если R1==4, то R1 сбрасываем,
              MOV    R1,#0h; если нет, то переходим на метку TSIKL
    METKA1:
            MOV    A,R1; A=R1(вычисляем смещение в строке, как сумму
; номера  индикатора)
            ADD    A,R2; A=R1+R2 (  и циклического смещения R2)
              MOV    DPTR,#STROKA; Заносим в DPTR адрес начала строки STROKA
            MOVC    A,@A+DPTR; байт из строки
              MOV    P1,A; Вывод этого байта в порт для индикации
            SETB    P3.3; Устанавливаем бит 3 порта P3 (вывод строба;записи в регистр)
            MOV    B,R1
              MOV    C,B.0
            MOV    P3.2,C; Подаем на вход дешифратора через P3.2 и P3.5      
            MOV    C,B.1; номер индикатора
            MOV    P3.5,C; записанный в R1
            INC    R1; Переключаемся на следующий индикатор
            CLR    P3.3; Конец строба записи в регистр
    TC_1_END:     RETI; Выход из прерывания
;--------Конец подпрограммы обработки прерывания таймера 1

Модуль 4. Строка для вывода на индикаторы
Просто массив с символами. Он мог бы располагаться в любом месте программы, ключевое слово STROKA — просто метка перехода.

STROKA:; Строка для вывода на индикаторы
            db    11111111b; <пробел>
            db    11111111b; <пробел>
            db    11111111b; <пробел>
            db     11001000b; П
            db     11000110b; С
            db     10111111b; - = BFh
            db     10011001b; 4 = 99h
            db     11111000b; 7 =
            db     10000010b; 6 =
            db     10111111b; - = BFh
            db     11000000b; 0 =
            db     10010010b; 8 =
            db     11111111b; <пробел>
            db     11111111b; <пробел>
            db     11111111b; <пробел>
    FINAL:
END.; Конец кода программы

Ну вот и все. Программа работает, буквы-циферки по индикаторам бегают, прерывания срабатывают время от времени. Не очень сложно, микроконтроллеры — они простые (смайл).

СКАЧАТЬ

1. Исходники программы
2. Franklin Proview32 + краткое описание
3. Описание микроконтроллера Intel 8051, краткая справка по ассемблеру (на английском)
4. Подробное руководство по микроконтроллеру Intel 8051 и ассемблеру для него (на русском)