Введение в ассемблер микроконтроллеров Intel 8051

Написал Vanger, в Статьи » Прочее.
ВВЕДЕНИЕ

Программы можно писать не только для 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:            

Забиваем числа, которые нужно отсортировать, во внешнюю память:
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

Запускаем цикл сортировки:
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

Опишем также работу дополнительного модуля, нужного для сортировки:
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

Все, сортировка данных завершена. Теперь нужно перенести числа из 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.

ОСОБЕННОСТИ РАБОТЫ ПРОГРАММЫ

Использование памяти
Участки памяти:
XDATA: 0000h…0009h – область сортируемых числа
DATA: 40h…49h - область, используемая для промежуточного хранения и сортировки чисел
Регистры:
DPTR: хранит адрес байта в XDATA (0000h..0009h).
A: используется как буфер для передачи данных из XDATA в DATA и для копирования данных из одного участка памяти в другой.
R0: хранит адрес обрабатываемого элемента в DATA (40h..49h)
R1: используется как локальный счетчик цикла.
R2: хранит данные из DPL для запоминания адреса текущего самого большего элемента.
Участок 4Ah: хранит текущее самое большое число.

Результаты работы программы
В таблице 1 приведены результаты работы программы. В столбце «Адрес ячейки» указан адрес внешней памяти XDATA, в которой хранятся сортируемые данные.
Введение в ассемблер микроконтроллеров Intel 8051


СКАЧАТЬ

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

Думаю так же интересно будет почитать о .NET Micro Framework. на техдейс видел несколько презентаций, понравилось ....
Дата публикации: 27 марта 2009 02:10 | ICQ: 958
цитировать
#2 Vanger |  

_NuClear, я .NET вообще честно говоря не знаю
если найду чтото по теме, выложу

ты кстати на techdays презентации как видел? вживую смотрел на конференции или с сайта ?
Дата публикации: 27 марта 2009 12:34 | ICQ: --
цитировать
#3 _NuClear |  

С сайта, интернет не позволяет смотреть в живую.
Дата публикации: 27 марта 2009 14:58 | ICQ: 958
цитировать
#4 Vanger |  

что делает конкретно какая команда тут - пока лениво писать, да и времени нет
сегодня докину на аплоуд franklin proview 32 этот, итоговую прогу + мануал по асму для этого проца
Дата публикации: 27 марта 2009 19:26 | ICQ: --
цитировать
#5 stokito |  

выложите или напишите отдельно серийник для Franklin Proview32
Дата публикации: 11 июля 2009 22:48 | ICQ: --
цитировать
#6 Vanger |  

Франклин запускается с триальным серийником... его я точно не помню, позже напишу
ограничение триалки - размер проги не может быть больше 2 килобайт, помоему
для изучения и написания простых прог хватит
для более серьезных дел посоветовал бы... делать железки с другим процессором)) более современным
Дата публикации: 28 июля 2009 10:23 | ICQ: --
цитировать
#7 Vanger |  

Регистрационный ключ для Franklin Proview32 - EVAL
Это ключ для демонстрационной версии, есть небольшие ограничения, которые не помешают изучению этого асма
Дата публикации: 4 августа 2009 18:59 | ICQ: --
цитировать
#8 alena |  

лЮДИ ПОМГИТЕ Я СКАЧАЛА ПРОГРАММУ Pro32 как ее запустить.что надо писать где запрашивается
Name:
Company:
Serial:
Дата публикации: 25 октября 2009 17:29 | ICQ: --
цитировать
#9 Vanger |  

Name: Что хочешь, то и напиши
Company: Что хочешь, то и напиши
Serial: EVAL
Дата публикации: 15 ноября 2009 19:48 | ICQ: --
цитировать
#10 Марат |  

а можно тожэ самое сделать тока в порядке убывания?

а можно тожэ самое сделать тока в чтоб числа впорядке убывания были!??
Дата публикации: 22 декабря 2009 22:49 | ICQ: --
цитировать
#11 Vanger |  

конечно
как запрограммируете, так и будет
Дата публикации: 4 января 2010 14:43 | ICQ: --
цитировать
#12 warezhunter_ |  

А я использую Keil C51 там попроще что нибудь писать, можно на С, а можно на ассемблере, что нибудь серьезное лучше делать на C, чем ломать голову с ассемблером, и в отличии от Proview там есть серийник и ограничения по коду программы можно убрать.
Дата публикации: 13 января 2010 07:57 | ICQ: --
цитировать
#13 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.
Дата публикации: 13 мая 2010 22:47 | ICQ: --
цитировать
#15 Duke Nukem |  

Loading....
Дата публикации: 22 июня 2010 04:35 | ICQ: --
цитировать
#16 olenikammm |  

Большое [url=http://new.ya.ru/]Спасибо[/url] вам!
Дата публикации: 6 июня 2011 16:38 | ICQ: --
цитировать

Добавить комментарий


Включите эту картинку для отображения кода безопасности
обновить код



 

Лучшие новости

Наш опрос

Мы в интернете