Professional Documents
Culture Documents
MICROCONTROLADORES
SUMRIO
INTRODUO............................................................................................................ 3
1. GRAVAO NO KIT PICGENIOS............................................................................... 4
INTRODUO
Passo:
Abrir
programa de Gravao:
Instale
o
programa
Gravador PICkit2 que acompanha
o CD.
D um duplo clique com o
mouse no cone que ir aparecer
na rea do seu computador.
9 Gravao
Clique no boto Write para gravar no microcontrolador.
Resumo terico
Cor do Led
Os leds esto disponveis nas cores, Vermelho, Laranja, Amarelo, Verde, Azul e
Branco. As cores branca e azul so mais caras que as restantes cores. A cor da luz
emitida pelo LED determinada pelo material semicondutor no pela cor da cpsula
plstica que o rodeia. LEDs coloridos esto disponveis com cpsulas brancas, difusas
ou transparentes.
Tipos de LEDs
EXPERINCIA 1
Objetivo
Realizar o acionamento de um conjunto de LEDs utilizando as portas de
comunicao do microcontrolador.
Programa
/*
********************** NETCOM ***************************
******************* TREINAMENTOS E SOLUES **********************
----------------------------------------------------------------------------------------------------------***************************************************************************
** PROGRAMA QUE FAZ UM CONJUNTO DE LEDS FICAREM PISCANDO A CADA 1 SEGUNDO **
***************************************************************************
*/
#include <PISCA-PISCA.h>
void main() {
set_tris_d(0x00); // DEFINE O PORTD COMO SADA
while(1)
{
output_d(0xff); // COLOCA OS LEDS LIGADOS
Delay_ms(500); // FUNO QUE CRIA UM TEMPO DE 1 SEGUNDO
output_d(0x00); // COLOCA OS LEDS DESLIGADOS
Delay_ms(500); // FUNO QUE CRIA UM TEMPO DE 1 SEGUNDO
}
}
EXPERINCIA 2
Objetivo
Realizar o rotacionamento de um conjunto de LEDs utilizando as portas de
comunicao do microcontrolador.
Programa
/*
******************** NETCOM *************************
***************** TREINAMENTOS E SOLUES **********************
------------------------------------------------------------------------------------------------------------------***************************************************************************
** PROGRAMA QUE FAZ UM CONJUNTO DE LEDS FICAREM ROTACIONANDO A CADA 50ms**
***************************************************************************
*/
#include <ROTAO DE LEDS.h>
void main() {
char cont; // DECLARAO DA VARIAVEL QUE SERIA UTILIZADA PARA A ROTAO
set_tris_d(0); // Define todos os pinos do PORTD como sada.
cont = 128; // Definimos que o bit7 de CONT ser 1 (1000 0000).
while(1){ // DEFINIO DE REPETIO INIFINITA DO BLOCO
// **** ROTAO DA ESQUERDA PARA DIREITA *****
while(cont > 1){
output_d(cont); // PASSANDO O VALOR DE CONT PARA A SAIDA DOS PINOS DO PORTD
cont>>=1; // DESLOCANDO 1 BIT PARA DIREITA
Delay_ms(50); // ROTINA DE TEMPO DE 50ms
}
// **** ROTAO DA DIREITA PARA ESQUERDA ****
while(cont < 128){
output_d(cont); // PASSANDO O VALOR DE CONT PARA A SAIDA DOS PINOS DO PORTD
cont<<=1; // DESLOCANDO 1 BIT PARA ESQUERDA
Delay_ms(50); // ROTINA DE TEMPO DE 50ms
}
}
}
9
3.1.
Resumo terico
que
possa
ser
10
3.2.
EXPERINCIA
Objetivo
Realizar a contagem de 0 a 99 com Display de 7 seguimentos utilizando as portas de
comunicao do microcontrolador.
Programa
/*
********************** NETCOM ***************************
******************* TREINAMENTOS E SOLUES **********************
--------------------------------------------------------------------------------------------------------***************************************************************************
** PROGRAMA QUE FAZ A CONTAGEM DE 0 99 NO DISPLA DE 7 SEGUIMENTO **
***************************************************************************
*/
#include "C:\Users\HP-CETEC\Desktop\PIC\Nova pasta\Contador.h"
void main()
{
// "0" "1" "2" "3" "4" "5" "6" "7" "8" "9"
unsigned char numero[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
int cont1, cont2,tempo; // Variaveis utilizadas
cont1 = 0; // variavel utilizada para contagem das unidades ( valores no Display 5)
cont2 = 0; // variavel utilizada para contagem das dezenas ( valores no Display 4)
tempo = 0; // variavel utilizada para contagem de durao do valor no display
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF|ADC_TAD_MUL_0);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab
11
4.1.
Resumo terico
13
4.2.
EXPERINCIA
Objetivo
Realizar a converso de analgico para digital utilizando um potencimetro e
apresentando o valor no Display de 7 seguimentos.
Programa
/*
********************** NETCOM ***************************
******************* TREINAMENTOS E SOLUES **********************
-------------------------------------------------------------------------------------------------------------***************************************************************************
** PROGRAMA QUE FAZ A CONVERSO AD E MOSTRA NO DISPLAY DE 7 SEGUIMENTO**
***************************************************************************
*/
#include "C:\Users\HP-CETEC\Desktop\PIC\Nova pasta\Conversor_AD.h"
void main()
{
// "0" "1" "2" "3" "4" "5" "6" "7" "8" "9"
INT numero[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned int temp_res;
SETUP_ADC_PORTS(AN0); //Configurada a entrada analgica, somente a entrada RA0
SETUP_ADC(ADC_CLOCK_INTERNAL); //Configurado o conversor AD interno
SET_ADC_CHANNEL(0);
//Configurado o canal de leitura 0
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab
// TODO: USER CODE!!
SET_TRIS_A(0x01);
14
delay_us(10);
set_tris_d(0); // Define os pinos do PORTD como sada ( leds do display)
// Define RA0 como entrada (pino ligado ao conversor)
// Define o pino RA2 do PORTA como saida(Seleo Display 1).
while(1) {
temp_res = read_adc(); // ler o conversor AN0
//Mostra o valor da unidade
output_d(numero[temp_res %10]); // Pega Modulo (Resto) Da Diviso Por 10 E Coloca O
Valor No PORTD.
output_bit (PIN_A5, 1); // Liga O Transistor Associado Ao Display 4.
delay_us(100);
// Delay Para Escrita No Display.
output_bit (PIN_A5, 0); // Desliga O Transistor Associado Ao Display 4.
temp_res /=10;
// Divide Variavel Por 10.
// Mostra Valor Da Dezena
output_d(numero[temp_res %10]); // Pega Modulo (Resto) Da Diviso Por 10 E Coloca O
Valor No PORTD.
output_bit (PIN_E2, 1); // Liga O Transistor Associado Ao Display 3.
delay_us(100);
// Delay Para Escrita No Display.
output_bit (PIN_E2, 0);
// Desliga O Transistor Associado Ao Display 3.
temp_res /=10;
// Divide Variavel Por 10.
// Mostra Valor Da Centena
output_d(numero[temp_res %10]); // Pega Modulo (Resto) Da Diviso Por 10 E Coloca O Valor
No PORTD.
output_bit (PIN_E1, 1);
// Liga O Transistor Associado Ao Display 2.
delay_us(100);
// Delay Para Escrita No Display.
output_bit (PIN_E1, 0);
// Desliga O Transistor Associado Ao Display 2.
temp_res /=10;
// Divide Variavel Por 10.
// Mostra Valor Do Milhar
output_d (numero[temp_res %10]); // Pega Modulo (Resto) Da Diviso Por 10 E Coloca O
Valor No PORTD.
output_bit (PIN_E0, 1);
// Liga O Transistor Associado Ao Display 1.
delay_us(100);
// Delay Para Escrita No Display.
output_bit (PIN_E0, 1);
// Desliga O Transistor Associado Ao Display 1.
}
}
15
5. PWM
5.1.
Resumo terico
16
5. PWM
Como fazer para obter uma potncia intermediria, digamos 50%, aplicada
carga? Uma idia fazermos com que a chave seja aberta e fechada rapidamente de
modo a ficar 50% do tempo aberta e 50% fechada. Isso significa que, em mdia,
teremos metade do tempo com corrente e metade do tempo sem corrente.
A potncia mdia e, portanto, a prpria tenso mdia aplicada carga neste caso
50% da tenso de entrada.
17
5. PWM
5.2.
EXPERINCIA
Objetivo
Realizar o controle da velocidade de um ventilador via PWM.
Programa
/*
********************** NETCOM ***************************
******************* TREINAMENTOS E SOLUES **********************
--------------------------------------------------------------------------------------------------------------------***************************************************************************
** PROGRAMA QUE CONTROLA A VELOCIDADE DO VENTILADOR **
***************************************************************************
*/
#include <velocidade.h>
void main()
{
unsigned int temp_res;
setup_timer_2(T2_DIV_BY_16,124,1); //1,0 ms overflow, 1,0 ms interrupt
setup_ccp1(CCP_PWM|CCP_SHUTDOWN_AC_L|CCP_SHUTDOWN_BD_L);
set_pwm1_duty((int16)248);
18
6. DISPLAY LCD
6.1.
Resumo terico
Memria no voltil onde esto gravados os cdigos em ASC II para escrita dos
caracteres.
DDRAM
19
6. DISPLAY LCD
6.2.
EXPERINCIA
Objetivo
Realizar a escrita no Display de LCD utilizando as portas de comunicao do
microcontrolador PIC.
Programa
Funo LCD
#define EN PIN_E1
//Definimos o pino 1 da porta E como EN
#define RS PIN_E0
//Definimos o pino 0 da porta E como RS
#define DATA OUTPUT_D //Definimos a sada para a porta D como DATA
void lcd_cmd(byte cmd) //Funo para envio de comandos para o LCD
{
DATA(cmd);
//Coloca o contedo da varivel cmd na porta D
OUTPUT_HIGH(EN);
//Pulso alto (1) no pino EN (Pino 1 da porta E)
OUTPUT_LOW(EN);
//Retorna a nvel baixo (0) em EN
}
void lcd_envia_byte(boolean nivel,byte dado) //Funo para envio de dados ou escrita para o
//LCD
{
OUTPUT_LOW(RS);
//Coloca em nvel baixo o pino RS (Pino 0 da porta E)
OUTPUT_BIT(RS,nivel); //Coloca o pino RS no nvel da varivel nivel
delay_us(100);
//Atraso de 100 us
OUTPUT_LOW(EN);
//Coloca em nvel baixo o pino EN
lcd_cmd(dado);
//Chama a funo lcd_cmd j com os dados a serem enviados
//para a porta D
}
void lcd_pos_xy(byte x, byte y) //Funo de posicionamento do cursor
{
byte endereco;
//Varivel de informao para o endereo do cursor
if (y!=1)
//Se o valor de y for 2
endereco = 0xC0;
//ento endereco vai ser igual a 0xC0 (endereo da segunda linha)
else
//Seno
endereco = 0x80;
//endereo vai ser igual a 0x80 (endereo da primeira linha)
endereco += x-1;
//Aqui decrementa o valor da varivel x e o resultado somado com
//a varivel endereo...
lcd_envia_byte(0,endereco); //Chama a funo lcd_envia_byte, com o valor 0, informando
para //o LCD que ser enviado um dado e o dado est contido na varivel endereo...
}
20
6. DISPLAY LCD
void lcd_escreve(char c) //Funo para envio dos caracteres e/ou dados para o LCD
{
switch(c)
//comando switch com a varivel c
{
case '\f' : lcd_envia_byte(0,1); //Caso c seja \f, o dado 1 ser enviado ao LCD para
//limpar todo o seu contedo.
delay_ms(2); //Atraso de 2 ms
break;
//Comando break, terminou o processo acima, j no testa
//nenhum outro caso...
case '\n' :
//Caso c seja \n
case '\r' : lcd_pos_xy(1,2); //ou \r, muda o cursor para a segunda linha do LCD
break;
//Comando break
case '\b' : lcd_envia_byte(0,0x10); //Caso c seja \b ento desloca o cursor para a esquerda
break;
//Comando break
default : lcd_envia_byte(1,c); //caso seja um caractere qualquer, ento este ser escrito no
//LCD pela funo lcd_envia_byte
break;
//Comando break
}
}
void lcd_ini()
//Funo de inicializao do LCD
{
byte conta;
//Varivel de contagem
DATA(0x00);
//Coloca na porta D o valor 0x00
OUTPUT_LOW(RS);
//Coloca em nvel baixo o pino RS
OUTPUT_LOW(EN);
//Coloca em nvel baixo o pino EN
delay_ms(15);
//Atraso de 15ms
for (conta=1;conta<=3;conta++) //Para conta = 1 at conta = 3, ou seja executar 3 vezes os
//comandos abaixo
{
lcd_cmd(0x30);
//Envia o comando 0x30 para o LCD
delay_ms(5);
//Atraso de 5ms
}
lcd_cmd(0x38);
//Escreve comando para interface de 8 vias de dados
lcd_cmd(0x01);
//Escreve comando para limpar todo o display
delay_ms(1);
//Atraso de 1ms
lcd_cmd(0x0C);
//Escreve comando para ligar o display sem cursor
lcd_cmd(0x06);
//Escreve comando para incrementar automaticamente direita
}
21
6. DISPLAY LCD
Programado LCD
/*
********************** NETCOM ***************************
******************* TREINAMENTOS E SOLUES **********************
-----------------------------------------------------------------------------------------------------------------------***************************************************************************
** PROGRAMA QUE APRESENTA TEXTO NO DISPLAY DE LCD **
***************************************************************************
*/
#include <LCD.h>
#include "LCD8B.c"
void main()
{
lcd_ini();
// lcd_cmd(0x38);
//Escreve comando para interface de 8 vias de dados
lcd_cmd(0x01);
//Escreve comando para limpar todo o display
while(1)
{
printf(lcd_escreve,"\f NETCOM ");
printf(lcd_escreve,"\nSEJA BEM VINDO");
delay_ms(1000);
lcd_cmd(0x01);
//Escreve comando para limpar todo o display
}
}
22
7. TECLADO MATRICIAL
7.1.
Resumo terico
23
7. TECLADO MATRICIAL
7.2.
EXPERINCIA
Objetivo
Realizar o acionamento de um rel utilizando as portas de comunicao do
microcontrolador PIC.
Funo Keys
//Definies da matriz do teclado
#define COL1 pin_b4
#define COL2 pin_b5
#define COL3 pin_b6
#define COL4 pin_b7
#define LIN1 pin_b0
#define LIN2 pin_b1
#define LIN3 pin_b2
#define LIN4 pin_b3
char tecla;
boolean tecla_pres;
char varre_teclas(void)
{
char key ;
output_high(COL4);
output_high(COL3);
output_high(COL2);
output_low(COL1); //Ativa a primeira coluna
if (!input(LIN1)) key = '1';
if (!input(LIN2)) key = '4';
if (!input(LIN3)) key = '7';
if (!input(LIN4)) key = '*';
output_high(COL1);
output_low(COL2); //Ativa a segunda coluna
if (!input(LIN1)) key = '2';
if (!input(LIN2)) key = '5';
if (!input(LIN3)) key = '8';
if (!input(LIN4)) key = '0';
output_high(COL2);
24
7. TECLADO MATRICIAL
Programa
/*
********************** NETCOM ***************************
******************* TREINAMENTOS E SOLUES **********************
----------------------------------------------------------------------------------------------------------------------***************************************************************************
** PROGRAMA QUE MOSTRA NO LCD O TECLADO MATRICIAL**
***************************************************************************
*/
#include <Teclado matricial.h>
#include "LCD8B.c" //chamada da funo LCD
#include "12Keys.c" // chamada da funo Keys
void main()
{
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF|ADC_TAD_MUL_0);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
25
7. TECLADO MATRICIAL
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab
port_b_pullups(True);
lcd_ini(); //inicializa LCD
delay_ms(100);
lcd_escreve("\f");
printf(lcd_escreve,"Digite:\n");
tecla_pres=0;
while(TRUE)
{
tecla = varre_teclas(); //ler teclado
lcd_pos_xy(1,2); //posiciona cursor
printf(Lcd_escreve,"%c", tecla); //escreve no display o valor lido do teclado
}
}
26
8. ACIONAMENTO DE REL
8.1.
Resumo terico
27
8. ACIONAMENTO DE REL
8.2.
EXPERINCIA
Objetivo
Realizar o acionamento de um rel utilizando as portas de comunicao do
microcontrolador PIC.
Programa
/*
********************** NETCOM ***************************
*******************
TREINAMENTOS E SOLUES **********************
----------------------------------------------------------------------------------------------------------------------***************************************************************************
** PROGRAMA QUE ACIONA O RELE COM O BOTAO B1**
***************************************************************************
*/
#include "C:\Users\HP-CETEC\Desktop\PIC\7.Rele\Rele.h"
void main()
{
int aux=0;
char ligado=0;
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF|ADC_TAD_MUL_0);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab
PORT_B_PULLUPS(true);
set_tris_b(0x0f);
//Configura os 4 bits menos significativos como entrada
set_tris_a(0x00);
output_bit(PIN_A3,0);
28
8. ACIONAMENTO DE REL
while(1)
{
if(!input(PIN_B0)&& ligado == 0) //verifica se botao B1 foi pressionado
{
while(!input(PIN_B0)); //Aguarda o boto ser solto
output_bit(PIN_A3,1); //liga o rel
ligado=1;
}
if(!input(PIN_B0)&& ligado == 1) //verifica se boto B1 foi pressionado
{
while(!input(PIN_B0)); //Aguarda o boto ser solto
output_bit(PIN_A3,0); //desliga o rel
ligado=0;
}
}
}
29
9. CONTADOR DE VELOCIDADE
9.1.
Resumo terico
Figura 21: Circuito utilizado para fazer anlise dos sensores infravermelho
30
9. CONTROLE DE VELOCIDADE
9.2.
EXPERINCIA
Objetivo
Realizar o controle da velocidade de um ventilador utilizando o sensor infravermelho
e o timer do microcontrolador PIC.
Programa
/*
********************** NETCOM ***************************
******************* TREINAMENTOS E SOLUES **********************
-------------------------------------------------------------------------------------------------------***************************************************************************
** PROGRAMA QUE APRESENTA NO LCD A VELOCIDADE DO VENTILADOR **
***************************************************************************
*/
#include "C:\Users\HP-CETEC\Desktop\PIC\Nova pasta\Controle_velocidade.h"
#include "LCD8B.c"
void main()
{
long int temp_res;
SETUP_ADC_PORTS(AN0); //Configura as entradas analgicas RA0,RA1,RA3
SETUP_ADC(ADC_CLOCK_INTERNAL);
//Configura o conversor AD interno
setup_timer_2(T2_DIV_BY_16,124,1);
setup_ccp1(CCP_PWM|CCP_SHUTDOWN_AC_L|CCP_SHUTDOWN_BD_L);
// TODO: USER CODE!!
lcd_ini();
//Chama a funo para inicializao do LCD
delay_us(100);
printf(lcd_escreve,"\f Ventilador\n");
SET_ADC_CHANNEL(0);
//Configura o canal de leitura 0
while(TRUE)
{
temp_res = read_adc(); // ler o conversor AN0
set_pwm1_duty((int16)temp_res);
printf(lcd_escreve,"Duty cycle: %d%% \n",(int)(temp_res*100/255));
}
}
31
32
/*
********************** NETCOM ***************************
******************* TREINAMENTOS E SOLUES **********************
-------------------------------------------------------------------------------------------------------------***************************************************************************
** PROGRAMA QUE CONTROLA A TEMPERATURA COM VENTILADOR**
***************************************************************************
*/
#include"C:\Users\HP-CETEC\Desktop\PIC\8.sensor de temperatura\Sensor de temperatura.h"
#include "LCD8B.c"
void main()
{
long int temperatura;
int ligado=1;
/*
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);*/
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab
// TODO: USER CODE!!
33
if (temperatura>=80)
//Sendo ad3 >= 80...
{
Output_High(PIN_C2); //Liga ventoinha
Output_low(PIN_C1); //Desliga aquecimento
ligado=1;
}
if (temperatura<=55)
//Sendo <= 55...
{
Output_High(PIN_C1); //liga aquecimento
Output_low(PIN_C2); //Desliga ventoinha
ligado=0;
}
if(ligado)
printf(lcd_escreve,"Vent. ON");
else
printf(lcd_escreve,"Vent. OFF");
delay_ms(100);
}
//Atraso
34
35
36
37