Введение в ассемблер микроконтроллеров Intel 8051
ВВЕДЕНИЕ
Программы можно писать не только для x86 компьютеров. Более того, большая часть процессоров в мире - НЕ x86. Основная часть микропроцессоров сейчас - это микроконтроллеры. В большинстве учебных заведений бывшего СССР изучение микроконтроллеров начинается с легендарного Intel 8051 (официальное название - MCS 51, также он известен как i8051 и MCS-51), нагло стыренного в советские годы гениальными советскими инженерами, и выпущенного у нас под названием МК-51 (причем, не поверите, МК здесь значит «МикроКонтроллер»). У этого микроконтроллера есть вполне неплохой assembler, очень похожий на ассемблер привычных нам процессоров x86 архитектуры. Этот контроллер применялся в старых клавиатурах, да и вообще много где он применялся. Вот его различные применения мы и рассмотрим на нашем сайте. Я буду называть этот микропроцессор Intel 8051 или MCS 51, потому что во всем мире он известен именно под этим названием.
ОСОБЕННОСТИ МИКРОКОНТРОЛЛЕРА
Intel 8051 — это 8 разрядный однокристальный микроконтроллер гардвардской архитектуры, впервые произведенный компанией Intel в 1980 году и предназначенный для использования во встраиваемых (embedded) системах. Он состоит из процессорного ядра (CPU), ОЗУ, ПЗУ, последовательного и параллельного порта, ну и еще небольшого количества дополнительных элементов. Если кому-то интересно узнать больше деталей - информация по Intel 8051 есть в открытом доступе.
Программы для него можно писать на специализированном асме, который очень напоминает ассемблер для x86-процессоров, или на языке С. Но, конечно, есть ограничения (смайл). У нас в распоряжении всего 128 байт ОЗУ (называется память DATA), 4 кбайта встроенного ПЗУ для хранения самой программы (память программ), и 64 кбайта в ПЗУ (называется XDATA - external data, или память данных). Зато есть прерывания (еще один смайл).
РАЗРАБОТКА КОНЦЕПЦИИ ПРОГРАММЫ
В статье будет рассказано о том, как создать программу на ассемблере для этого микроконтроллера. Для начала простую :). Забьем десять байт данных во внешнюю память (в ту, которой 64 кбайта) MCS 51 по адресам 00h…09h и проведем сортировку их по возрастанию. Стандартно для разработки программ для этого микроконтроллера используется программа Franklin Proview32. Старый добрый дедушка Франклин ))). Он позволяет эмулировать работу MCS 51 и в графическом виде смотреть, как изменяется состояние памяти микроконтроллера, разных регистров и таймеров. Короче, видеть почти все, что происходит внутри нашего мелкопроцессора.
Теперь, как программа должна выполнять поставленную задачу? Для начала нужно забить числа в память Intel 8051. После этого запускать цикл, который проведет сортировку полученного массива чисел. При этом надо учесть, что помещать числа из ПЗУ в ОЗУ для обработки их в цикле нам нужно вручную (т.е. указать это явно в коде). Я решил задачу следующим образом.
Описание принципа работы программы
Сначала программа записывает данные во внешнюю память. После этого она считывает исходные числа из внешней памяти во внутреннюю и одновременно сортирует их.
Процесс сортировки происходит во время считывания данных из внешней памяти и выглядит следующим образом.
Программа просматривает все исходные числа во внешней памяти и выбирает самое большое число. После этого она записывает это число в ячейку во внутренней памяти с самым большим запланированным номером. Далее ячейка во внешней памяти, откуда было считано это число, обнуляется.
После этого снова производится поиск самого большого из оставшихся чисел, это число записывается в следующую ячейку во внешней памяти.
Процесс продолжается до использования всех чисел из внешней памяти.
После этого отсортированные элементы переписываются обратно во внешнюю память.
СОЗДАНИЕ ПРОГРАММЫ
К счастью, метки и переходы типа “GOTO“ здесь применимы, поэтому программу можно разбить на отдельные модули. Еще одно замечание: все цифры в программе - шестнадцатеричные, и обозначаются буквой h.
Указываем, с какого участка кода программа начинает работать:
Забиваем числа, которые нужно отсортировать, во внешнюю память:
Запускаем цикл сортировки:
Опишем также работу дополнительного модуля, нужного для сортировки:
Все, сортировка данных завершена. Теперь нужно перенести числа из DATA обратно в XDATA:
ОСОБЕННОСТИ РАБОТЫ ПРОГРАММЫ
Использование памяти
Участки памяти:
XDATA: 0000h…0009h – область сортируемых числа
DATA: 40h…49h - область, используемая для промежуточного хранения и сортировки чисел
Регистры:
DPTR: хранит адрес байта в XDATA (0000h..0009h).
A: используется как буфер для передачи данных из XDATA в DATA и для копирования данных из одного участка памяти в другой.
R0: хранит адрес обрабатываемого элемента в DATA (40h..49h)
R1: используется как локальный счетчик цикла.
R2: хранит данные из DPL для запоминания адреса текущего самого большего элемента.
Участок 4Ah: хранит текущее самое большое число.
Результаты работы программы
В таблице 1 приведены результаты работы программы. В столбце «Адрес ячейки» указан адрес внешней памяти XDATA, в которой хранятся сортируемые данные.

СКАЧАТЬ
1. Исходники программы
2. Franklin Proview32 + краткое описание
3. Описание микроконтроллера Intel 8051, краткая справка по ассемблеру (на английском)
4. Подробное руководство по микроконтроллеру Intel 8051 и ассемблеру для него (на русском)
Программы можно писать не только для x86 компьютеров. Более того, большая часть процессоров в мире - НЕ x86. Основная часть микропроцессоров сейчас - это микроконтроллеры. В большинстве учебных заведений бывшего СССР изучение микроконтроллеров начинается с легендарного Intel 8051 (официальное название - MCS 51, также он известен как i8051 и MCS-51), нагло стыренного в советские годы гениальными советскими инженерами, и выпущенного у нас под названием МК-51 (причем, не поверите, МК здесь значит «МикроКонтроллер»). У этого микроконтроллера есть вполне неплохой assembler, очень похожий на ассемблер привычных нам процессоров x86 архитектуры. Этот контроллер применялся в старых клавиатурах, да и вообще много где он применялся. Вот его различные применения мы и рассмотрим на нашем сайте. Я буду называть этот микропроцессор Intel 8051 или MCS 51, потому что во всем мире он известен именно под этим названием.
ОСОБЕННОСТИ МИКРОКОНТРОЛЛЕРА
Intel 8051 — это 8 разрядный однокристальный микроконтроллер гардвардской архитектуры, впервые произведенный компанией Intel в 1980 году и предназначенный для использования во встраиваемых (embedded) системах. Он состоит из процессорного ядра (CPU), ОЗУ, ПЗУ, последовательного и параллельного порта, ну и еще небольшого количества дополнительных элементов. Если кому-то интересно узнать больше деталей - информация по Intel 8051 есть в открытом доступе.
Программы для него можно писать на специализированном асме, который очень напоминает ассемблер для x86-процессоров, или на языке С. Но, конечно, есть ограничения (смайл). У нас в распоряжении всего 128 байт ОЗУ (называется память DATA), 4 кбайта встроенного ПЗУ для хранения самой программы (память программ), и 64 кбайта в ПЗУ (называется XDATA - external data, или память данных). Зато есть прерывания (еще один смайл).
РАЗРАБОТКА КОНЦЕПЦИИ ПРОГРАММЫ
В статье будет рассказано о том, как создать программу на ассемблере для этого микроконтроллера. Для начала простую :). Забьем десять байт данных во внешнюю память (в ту, которой 64 кбайта) MCS 51 по адресам 00h…09h и проведем сортировку их по возрастанию. Стандартно для разработки программ для этого микроконтроллера используется программа Franklin Proview32. Старый добрый дедушка Франклин ))). Он позволяет эмулировать работу MCS 51 и в графическом виде смотреть, как изменяется состояние памяти микроконтроллера, разных регистров и таймеров. Короче, видеть почти все, что происходит внутри нашего мелкопроцессора.
Теперь, как программа должна выполнять поставленную задачу? Для начала нужно забить числа в память Intel 8051. После этого запускать цикл, который проведет сортировку полученного массива чисел. При этом надо учесть, что помещать числа из ПЗУ в ОЗУ для обработки их в цикле нам нужно вручную (т.е. указать это явно в коде). Я решил задачу следующим образом.
Описание принципа работы программы
Сначала программа записывает данные во внешнюю память. После этого она считывает исходные числа из внешней памяти во внутреннюю и одновременно сортирует их.
Процесс сортировки происходит во время считывания данных из внешней памяти и выглядит следующим образом.
Программа просматривает все исходные числа во внешней памяти и выбирает самое большое число. После этого она записывает это число в ячейку во внутренней памяти с самым большим запланированным номером. Далее ячейка во внешней памяти, откуда было считано это число, обнуляется.
После этого снова производится поиск самого большого из оставшихся чисел, это число записывается в следующую ячейку во внешней памяти.
Процесс продолжается до использования всех чисел из внешней памяти.
После этого отсортированные элементы переписываются обратно во внешнюю память.
СОЗДАНИЕ ПРОГРАММЫ
К счастью, метки и переходы типа “GOTO“ здесь применимы, поэтому программу можно разбить на отдельные модули. Еще одно замечание: все цифры в программе - шестнадцатеричные, и обозначаются буквой h.
Указываем, с какого участка кода программа начинает работать:
org 00h
jmp start
org 30h
Start:
jmp start
org 30h
Start:
Забиваем числа, которые нужно отсортировать, во внешнюю память:
module_create_data:;Модуль устанавливает начальные значения байтам в XDATA с адресами 00h..09h
mov DPTR, #0000h
mov A, #13h; 1-e число
movx @DPTR, A
inc DPTR
mov A, #11h; 2-e число
movx @DPTR, A
inc DPTR
mov A, #01h; 3-e число
movx @DPTR, A
inc DPTR
mov A, #17h; 4-e число
movx @DPTR, A
inc DPTR
mov A, #07h; 5-e число
movx @DPTR, A
inc DPTR
mov A, #03h; 6-e число
movx @DPTR, A
inc DPTR
mov A, #21h; 7-e число
movx @DPTR, A
inc DPTR
mov A, #32h; 8-e число
movx @DPTR, A
inc DPTR
mov A, #32h; 9-e число
movx @DPTR, A
inc DPTR
mov A, #12h; 10-e число
movx @DPTR, A
mov DPTR, #0000h
mov A, #13h; 1-e число
movx @DPTR, A
inc DPTR
mov A, #11h; 2-e число
movx @DPTR, A
inc DPTR
mov A, #01h; 3-e число
movx @DPTR, A
inc DPTR
mov A, #17h; 4-e число
movx @DPTR, A
inc DPTR
mov A, #07h; 5-e число
movx @DPTR, A
inc DPTR
mov A, #03h; 6-e число
movx @DPTR, A
inc DPTR
mov A, #21h; 7-e число
movx @DPTR, A
inc DPTR
mov A, #32h; 8-e число
movx @DPTR, A
inc DPTR
mov A, #32h; 9-e число
movx @DPTR, A
inc DPTR
mov A, #12h; 10-e число
movx @DPTR, A
Запускаем цикл сортировки:
module_sort_massiv:
mov R0, #49h
metka1:
mov 4Ah, #00h
mov R2, DPL
jmp module_search_massiv
metka_vozvrata1:
mov DPL, R2
mov A, #00h
dec DPL
movx @DPTR, A
mov @R0, 4Ah
dec R0
cjne R0, #3Fh, metka1
jmp module_data_to_xdata
mov R0, #49h
metka1:
mov 4Ah, #00h
mov R2, DPL
jmp module_search_massiv
metka_vozvrata1:
mov DPL, R2
mov A, #00h
dec DPL
movx @DPTR, A
mov @R0, 4Ah
dec R0
cjne R0, #3Fh, metka1
jmp module_data_to_xdata
Опишем также работу дополнительного модуля, нужного для сортировки:
module_search_massiv:
mov DPTR, #0000h
metka2:
movx A, @DPTR
inc DPTR
mov R1, DPL
cjne A, 4Ah, metka3
metka_vozvrata2:
cjne R1, #0Ah, metka2
jmp metka_vozvrata1
metka3:
jc metka_vozvrata2
mov 4Ah, A
mov R2, DPL
jmp metka_vozvrata2
mov DPTR, #0000h
metka2:
movx A, @DPTR
inc DPTR
mov R1, DPL
cjne A, 4Ah, metka3
metka_vozvrata2:
cjne R1, #0Ah, metka2
jmp metka_vozvrata1
metka3:
jc metka_vozvrata2
mov 4Ah, A
mov R2, DPL
jmp metka_vozvrata2
Все, сортировка данных завершена. Теперь нужно перенести числа из DATA обратно в XDATA:
module_data_to_xdata:
mov DPTR, #0000h
mov R0, #40h
metka4:
mov A, @R0
movx @DPTR, A
inc DPTR
inc R0
cjne R0, #4Ah, metka4
final:
end.
mov DPTR, #0000h
mov R0, #40h
metka4:
mov A, @R0
movx @DPTR, A
inc DPTR
inc R0
cjne R0, #4Ah, metka4
final:
end.
ОСОБЕННОСТИ РАБОТЫ ПРОГРАММЫ
Использование памяти
Участки памяти:
XDATA: 0000h…0009h – область сортируемых числа
DATA: 40h…49h - область, используемая для промежуточного хранения и сортировки чисел
Регистры:
DPTR: хранит адрес байта в XDATA (0000h..0009h).
A: используется как буфер для передачи данных из XDATA в DATA и для копирования данных из одного участка памяти в другой.
R0: хранит адрес обрабатываемого элемента в DATA (40h..49h)
R1: используется как локальный счетчик цикла.
R2: хранит данные из DPL для запоминания адреса текущего самого большего элемента.
Участок 4Ah: хранит текущее самое большое число.
Результаты работы программы
В таблице 1 приведены результаты работы программы. В столбце «Адрес ячейки» указан адрес внешней памяти XDATA, в которой хранятся сортируемые данные.

СКАЧАТЬ
1. Исходники программы
2. Franklin Proview32 + краткое описание
3. Описание микроконтроллера Intel 8051, краткая справка по ассемблеру (на английском)
4. Подробное руководство по микроконтроллеру Intel 8051 и ассемблеру для него (на русском)
- Просмотров: 11788
Версия для печати
#1
_NuClear |
_NuClear | 
Думаю так же интересно будет почитать о .NET Micro Framework. на техдейс видел несколько презентаций, понравилось ....
Дата публикации: 27 марта 2009 02:10 | ICQ: 958
цитировать
цитировать
#2
Vanger |
Vanger | 
_NuClear, я .NET вообще честно говоря не знаю
если найду чтото по теме, выложу
ты кстати на techdays презентации как видел? вживую смотрел на конференции или с сайта ?
если найду чтото по теме, выложу
ты кстати на techdays презентации как видел? вживую смотрел на конференции или с сайта ?
Дата публикации: 27 марта 2009 12:34 | ICQ: --
цитировать
цитировать
#3
_NuClear |
_NuClear | 
С сайта, интернет не позволяет смотреть в живую.
Дата публикации: 27 марта 2009 14:58 | ICQ: 958
цитировать
цитировать
#4
Vanger |
Vanger | 
что делает конкретно какая команда тут - пока лениво писать, да и времени нет
сегодня докину на аплоуд franklin proview 32 этот, итоговую прогу + мануал по асму для этого проца
сегодня докину на аплоуд franklin proview 32 этот, итоговую прогу + мануал по асму для этого проца
Дата публикации: 27 марта 2009 19:26 | ICQ: --
цитировать
цитировать
#5
stokito |
stokito | выложите или напишите отдельно серийник для Franklin Proview32
Дата публикации: 11 июля 2009 22:48 | ICQ: --
цитировать
цитировать
#6
Vanger |
Vanger | 
Франклин запускается с триальным серийником... его я точно не помню, позже напишу
ограничение триалки - размер проги не может быть больше 2 килобайт, помоему
для изучения и написания простых прог хватит
для более серьезных дел посоветовал бы... делать железки с другим процессором)) более современным
ограничение триалки - размер проги не может быть больше 2 килобайт, помоему
для изучения и написания простых прог хватит
для более серьезных дел посоветовал бы... делать железки с другим процессором)) более современным
Дата публикации: 28 июля 2009 10:23 | ICQ: --
цитировать
цитировать
#7
Vanger |
Vanger | 
Регистрационный ключ для Franklin Proview32 - EVAL
Это ключ для демонстрационной версии, есть небольшие ограничения, которые не помешают изучению этого асма
Это ключ для демонстрационной версии, есть небольшие ограничения, которые не помешают изучению этого асма
Дата публикации: 4 августа 2009 18:59 | ICQ: --
цитировать
цитировать
#8
alena |
alena | лЮДИ ПОМГИТЕ Я СКАЧАЛА ПРОГРАММУ Pro32 как ее запустить.что надо писать где запрашивается
Name:
Company:
Serial:
Name:
Company:
Serial:
Дата публикации: 25 октября 2009 17:29 | ICQ: --
цитировать
цитировать
#9
Vanger |
Vanger | 
Name: Что хочешь, то и напиши
Company: Что хочешь, то и напиши
Serial: EVAL
Company: Что хочешь, то и напиши
Serial: EVAL
Дата публикации: 15 ноября 2009 19:48 | ICQ: --
цитировать
цитировать
#10
Марат |
Марат | а можно тожэ самое сделать тока в порядке убывания?
а можно тожэ самое сделать тока в чтоб числа впорядке убывания были!??
а можно тожэ самое сделать тока в чтоб числа впорядке убывания были!??
Дата публикации: 22 декабря 2009 22:49 | ICQ: --
цитировать
цитировать
#11
Vanger |
Vanger | 
конечно
как запрограммируете, так и будет
как запрограммируете, так и будет
Дата публикации: 4 января 2010 14:43 | ICQ: --
цитировать
цитировать
#12
warezhunter_ |
warezhunter_ | А я использую Keil C51 там попроще что нибудь писать, можно на С, а можно на ассемблере, что нибудь серьезное лучше делать на C, чем ломать голову с ассемблером, и в отличии от Proview там есть серийник и ограничения по коду программы можно убрать.
Дата публикации: 13 января 2010 07:57 | ICQ: --
цитировать
цитировать
#13
1 |
1 | А еще в Keil 51 (v.3 или v.4) есть замечательный logyc analyzer для просмотра временных диаграмм сигналов
Дата публикации: 21 февраля 2010 14:18 | ICQ: --
цитировать
цитировать
#14
Марк |
Марк | Помогите решить задачу
Написать программу на ассемблере МК51, выполняющую действия в соответствии с заданием. Определить необходимый объем РПП и время выполнения программы.
Задание
вычислить логическое выражение для X < E0Н:
V = (X Y + Z & R) & (X & Y & Z + R) & FCH;
По окончании вывести на индикатор (P1) вычисленное значение V.
Размещение переменных в портах и РПД МК51:
X – Р0; Y – Р2; Z – 3FH; R - 40H; V - 41H.
Написать программу на ассемблере МК51, выполняющую действия в соответствии с заданием. Определить необходимый объем РПП и время выполнения программы.
Задание
вычислить логическое выражение для X < E0Н:
V = (X Y + Z & R) & (X & Y & Z + R) & FCH;
По окончании вывести на индикатор (P1) вычисленное значение V.
Размещение переменных в портах и РПД МК51:
X – Р0; Y – Р2; Z – 3FH; R - 40H; V - 41H.
Дата публикации: 13 мая 2010 22:47 | ICQ: --
цитировать
цитировать
#16
olenikammm |
olenikammm | Большое [url=http://new.ya.ru/]Спасибо[/url] вам!
Дата публикации: 6 июня 2011 16:38 | ICQ: --
цитировать
цитировать

