АТ89С2051 - это низковольтный высокопроизводительный КМОП восьмиразрядный микроконтроллер с 2 Кбайт программируемой и стираемой Flash-памяти. Он полностью совместим с семейством MCS-51, выпускается в 20-выводных корпусах DIP и SOIC. Низкая стоимость, высокие характеристики и совместимость с MCS-51 обусловили его широкое применение в промышленных и любительских разработках.
Однажды автор разработал некое простое устройство на АТ89С2051, запрограммировал микроконтроллер, установил его в панельку и... Устройство не заработало. Дело осложнялось тем, что программатор был простейшим (было решено обойтись "малой кровью") и не позволял считывать записанные данные. Делать другой программатор? А если история повторится? Пришлось делать простейшую, чисто аппаратную "читалку", которая могла бы работать без компьютера и программного обеспечения.
Вначале необходимо коротко рассказать о внутреннем устройстве микроконтроллера применительно к его программированию и верификации. Стандартные микроконтроллеры семейства х51 выпускаются в 40-выводных корпусах и имеют 4 восьмиразрядных двунаправленных порта - Р0, Р1, Р2 и Р3. При этом один из портов (обычно РО) используется для ввода (при программировании) или для вывода (при верификации) данных. Выводы других портов используются в качестве адресной шины и шины управления, сигналы которой определяют режим работы (стирание, программирование, верификация, чтение сигнатурных байтов, программирование битов защиты).
Микроконтроллер АТ89С2051 имеет всего два порта - Р1 и Р3, поэтому отсутствует возможность задавать извне адрес программируемого или верифицируемого байта. Адресация осуществляется при помощи внутреннего счетчика, сбрасываемого в 0 при сбросе контроллера. Инкрементирование счетчика осуществляется положительным импульсом на входе XTAL1. Поэтому при программировании и верификации необходимо внешнее тактирование по входу XTAL1. Прочитать внутреннее содержимое ПЗУ микроконтроллера можно только в том случае, если биты защиты не установлены.
Схема для считывания содержимого ПЗУ микроконтроллера показана на изображении выше. Элементы DD1.1 и DD1.2 образуют RS-триггер с защитой от дребезга. При нажатии кнопки S2 на выводе 3 элемента DD1.1 появляется импульс лог.О с длительностью, равной времени нажатия. Этот импульс поступает на вход RST микроконтроллера и устанавливает его в начальное состояние. Элементы DD1.3 и DD1.4 образуют второй RS-триггер с защитой от дребезга. При нажатии кнопки S1 на выводе 11 элемента DD1.4 1 появляется импульс лог.1 с длительностью, равной времени нажатия.
Этот импульс поступает на вход XTAL1 микроконтроллера и инкрементирует внутренний счетчик. Перемычка JMP1 определяет, какие именно данные будут считываться; если замкнуты контакты 1 и 2 - будут считываться сигнатурные байты, если замкнуты контакты 2 и 3 - будут считываться данные из внутреннего ПЗУ микроконтроллера. К выходам порта Р1 через токоограничивающие резисторы R8 -R15 присоединены светодиоды VD2 - VD9. Свечению светодиода соответствует лог. О на соответствующем выходе порта Р1. Светодиод VD2 индицирует младший разряд, светодиод VD9 - старший. Светодиод VD1 индицирует включение устройства. Выводы порта Р1.0 и Р1.1 могут использоваться альтернативным образом (служить входами встроенного аналогового компаратора) и не имеют внутренних притягивающих (pull up) резисторов, поэтому для них используются внешние притягивающие резисторы R6 и R7 . Порядок работы с устройством следующий.
1. Включить питание.
2. Нажать и отпустить кнопу S2.
3. Установить перемычку JMP1 в необходимое положение.
4. Прочитать байт с адреса 0.
5. Нажать и отпустить кнопку S1.
6. Прочитать байт с адреса 1.
7. Повторить шаги 5 и 6 до прочтения всего содержимого ПЗУ микроконтроллера.
8. Нажать кнопку S2 и выключить питание.
Разумеется, удобство пользования прибором можно было бы повысить, например, включив в схему дешифраторы семисегментного кода и светодиодные матрицы вместо дискретных светодиодов. Или ввести в состав какое либо устройство, которое могло бы выдавать несколько импульсов вместо одного (например, микросхему импульсного телефонного номеронабирателя), чтобы быстрее проскакивать незначащие области памяти. Но при этом исчезло бы главное преимущество - простота.