Бегущая строка на базе Intel 8051
ВВЕДЕНИЕ
Микроконтроллеры созданы для использования в специализированных системах, в которых им выделяется какая-то вполне определенная роль. Сделаем систему, которая будет управлять светодиодными индикаторами (LED индикаторы). Точнее, сделаем бегущую строку. 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.
После задания дефолтных значений программа переходит к модулю 2.
Модуль 2. Бесконечный цикл, ожидание прерываний от таймеров
Бесконечный цикл. Оператор NOP выполняется за 1 цикл. Если происходит очередное прерывание, оно начинает выполняться после NOP. Потом происходит возврат в бесконечный цикл ).
Модуль 3. Обработка прерываний от таймеров
Первый таймер считает 7 раз до 77 мс (т.е. 77мс*7 = 0.5с), после этого вызывает сдвиг символов на 1 индикатор второй считает до 2.5мс и отправляет данные на индикаторы (бегущую строку надо все время обновлять, иначе она не будет "гореть" постоянно).
Модуль 4. Строка для вывода на индикаторы
Просто массив с символами. Он мог бы располагаться в любом месте программы, ключевое слово STROKA - просто метка перехода.
Ну вот и все. Программа работает, буквы-циферки по индикаторам бегают, прерывания срабатывают время от времени. Не очень сложно, микроконтроллеры - они простые (смайл).
СКАЧАТЬ
1. Исходники программы
2. Franklin Proview32 + краткое описание
3. Описание микроконтроллера Intel 8051, краткая справка по ассемблеру (на английском)
4. Подробное руководство по микроконтроллеру Intel 8051 и ассемблеру для него (на русском)
Микроконтроллеры созданы для использования в специализированных системах, в которых им выделяется какая-то вполне определенная роль. Сделаем систему, которая будет управлять светодиодными индикаторами (LED индикаторы). Точнее, сделаем бегущую строку. 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; Включение таймеров
;-------Описание работы таймеров
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
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
; Таймер 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.; Конец кода программы
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 и ассемблеру для него (на русском)
- Просмотров: 1854
Версия для печати
#1
Vanger |
Vanger |
Дата публикации: 31 марта 2009 14:57 | ICQ: --
цитировать
цитировать
#2
прохожий |
прохожий | спасибо, статья помогла разобраться! а то тут как раз лаба по МС51..
Дата публикации: 4 ноября 2009 11:53 | ICQ: --
цитировать
цитировать
#3
Анастасия |
Анастасия | Спасибо, ребят! Спасли мой курсач !! :-*
Дата публикации: 12 декабря 2009 18:42 | ICQ: --
цитировать
цитировать
#4
Petr58 |
Petr58 | Как переделать эту прогу,чтобы была дин.индикация
и на каждый индикатор вводить инфу от кнопок?
Помогите!!!
и на каждый индикатор вводить инфу от кнопок?
Помогите!!!
Дата публикации: 7 июня 2010 12:11 | ICQ: --
цитировать
цитировать


львиную долю просмотров похоже как раз рекламные боты дали