Компонент · Контроллер

Микроконтроллер 8051

8051 — 8-битный микроконтроллер, который преподают первым на большинстве инженерных курсов. Что даёт его архитектура и что приходится реализовывать вручную.

Что это такое

8051 — не плата и даже не одна микросхема, а архитектура. Intel представила её в 1980 году, а затем так широко лицензировала ядро, что сегодня доступную микросхему выпускает другая компания. В лабораторном наборе это почти всегда Atmel AT89S52: ядро 8051 с 8 KB флеш-памяти, 256 байт RAM, тремя таймерами и внутрисхемным программированием через четыре вывода.

В комплекте есть только 40-выводный DIP. Никаких USB, регулятора питания, загрузчика и pinMode(). До выполнения первой инструкции необходимо подключить кварцевый резонатор, два нагрузночных конденсатора, схема сброса и соединение вывода EA с +5 V. Именно эта минималистичность объясняет, почему микросхема остаётся в учебных программах: между кодом и кремнием нет слоя, скрывающего поведение, которое вы не понимаете.

Минимальная схема, необходимая 8051 для работы. На блоке микросхемы AT89S52 показаны шесть выводов: вывод VCC 40 соединён с шиной пяти вольт, а вывод GND 20 — с землёй; вывод EA 31 красным проводом подключён к шине пяти вольт и подписан «соедините EA с высоким уровнем, иначе микросхема ничего не будет выполнять»; вывод XTAL2 18 и вывод XTAL1 19 подключены к кварцевому резонатору 11.0592 MHz, а от каждого его вывода к земле идёт конденсатор 33 пикофарад; вывод RST 9 соединён с конденсатором 10 микрофарад, идущим вверх к шине пяти вольт, и резистором 10 кОм, идущим вниз к земле, с пометкой «сброс активен при HIGH».
Всё, что нужно 8051 до выполнения первой инструкции. Соединение EA с +5 V — единственный элемент, из-за которого первая плата молча перестаёт работать. Скачать SVG
Схема выводов 8051 в 40-выводном корпусе DIP, выполненная вертикально с меткой вывода 1 сверху. Левый столбец содержит выводы от 1 до 20: выводы порта 1 от P1.0 до P1.7 с альтернативными функциями T2, T2EX, MOSI, MISO и SCK, затем RST, затем выводы порта 3 от P3.0 до P3.7 с обозначениями RXD, TXD, INT0, INT1, T0, T1, WR и RD, затем XTAL2, XTAL1 и GND. Правый столбец содержит выводы от 40 до 21: VCC, выводы порта 0 от P0.0 до P0.7, работающие также как AD0–AD7, затем EA, ALE и PSEN, затем выводы порта 2 от P2.7 до P2.0, работающие также как линии адреса A15–A8. Цветовая маркировка разделяет порты I/O, альтернативные функции порта 3, тактовые и управляющие выводы и питание.
40-выводный DIP. Обратите внимание: выводы порта 0 идут в обратном порядке — вывод 32 — P0.7, а вывод 39 — P0.0; вторые обозначения порта 3 соответствуют выводам последовательного интерфейса, прерываний и таймеров. Скачать SVG

Как это работает

8051 представляет собой гарвардскую архитектуру: память программ и память данных находятся в разных адресных пространствах, к которым обращаются разные инструкции. Код хранится во флеш-памяти, а переменные — во внутренней RAM объёмом 256 байт, разделённой на четыре банка регистров, адресуемое по битам окно и область для стека.

Время здесь легко поддаётся анализу. Один машинный цикл составляет двенадцать периодов генератора, а большинство инструкций выполняются за один или два таких цикла. При 11.0592 MHz один цикл длится 1.085 µs, поэтому можно подсчитать инструкции и точно, а не приблизительно, узнать время выполнения цикла. Очень немногие современные микросхемы это позволяют.

32 вывода I/O объединены в четыре порта с разными свойствами:

  • P1 — единственный простой порт: восемь выводов общего назначения с внутренними подтягивающими резисторами.
  • P3 совмещает на каждом выводе альтернативную функцию: последовательный интерфейс RXD/TXD, два внешних прерывания, два входа таймеров, а также сигналы чтения и записи внешней памяти.
  • P2 передаёт старший байт адреса при подключённой внешней памяти.
  • P0 имеет открытый сток. Без внешних подтягивающих резисторов он вообще не может вывести логическую единицу; кроме того, он работает как мультиплексированная шина младшего байта адреса и байта данных.

Чего у микросхемы нет, не менее важно: аналоговых входов и аппаратного PWM нет. Для измерения напряжения датчика нужен внешний ADC, а для изменения скорости двигателя придётся самостоятельно формировать сигнал по прерыванию таймера.

Когда его следует использовать

Выбирайте 8051, если цель — изучить архитектуру микроконтроллера: курс по микроконтроллерам, университетский мини-проект или собственное любопытство к тому, что действительно делает analogWrite(). Написание генератора программного PWM даст больше, чем год вызовов библиотеки, скрывающей его реализацию.

Выбирайте практически любое другое устройство, когда цель — робот. Arduino Uno предоставляет аппаратный PWM, аналоговые входы и библиотеку для каждого датчика, который встретится; ESP32 добавляет Wi-Fi и значительно больше памяти. Оба стоят примерно столько же, сколько отладочная плата 8051. Выбор 8051 для проекта, которому нужно работать, а не обучать, означает вручную реализовать то, что альтернативы предоставляют бесплатно.

Типичные ошибки

  • EA необходимо соединить с +5 V. Вывод 31 выбирает внутреннюю или внешнюю память программ. Если он не подключён или соединён с землёй, микросхема молча обращается к отсутствующей внешней памяти и ничего не выполняет — без ошибки, индикации или подсказки. Это самая частая причина того, что первая плата на 8051 кажется нерабочей.
  • Сброс активен при HIGH. В отличие от почти всех других микроконтроллеров, 8051 сбрасывается, когда RST переводится вверх. Стандартная схема питания содержит конденсатор 10 µF от +5 V к RST и резистор 10 kΩ от RST к земле.
  • Порту 0 нужны внешние подтягивающие резисторы. У него открытый сток. Подключите резисторы 10 kΩ к +5 V, иначе он никогда не сможет надёжно считать или вывести высокий уровень.
  • Выводы принимают, но не отдают ток. Внутренняя подтяжка обеспечивает лишь десятки микроампер, тогда как транзистор стока пропускает миллиамперы. Аноды светодиодов (LED) подключают к источнику питания, катоды — к выводу, а 0 включает светодиод. При обратном подключении он светится очень слабо и вызывает массу недоумения.
  • Стек начинается с 08h, поверх банка регистров 1. Указатель стека при сбросе равен 07h. Если перейти к банку 1, не передвинув SP, регистры и обратные адреса займут одни и те же байты.

Почему именно 11.0592 MHz

Эта частота резонатора выглядит произвольной, но это один из самых продуманных выборов во всей архитектуре.

8051 формирует скорость последовательной передачи с помощью переполнения таймера 1 в 8-битном режиме автоперезагрузки:

baud = (2^SMOD / 32) x (oscillator / 12) / (256 - TH1)

При SMOD = 0 и кварцевом резонаторе 11.0592 MHz для скорости 9600 бод:

TH1 = 256 - (11059200 / (12 x 32 x 9600)) = 256 - 3 = 253 = 0xFD

Получается ровно 3. Без округления и ошибки. Каждая стандартная скорость — 1200, 2400, 4800, 9600, 19200 — даёт целое число перезагрузок таймера.

Теперь попробуйте круглое значение 12 MHz:

TH1 = 256 - (12000000 / 3686400) = 256 - 3.26 -> must round to 3
actual baud = 10417, against a target of 9600 -> 8.5% error

Последовательные линии допускают суммарную ошибку примерно 2–3% между двумя концами. При ошибке 8.5% кадры смещаются в пределах байта, и каждый символ приходит повреждённым. Именно поэтому существует 11.0592 MHz, поэтому эта частота применяется на каждой лабораторной плате 8051 и почему замена резонатора в ящике на 12 MHz приводит к тому, что микросхема идеально работает, пока не попытаешься что-либо вывести.

Плата за это — неудобные расчёты времени: машинный цикл длится 1.085 µs, а не круглые 1 µs. Кварцевый резонатор 12 MHz даёт ровно циклы 1 µs и непригодную последовательную связь. Выбирайте исходя из того, что требуется проекту.

Таймеры и формирование PWM вручную

В 8051 есть три 16-битных таймера и аппаратного PWM нет вообще. Изменение скорости двигателя означает самостоятельное формирование сигнала, и это действительно лучшая часть изучения этой микросхемы.

У таймеров четыре режима; важны два:

Режим Разрядность Перезагрузка Для чего использовать
0 13-битный Вручную Устаревший; не используйте
1 16-битный Вручную Длительные точные задержки. Требуется перезагрузка в ISR
2 8-битный Автоматически Скорости передачи и любой такт с фиксированным периодом
3 Раздельный T0 — Когда остро нужен третий таймер

Режим 2 подходит для стабильного тактового сигнала, поскольку перезагрузка выполняется оборудованием и длительность периода не зависит от нестабильности ISR.

Генератор программного PWM на таймере 0 с частотой около 1 kHz и 100 ступенями разрешения:

#include <reg52.h>

sbit MOTOR_L = P1^0;
sbit MOTOR_R = P1^1;

volatile unsigned char dutyL = 0, dutyR = 0;   // 0..99
volatile unsigned char tick  = 0;

void timer0_isr(void) interrupt 1 {
    /* Mode 1 is not self-reloading: put the value back first, before
       anything else, or the period stretches by the ISR's own length. */
    TH0 = 0xFF; TL0 = 0xA4;                    /* ~10 us at 11.0592 MHz */

    if (++tick >= 100) tick = 0;               /* 100 ticks = ~1 ms period */

    MOTOR_L = (tick < dutyL) ? 1 : 0;
    MOTOR_R = (tick < dutyR) ? 1 : 0;
}

void main(void) {
    TMOD = (TMOD & 0xF0) | 0x01;               /* Timer 0, mode 1 */
    TH0  = 0xFF; TL0 = 0xA4;
    ET0  = 1;                                  /* enable timer 0 interrupt */
    EA   = 1;                                  /* global interrupt enable */
    TR0  = 1;                                  /* start */

    dutyL = 70; dutyR = 70;
    while (1) { }                              /* PWM runs entirely in the ISR */
}

Из этого стоит извлечь два вывода. Сначала перезагружайте, всегда — в режиме 1 после переполнения таймер продолжает счёт с нуля, поэтому каждая инструкция до перезагрузки увеличивает следующий период. И эта цена реальна: данный ISR срабатывает 100,000 раз в секунду, а при длительности машинного цикла 1.085 µs обработчик из десятка инструкций расходует заметную долю всех возможностей микросхемы. Именно эту нагрузку снимает аппаратный модуль PWM, и её ценность понимаешь лишь после того, как сам заплатишь за неё.

Бюджет тока портов

Этот вопрос сбивает с толку, потому что порты 8051 несимметричны, в отличие от современных микросхем.

Приём тока (выход LOW) Отдача тока (выход HIGH)
На один вывод P1/P2/P3 ~10 mA ~60 µA (только внутренняя подтяжка)
На один вывод P0 ~10 mA 0 — открытый сток, подтяжки нет
На один порт, всего ~26 mA —
Вся микросхема ~71 mA —

Шестьдесят микроампер — не опечатка. Внутренняя подтяжка является слабым резистором, а не драйвером, поэтому вывод в состоянии HIGH способен обеспечить примерно тысячную часть тока, который он может принять.

Непосредственно отсюда следуют три последствия:

Катоды светодиодов (LED) подключаются к выводам, а аноды — через резистор к +5 V; запись 0 включает светодиод. При обратном подключении они светятся очень слабо, что воспринимается не как ошибка понимания, а как тусклый или неисправный LED.

Никогда не управляйте нагрузкой непосредственно. Ни реле, ни громким звонком, ни двигателем. Используйте транзистор, матрицу драйверов ULN2003 или подходящий драйвер двигателей.

Порту 0 нужны внешние подтягивающие резисторы — 10 kΩ к +5 V на каждом выводе, который планируется использовать как I/O. Без них он не может вывести высокий уровень или надёжно считать его; именно этот порт на большинстве лабораторных плат подключают к LCD.

Память и распределение 256 байт

Объём флеш-памяти в восемь килобайт кажется тесным, но обычно это не так. Реальное ограничение — 256 байт RAM, причём это не плоские 256 байт:

Адрес Размер Что находится там
00h–1Fh 32 байт Четыре банка регистров, по R0–R7 в каждом
20h–2Fh 16 байт С побитовой адресацией — 128 отдельно адресуемых битов
30h–7Fh 80 байт Общая рабочая область и обычно стек
80h–FFh 128 байт Только косвенная адресация (SFRs занимают прямое пространство)

Указатель стека при сбросе равен 07h, поэтому стек начинается непосредственно поверх банка регистров 1. Если перейти к банку 1, не передвинув SP, регистры и обратные адреса будут занимать одни байты, а отказ станет разительным: программа вернётся по случайному адресу. Обычно SP = 0x30; является первой строкой main().

Адресуемой по битам области стоит знать, поскольку она действительно изящна. Любой бит в области 20h–2Fh можно установить, сбросить или проверить одной инструкцией, что делает флаги состояния бесплатными:

bit lineDetected;      /* the compiler allocates this in 20h-2Fh */
bit motorEnabled;      /* one bit each, one instruction to test */

Восемь таких битов занимают один байт, а проверка каждого — один машинный цикл. Для микросхемы с 256 байт RAM это существенно.

Диагностика

Симптом Вероятная причина Исправление
Микросхема вообще ничего не делает EA плавает или соединён с землёй Соедините вывод 31 с +5 V. Проверяйте это первым делом всегда
Микросхема ничего не делает, EA имеет высокий уровень Кварцевый резонатор не колеблется Проверьте нагрузочные конденсаторы 33 pF и пайку резонатора
Постоянная перезагрузка RST удерживается в высоком уровне Здесь сброс активен при HIGH — проверьте сеть 10 µF / 10 kΩ
Порт 0 ничего не считывает и не записывает Открытый коллектор без подтяжек Резистор 10 kΩ от каждого вывода к +5 V
LED очень тусклый Подключён на отдачу тока Катод к выводу; для включения записать 0
Последовательный вывод содержит мусор Кварцевый резонатор 12 MHz Используйте 11.0592 MHz — 12 MHz даёт ошибку скорости 8.5%
Последовательная связь работает только в одну сторону TX/RX не перекрещены или нет общей земли Перекрестите их; соедините земли
Программа возвращается неизвестно куда Стек перекрывает банк регистров 1 SP = 0x30; в начале main()
Период PWM нестабилен Таймер перезагружается в конце ISR Выполните перезагрузку первой инструкцией или используйте режим 2
Непредсказуемое поведение по мере роста кода Не хватает RAM Всего 256 байт; проверьте карту компоновщика
Программатор не видит микросхему Выводы ISP заняты или нет управления сбросом Освободите P1.5–P1.7 и RST на время программирования

8051 или современный микроконтроллер?

8051 (AT89S52) Arduino Uno ESP32
Флеш-память / RAM 8 KB / 256 B 32 KB / 2 KB 4 MB / 520 KB
Аппаратный PWM Нет 6 каналов 16 каналов
Аналоговый вход Нет 6 × 10-битный 18 × 12-битный
Скорость последовательной передачи Нужен подходящий резонатор Любая Любая
Библиотеки Пишите самостоятельно Тысячи Тысячи
Что вы изучите Микросхему Проект Систему

Честный вывод: 8051 — отличная обучающая микросхема. Написание генератора программного PWM, ручной расчёт значения перезагрузки для последовательной передачи и обнаружение того, что вывод порта не может отдавать ток, показывают, что именно современные периферийные устройства делают за вас. Это понимание сохраняется навсегда, и именно поэтому архитектура остаётся в учебных программах через сорок пять лет после публикации Intel.

Для робота, который должен работать, выбирайте практически любое другое устройство. Создание робота, следующего за линией на 8051 означает написание PWM, добавление внешнего ADC или использование датчиков на основе выхода компаратора и ручной расчёт каждой постоянной времени — всё это Uno предоставляет за те же деньги. Делайте это, если цель — понять микросхему. Выбирайте Uno, если цель — робот.

Исследуйте граф

Используется в этих сборках

Проекты, учебные пути и симуляторы, в которых используется Микроконтроллер 8051.

Сравнение

Альтернативы

Вопросы

Микроконтроллер 8051: частые вопросы

Что такое микроконтроллер 8051?

8051 — архитектура 8-битных микроконтроллеров, представленная Intel в 1980 году и впоследствии лицензированная многими производителями, поэтому сегодня её покупают как совместимую микросхему, например Atmel AT89S52, а не как изделие Intel. В одном 40-выводном корпусе объединены CPU, флеш-память, RAM, таймеры, последовательный порт и 32 вывода I/O; это остаётся стандартным обучающим микроконтроллером в большинстве инженерных программ.

Почему 8051 всё ещё изучают, хотя он появился в 1980 году?

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

Чем 8051 отличается от Arduino?

Arduino Uno — плата на базе ATmega328P, а 8051 — отдельная микросхема, которую нужно дополнить кварцевым резонатором, схемой сброса и программатором. Arduino предоставляет аппаратный PWM, аналоговые входы, USB-загрузчик и огромную экосистему библиотек. У 8051 нет ни одного из этих возможностей: у него нет ADC и PWM вовсе, поэтому на нём учат основам.

Почему в 8051 используют кварцевый резонатор 11.0592 MHz?

Он обеспечивает точные скорости передачи по последовательному интерфейсу. UART делит тактовую частоту машинного цикла, и 11.0592 MHz делится без остатка до точно 9600 бод, тогда как круглое значение 12 MHz даёт ошибку около 8.5% и повреждает последовательные данные. Странное на вид число выбрано для арифметики, а не ради скорости.

Сколько портов у 8051?

Четыре 8-битных порта — P0, P1, P2 и P3, всего 32 вывода I/O. Они не взаимозаменяемы: у P0 нет внутренних подтягивающих резисторов и нужны внешние; P3 передаёт сигналы последовательного интерфейса, прерываний и таймеров как альтернативные функции; P0 и P2 при подключении внешней памяти работают также как шина адреса и данных.

Почему моя программа для 8051 ничего не делает после прошивки?

Сначала проверьте вывод EA (вывод 31). Если он соединён с землёй или оставлен неподключённым, микросхема пытается загружать программу из отсутствующей внешней памяти, поэтому ничего не выполняется и ошибка не выдаётся. Для выполнения кода из внутренней флеш-памяти вывод EA должен быть подключён к +5 V. Следующие два вероятных виновника — отсутствующая схема сброса и два нагрузочных конденсатора кварцевого резонатора.

Можно ли программировать 8051 на C?

Да, и сейчас так делает большинство курсов. Keil C51 — отраслевой компилятор, а SDCC — бесплатная альтернатива с открытым исходным кодом. Здесь C намного продуктивнее ассемблера, но 8051 вознаграждает знание того, что генерирует компилятор: даже безобидное умножение или большой локальный массив на микросхеме с 256 байт RAM обходятся намного дороже, чем на других платформах.

Используется ли 8051 в реальных изделиях?

Да, хотя редко как отдельная видимая микросхема. Совместимые с 8051 ядра встраивают в бесчисленное число устройств — USB-контроллеры, сенсорные панели, пульты дистанционного управления и радиомодули, — поскольку ядро компактно, хорошо изучено и не создаёт сложностей с лицензированием. Чаще всего его можно встретить как блок внутри другой микросхемы, а не как 40-выводный DIP на лабораторном столе.

Дополнительные материалы

Источники