- Componentes necessários:
- Diagrama de circuito:
- Usando o TIMER de 8051 para medir a frequência:
- 555 Temporizador como fonte de frequência:
- Trabalho e explicação do código:
A frequência é definida como o número de ciclos por segundo. Também pode ser definido como recíproco do tempo total 'T'. Neste projeto, vamos contar o número de pulsos que entram na porta 3.5 do microcontrolador 8051 e exibi-lo em um display LCD 16 * 2. Basicamente, temos a medição da frequência do sinal na porta 3.5 do 8051. Aqui usamos o chip AT89S52 8051 e um 555 IC no modo Astable para gerar o pulso de amostra para demonstração. Anteriormente, construímos o contador de frequência usando o Arduino.
Componentes necessários:
- Microcontrolador 8051 (AT89S52)
- Visor LCD 16 * 2
- Fonte de frequência (temporizador 555)
- Potenciômetro
- Fios de conexão
Diagrama de circuito:
Usando o TIMER de 8051 para medir a frequência:
O microcontrolador 8051 é um microcontrolador de 8 bits que possui 128 bytes de RAM no chip, 4K bytes de ROM no chip, dois temporizadores, uma porta serial e quatro portas de 8 bits. O microcontrolador 8052 é uma extensão do microcontrolador. Para configurar a porta 3.5 como contador, os valores do registro TMOD são configurados para 0x51. A figura abaixo mostra o registro TMOD.
PORTÃO | C / T | M1 | M0 | PORTÃO | C / T | M1 | M2 |
TEMPORIZADOR 1 | TEMPORIZADOR 0 |
GATE - quando GATE é definido, o temporizador ou contador é habilitado apenas quando o pino INTx está HIGH e o pino de controle TRx é definido. Quando GATE é apagado, o temporizador é habilitado sempre que o bit de controle TRx é definido.
C / T - quando C / T = 0, atua como Timer. Quando C / T = 1, atua como Contador.
M1 e M0 indicam o modo de operação.
Para TMOD = 0x51, o timer1 atua como contador e opera no modo1 (16 bits).
16 * 2 LCD é usado para exibir a frequência do sinal em Hertz (Hz). Se você é novo no LCD 16x2, verifique mais sobre os pinos do LCD 16x2 e seus comandos aqui. Verifique também como fazer a interface do LCD com 8051.
555 Temporizador como fonte de frequência:
A fonte de frequência deve produzir ondas quadradas e a amplitude máxima é limitada a 5V, porque as portas do microcontrolador 8051 não suportam tensões maiores que 5V. A frequência máxima que ele pode medir é 655,35 KHz por causa da limitação de memória dos registros TH1 e TL1 (8 bits cada). Em 100 milissegundos, TH1 e TL1 podem conter até 65535 contagens. Portanto, a frequência máxima que pode ser medida é 65535 * 10 = 655,35 KHz.
Neste projeto do medidor de frequência 8051, estou usando o temporizador 555 no modo astável para produzir ondas quadradas de frequência variável. A frequência do sinal gerado pelo 555 IC pode ser variada ajustando o potenciômetro conforme demonstrado no Vídeo fornecido no final deste Projeto.
Neste projeto, o Timer1 (T1) conta o número de pulsos que entram na porta 3.5 dos microcontroladores 8051 por 100 milissegundos. Os valores da contagem serão armazenados nos registros TH1 e TL1, respectivamente. Para combinar os valores dos registradores TH1 e TL1, a fórmula abaixo é usada.
Pulsos = TH1 * (0x100) + TL1
Agora o 'pulso' terá um número de ciclos em 100 milissegundos. Mas a frequência do sinal é definida como o número de ciclos por segundo. Para convertê-lo em frequência, a fórmula abaixo é usada.
Pulsos = Pulsos * 10
Trabalho e explicação do código:
O programa C completo para este frequencímetro é fornecido no final deste projeto. O código é dividido em pequenos pedaços significativos e explicado a seguir.
Para interface de LCD 16 * 2 com microcontrolador 8051, temos que definir os pinos nos quais o LCD 16 * 2 está conectado ao microcontrolador 8051. O pino RS de 16 * 2 lcd está conectado a P2.7, o pino RW de 16 * 2 lcd está conectado a P2.6 e o pino E de 16 * 2 lcd está conectado a P2.5. Os pinos de dados são conectados à porta 0 do microcontrolador 8051.
sbit rs = P2 ^ 7; sbit rw = P2 ^ 6; sbit en = P2 ^ 5;
Em seguida, temos que definir algumas funções que são usadas no programa. A função de atraso é usada para criar um atraso de tempo especificado. A função Cmdwrt é usada para enviar comandos ao display LCD 16 * 2. A função datawrt é usada para enviar dados para o display LCD 16 * 2.
void delay (unsigned int); void cmdwrt (unsigned char); void datawrt (unsigned char);
Nesta parte do código, estamos enviando comandos para 16 * 2 lcd. Comandos, tais como exposição do espaço livre, o cursor incremento, forçar o cursor para o início de uma r linha são enviados para um visor LCD 16 * 2 por um após algum atraso de tempo especificado.
para (i = 0; i <5; i ++) {cmdwrt (cmd); atraso (1); }
Nesta parte do código, o temporizador1 é configurado como contador e o modo de operação é definido para o modo 1.
Timer0 é configurado como temporizador e o modo de operação é definido como modo 1. O temporizador 1 é usado para contar o número de pulsos e o temporizador 0 é usado para gerar o atraso de tempo. Os valores TH1 e TL1 são definidos como 0, para garantir que a contagem comece a partir de 0.
TMOD = 0x51; TL1 = 0; TH1 = 0;
Nesta parte do código, o cronômetro é executado por 100 milissegundos. 100 milissegundos de atraso são gerados usando a função de atraso. TR1 = 1 é para iniciar o temporizador e TR1 = 0 é para parar o temporizador após 100 milissegundos.
TR1 = 1; atraso (100); TR1 = 0;
Nesta parte do código, os valores de contagem presentes nos registradores TH1 e TL1 são combinados e depois multiplicados por 10 para obter o número total de ciclos em 1 segundo.
Pulsos = TH1 * (0x100) + TL1; Pulsos = pulsos * 10;
Nesta parte do código, o valor da frequência é convertido em bytes únicos para facilitar a exibição no display LCD 16 * 2.
d1 = pulsos% 10; s1 = pulsos% 100; s2 = pulsos% 1000; s3 = pulsos% 10000; s4 = pulsos% 100000; d2 = (s1-d1) / 10; d3 = (s2-s1) / 100; d4 = (s3-s2) / 1000; d5 = (s4-s3) / 10000; d6 = (pulsos-s4) / 100000;
Nesta parte do código, os dígitos individuais do valor da frequência são convertidos para o formato ASCII e são exibidos no display LCD 16 * 2.
Se (pulsos> = 100000) datawrt (0x30 + d6); se (pulsos> = 10000) datawrt (0x30 + d5); se (pulsos> = 1000) datawrt (0x30 + d4); se (pulsos> = 100) datawrt (0x30 + d3); se (pulsos> = 10) datawrt (0x30 + d2); datawrt (0x30 + d1);
Nesta parte do código, estamos enviando comandos para um display LCD 16 * 2. O comando é copiado para a porta 0 do microcontrolador 8051. RS é reduzido para gravação de comando. RW é reduzido para operação de gravação. O pulso de alto a baixo é aplicado no pino de habilitação (E) para iniciar a operação de gravação de comando.
void cmdwrt (unsigned char x) {P0 = x; rs = 0; rw = 0; en = 1; atraso (1); en = 0; }
Nesta parte do código, estamos enviando dados para um display LCD 16 * 2. Os dados são copiados para a porta 0 do microcontrolador 8051. RS é elevado para gravação de comando. RW é reduzido para operação de gravação. O pulso alto para baixo é aplicado no pino de habilitação (E) para iniciar a operação de gravação de dados.
void datawrt (unsigned char y) {P0 = y; rs = 1; rw = 0; en = 1; atraso (1); en = 0; }
É assim que podemos medir a frequência de qualquer sinal usando o microcontrolador 8051. Verifique o código completo e o vídeo de demonstração abaixo.