Em sistemas baseados no microcontrolador 8051, a interface de botões é fundamental para a interação do usuário. Os botões podem ser conectados de forma independente ou em matriz, utilizando portas GPIO específicas. No STC89C52, as portas P3^0 a P3^3 são frequentemente utilizadas para essa finalidade.
O princípio de detecção baseia-se na variação de nível lógico: em repouso, a porta permanece em nível alto através de um resistor de pull-up; quando o botão é pressionado, a porta é levada ao nível baixo. Esse mecanismo permite que o microcontrolador detecte a ação do usuário.
Devido às características mecânicas dos botões, ocorre o fenômeno de bouncing. Para mitigar esse problema, utiliza-se a técnica de debounce por software, que consiste em aguardar um curto período após a primeira detecção e verificar novamente o estado do botão, eliminando leituras falsas.
Interface do Motor
O microcontrolador 8051 não possui capacidade direta de acionamento de motores de alta potência. Por isso, é necessário utilizar circuitos drivers que convertem sinais de baixa corrente em sinais adequados para acionamento de cargas maiores.
| Tipo de Pino | Exemplo | Função |
|---|---|---|
| Saída digital | P3^0, P3^1 | Controle de partida/parada e direção |
| Saída PWM | P1.0–P1.7 | Regulação de velocidade |
Motores DC não possuem polaridade fixa, mas a inversão das conexões resulta na inversão do sentido de rotação, o que pode ser explorado conforme a necessidade da aplicação.
Inicialização do Sistema
A fase de inicialização configura os registradores e portas necessárias para o funiconamento do controle de motor. Os principais elementos são:
Configuração de Registradores
O registrador TMOD define o modo de operação do temporizador:
TMOD = 0x10; // Temporizador 1 no modo 1 (16 bits)
O registrador TCON controla o início e as interrupções:
TF1 = 0; // Limpa flag de interrupção
TR1 = 1; // Inicia temporizador 1
Configuração da comunicação serial via SCON:
SCON = 0x50; // Serial modo 1, 8 bits de dados
Configuração de Interrupções
Habilitação da interrupção global:
EA = 1;
Definição de prioridade:
IP = 0x08; // Temporizador 1 com alta prioridade
Configuração de GPIO
Configuração da porta P1 como saída:
P1 = 0x00; // Inicializa P1 em nível baixo
Controle por Botões
A lógica de controle de botões gerencia as operações de partida, parada e inversão do motor. Uma implementação típica:
Definição dos pinos dos botões:
sbit BTN_START = P3^0;
sbit BTN_STOP = P3^1;
sbit BTN_REVERSE = P3^2;
Função de varredura com debounce:
unsigned char ler_botoes(void)
{
if (BTN_START == 0)
{
atraso_ms(15);
if (BTN_START == 0) return 1;
}
if (BTN_STOP == 0)
{
atraso_ms(15);
if (BTN_STOP == 0) return 2;
}
if (BTN_REVERSE == 0)
{
atraso_ms(15);
if (BTN_REVERSE == 0) return 3;
}
return 0;
}
Loop principal de processamento:
while (1)
{
unsigned char cmd = ler_botoes();
switch (cmd)
{
case 1:
ligar_motor();
break;
case 2:
desligar_motor();
break;
case 3:
inverter_motor();
break;
default:
break;
}
}
Funções de controle do motor:
void ligar_motor(void)
{
// Ativa saída PWM e liga o motor
}
void desligar_motor(void)
{
// Desativa saída PWM e para o motor
}
void inverter_motor(void)
{
// Inverte o sentido de rotação
}
Controle de Velocidade via PWM
A regulação de velocidade do motor depende da geração de um sinal PWM preciso. O temporizador do 8051 é utilizado para criar esse sinal.
Geração do Sinal PWM
Configuração do temporizador 0 no modo 1:
TMOD |= 0x01; // Temporizador 0, modo 16 bits
Definição dos valores de recarga:
TH0 = 0xFC; // Valor alto
TL0 = 0x18; // Valor baixo
Ativação do temporizador e interrupções:
TR0 = 1; // Inicia temporizador 0
ET0 = 1; // Habilita interrupção do temporizador 0
EA = 1; // Habilita interrupções globais
Controle de Duty Cycle
Uma variável global armazena o duty cycle atual e a interrupção ajusta a saída:
unsigned char contador_pwm = 0;
unsigned char ciclo_ativo = 50; // 50% inicial
void isr_timer0(void) interrupt 1
{
TH0 = 0xFC;
TL0 = 0x18;
contador_pwm++;
if (contador_pwm < ciclo_ativo)
P1_2 = 1; // Nível alto
else
P1_2 = 0; // Nível baixo
if (contador_pwm >= 100)
contador_pwm = 0;
}
Ajuste por Botões
Botões adicionais controlam o aumento e a diminuição do duty cycle:
if (botao_acelerar_pressionado())
{
ciclo_ativo += 5;
if (ciclo_ativo > 100) ciclo_ativo = 100;
}
if (botao_desacelerar_pressionado())
{
if (ciclo_ativo >= 5)
ciclo_ativo -= 5;
}
Atualização de Display
Um display LCD1602 pode exibir o duty cycle e a velocidade do motor:
void atualizar_lcd(void)
{
lcd_posicao(0, 0);
lcd_string("Ciclo: ");
lcd_inteiro(ciclo_ativo);
lcd_string("%");
lcd_posicao(0, 1);
lcd_string("RPM: ");
lcd_inteiro(calcular_rpm());
}
Ferramentas de Simulação
No desenvolvimento de projetos com o 8051, as seguintes ferramentas são amplamente utilizadas:
- Proteus: simulação de circuitos com suporte completo à família 8051, oferecendo biblioteca extensa de componentes e interface gráfica para prototipação rápida.
- Keil uVision: IDE para compilação e depuração de código C e Assemb, com funcionalidades básicas de simulação integrada.
- MATLAB/Simulink: modelagem matemática avançada, com integração via S-functions ou Embedded Coder para geração de código compatível.
Montagem do Circuito
A montagem física do circuito envolve os seguintes componentes principais:
- Microcontrolador: STC89C51/52 como unidade central de processamento, com portas I/O e temporizadores integrados.
- Driver de motor: CI MX1508 (ponte H dupla), com proteção térmica e contra curto-circuito, ideal para motores DC de pequeno e médio porte.
- Regulador de tensão: AMS1117 para fornecer alimentação estável de 3.3V ou 5V ao circuito driver.
- Display: OLED SSD1306 para visualização de parâmetros como velocidade e duty cycle.
- Sensores: sensor Hall para medição não-contactada da rotação do motor.
Esquema de conexões:
+------------------+ +------------+
| STC89C52 | | MX1508 |
|------------------| |------------|
| P1.0 ---+--------| IN1 | |
| P1.1 ---+--------| IN2 | |
| VCC ----|--------| VCC | |
| GND ----|--------| GND | |
+------------------+ +------------+
+------------+ +-------------+
| SSD1306 | | AMS1117 |
|------------| |-------------|
| SDA -------| | |
| SCL -------| | |
| VCC -------| | VCC |
| GND -------| | GND |
+------------+ +-------------+
Análise do Código-Exemplo
O trecho a seguir demonstra um controle simples de liga/desliga do motor com um único botão:
sbit MOTOR_PIN = P1^0; // Motor ligado ao pino P1.0
void main(void)
{
MOTOR_PIN = 0; // Motor inicialmente parado
while (1)
{
if (P3_1 == 0) // Verifica se o botão foi pressionado
{
atraso_ms(20); // Debounce
if (P3_1 == 0) // Confirma o pressionamento
{
MOTOR_PIN = !MOTOR_PIN; // Inverte o estado do motor
}
while (P3_1 == 0) {} // Aguarda o botão ser solto
}
}
}
O funcinoamento do código segue esta lógica:
- Inicialização: o motor é definido como desligado ao iniciar.
- Detecção de pressionamento: o estado do pino P3_1 é verificado; se estiver em nível baixo, indica que o botão foi pressionado.
- Debounce: um atraso de 20 ms é aplicado e o estado é verificado novamente para confirmar a leitura.
- Alternância de estado: o operador
!inverte o estado atual do pino do motor, alternando entre ligado e desligado. - Espera de liberação: o loop
while (P3_1 == 0)mantém o programa parado até que o botão seja solto, evitando múltiplas leituras de uma única pressão.
Pontos Técnicos Fundamentais
- Geração de PWM: controle preciso da velocidade através da interrupção do temporizador.
- Debounce de botões: dupla verificação com atraso para eliminação de ruídos elétricos.
- Alternância de estado: uso do operador lógico NOT para alternar entre ligado e desligado de forma eficiente.
- Interrupções: garantem resposta rápida a eventos externos e temporizados, melhorando a reatividade do sistema.