Você está na página 1de 69

ENGENHARIA ELECTROMECÂNICA | 3º Ano | Manhã | 2022-2023

Trabalho académico de COMANDOS ELETRICOS

IMPLEMENTAÇÃO DE UM SISTEMA AUTOMÁTICO DE


PRODUÇÃO DE BIODIESEL ATRAVÉS DE ÓLEO VEGETAL
CONTROLADO POR MICROCONTROLADOR
PIC16F877A DE

DOCENTE
___________________
Eng.º Emílio Queba

Benguela
Agosto de 2023
DISCENTES

PMS NOME
318105 Adelcio Antonio
319810 Alfredo Mazebo
319381 Augusto Buta
319707 Aurelio Etande
318087 Catarina Pedro
316012 Catarina Beua
316400 Cecilia Chinoa
320265 Daniel Quessongo
319290 Ernesto Lucalua
318983 Evert Laurindo
319761 Fernando Fonseca
318830 Inácio Casímiro
319246 João Pinto
319896 José Mataia
318989 Justino Capepula
318890 Katiliano Cunha
320036 Luís Matumona
302980 Manuel Caxito
319703 Mário Soma
319142 Ntela Victor
319073 Olívio Castigo
319560 Osvaldo Viombo
314686 Wilder Jamba

Benguela
Agosto de 2023

2
Índice

Índice .......................................................................................................................................... 3

Resumo ...................................................................................................................................... 5

Introdução.................................................................................................................................. 6

Justificativa............................................................................................................................. 6

Problema de investigação ...................................................................................................... 6

Objetivos ................................................................................................................................ 6

Capítulo 1. Apresentação ........................................................................................................... 7

Fluxograma............................................................................................................................. 9

Capítulo 2. Teorias ................................................................................................................... 10

Componentes Para Lógica Programável .............................................................................. 10

Microcontrolador PIC-16F877A ....................................................................................... 10

Display De Cristal Líquido................................................................................................. 11

Módulos Relés-De 4 Canais.............................................................................................. 11

Regulador De Tensão-LM7805......................................................................................... 12

Cristal Oscilador ............................................................................................................... 12

Componentes Para Lógica Cablada...................................................................................... 13

Disjuntor motor................................................................................................................ 13

Contactor ......................................................................................................................... 13

Disjuntor termomagnético 4 polos .................................................................................. 13

Disjuntor termomagnético Unipolar................................................................................ 13

Fonte 220V -24V DC ......................................................................................................... 14

Inversor de Frequência .................................................................................................... 14

Bornes .............................................................................................................................. 15

Botoeiras .......................................................................................................................... 15

3
Constituição Da Planta Piloto Para Produção Do Biodiesel ................................................. 15

Motor Eléctrico ................................................................................................................ 15

Sensor De Temperatura LM35 Submersível .................................................................... 16

Resistência interna ........................................................................................................... 16

Electroválvula ................................................................................................................... 16

Capítulo 3. Implementação Teórica ......................................................................................... 17

Diagrama No Proteus Da Lógica Programável ..................................................................... 17

Diagrama no CADSIMU da lógica Cablada ........................................................................... 19

Capítulo 4. Datasheets ............................................................................................................. 21

Microcontrolador PIC16F877A ............................................................................................ 21

Memórias de Programa x Memória de Dados ................................................................. 21

Arquitetura Interna Do PIC .............................................................................................. 23

LCD ........................................................................................................................................... 23

Capítulo 5. Programação.......................................................................................................... 25

Conclusão ................................................................................................................................. 26

Referências Bibliográficas ........................................................................................................ 27

4
Resumo

Neste trabalho apresenta-se o projecto de um equipamento proposto para estudos


relacionados ao uso de microcontroladores em sistemas de automação, tanto no ambiente
industrial quanto em campos residenciais ou relacionados, trazendo uma visão geral da
estrutura interna deste componente, focalizando especificamente o modelo PIC 16F877A e
LCD , desta feita Este trabalho académico consiste em implementar conhecimentos
adquiridos na cadeira de comandos eléctricos, como lógica programável e lógica cablada na
adaptação de um processo automático de uma planta piloto para produção de biodiesel
através do microcontrolador PIC e LCD.

Palavra-chave: PIC , LCD, Microcontrolador e Programação.

5
Introdução

O projeto em questão buscou, com base no estudo de Controladores Lógicos


Programáveis, desenvolver uma pesquisa teórica com aplicação prática em comandos
eletricos. Para isso, foi sugerido a adaptação de uma planta piloto de produção de biodiesel
com foco no microcontrolador Controlador de Interface Programável (PIC), especificamente
modelo 16F877A, e o Display Cristal líquido (LCD).

Um processo automático reduz o tempo e aumenta a eficiência. Em todo caso, a


automação encurta o ciclo de produção pois as tarefas manuais podem ser feitas
automaticamente, dando a equipa maior condição para se concentrar em questões
estratégicas.

Justificativa

O programa curricular do curso engenharia tem como essência interligar os


conhecimentos e promover o autodidactismo através de trabalhos académicos de
investigação científica. Nesta senda, o desafio dos estudantes consiste em elaborar o tema
em questão.

Problema de investigação

Como implementar conhecimentos sobre a programação do PIC na adaptação de um


sistema automático de produção de biodiesel através de óleo vegetal?

Objetivos

A revisão da literatura é o objectivo geral, e este consiste em pesquisar todas as


fontes possíveis desde os livros até aos titulares experientes.

A conceitualização do tema e o enquadramento dos assuntos compõem os


objectivos específicos do presente trabalho académico.

6
Capítulo 1. Apresentação

Neste capítulo se apresenta a estrutura de funcionamento da nossa proposta.

O processo de produção de biodiesel consiste em: (Paráfrase de Jémina, 2022 – p.54)

Iniciar o processo

Verifica os reservatórios de álcool/base e de água.

Entrada de álcool/base

Liga resistência e o motor, o óleo é aquecido até 55°C, desliga o motor, e adiciona-se
o álcool/base.

Funcionar durante 1 hora

Liga o motor, e controla a resistência mediante a temperatura (55-65°C) durante 1


hora, posteriormente desliga a resistência e o motor.

Modo espera 24 horas

Desliga o motor e a resistência, aguarda as 24 horas para a decantação.

Adicionar água

Adicionar água? Caso não, voltará para o menu; se for sim, testará a existência de
água no reservatório e adiciona água.

Ligar o motor durante 1 minuto

Liga o motor, controla o tempo de mistura até 1 minuto. Se o pH não estiver dentro
dos padrões, perguntará novamente: adicionar água?

Controle até 100°C

Durante um período de tempo estipulado, efectua-se o controle da resistência


mediante a temperatura (90 a 100°C) durante um período de tempo. Controlar novamente?
Fim do processo.

7
Entradas
Simbologia Designação
S1 Botão on/off
S2 Sensor de nível da água
S3 Sensor de nível de alcool
S4 Sensor do nível baixo de álcool
S5 Botão de emergência
Bot_INCREMENTA Botão de incrementar
Bot_DECREMENTA Botão de decrementar

Saídas
Simbologia Designação
LS Led_sistema
R Resistenia
Bal Bomba_água
Bag Bomba_álcool
M MOTOR
BU BUZZER

8
Fluxograma

9
Capítulo 2. Teorias

Neste capítulo é definido alguns conceitos básicos dos principais componentes e leis
básicas que sustentam o princípio de funcionamento dos mesmos.

Este capítulo será divido em duas partes principais, a primeira abordará sobre os
componentes que fazem parte da lógica programável, e a segunda parte abordará sobre os
componentes que fazem parte da lógica cablada.

Componentes Para Lógica Programável

A lógica programável refere-se à capacidade criar circuitos lógicos e sistemas digitais


por meio da programação de dispositivos electrónicos configuráveis, como o PIC,
permitindo que que você projecte, personalize e implemente circuitos digitais sem a
necessidade de criar um físico especifico.

Microcontrolador PIC-16F877A

Um microcontrolador é um dispositivo programável que possui um sistema


microprocessado composto por várias funcionalidades, dentre elas, conversores analógicos
e digitais, temporizadores e contadores, interface de comunicação, circuito de clock e
memórias internas. Tem como vantagem ser um dispositivo compacto que permite o
desenvolvimento de circuitos eletrônicos, bem como um menor número de componentes
externos que podem ser empregados em sistemas automatizados.

O microcontrolador da família PIC modelo 16F877A, fabricado pela Microchip,


utilizado no projeto (Figura 1) tem a vantagem de possuir um número maior de portas para
realização de projetos automatizados. Com capacidade maior de memória interna para
gravação, sua velocidade de clock pode ser aumentada através da instalação de um cristal
oscilador externo, sendo que para programações menores possui um cristal oscilador
interno de 4 MHz (LIMA, 2010).

Uma de suas características é a condição de ser gravado em 5V ou 12V.


Internamente é constituído por uma unidade de processamento, a memória de
programação flash, a EEPROM (Electrical Erasable Programming Read Only Memory) e a

10
RAM (Random Access Memory), as quais armazenam os dados. O microcontrolador em
questão pode ser programado na linguagem hexadecimal, assembly e linguagem C,
possuindo 368 bytes de memória RAM, capacidade de 8kWords (8 mil instruções em um
único programa) de memória flash e 256 bytes de memória EEPROM programável via
software (Datasheet Microchip Tecnology PIC16F87XA, 2003). É recomendável a consulta do
datasheet especifico para mais informações.

Display De Cristal Líquido

LCD é sigla para Liquid Crystal Display, que em português significa Display de Cristal
Liquido. É uma tecnologia amplamente utilizada na electrónica para exibir informações de
forma visual em uma variedade de dispositivos, como televisores, monitores de
computador, relógios digitais , calculadoras, smartphones e muito mais.

Um LCD é composto por uma camada de cristal liquido posionada entre duas placas
de vidro ou plástico. Esse cristal liquido é um material que pode modificar sua orientação
quando uma corrente eléctrica é aplicada. O principio básico de um LCD envolve a
manipulação da polarização da luz para criar as imagens que vemos na tela. É recomendável
a consulta do datasheet especifico para mais informações.

Módulos Relés-De 4 Canais

Módulos Relés são dispositivos electrónicos utilizados para controlar circuitos de alta
potencia ou corrente por meio de sinais de baixa potencia. Eles são usados para isolar
eletricamentente um circuito de controle (baixa potencia) de um circuito de carga(alta
potencia ). Os relés são accionadas por uma corrente ou tensão relativamente baixa, mas
são capazes de comutar cargas mais pesadas, como motores, lâmpadas, electrodomésticos
e sistemas industriais.

Um módulo de relé geralmente consiste em um ou mais relés e outros componentes


associados, como diodos de protecção, optocopladores (também conhecidos como opto-
isoladores) e circuitos de protecção.

A versatilidade dos módulos Relés os torna componentes essenciais em muitos


sistemas electrónicos, permitindo o controle seguro e eficiente de cargas de alta potencia a

11
partir de circuitos de controle de baixa potencia. É recomendável a consulta do datasheet
especifico para mais informações.

Regulador De Tensão-LM7805

O regulador de tensão LM7805 é parte da família dos reguladores de tensão 78x, que
inclui vários outros modelos que fornecem tensões reguladas diferentes.

Normalmente possuem características especificas como:

Tensão de entrada (Vin), tensão de saída (Vout), corrente máxima de saída (Iout),
Dissipação de calor e Pinagem.

O Regulador de tensão LM785 é frequentemente utilizado em projectos electrónicos,


como fonte de alimentação para microcontroladores, circuitos digitais, sensores e outros
componentes que requerem uma alimentação estável de +5V. é uma opção confiável para
converter uma variedade de tensões de entrada em uma tensão regulada e constante de
+5V. É recomendável a consulta do datasheet especifico para mais informações

Cristal Oscilador

Um cristal oscilador é um componente electrónico usado para gerar sinais eléctricos


oscilantes a uma frequência precisa e estável. É uma parte fundamental de muitos circuitos
electrónicos.

Para um microcontrolador, o cristal oscilador, a sua importância reside na


necessidade de fornecer referencia de tempo precisa para as operações internas do
dispositivo. Sendo assim , o seu uso tem como pontos chaves, precisão do relógio, tempo
real, comunicação, compatibilidade, duração e teste.

Em suma, o cristal oscilador é crucial para manter o funcionamento preciso e


coordenado de um microcontrolador como o PIC. Ele fornece o pulso de clock necessário
para que o microcontrolador execute suas tarefas em ritmo consistente, garantindo a
operação correta e previsível do sistema.

12
Componentes Para Lógica Cablada

Disjuntor motor

É um dispositivo composto de um relé térmico e mais um disjuntor ajustável. Esse


dispositivo é utilizado para proteger motores contra curto circuitos e sobrecargas
simultaneamente. Deve-se atentar para o fato de que o disjuntor motor não é feito para ser
uma chave liga-desliga. O disjuntor motor deve ser accionado e assim permanecer enquanto
não ocorrer nenhum evento anormal que produza o seu desligamento.

Contactor

É uma chave com accionamento electromagnético que liga e desliga circuitos. Usado
de preferência em comandos eléctricos automáticos à distância. É constituído de uma
bobina que quando alimentada cria um campo magnético no núcleo fixo que por sua vez
atrai o núcleo móvel que fecha o circuito. Cessando alimentação da bobina, desaparece o
campo magnético, provocando o retorno do núcleo através de molas.

Disjuntor termomagnético 4 polos

Um disjuntor termomagnético de 4 polos é semelhante ao unipolar, mas possui 4


polos ou vias para interrupção da corrente. Ele é geralmente usado em sistemas de
distribuição de energia trifásica, onde há três condutores de fase(L1, L2, L3) e um condutor
neutro(N).

Dispositivo de manobra mecânico, capaz de ligar, conduzir e interromper correntes


sob condições de sobrecarga previstas e, também, de conduzir por tempo especificado,
correntes sob condições anormais preestabelecidas, tais como as de curto-circuito.

Disjuntor termomagnético Unipolar

Um disjuntor termomagnético unipolar é projectado para interromper a corrente em


apenas um dos condutores de um circuito eléctrico. Tendo duas formas de actuação,
Actuação térmica e Actuação magnética.

13
Dispositivo de manobra mecânico, capaz de ligar, conduzir e interromper correntes
sob condições de sobrecarga previstas e, também, de conduzir por tempo especificado,
correntes sob condições anormais preestabelecidas, tais como as de curto-circuito.

Fonte 220V -24V DC

Uma fonte de 220 volts para 24 volts DC é um dispositivo que converte a tensão da
rede eléctrica de 220volts em uma tensão constante de 24 volts em corrente continua. Isso
é em aplicações onde os componentes ou dispositivos electrónicos operam com tensão de
24 volts.

Essas fontes de alimentação desempenham um papel crucial em muitos sistemas


eléctricos e electrónicos, fornecendo a tensão estabilizada e adequada para que os
dipositivos funcionem correctamente, papéis como, conversão de tensão, estabilização,
corrente continua, eficiência, protecção e certificação.

Em suma, uma fonte de 220 volts para 24 volts é um dispositivo que converte a
tensão da rede eléctrica em uma tensão constante e estabilizada de 2 volts em corrente
continua, sendo fundamental para muitas aplicações que exigem uma alimentação precisa e
adequada para operar correctamente.

Inversor de Frequência

Um inversor de frequência também conhecido como um conversor de frequência ou


drive de velocidade variável, é um dispositivo electrónico utilizado para controlar a
velocidade e a direcção de um motor forma precisa. Ele permite variar a a frequência e a
tensão aplicada ao motor, que resulta em variações na velocidade do motor.

Tem como principais características durante a sua utilização, Rectificador, Circuito de


controle, conversor CC-CA, circuito de protecção, Interfase de controle. Em resumo, um
inversor de frequência é um componente crucial em muitas industrias para controlar
motores eléctricos de forma eficiente e precisa, resultado em economia de energia e
prolongamento da vida útil dos equipamentos.

14
Bornes

Bornes são terminais ou conectores que são usados para realizar conexões eletricas
em um painel de controle, quadro de distribuição ou em dispositivos eléctricos. Eles
desempenham um papel fundamental na organização e no gerenciamento das conexões
eletricas em sistema de automação e controle.

Na sua utilização, os bornes oferecem, conexões seguras, organização, identificação,


facilidade de manutenção, diversidade de tipos, isolamento, flexibilidade e expansibilidade.

Botoeiras

A botoeira é uma outra forma de acionamento de motores por meio manual e


servem para energizar ou desenergizar contatores, a partir da comutação de seus contatos
NA (Normalmente Aberto) ou NF (Normalmente Fechado). Existem diversos modelos e
podem variar quanto ao formato, cor, tipo de proteção do acionador, quantidade e tipos de
contatos. As botoeiras podem ser do tipo pulsante ou com intertravamento. As botoeiras
com intertravamento mantém a posição de NA ou NF toda vez que é acionada
(pressionada), ou seja, permanecem na nova posição até o próximo acionamento. Já as
botoeiras pulsantes permanecem na nova posição apenas durante o tempo em que o botão
está pressionado.

Constituição Da Planta Piloto Para Produção Do Biodiesel

Para produção do biodiesel foi utilizado um reator construído com chapa de metal
galvanizado de 5mm de espessura acoplado a materiais eléctricos, electrónicos hidráulicos e
mecânicos.

Motor Eléctrico

São dispositivos eletromecânicos que convertem energia elétrica em energia


mecânica, produzindo movimento rotativo ou linear. Eles são amplamente utilizados em
uma variedade de aplicações, desde máquinas industriais e sistemas de transporte até
eletrodomésticos e dispositivos de consumo. A principal característica dos motores elétricos
é a capacidade de transformar a energia elétrica fornecida em movimento mecânico. Isso é

15
realizado por meio de interações entre campos magnéticos e correntes elétricas, de acordo
com os princípios da eletromagnetismo.

Sera utilizado para misturar os diferentes fluido que compõem o sistema.

Sensor De Temperatura LM35 Submersível

O LM35 é um sensor de temperatura analógico amplamente utilizado na medição de


temperatura em sistemas eletrônicos e projetos. Os sensores de temperatura submersíveis
são comumente usados em aplicações onde é necessário medir a temperatura de líquidos,
como aquários, piscinas, tanques de água, sistemas de refrigeração líquida, entre outros.
Eles também podem ser usados em aplicações industriais para monitorar a temperatura de
líquidos ou ambientes úmidos.

Resistência interna

Uma resistência de 4kw de potência é utilizada para variar a temperatura a ser


submetida ao fluido, assim sendo a temperatura será manipulada como desejada.

Electroválvula

Serão utilizadas para fazer a dosagem necessária de fluidos para o reservatório


principal.

16
Capítulo 3. Implementação Teórica

Neste capítulo se pretende interligar e por em prática as teorias acima abordadas de


forma mais abrangente, com auxilio de softwares serão ilustrados as partes que constituem
o trabalho.

Diagrama No Proteus Da Lógica Programável

O Proteus é um software de simulação de circuitos eletrônicos amplamente utilizado


na indústria e na educação. Ele permite projetar, simular e testar circuitos eletrônicos e
sistemas embutidos antes de criar protótipos físicos

A imagem acima representa o circuito lógico adaptado para automatização da planta


piloto de produção do biodiesel.

Através do software Proteus foi possível implementar o circuito lógico programável


para realização do projeto, que com o auxilio do microcontrolador PIC, e do LCD será
efetuado o controle do processo de produção do Biodiesel.

Os microcontroladores PIC (Programmable Integrated Circuit) são dispositivos


eletrônicos extremamente versáteis usados para controle e automação em uma variedade
de aplicações. Os microcontroladores PIC possuem uma arquitetura baseada em Harvard,

17
onde a memória de programa e a memória de dados são separadas. A memória de
programa armazena as instruções a serem executadas, enquanto a memória de dados
armazena variáveis e resultados intermediários.

Os microcontroladores PIC podem ser programados usando linguagens como


Assembly (linguagem de baixo nível específica para o processador) ou linguagens de alto
nível como C. Existem ambientes de desenvolvimento integrados (IDEs) oferecidos pela
Microchip, como o MPLAB X, que facilitam a programação, depuração e simulação de
códigos.

Os microcontroladores PIC desempenham um papel fundamental na evolução da


eletrônica e da automação. Sua versatilidade, baixo consumo de energia e vasta gama de
periféricos integrados tornam-nos uma escolha popular em uma variedade de aplicações.

Display de Cristal Líquido é uma tecnologia amplamente utilizada na eletrônica para


exibir informações de forma visual em uma variedade de dispositivos, como televisores,
monitores de computador, relógios digitais, calculadoras, smartphones e muito mais.

Um LCD é composto por uma camada de cristal líquido posicionada entre duas placas
de vidro ou plástico. Esse cristal líquido é um material que pode modificar sua orientação
quando uma corrente elétrica é aplicada. O princípio básico de um LCD envolve a
manipulação da polarização da luz para criar as imagens que vemos na tela.

O funcionamento de um LCD envolve controlar a orientação das moléculas de cristal


líquido para bloquear ou permitir a passagem da luz polarizada. Ao ajustar a intensidade da
luz que passa pelos pixels controlados pelo cristal líquido, os displays de cristal líquido
podem exibir imagens nítidas e coloridas.

Os LCDs são populares devido à sua eficiência energética, capacidade de exibir


imagens de alta resolução e ampla gama de aplicações. No entanto, eles estão sendo
gradualmente substituídos por tecnologias mais avançadas, como OLED (Organic Light
Emitting Diode), que oferecem melhor contraste, cores mais vivas e flexibilidade.

Um sensor de temperatura LM35 submersível seria uma versão do sensor


LM35 que foi projetada ou modificada para permitir a medição de temperatura em

18
ambientes submersos, como líquidos ou ambientes úmidos. Isso pode envolver a
incorporação de materiais resistentes à água ou encapsulamento adequado para proteger o
sensor e permitir sua imersão em líquidos sem comprometer seu desempenho ou
integridade.

Diagrama no CADSIMU da lógica Cablada

CADSIMU é um software de simulação eletrotécnica e automação industrial


desenvolvido para auxiliar na criação, simulação e análise de circuitos elétricos, eletrônicos
e sistemas de controle. Ele é amplamente utilizado por engenheiros, técnicos e estudantes
na área de eletrotécnica, automação e eletrônica.

A imagem acima representa o esquema eléctrico das ligações feitas para a partida
direita do motor, tendo o inversor de frquencia fazendo parte do seu respectivo circuito de
protecção, tendo assim um circuito de potencia, constituído por, disjuntor termomagnético
de 4 polos, o inversor de frequência e o disjuntor motor

Os motores trifásicos são os mais comuns e utilizados na indústria atualmente. Tem


a vantagem de serem mais econômicos em relação aos motores monofásicos tanto na
construção como na utilização. Além disso, escolhendo o método de partida ideal, tem um
leque muito maior de aplicações.

19
Caracteriza-se como partida de motor elétrico trifásico a forma pela qual é concebida
a alimentação elétrica ao motor de forma direta ou indireta para que este venha a iniciar
seu funcionamento.

Como todo motor está sujeito a sofrer variações do ponto de vista elétrico, há,
portanto conveniência em protegê-lo. Emgeral, as proteções principais necessárias são
contra: curto-circuito, sobrecargas, baixa tensão, fase aberta, reversão de fase, defeitos
internos etc. Os dispositivos de proteção fazem operar os mecanismos de desligamento no
caso de existir uma predeterminada condição.

Os modulo relés, botoeiras e o microcontrolador farão parte do circuito de comando,


que irão fazer o controle do fluxo de processo do sistema.

20
Capítulo 4. Datasheets

Datasheet é uma palavra do inglês que significa: folha de dados; folheto de


explicação; folha contendo especificação de um determinado componente. Então, se pode
dizer que nesta secção vamos especificar as principais características ou parâmetros de
alguns componentes para depois utilizarmos no dimensionamento.

Microcontrolador PIC16F877A

O dispositivo programável PIC 16F877A, possui várias funções na sua arquitetura ,


muito importantes em projetos de automação, como por exemplo:

 Microcontrolador com 40 pinos, incluindo pinos analógicos e 33 I/O's;


 15 Tipos de interrupções disponíveis: timers, contagem, pulso externo, etc;
 Clock de 4 até 20MHz;
 Pilha com oito níveis de profundidade;
 Memória RAM com 368 bytes;
 Conversores Analógico/Digital (A/D);
 Modo Sleep;
 Diferentes opções para osciladores (crystal, oscilador RC, etc);
 PWM;
 Modo USART (para comunicação serial);
 8kBytes de memória ROM.

Memórias de Programa x Memória de Dados

Memórias de Programa O PIC possui uma memória de programa de 14 bits do tipo


FLASH (Figura 6), regravável eletronicamente e de grande velocidade de trabalho. Essa
memória é designada para a programação do PIC, possuindo as seguintes características:

Vetor de reset, onde o programa inicia ( PIC 16F877A), endereço 0x00H.

Vetor de interrupção, após cada interrupção o contador de programa (PC) pula


automaticamente para essa posição que, no PIC 16F877A, possui o endereço 0x 04H.

Pilha, guarda o endereço para os desvios de fluxo na programação.

O PIC 16F877A possui uma pilha de 8 níveis, ou seja, ela pode guardar até 8
endereços de retorno.

21
Memória de Dados é dividida em 4 bancos de memória para facilitar a programação.
Essa memória é constituída de vários registradores 13 para guardar os dados de 8 bits a
serem usados na programação e configuração de trabalho do microcontrolador. Existem
dois tipos de registradores:

Registradores Especiais (SFR's) são pré-determinados pelo fabricante. Normalmente


possuem locais para que se possa configurar o modo de operação do microcontrolador. Por
exemplo: para definir se o PORTB vai ser entrada ou saída, tem-se o registrador especial
TRISB.

Registradores de Uso Geral são registradores definidos pelo usuário. Fazendo-se


uma comparação, é o mesmo que as variáveis criadas em linguagens de programação, com
a diferença que se nomeia o endereço do dado e não o dado em si.

22
Arquitetura Interna Do PIC

LCD

Os displays alfanuméricos são usados em uma ampla gama de aplicações, incluindo


palmtops computadores, processadores de texto, fotocopiadoras, terminais de ponto de
venda, equipamentos médicos instrumentos, telefones celulares, etc. A matriz de pontos
alfanumérica inteligente 16 x 2 display é capaz de exibir 224 caracteres e símbolos
diferentes. Uma lista completa:

23
24
Capítulo 5. Programação

Programação é o processo de criar instruções ou código de computador para instruir


um computador a executar uma tarefa específica. É a forma pela qual os seres humanos
comunicam suas intenções para um computador, dizendo-lhe o que fazer passo a passo. A
programação é uma habilidade central no desenvolvimento de software e sistemas de
computador.

Através do software MPLAB, foi feita a programação do nosso fluxo de processo para
a produção do Biodiesel.

25
Conclusão

Neste trabalho se abordou o tema adaptação da planta piloto para produção do


Biodiesel, a partir de óleo vegetal, utilizando o microcontrolador PIC, e o display de cristal
liquido LCD, explicitando os seguintes assuntos, programação do fluxo de processo para
utilização no PIC. Para tal, foi necessário pesquisar exaustivamente de todas as fontes
possíveis.

26
Referências Bibliográficas

 Filho, Guilherme Filippo; “Motor de Indução”; Editora Érica; São Paulo; 2000.
 Arnold, Robert, Stehr, Wilhelm; “Máquinas Elétricas – Volume 1”; Editora
E.P.U; São Paulo; 1976
 FRANCHI, Clainton, Acionamentos Elétricos. 3ª ed. Editora Érica - 2008
 KOSTENKO, M. P & PIOTROVSKI, M. P Máquinas Eléctricas. Editora Lopes da
Silva
 Manual de Chaves de Partida, WEG
 Manual de Motores Elétricos, WEG
 VAN VALKEN BURGH, Nooger e Neville, Eletricidade Básica, Vol. 5, Rio de
Janeiro, Ao Livro Técnico,1982.
 Coleção Básica Senai de Comandos Elétricos: SENAI – DN, 1980.
 Apresentacao de Comandos Eletricos, Carlos T. MATSUMI
 Papenkort, Franz. Esquemas eletricos de comando e protecao. Editora EPU,
Sao Paulo, 1989.
 CLAITON, Moro Fanchi. Acionamentos Eletricos. Editora Erica, Sao Paulo,
2008.
 CREDER, Helio. Instalacoes Eletricas. Editora LTC, Rio de Janeiro, 2001.
 NBR-5410. Instalacoes Eletricas em Baixa Tensao. Editora ABNT, Brasil, 2007.

27
Anexos

28
29
Linhas de programação

list p=16f877A ; list directive to define processor

#include <p16f877A.inc> ; processor specific variable definitions

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _RC_OSC & _WRT_OFF & _LVP_ON & _CPD_OFF;

;2º--- Paginação de Memória ---

#define BANK0 BCF STATUS,RP0 ;Cria um mnemônico para o banco 0 de memória

#define BANK1 BSF STATUS,RP0 ;Cria um mnemônico para selecionar o banco 1 de


memória;

; a)--- Entradas ---

#define Bot_ON_OFF PORTD,0 ; Definimos que o Botão Bot_ON/OFF está no RD0 e liga ou desliga o sistema;

#define Bot_SN_água PORTD,1 ; Definimos que o Bot_SN_água está no RD1 controla o nivel de agua;

#define bot_SN_álcool PORTD,2 ; Definimos que o bot_SN_álcool está no RD2 e controla o nivel de alccol;

#define SBvazio_álcool PORTD,3 ; Definimos que SBvazio_álcoolestá no RD3 verifica se o reservatorio de alcool esta vazio;

#define Bot_S_EMER PORTD,4 ; Definimos que o Botão Bot_S_EMER está no RD4 ;

#define Bot_INCREMENTA PORTD,5 ; Definimos que o Botão do PH Bot_INCREMENTA está no RD5;

#define Bot_DECREMENTA PORTD,6 ; Definimos que o Botão do PH Bot_DECREMENTA está no RD6 ; Bot_INCREMENTA
Bot_DECREMENTA

; b)--- Saídas ---

#define Led_sistema PORTC,0 ; Definimos que Led_sistema está no RC0 mostra o sistema ligado;

#define Resistenia PORTC,1 ; Definimos que Resisteniaestá no RC1;

#define Bomba_água PORTC,2 ; Definimos que Bomba_água está no RC2 ;

#define Bomba_álcool PORTC,3 ; Definimos que Bomba_álcool está no RC3 ;

#define MOTOR PORTC,4 ; Definimos que MOTOR está no RC4 ;

#define BUZZER_Emer PORTC,5 ; Definimos que o BUZZER_Emere stá no RC5 ;

;**********************************************************************

;3º--- Registradores de Uso Geral ---

w_temp EQU 0x7D ; variável usada para salvar o contexto;

30
status_temp EQU 0x7E ; variável usada para salvar o contexto;

pclath_temp EQU 0x7F ; variável usada para salvar o contexto;

cblock H'21' ; Início da memória disponível para o usuário

X ; variável para Sub-rotina do Tempo0;

Y ; variável para Sub-rotina do Tempo1;

BAIXO ; Variável para Activação de Comando e Dados no LCD;

ALTO ; Variável para Activação de Comando e Dados no LCD;

REG_AUX ; Registrador auxiliar para uso na conversão


bin/dec;

UNI ; Armazena
unidade ;

UNIS ; Armazena unidade ;

UNIM ; Armazena unidade ;

UNIH ; Armazena unidade ;

UNID ; Armazena unidade ;

UNIME ; Armazena unidade ;

UNIA ; Armazena unidade ;

UNIA0 ; Armazena unidade ;

DEZ ; Armazena dezena ;

DEZS ; Armazena dezena ;

DEZM ; Armazena dezena ;

DEZH ; Armazena dezena ;

DEZD ; Armazena dezena ;

DEZME ; Armazena dezena ;

DEZA ; Armazena dezena ;

DEZA0 ; Armazena dezena ;

CEN ; Armazena centena ;

DISP ; Registrador a ser exibido no


display ;

DISP1 ; Registrador a ser exibido no display ;

DISP2 ; Registrador a ser exibido no display ;

DISP3 ; Registrador a ser exibido no display ;

DISP4 ; Registrador a ser exibido no display ;

DISP5 ; Registrador a ser exibido no display ;

DISP6 ; Registrador a ser exibido no display ;

DISP7 ; Registrador a ser exibido no display ;

31
DISP8 ; Registrador a ser exibido no display ;

A ; variável para Sub-rotina do Tempo0;

K ; variável para Sub-rotina do Tempo1;

E ; variável para Sub-rotina do Tempo0;

G ; variável para Sub-rotina do Tempo1;

SEG ; variável para Sub-rotina do Tempo;

second ; Armazena segundos ;

min ; Armazena minutos ;

hour ; Armazena horas ;

day ; Armazena dia ;

mouth ; Armazena mês ;

year ; Armazena ano ;

year0 ; Armazena ano0 ;

DISP9 ; Registrador a ser exibido no display ;

DISP10 ; Registrador a ser exibido no display ;

DISP11 ; Registrador a ser exibido no display ;

DISP12 ; Registrador a ser exibido no display ;

DISP13 ; Registrador a ser exibido no display ;

DISP14 ; Registrador a ser exibido no display ;

DISPZ ; Registrador a ser exibido no display ;

UNISA ; Armazena unidade ;

UNIMA ; Armazena unidade ;

UNIHA ; Armazena unidade ;

UNIDA ; Armazena unidade ;

UNIMEA ; Armazena unidade ;

UNIAA ; Armazena unidade ;

UNIA0A ; Armazena unidade ;

DEZSA ; Armazena dezena ;

DEZMA ; Armazena dezena ;

DEZHB ; Armazena dezena ;

DEZDA ; Armazena dezena ;

DEZMEA ; Armazena dezena ;

DEZAA ; Armazena dezena ;

DEZA0A ; Armazena dezena ;

DEZZ ; Armazena dezena ;

32
UNIZ ; Armazena unidade ;

CENZ ; Armazena centena ;

REG1H ; byte alto registrador 1 de 16 bits utilizado na


rotina de divisão

REG1L ; byte baixo registrador 1


de 16 bits utilizado na rotina de divisão

REG2H ; byte alto registrador 2


de 16 bits utilizado na rotina de divisão

REG2L ; byte baixo registrador 2 de


16 bits utilizado na rotina de divisão

REG3H ; byte alto registrador 3 de 16


bits utilizado na rotina de divisão

REG3L ; byte baixo registrador 3 de


16 bits utilizado na rotina de divisão

REG4H ; byte alto registrador 4 de 16


bits utilizado na rotina de divisão

REG4L ; byte baixo registrador 4 de


16 bits utilizado na rotina de divisão

AUX_H ; byte baixo de registrador de


16 bits para retornar valor da div

AUX_L ; byte baixo de registrador de


16 bits para retornar valor da div

AUX_TEMP ; contador temporário


usado na rotina de divisão

REG_MULT1 ; registrador 1 para


multiplicação

REG_MULT2 ; registrador 2 para


multiplicação

UN ; armazena
unidade

DEZ_A ; armazena unidade da


dezena

DEZ_B ; armazena dezena

cab ; ARMAZENA CENTENA

endc ; Final da memória


do usuário

;**********************************************************************

;4º--- Vetor de RESET ---

ORG 0x000 ; Origem no endereço H'0000' do RESET Vector de memória;

33
nop ; nop requerido para icd;

goto main ; Desvia para a label main;

;**********************************************************************

;5º--- Vetor de Interrupção ---

ORG 0x004 ; As interrupções apontam para este endereço H'0004';

; -- Salva Contexto --

movwf w_temp ; Copia o conteúdo de Work para W_TEMP;

movf STATUS,w ; Mover status register para W register;

movwf status_temp ; salvar o conteúdo do registro STATUS;

movf PCLATH,w ; mover o registro pclath para o registro w;

movwf pclath_temp ; salvar o conteúdo do registro PCLATH;

; -- Final do Salvamento de Contexto --

; --o código isr pode ir aqui ou ser localizado como uma sub-rotina de chamada em outro lugar;

btfss INTCON,T0IF ; Ocorreu um overflow no Timer0?

goto exit_ISR ; Não, desvia para saída da interrupção

bcf INTCON,T0IF ; Sim, limpa a flag

movlw D'0' ; Sim, move a literal 0d para work

movwf TMR0 ; reinicializa TMR0 em 0d. Timer0 =


256 - 0 = 256

;==================================================================;

; -- Recupera Contexto (Saída da Interrupção) --

exit_ISR

movf pclath_temp,w ; recuperar cópia do registro PCLATH

movwf PCLATH ; restaurar o conteúdo do registro PCLATH pré-isr

movf status_temp,w ; recuperar cópia do registro STATUS

movwf STATUS ; restaurar o conteúdo do registro de STATUS pré-isr

swapf w_temp,f ; W_TEMP = W_TEMP com os nibbles invertidos

swapf w_temp,w ; restaurar o conteúdo do registro W pré-isr;

retfie ; retornar da interrupção

; -- Final da recuperação do Contexto --

34
;**********************************************************************

;*********************** sub-rotinas de chamada ***********************

;**********************************************************************

;6º--- Activação de Comando e Dados no LCD---

COMANDO

BANKSEL BAIXO

MOVWF BAIXO

ANDLW B'11110000'

MOVWF ALTO

SWAPF ALTO

MOVF ALTO,0

BANKSEL PORTB ;

MOVWF PORTB ;

BCF PORTB,4 ; CONFIGURA COMANDO Para modo Comando RS=0 ;

CALL ENABLE ;

BANKSEL BAIXO ;

MOVF BAIXO,0 ;

ANDLW B'00001111'

BANKSEL PORTB

MOVWF PORTB

BCF PORTB,4 ; CONFIGURA COMANDO Para modo comando RS=0 ;

CALL ENABLE

RETURN

;---------------------------------------

ESCREVE

BANKSEL BAIXO

MOVWF BAIXO

ANDLW B'11110000'

MOVWF ALTO

SWAPF ALTO

MOVF ALTO,0

BANKSEL PORTB

MOVWF PORTB

BSF PORTB,4 ; CONFIGURA DADO Para modo Dados RS=1 ;

CALL ENABLE

35
BANKSEL BAIXO

MOVF BAIXO,0

ANDLW B'00001111'

BANKSEL PORTB

MOVWF PORTB

BSF PORTB,4 ; CONFIGURA DADO Para modo Dados RS=1 ;

CALL ENABLE

RETURN

;**********************************************************************

;7º---Sub-rotina do Tempo---

UM_MS

BANKSEL X ; Selecionar a variável para Sub-rotina do Tempo0 no BANK0 ;

MOVLW D'4'

MOVWF X ; A variável X=W ;

VOLTA

MOVLW D'250'

MOVWF Y ; A variável Y=W ;

LOOP

NOP

NOP

DECFSZ Y

GOTO LOOP

DECFSZ X

GOTO VOLTA

RETURN

;---------------------------------------------------------------------------;

delay500ms

BANKSEL E

movlw D'200' ; Move o valor para W

movwf E ; Inicializa a variável tempo0

aux1:

movlw D'250' ; Move o valor para W

movwf G ; Inicializa a variável tempo1

aux2:

nop

36
nop

nop

nop

nop

nop

nop

decfsz G ; Decrementa tempo1 até que seja igual a zero

goto aux2 ; Vai para a label aux2, 250 x


10 ciclos de máquina = 2500 ciclos

decfsz E ; Decrementa tempo0 até que seja igual a zero

goto aux1 ; Vai para a label aux1 , ;


2500 x 200 = 500000

return ; Retorna após a chamada da sub rotina

;--------------------------------------------------------------;

UM_SEGUNDO

BANKSEL A

MOVLW D'4'

MOVWF A

VEM

MOVLW D'250'

MOVWF K

AQUI

CALL UM_MS

DECFSZ K

GOTO AQUI

DECFSZ A

GOTO VEM

RETURN

;-----------------------------------------------------------------;

X_SEGUNDOS

BANKSEL SEG

MOVWF SEG

HERE

CALL UM_SEGUNDO

DECFSZ SEG

GOTO HERE

37
RETURN

;-----------------------------------------------------------------;

;8º--- Enable ou Pulso---

ENABLE

BANKSEL PORTB ; Seleção do Banco do PORTB;

BCF PORTB,6 ; RB6 em nivel Baixo;

CALL UM_MS ; Chama a Sub-rotina do tempo;

BSF PORTB,6 ; RB6 em nivel Alto;

CALL UM_MS ; Chama a Sub-rotina do tempo;

BCF PORTB,6 ; RB6 em nivel Baixo;

CALL UM_MS ; Chama a Sub-rotina do tempo;

RETURN ; Retorna

;**********************************************************************

;9º--- Inicialização do LCD---

INIT

BANKSEL PORTB

CLRF PORTB

BSF PORTB,1

CALL ENABLE

BSF PORTB,1

CALL ENABLE

BCF PORTB,1

BSF PORTB,3

CALL ENABLE

CLRF PORTB

CALL ENABLE

BSF PORTB,1

CALL ENABLE

CLRF PORTB

CALL ENABLE

MOVLW B'00001100'

MOVWF PORTB

CALL ENABLE

RETURN

LIMPA_LCD

38
MOVLW B'00000001'

CALL COMANDO

RETURN

WELCOME

MOVLW B'10000101' ; Mudando o cursor para 1ºlinha/5ºcoluna;

CALL COMANDO ; Chamamos a Sub. Comando para activação;

MOVLW 'W'

CALL ESCREVE

MOVLW 'E'

CALL ESCREVE

MOVLW 'L'

CALL ESCREVE

MOVLW 'C'

CALL ESCREVE

MOVLW 'O'

CALL ESCREVE

MOVLW 'M'

CALL ESCREVE

MOVLW 'E'

CALL ESCREVE

MOVLW B'11000000' ; Mudando o cursor para 1ºlinha/5ºcoluna;

CALL COMANDO ; Chamamos a Sub. Comando para activação;

MOVLW 'I'

CALL ESCREVE

MOVLW 'S'

CALL ESCREVE

MOVLW 'P'

CALL ESCREVE

MOVLW ' '

CALL ESCREVE

MOVLW 'J'

CALL ESCREVE

MOVLW 'E'

CALL ESCREVE

39
MOVLW 'A'

CALL ESCREVE

MOVLW 'N'

CALL ESCREVE

MOVLW ' '

CALL ESCREVE

MOVLW 'P'

CALL ESCREVE

MOVLW 'I'

CALL ESCREVE

MOVLW 'A'

CALL ESCREVE

MOVLW 'G'

CALL ESCREVE

MOVLW 'E'

CALL ESCREVE

MOVLW 'T'

CALL ESCREVE

MOVLW D'3'

CALL X_SEGUNDOS ; chama a subrotina de tempo ; ;

RETURN

MENU1

Call LIMPA_LCD ; Chamar a Sub. LIMPA_LCD ;

MOVLW '2'

CALL ESCREVE

MOVLW ':'

CALL ESCREVE

MOVLW 'V'

CALL ESCREVE

MOVLW 'E'

CALL ESCREVE

MOVLW 'R'

CALL ESCREVE

MOVLW 'I'

40
CALL ESCREVE

MOVLW 'F'

CALL ESCREVE

MOVLW ' '

CALL ESCREVE

MOVLW 'A'

CALL ESCREVE

MOVLW 'G'

CALL ESCREVE

MOVLW 'U'

CALL ESCREVE

MOVLW 'A'

CALL ESCREVE

MOVLW B'11000000' ; Mudando o cursor para 2ºlinha/1ºcoluna;

CALL COMANDO ; Chamamos a Sub. Comando para activação;

MOVLW '5'

CALL ESCREVE

MOVLW ':'

CALL ESCREVE

MOVLW 'E'

CALL ESCREVE

MOVLW 'M'

CALL ESCREVE

MOVLW 'E'

CALL ESCREVE

MOVLW 'R'

CALL ESCREVE

MOVLW 'G'

CALL ESCREVE

MOVLW D'3'

CALL X_SEGUNDOS ; chama a subrotina de tempo de ;

RETURN

MENU2

Call LIMPA_LCD ; Chamar a Sub. LIMPA_LCD ;

41
MOVLW '3'

CALL ESCREVE

MOVLW ':'

CALL ESCREVE

MOVLW 'V'

CALL ESCREVE

MOVLW 'E'

CALL ESCREVE

MOVLW 'R'

CALL ESCREVE

MOVLW 'I'

CALL ESCREVE

MOVLW 'F'

CALL ESCREVE

MOVLW ' '

CALL ESCREVE

MOVLW 'A'

CALL ESCREVE

MOVLW 'L'

CALL ESCREVE

MOVLW 'C'

CALL ESCREVE

MOVLW 'O'

CALL ESCREVE

MOVLW 'O'

CALL ESCREVE

MOVLW 'L'

CALL ESCREVE

MOVLW B'11000000' ; Mudando o cursor para 2ºlinha/1ºcoluna;

CALL COMANDO ; Chamamos a Sub. Comando para activação;

MOVLW '5'

CALL ESCREVE

MOVLW ':'

CALL ESCREVE

MOVLW 'E'

42
CALL ESCREVE

MOVLW 'M'

CALL ESCREVE

MOVLW 'E'

CALL ESCREVE

MOVLW 'R'

CALL ESCREVE

MOVLW 'G'

CALL ESCREVE

MOVLW D'3'

CALL X_SEGUNDOS ; chama a subrotina de tempo de ;

RETURN

Reservatório_CHEIO

Call LIMPA_LCD ; Chamar a Sub. LIMPA_LCD ;

MOVLW ' '

CALL ESCREVE

MOVLW ' '

CALL ESCREVE

MOVLW 'R'

CALL ESCREVE

MOVLW 'E'

CALL ESCREVE

MOVLW 'S'

CALL ESCREVE

MOVLW 'E'

CALL ESCREVE

MOVLW 'R'

CALL ESCREVE

MOVLW 'V'

CALL ESCREVE

MOVLW 'A'

CALL ESCREVE

MOVLW 'T'

CALL ESCREVE

43
MOVLW 'O'

CALL ESCREVE

MOVLW 'R'

CALL ESCREVE

MOVLW 'I'

CALL ESCREVE

MOVLW 'O'

CALL ESCREVE

MOVLW B'11000000' ; Mudando o cursor para 2ºlinha/1ºcoluna;

CALL COMANDO ; Chamamos a Sub. Comando para activação;

MOVLW ' '

CALL ESCREVE

MOVLW ' '

CALL ESCREVE

MOVLW ' '

CALL ESCREVE

MOVLW 'C'

CALL ESCREVE

MOVLW 'H'

CALL ESCREVE

MOVLW 'E'

CALL ESCREVE

MOVLW 'I'

CALL ESCREVE

MOVLW 'O'

CALL ESCREVE

MOVLW D'4'

CALL X_SEGUNDOS ; chama a subrotina de tempo de ;

RETURN

TEMPERATURA

Call LIMPA_LCD ; Chamar a Sub. LIMPA_LCD ;

MOVLW ' '

CALL ESCREVE

MOVLW ' '

44
CALL ESCREVE

MOVLW 'T'

CALL ESCREVE

MOVLW 'E'

CALL ESCREVE

MOVLW 'M'

CALL ESCREVE

MOVLW 'P'

CALL ESCREVE

MOVLW 'E'

CALL ESCREVE

MOVLW 'R'

CALL ESCREVE

MOVLW 'A'

CALL ESCREVE

MOVLW 'T'

CALL ESCREVE

MOVLW 'U'

CALL ESCREVE

MOVLW 'R'

CALL ESCREVE

MOVLW 'A'

CALL ESCREVE

MOVLW ' '

CALL ESCREVE

MOVLW ' '

CALL ESCREVE

MOVLW B'11000000' ; Mudando o cursor para 2ºlinha/1ºcoluna;

CALL COMANDO ; Chamamos a Sub. Comando para activação;

MOVLW 'T'

CALL ESCREVE

MOVLW 'E'

CALL ESCREVE

MOVLW 'M'

CALL ESCREVE

45
MOVLW 'P'

CALL ESCREVE

MOVLW ':'

CALL ESCREVE

MOVLW B'11001000' ; Mudando o cursor para 2ºlinha/1ºcoluna;

CALL COMANDO ; Chamamos a Sub. Comando para activação;

MOVLW '^'

CALL ESCREVE

MOVLW 'C'

CALL ESCREVE

MOVLW D'2'

CALL X_SEGUNDOS ; chama a subrotina de tempo de ;

RETURN

CRONOMETRO

Call LIMPA_LCD ; Chamar a Sub. LIMPA_LCD ;

MOVLW ' '

CALL ESCREVE

MOVLW ' '

CALL ESCREVE

MOVLW 'C'

CALL ESCREVE

MOVLW 'R'

CALL ESCREVE

MOVLW 'O'

CALL ESCREVE

MOVLW 'N'

CALL ESCREVE

MOVLW 'O'

CALL ESCREVE

MOVLW 'M'

CALL ESCREVE

MOVLW 'E'

CALL ESCREVE

MOVLW 'T'

46
CALL ESCREVE

MOVLW 'R'

CALL ESCREVE

MOVLW 'O'

CALL ESCREVE

MOVLW B'11000000' ; Mudando o cursor para 2ºlinha/1ºcoluna;

CALL COMANDO ; Chamamos a Sub. Comando para activação;

MOVLW 'T'

CALL ESCREVE

MOVLW 'E'

CALL ESCREVE

MOVLW 'M'

CALL ESCREVE

MOVLW 'P'

CALL ESCREVE

MOVLW ':'

CALL ESCREVE

MOVLW B'11001000' ; Mudando o cursor para 2ºlinha/1ºcoluna;

CALL COMANDO ; Chamamos a Sub. Comando para activação;

MOVLW 'h'

CALL ESCREVE

MOVLW D'2'

CALL X_SEGUNDOS ; chama a subrotina de tempo de ;

RETURN

pOTENCIAL_HIDROGENIO

Call LIMPA_LCD ; Chamar a Sub. LIMPA_LCD ;

MOVLW ' '

CALL ESCREVE

MOVLW ' '

CALL ESCREVE

MOVLW ' '

CALL ESCREVE

MOVLW 'P'

CALL ESCREVE

47
MOVLW 'O'

CALL ESCREVE

MOVLW 'T'

CALL ESCREVE

MOVLW ' '

CALL ESCREVE

MOVLW 'H'

CALL ESCREVE

MOVLW 'I'

CALL ESCREVE

MOVLW 'D'

CALL ESCREVE

MOVLW 'R'

CALL ESCREVE

MOVLW 'O'

CALL ESCREVE

MOVLW B'11000000' ; Mudando o cursor para 2ºlinha/1ºcoluna;

CALL COMANDO ; Chamamos a Sub. Comando para activação;

MOVLW 'P'

CALL ESCREVE

MOVLW '.'

CALL ESCREVE

MOVLW 'H'

CALL ESCREVE

MOVLW ' '

CALL ESCREVE

MOVLW ':'

CALL ESCREVE

MOVLW D'2'

CALL X_SEGUNDOS ; chama a subrotina de tempo de ;

RETURN

vazio

Call LIMPA_LCD ; Chamar a Sub. LIMPA_LCD ;

MOVLW '4'

48
CALL ESCREVE

MOVLW ':'

CALL ESCREVE

MOVLW 'T'

CALL ESCREVE

MOVLW 'E'

CALL ESCREVE

MOVLW 'S'

CALL ESCREVE

MOVLW 'T'

CALL ESCREVE

MOVLW ' '

CALL ESCREVE

MOVLW 'A'

CALL ESCREVE

MOVLW 'L'

CALL ESCREVE

MOVLW 'C'

CALL ESCREVE

MOVLW 'O'

CALL ESCREVE

MOVLW 'O'

CALL ESCREVE

MOVLW 'L'

CALL ESCREVE

MOVLW ' '

CALL ESCREVE

MOVLW 'V'

CALL ESCREVE

MOVLW 'A'

CALL ESCREVE

MOVLW 'Z'

CALL ESCREVE

MOVLW B'11000000' ; Mudando o cursor para 2ºlinha/1ºcoluna;

CALL COMANDO ; Chamamos a Sub. Comando para activação;

49
MOVLW '5'

CALL ESCREVE

MOVLW ':'

CALL ESCREVE

MOVLW 'E'

CALL ESCREVE

MOVLW 'M'

CALL ESCREVE

MOVLW 'E'

CALL ESCREVE

MOVLW 'R'

CALL ESCREVE

MOVLW 'G'

CALL ESCREVE

MOVLW D'3'

CALL X_SEGUNDOS ; chama a subrotina de tempo de ;

RETURN

PH_adequado

Call LIMPA_LCD ; Chamar a Sub. LIMPA_LCD ;

MOVLW ' '

CALL ESCREVE

MOVLW ' '

CALL ESCREVE

MOVLW 'P'

CALL ESCREVE

MOVLW 'H'

CALL ESCREVE

MOVLW ' '

CALL ESCREVE

MOVLW 'A'

CALL ESCREVE

MOVLW 'D'

CALL ESCREVE

MOVLW 'E'

50
CALL ESCREVE

MOVLW 'Q'

CALL ESCREVE

MOVLW 'U'

CALL ESCREVE

MOVLW 'A'

CALL ESCREVE

MOVLW 'D'

CALL ESCREVE

MOVLW 'O'

CALL ESCREVE

MOVLW D'3'

CALL X_SEGUNDOS ; chama a subrotina de tempo de ;

RETURN

FINAL_APRESENTA

Call LIMPA_LCD ; Chamar a Sub. LIMPA_LCD ;

MOVLW 'F'

CALL ESCREVE

MOVLW 'I'

CALL ESCREVE

MOVLW 'M'

CALL ESCREVE

MOVLW ' '

CALL ESCREVE

MOVLW 'D'

CALL ESCREVE

MOVLW 'O'

CALL ESCREVE

MOVLW ' '

CALL ESCREVE

MOVLW 'P'

CALL ESCREVE

MOVLW 'R'

CALL ESCREVE

51
MOVLW 'O'

CALL ESCREVE

MOVLW 'C'

CALL ESCREVE

MOVLW 'E'

CALL ESCREVE

MOVLW 'S'

CALL ESCREVE

MOVLW 'S'

CALL ESCREVE

MOVLW 'O'

CALL ESCREVE

MOVLW D'3'

CALL X_SEGUNDOS ; chama a subrotina de tempo de ;

RETURN

;========================================================================================

;======================__ CONVERSÃO ADC__TEMPERATURA__===================================

;========================================================================================

;==========CONVERSÃO ADC====================

ADC ; --- Faz Leitura do Canal AD ---(ADC_READ)

bsf ADCON0,GO_DONE ; inicia conversão AD

wait_ADC:

btfsc ADCON0,GO_DONE ; GO_DONE limpo?

goto wait_ADC ; Não. Aguarda

movf ADRESH,W ; Sim. Move conteúdo de ADRESH em Work

movwf REG_MULT1 ; move conteúdo de Work para REG_MULT1

movlw D'95' ; move literal 50 para Work

movwf REG_MULT2 ; carrega 95 em REG_MULT2

call multip ; chama sub rotina para multiplicação

movf AUX_H,W ; move conteúdo de AUX_H para Work

movwf REG2H ; armazena resultado da multiplicação

movf AUX_L,W ; move conteúdo de AUX_L para Work

movwf REG2L ; armazena resultado da multiplicação

clrf REG1H ; limpa REG1H

52
movlw D'95' ; move 95 para WOrk

movwf REG1L ; armazena 95 em REG1L

call divid ; chama sub rotina para divisão

movf REG2L,W ; move conteúdo de REG2L para Work

call conv_binToDecI ; chama sub rotina para conversão binária em decimal

BTFSS Bot_S_EMER ; Botão Bot_S_EMER foi acionado ? Bot_S_EMER Bot_ON/OFF

goto VAZIO_3 ; não, vai para label desligar_2

goto Alarme

VAZIO_3

btfss SBvazio_álcool ; o SBvazio_álcool foi acionadoo?

goto desligar_2 ; NÃO , VAI PARA LABEL desligar_2

GOTO painel ; sim , desvia para label painel

desligar_2

BTFSC Bot_ON_OFF ; Botão ON_OFF foi desacionado ;

GOTO compara_CA ; Não, vai para compara_CA

GOTO REINICIAR ; SIM,REINICIAR O SISTEMA

;-----------temperatura em 55ºC(temperatura )--------------------------------;

compara_CA

movf UN,W ; move conteúdo de UNI para work UNIHA

xorlw H'05' ; W = DEZH XOR 0d

btfss STATUS,Z ; Resultou em 0d

goto compara_CA_X ; Não, vai para label mostrar_X1

goto compare_CE ; sim, desvia para label compare_CE

compare_CE

movf DEZ_A,W ; MOVER DEZ_A PARA W

xorlw H'05' ; W =DEZ_A XOR 3d

btfss STATUS,Z ; Resultou em 3d

goto compara_CA_X ; Não,vai para mistura_1

goto mistura_1 ; sim vai para jumpsely

;------------temperatura em 54ºC(temperatura )--------------------------------;

53
compara_CA_X

movf UN,W ; move conteúdo de UNI para work UNIHA

xorlw H'04' ; W = DEZH XOR 0d

btfss STATUS,Z ; Resultou em 0d

goto mostrar_X1 ; Não, vai para label compara_BAI

goto compare_CE_X ; sim, desvia para label compare_CE

compare_CE_X

movf DEZ_A,W ; MOVER DEZ_A PARA W

xorlw H'05' ; W =DEZ_A XOR 3d

btfss STATUS,Z ; Resultou em 3d

goto mostrar_X1 ; Não,vai para compara_BAI

goto mistura_1_X ; sim vai para jumpsely

;------------temperatura em 100ºC(temperatura )--------------------------------;

compara_CA_CABO

movf UN,W ; move conteúdo de UNI para work UNIHA

xorlw H'00' ; W = DEZH XOR 0d

btfss STATUS,Z ; Resultou em 0d

goto mostrar_X1 ; Não, vai para label compara_BAI

goto compare_CE_cABO ; sim, desvia para label compare_CE_cABO

compare_CE_cABO

movf DEZ_A,W ; MOVER DEZ_A PARA W

xorlw H'09' ; W =DEZ_A XOR 3d

btfss STATUS,Z ; Resultou em 3d

goto mostrar_X1 ; Não,vai para compara_BAI

goto FINAL ; sim vai para FINAL

mostrar_X1

movlw B'11000100' ; posiciona cursor na linha 2, coluna 6

call COMANDO ; envia comando para LCD

MOVLW ':' ; enviar dados

CALL ESCREVE ; enviar Dados

movf DEZ_B ,W ; move conteúdo de centena para work

addlw H'30' ; soma com 30h (ASCII)

call ESCREVE ; envia para LCD

54
movf DEZ_A,W ; move conteúdo de DEZ para work

addlw H'30' ; soma com 30h (ASCII)

call ESCREVE ; envia para LCD

movf UN,W ; move conteúdo de UNI para work

addlw H'30' ; soma com 30h (ASCII)

call ESCREVE ; envia para LCD

movlw '^'

call ESCREVE ; envia para LCD

movlw 'C'

call ESCREVE ; envia para LCD

goto ADC

mistura_1 ; temperatura 55

movlw B'11000100' ; posiciona cursor na linha 2, coluna 6

call COMANDO ; envia comando para LCD

MOVLW ':' ; enviar dados

CALL ESCREVE ; enviar Dados

movf DEZ_B ,W ; move conteúdo de centena para work

addlw H'30' ; soma com 30h (ASCII)

call ESCREVE ; envia para LCD

movf DEZ_A,W ; move conteúdo de DEZ para work

addlw H'30' ; soma com 30h (ASCII)

call ESCREVE ; envia para LCD

movf UN,W ; move conteúdo de UNI para work

addlw H'30' ; soma com 30h (ASCII)

call ESCREVE ; envia para LCD

MOVLW D'5'

CALL X_SEGUNDOS ; chama a subrotina de tempo de ;

PATRICIA

BSF Led_sistema ; liga o led

BSF Resistenia ; liga a res

BCF MOTOR ; desliga o motor

BSF Bomba_álcool ; ligamos Bomba_álcool

goto TEst_reserv_vazio ; vai para TEst_reserv_vazio

55
mistura_1_X ; temperatura 54

BSF Led_sistema ; liga o led

BSF Resistenia ; liga a res

BsF MOTOR ; liga o motor

BCF Bomba_álcool ; desligamos Bomba_álcool

goto mostrar_X1 ; vai para mostrar_X1

TEst_reserv_vazio

call vazio ; enviar dados ao LCD

btfss SBvazio_álcool ; o SBvazio_álcool foi acionadoo?

goto PATRICIA ; NÃO , VAI PARA LABEL PATRICIA

GOTO painel_1 ; sim , desvia para label painel_1

painel_1

Call TEMPERATURA ; enviar dados ao LCD

GOTO painel

painel ;--temperatura em 65ºC(temperatura )--------------------------------;

movf UN,W ; move conteúdo de UNI para work UNIHA

xorlw H'05' ; W = DEZH XOR 0d

btfss STATUS,Z ; Resultou em 0d

goto mostrar_X1_x ; Não, vai para label mostrar_X1

goto compare_BAI ; sim, desvia para label compare_BAI

compare_BAI

movf DEZ_A,W ; MOVER DEZ_A PARA W

xorlw H'06' ; W =DEZ_A XOR 3d

btfss STATUS,Z ; Resultou em 3d

goto mostrar_X1_x ; Não,vai para mistura_1

goto CAMELO_MIST ; sim vai para CAMELO_MIST

mostrar_X1_x

movlw B'11000100' ; posiciona cursor na linha 2, coluna 6

call COMANDO ; envia comando para LCD

MOVLW ':' ; enviar dados

CALL ESCREVE ; enviar Dados

56
movf DEZ_B ,W ; move conteúdo de centena para work

addlw H'30' ; soma com 30h (ASCII)

call ESCREVE ; envia para LCD

movf DEZ_A,W ; move conteúdo de DEZ para work

addlw H'30' ; soma com 30h (ASCII)

call ESCREVE ; envia para LCD

movf UN,W ; move conteúdo de UNI para work

addlw H'30' ; soma com 30h (ASCII)

call ESCREVE ; envia para LCD

BSF Led_sistema ; liga o led

BSF Resistenia ; liga a res

BsF MOTOR ; liga o motor

BCF Bomba_álcool ; desligamos Bomba_álcool

goto ADC ; vai para ADC

CAMELO_MIST

BSF Led_sistema ; liga o led

BcF Resistenia ; DESliga a res

BCF MOTOR ; DESliga o motor

BCF Bomba_álcool ; desligamos Bomba_álcool

CALL CRONOMETRO

goto contar

contar

clrf DISP ; ZERAR O DISP

GOTO contar_X

contar_X

movf DISP,W ; move conteúdo de DISP para work

call conv_binToDecI ; Chama sub rotina para ajuste decimal

movlw B'11000100' ; posiciona cursor na linha 2, coluna 6

call COMANDO ; envia comando para LCD

MOVLW ':' ; enviar dados

CALL ESCREVE ; enviar Dados

movf DEZ_B ,W ; move conteúdo de centena para work

57
addlw H'30' ; soma com 30h (ASCII)

call ESCREVE ; envia para LCD

movf DEZ_A,W ; move conteúdo de DEZ para work

addlw H'30' ; soma com 30h (ASCII)

call ESCREVE ; envia para LCD

movf UN,W ; move conteúdo de UNI para work

addlw H'30' ; soma com 30h (ASCII)

call ESCREVE ; envia para LCD

movlw 'h'

call ESCREVE ; envia para LCD

incf DISP,F ; incrementa conteúdo de DISP

MOVLW D'5'

CALL X_SEGUNDOS ; chama a subrotina de tempo de ;

;------------tempo em 24h )--------------------------------;

compara_BAI_X

movf UN,W ; move conteúdo de UNI para work UNIHA

xorlw H'04' ; W = DEZH XOR 0d

btfss STATUS,Z ; Resultou em 0d

goto contar_X ; Não, vai para label contar_X

goto compare_BAI_X ; sim, desvia para label compare_BAI_X

compare_BAI_X

movf DEZ_A,W ; MOVER DEZ_A PARA W

xorlw H'02' ; W =DEZ_A XOR 3d

btfss STATUS,Z ; Resultou em 3d

goto contar_X ; Não,vai paracontar_X

goto dosagem ; sim vai para dosagem

dosagem

CALL pOTENCIAL_HIDROGENIO ; ENVIAR DADOS AO lcd

clrf DISP ; ZERAR O DISP

clrf DISP1 ; zerar o DISP1

BSF Led_sistema ; liga o led

BcF Resistenia ; DESliga a res

BCF MOTOR ; DESliga o motor

BCF Bomba_álcool ; desligamos Bomba_álcool

58
bsf Bomba_água ; ligamos Bomba_água Bot_INCREMENTA Bot_DECREMENTA

MOVLW D'1' ; atraso de 1 min

CALL X_SEGUNDOS ; chama a subrotina de tempo de ;

movlw D'1' ; manter 1

movwf DISP1 ; agora DISP1 é igual 1

contar_Xb

BTFSS Bot_S_EMER ; Botão Bot_S_EMER foi acionado ? Bot_S_EMER Bot_ON/OFF

goto desligar_4 ; não, vai para label desligar_2

goto Alarme

desligar_4

BTFSC Bot_ON_OFF ; Botão ON_OFF foi desacionado ;

GOTO contar_XA ; Não, vai para contar_XA

GOTO REINICIAR ; SIM,REINICIAR O SISTEMA

contar_XA

btfss Bot_INCREMENTA ; o Bot_INCREMENTA foi acionado?

goto decrescente ; Não,vai paracontar_X

goto increment ; sim vai para increment

decrescente

btfss Bot_DECREMENTA ; o Bot_DECREMENTA foi acionado?

goto ver ; Não,vai paracontar_X

goto decrement ; sim vai para decrement

ver

movf DISP1,W ; move conteúdo de DISP para work

call conv_binToDecI ; Chama sub rotina para ajuste decimal

movlw B'11000100' ; posiciona cursor na linha 2, coluna 6

call COMANDO ; envia comando para LCD

MOVLW ':' ; enviar dados

CALL ESCREVE ; enviar Dados

movf DEZ_A,W ; move conteúdo de DEZ para work

addlw H'30' ; soma com 30h (ASCII)

59
call ESCREVE ; envia para LCD

movf UN,W ; move conteúdo de UNI para work

addlw H'30' ; soma com 30h (ASCII)

call ESCREVE ; envia para LCD

MOVLW D'1'

CALL X_SEGUNDOS ; chama a subrotina de tempo de ;

goto contar_Xb

increment

incf DISP1,F ; incrementa conteúdo de DISP

goto compara_BAI_XX ; vai para compara_BAI_XX

decrement

decf DISP1,F ; incrementa conteúdo de DISP

goto compara_BAI_XX ; vai para compara_BAI_XX

;------------PH em 07 )--------------------------------;

compara_BAI_XX

movf UN,W ; move conteúdo de UNI para work UNIHA

xorlw H'07' ; W = DEZH XOR 0d

btfss STATUS,Z ; Resultou em 0d

goto compare_BAI_XX ; Não, vai para label compare_BAI_XX

goto buta ; sim, desvia para label buta

;------------PH em 00 )--------------------------------;

compare_BAI_XX

movf UN,W ; move conteúdo de UNI para work UNIHA

xorlw H'00' ; W = DEZH XOR 0d

btfss STATUS,Z ; Resultou em 0d

goto ver ; Não, vai para label ver

goto dosagem ; sim, desvia para label manter_XX

buta

MOVLW D'07' ;

MOVWF DISP1

movf DISP1,W ; move conteúdo de DISP para work

call conv_binToDecI ; Chama sub rotina para ajuste decimal

60
movlw B'11000100' ; posiciona cursor na linha 2, coluna 6

call COMANDO ; envia comando para LCD

MOVLW ':' ; enviar dados

CALL ESCREVE ; enviar Dados

movf DEZ_A,W ; move conteúdo de DEZ para work

addlw H'30' ; soma com 30h (ASCII)

call ESCREVE ; envia para LCD

movf UN,W ; move conteúdo de UNI para work

addlw H'30' ; soma com 30h (ASCII)

call ESCREVE ; envia para LCD

clrf DISP1 ; zerar o DISP1

BSF Led_sistema ; liga o led

BsF Resistenia ; liga a res

BCF MOTOR ; DESliga o motor

BCF Bomba_álcool ; desligamos Bomba_álcool

bcf Bomba_água ;desligamos Bomba_água

MOVLW D'5'

CALL X_SEGUNDOS ; chama a subrotina de tempo de ;

call PH_adequado ; enviar dados ao LCD

Call TEMPERATURA ; enviar dados ao LCD

goto ADC

FINAL

movlw B'11000100' ; posiciona cursor na linha 2, coluna 6

call COMANDO ; envia comando para LCD

MOVLW ':'

CALL ESCREVE

MOVLW '1'

CALL ESCREVE

MOVLW '0'

CALL ESCREVE

MOVLW '0'

CALL ESCREVE

MOVLW D'5'

CALL X_SEGUNDOS ; chama a subrotina de tempo de ;

61
CALL FINAL_APRESENTA ; ENVIAR DADOS AO LCD

GOTO START ; VAI PARA START

;----------------------------------------------------------------;

;-------------------Conversão Binário para Decimal--------------;

;---------------------------------------------------------------;

conv_binToDecI: ; AJUSTE DEIMAL

movwf REG_AUX ; salva valor a converter em REG_AUX

clrf UN ; limpa unidade

clrf DEZ_A ; limpa dezena A

clrf DEZ_B ; limpa dezena B

movf REG_AUX,F ; REG_AUX = REG_AUX

btfsc STATUS,Z ; valor a converter resultou em zero?

return ; Sim. Retorna

start_adjo:

BTFSS Bot_S_EMER ; Botão Bot_S_EMER foi acionado ? Bot_S_EMER Bot_ON/OFF

goto desligar_5 ; não, vai para label desligar_2

goto Alarme

desligar_5

BTFSC Bot_ON_OFF ; Botão ON_OFF foi desacionado ;

GOTO start_adjo_1 ; Não, vai para contar_XA

GOTO REINICIAR ; SIM,REINICIAR O SISTEMA

start_adjo_1

incf UN,F ;Não. Incrementa UNI

movf UN,W ;move o conteúdo de UNI para Work

xorlw H'0A' ;W = UNI XOR 10d

btfss STATUS,Z ;Resultou em 10d?

goto end_adjo ;Não. Desvia para end_adj

clrf UN ;Sim. Limpa registrador UNI

movf DEZ_A,W ;Move o conteúdo de DEZ_A para Work

xorlw H'09' ;W = DEZ_A XOR 9d

btfss STATUS,Z ;Resultou em 9d?

goto incDezAo ;Não, valor menor que 9. Incrementa


DEZ_A

62
clrf DEZ_A ;Sim. Limpa registrador DEZ_A

incf DEZ_B,F ;Incrementa registrador DEZ_B

goto end_adjo ;Desvia para end_adj

incDezAo:

incf DEZ_A,F ;Incrementa DEZ_A

end_adjo:

decfsz REG_AUX,F ;Decrementa REG_AUX. Fim da


conversão ?

goto start_adjo ;Não. Continua

return ;Sim. Retorna

;========================================================================================

; --- Sub rotina de multiplicação (baseada na nota de aplicação AN544 da Microchip) ---

mult MACRO bit ;Inicio da macro de multiplicação

btfsc REG_MULT1,bit ;bit atual de REG_MULT1 limpo?

addwf AUX_H,F ;Não. Acumula soma de AUX_H

rrf AUX_H,F ;rotaciona AUX_H para


direita e armazena o resultado nele próprio

rrf AUX_L,F ;rotaciona AUX_L para direita


e armazena o resultado nele próprio

endm ;fim da macro

multip:

clrf AUX_H ;limpa AUX_H

clrf AUX_L ;limpa AUX_L

movf REG_MULT2,W ;move o conteúdo de REG_MULT2 para


Work

bcf STATUS,C ;limpa o bit de carry

mult 0 ;chama macro para cada um dos 7 bits

mult 1 ;de REG_MULT1

mult 2 ;

mult 3 ;

mult 4 ;

mult 5 ;

mult 6 ;

mult 7 ;

return ;retorna

63
;========Sub rotina de divisão (baseada na nota de aplicação AN544 da Microchip)=========

divid:

movlw H'10' ;move 16d para Work

movwf AUX_TEMP ;carrega contador para divisão

movf REG2H,W ;move conteúdo de REG2H para Work

movwf REG4H ;armazena em REG4H

movf REG2L,W ;move conteúdo de REG2L para Work

movwf REG4L ;armazena em REG4L

clrf REG2H ;limpa REG2H

clrf REG2L ;limpa REG2L

clrf REG3H ;limpa REG3H

clrf REG3L ;limpa REG3L

DIV

bcf STATUS,C ;limpa bit de carry

rlf REG4L,F ;rotaciona REG4L para


esquerda e armazena nele próprio

rlf REG4H,F ;rotaciona REG4H para


esquerda e armazena nele próprio

rlf REG3L,F ;rotaciona REG3L para


esquerda e armazena nele próprio

rlf REG3H,F ;rotaciona REG3H para


esquerda e armazena nele próprio

movf REG1H,W ;move conteúdo de REG1H para Work

subwf REG3H,W ;Work = REG3H - REG1H

btfss STATUS,Z ;Resultado igual a zero?

goto NOCHK ;Não. Desvia para NOCHK

movf REG1L,W ;Sim. Move conteúdo de REG1L para


Work

subwf REG3L,W ;Work = REG3L - REG1L

NOCHK

btfss STATUS,C ;Carry setado?

goto NOGO ;Não. Desvia para NOGO

movf REG1L,W ;Sim. Move conteúdo de REG1L para


Work

subwf REG3L,F ;Work = REG3L - REG1L

64
btfss STATUS,C ;Carry setado?

decf REG3H,F ;decrementa REG3H

movf REG1H,W ;move conteúdo de REG1H para Work

subwf REG3H,F ;Work = REG3H - REG1H

bsf STATUS,C ;seta carry

NOGO

rlf REG2L,F ;rotaciona REG2L para


esquerda e salva nele próprio

rlf REG2H,F ;rotaciona REG2H para


esquerda e salva nele próprio

decfsz AUX_TEMP,F ;decrementa AUX_TEMP. Chegou em zero?

goto DIV ;Não. Continua processo


de divisão

return

;-------------------------------------------------------;

;****************************************************************************;

;**************** DESLIGAR E REINICIAR O SISTEMA *************************;

;****************************************************************************;

DESLIGAR ;14º--- DESLIGAR O SISTEMA ---

BTFSC Bot_ON_OFF ; Botão ON_OFF foi desacionado ;

GOTO START ; Não, vai para Start

GOTO REINICIAR ; SIM,REINICIAR O SISTEMA

DESLIGAR_1 ;14º--- DESLIGAR O SISTEMA ---

BTFSC Bot_ON_OFF ; Botão ON_OFF foi desacionado ;

GOTO verif_Niv_Alcool; Não, vai para verif_Niv_Alcool

GOTO REINICIAR ; SIM,REINICIAR O SISTEMA

REINICIAR ;15º--- REINICIAR O SISTEMA---

CALL LIMPA_LCD

BANKSEL PORTA ; selecionamos o Banco0

CLRF PORTA ; Estamos a limpar PORTA

CLRF PORTB ; Estamos a limpar PORTB

CLRF PORTC ; Estamos a limpar PORTC

CLRF PORTD ; Estamos a limpar PORTD

BTFSS Bot_ON_OFF ; Botão ON_OFF foi acionado LIGAR2;

65
GOTO REINICIAR ; Não, volta para label REINICIAR ;

GOTO COMPRIMENTAR ; Sim, desvia para label COMPRIMENTAR ;

;*************************************************************************;

;***************** MAIN ********************************;

;****************************************************************************;

main: ; Programação Principal..........................

BANK1

BANKSEL TRISA ; Estamos a selecionar o Banco1 de memória;

MOVLW B'11111111' ; Estamos a definir o RA0 e RA1 como entrada;

MOVWF TRISA ; TRISA=W ;

MOVLW B'00000000' ; Etamos a definir todo PORTB como Saída;

MOVWF TRISB ; TRISB=W ;

MOVLW B'00000000' ; Estamos a definir todo trisC como saída;

MOVWF TRISC ; TRISC=W ;

MOVLW B'11111111' ; Estamos definir todo PORTD como entrada;

MOVWF TRISD ; Estamos mover do W para registro TRISD;

movlw B'00001110' ; move literal 0Eh para Work ADC


=================== ADC ==================

movwf ADCON1 ; apenas AN0 como analógico,


justificado à esquerda com o canal3 ;=================== ADC ==================

BANK0

BANKSEL PORTA

CLRF PORTA ; Estamos a limpar PORTA

CLRF PORTB ; Estamos a limpar PORTB

CLRF PORTC ; Estamos a limpar PORTC

CLRF PORTD ; Estamos a limpar PORTD

movlw B'01000001' ; move literal 41h para Work


=================== ADC ==================

movwf ADCON0 ; fosc/8, liga conversor AD


=================== ADC ==================

BANKSEL OPTION_REG ; Estamos a selecionar o Banco1 de memória;H'06'


======INTERRUPÇÃO=========================

MOVLW B'00000110' ; Pull Ups internos habilitados(RBPU=0)...


======INTERRUPÇÃO=========================

MOVWF OPTION_REG ; Timer0 incrementa com ciclo de


máquina(T0CS=0) ======INTERRUPÇÃO=========================

;======INTERRUPÇÃO====; Prescaler 1:128 associado ao Timer0 (PSA=0 e PS2:PS0=110)


======INTERRUPÇÃO=========================

BANKSEL INTCON ; Estamos a selecionar todos os Bancos de memória;H'A0'


======INTERRUPÇÃO=========================

66
MOVLW B'10100000' ; Habilita Interrupção
Global(GIE=1)... ======INTERRUPÇÃO=========================

MOVF INTCON ; Habilita as Interrupção pelo Estouro(Overflow:T0IE=1) do Timer0


======INTERRUPÇÃO=========================

BANKSEL TMR0 ; Estamos a selecionar o Banco0 de memória;


======INTERRUPÇÃO=========================

CLRF TMR0 ; inicializa TMR0 em 0 . contagem


Timer0 = 0 até 255 =256 ciclos de M´quina ;

LIGAR ; 1ºFASE

BTFSS Bot_ON_OFF ; O Botão O ON_OFF foi precionado?

goto LIGAR ; Não, volta para Label LIGAR ;

goto Menu ; Sim, desvia para label Menu ;

Menu

BSF Led_sistema ; ligamos o led do sistema

CALL INIT ; Inicializa o LCD ;

COMPRIMENTAR

CALL WELCOME ; envia dados ao LCD

START

CALL MENU1 ; envia dados ao LCD

BTFSS Bot_SN_água ; Botão Bot_SN_água foi acionado ?

goto emergencia ; Não, vai para label emergencia ;

goto verif_Niv_Alcool_1 ; sim, vai para verif_Niv_Alcool ;

emergencia

BTFSS Bot_S_EMER ; Botão Bot_S_EMER foi acionado ?

goto DESLIGAR ; Não, vai para label DESLIGAR ;

goto Alarme ; sim, vai para Alarme ;

Alarme

BSF BUZZER_Emer ; liga o alarme

MOVLW D'3'

CALL X_SEGUNDOS ; chama a subrotina de tempo ; ;

BCF BUZZER_Emer ; desliga o alarme

BANKSEL PORTA ; selecionamos o Banco0

CLRF PORTA ; Estamos a limpar PORTA

CLRF PORTB ; Estamos a limpar PORTB

67
CLRF PORTC ; Estamos a limpar PORTC

CLRF PORTD ; Estamos a limpar PORTD

goto START ; vai para START

verif_Niv_Alcool_1

cALL Reservatório_CHEIO ; ENVIAR DADOS OU ESCREVER

GOTO verif_Niv_Alcool

verif_Niv_Alcool

CALL MENU2 ; envia dados ao LCD

BTFSS bot_SN_álcool ; Botão bot_SN_álcool foi acionado ?

goto emergencia_1 ; Não, vai para label emergencia_1 ;

goto Mistura_x2 ; sim, vai para Mistura ;

emergencia_1

BTFSS Bot_S_EMER ; Botão Bot_S_EMER foi acionado ? Bot_S_EMER

goto DESLIGAR_1 ; Não, vai para label DESLIGAR_1 ;

goto Alarme ; sim, vai para Alarme ;

Mistura_x2

cALL Reservatório_CHEIO ; ENVIAR DADOS OU ESCREVER

GOTO Mistura

Mistura

Call TEMPERATURA ; enviar dados ao LCD

BSF Led_sistema ; liga o led

BSF Resistenia ; liga a res

BSF MOTOR ; liga o motor

goto ADC ; vai para ADC

end ;Término da Programação;

;******************************************* END *****************************************************;

;******************************** 3º ANO DE ELECTROMEÂNICA ***********************************************;

68
69

Você também pode gostar