Índice:
2025 Autor: John Day | [email protected]. Última modificação: 2025-01-13 06:58
O 8051 (também conhecido como MCS-51) é um design MCU dos anos 80 que permanece popular até hoje. Microcontroladores modernos compatíveis com 8051 estão disponíveis em vários fornecedores, em todas as formas e tamanhos, e com uma ampla variedade de periféricos. Neste instrutível, examinaremos o MCU AT89C2051 da Atmel.
AT89C2051 é um microcontrolador pequeno (2Kbyte Flash, 128byte RAM) e barato (~ $ 1,40 por chip). Características:
- Operação 2,7-6V
- 15 linhas de I / O
- 2 temporizadores (16 bits)
- Interrupções internas e externas
- UART
- Comparador analógico no chip
- Até 2MIPS com relógio de 24 MHz
Etapa 1: Requisitos
Requisitos:
- PC Linux (software necessário: Arduino IDE, git, make, sdcc)
- Arduino UNO
- Chip AT89C2051 (pacote DIP20)
- Soquete ZIF de 20 pinos
- Optoacoplador (de preferência com saída MOSFET)
- Escudo de prototipagem Arduino
- Fonte de alimentação 12V
- Fonte de alimentação 5V
- Oscilador de cristal de 16 MHz
- 2x capacitor 30pF
- Capacitor 100nF
- Diodo (ex: 1N400X)
- Resistores (1K, 3K3)
- Protoboard
- Jumpers
- Fio de cobre
Verifique o software necessário:
qual python3
qual faz qual sdcc qual git
Etapa 2: Construindo o Programador
Esta seção será breve, pois construí meu escudo de programação há algum tempo. Anexei o esquema e as fotos da placa montada. O PDF do esquema pode ser encontrado no repositório.
Você terá que programar a placa do programador:
1. Clone o repositório.
git clone
2. Abra o arquivo AT89C2051_programmer / AT89_prog / AT89_prog.ino no Arduino IDE.
3. Construa e carregue o esboço do Arduino IDE.
Etapa 3: Instalando o software do programador
1. Crie um ambiente virtual python.
python3 -m venv venv
. venv / bin / activate
2. Instale o at89overlord. at89overlord é um programador de código aberto para o chip AT89C2051 escrito por mim. O código-fonte pode ser encontrado aqui.
pip install at89overlord
3. Verifique a instalação.
at89overlord -h
Etapa 4: Programando o Chip
1. Clone um projeto simples de piscar.
cd ~
git clone https://github.com/piotrb5e3/hello-8051.git cd hello-8051 /
2. Crie o aplicativo.
faço
3. Conecte o Arduino ao PC, conecte a fonte de 12 V, coloque o chip AT89C2051 no soquete ZIF.
4. Localize a porta serial do Arduino.
ls / dev / tty *
5. Carregue o arquivo IntelHex integrado para o chip. Se a porta do seu Arduino for diferente de / dev / ttyACM0, você deve passar o valor correto com o parâmetro de linha de comando -p.
at89overlord -f./hello.ihx
Etapa 5: Montagem
Monte o circuito de acordo com o esquema. Uma versão em PDF pode ser encontrada no repositório.
Você deve ver o LED verde piscar com uma frequência de cerca de 0,5 Hz.
Etapa 6: Explicação do código
#incluir
#incluir
Começamos incluindo o cabeçalho AT89X051 do sdcc. Ele contém macros para interagir com os registradores como se fossem variáveis. Também incluímos stdint.h que contém definições dos tipos inteiros uint8_t e uint16_t.
// Assumindo que o oscilador é 16 MHz
# define INTERRUPTS_PER_SECOND 5208
Uma interrupção ocorre quando o Timer0 transborda. Ele é configurado como um único temporizador de 8 bits, então isso acontece a cada 2 ^ 8 ciclos do processador. Um ciclo de processador leva 12 ciclos de clock e, portanto, chegamos a 16000000/12/2 ^ 8 = 5208,33333.
volátil uint8_t led_state = 0;
volátil uint16_t timer_counter = INTERRUPTS_PER_SECOND;
Declaramos o controle de estado do led e as variáveis do contador de interrupções.
void Timer0_ISR (void) _interrupt (1) {
timer_counter--; if (timer_counter == 0) {led_state =! led_state; timer_counter = INTERRUPTS_PER_SECOND; }}
Cada vez que o Timer0 transborda, o contador diminui. Se for igual a zero é zerado e o estado do led é alterado. Isso ocorre cerca de uma vez por segundo, resultando em frequência de intermitência do LED de aproximadamente 0,5 Hz.
int main () {
TMOD = 0x3; // Modo temporizador - 8 bits, sem prescaler. freq = OSCFREQ / 12/2 ^ 8 TL0 = 0; // Limpar contador TH0 = 0; // Limpa o registro TR0 = 1; // Defina o cronômetro para funcionar. ET0 = 1; // Definir interrupção. EA = 1; // Definir interrupção global. while (1) {if (led_state) {P1 = 0xFF; } senão {P1 = 0x00; }}}
Configuramos o módulo do temporizador e aguardamos as alterações na variável de controle do estado do led. TMOD é o registro de controle do modo do temporizador. TL0 e TH0 são registradores de controle Timer0. ET0 é o bit de habilitação do timer0 no registro de controle do timer (TCON). TR0 e EA são bits no registro de habilitação de interrupção (IE).
Etapa 7: Recursos Adicionais
- Folha de dados do AT89C2051:
- Compilador C de dispositivo pequeno (sdcc):
- Recursos do 8051:
- Repositório do programador AT89C2051:
- repositório hello-8051: