Baixe o app para aproveitar ainda mais
Prévia do material em texto
Microcontroladores e redes 8.1 CAPÍTULO 8 – FUNÇÕES 8.1-) INTRODUÇÃO Quando escrevemos um programa podemos ter uma sequência de comandos que se repetem ao longo deste. Podemos escrever esta sequência de comandos uma única vez e atribuir-lhe um nome. Quando for necessária a execução desta função, basta chamá-la (colocar o nome da função no programa) que a mesma vai ser executada. Após a função ser executada, o programa retorna à posição em que estava quando a função foi chamada. Exemplo: comando 1; comando 2; delay2s (); comando 3; comando 4; comando 5; ... As funções em linguagem C são semelhantes as sub-rotinas utilizadas em outras linguagens como BASIC e Assembly. Além das funções que podem ser criadas pelo programador, os compiladores C para microcontroladores possuem funções prontas que facilitam a operação com displays LCD, conversores analógico-digital, teclados, comunicação com microcontroladores, etc. Estas funções podem ser visualizadas clicando no Help do mikroC (duas vezes) e abrindo a pasta mikroC Libraries que se encontra na janela à esquerda. 8.2-) FORMA GERAL A forma geral de uma função no compilador mikroC é: void nome_da_função () { comando a; comando b; ... } nome da função : Especifica o nome pelo qual a função será conhecida pelo resto do programa. O corpo da função deve ser escrito antes da função principal. Para chamar a função, basta escrever no programa o seu nome seguido de parênteses (). Exemplo 1: Dado o circuito da figura 1, faça um programa, utilizando uma função pisca_led, que funcione de acordo com a seguinte lógica: a-) Pisca 3 vezes o led a uma freqüência de 2 Hz. b-) Espera 3 segundos. c-) Pisca 6 vezes o led a uma freqüência de 2 Hz. d-) Espera 4 segundos. e-) Retorna para o início. OBS: O tempo que o led fica ligado deve ser igual ao tempo que o led fica desligado. O laço de for e os comandos para ligar e desligar o led e as temporizações dos itens a e c devem ser colocadas na função pisca_led. As temporizações dos itens b e d devem ser colocadas na função principal. void delay2s () { comando a; comando b; comando c; ... comando x; comando y; comando z; } Microcontroladores e redes 8.2 - CIRCUITO ELETRÔNICO: - FLUXOGRAMA: Figura 2 RD0 PIC 16F877A + 5V VDD VSS 6 14 5 330 Ω MCLR 4 Figura 1 pisca_led rd0 = 1 250 ms fim rd0 = 0 250 ms i = 0; i < n; i ++ N S início pisca_led 1 S fim N n = 3 3000 ms pisca_led n = 6 4000 ms Microcontroladores e redes 8.3 - PROGRAMA: int i; // declara a variável i como inteira, int n; // declara a variável n como inteira, void pisca_led () // início da função pisca_led, { for (i = 0; i < n; i++) // para i variando de 0 a n, faça: { portd =1; // liga o diodo conectado no pino 0 da porta D, delay_ms (250); // espera 250 ms, portd = 0; // desliga o diodo conectado no pino 0 da porta D, delay_ms (250); // espera 250 ms. } } void main() // início da função principal, { trisd =0; // configura os pinos da porta D como saída, portd =0; // zera os pinos da porta D, while(1) // início de um loop infinito, { n = 3; // atribui à variável n o valor 3, pisca_led (); // chama a função pisca_led, delay_ms (3000); // espera 3 segundos, n = 6; // atribui à variável n o valor 4, pisca_led(); // chama a função pisca_led, delay_ms (4000); // espera 4 segundos. } } A utilização de funções além de simplificar o programa, como no exemplo anterior, também facilita a análise do funcionamento e a correção de erros do programa. Exemplo 2: Faça um programa, utilizando laço do for na função principal (main), para ligar em sequência os leds conectados nos pinos da porta D, um de cada vez, liga o led 0, espera 1 s, desliga o led 0, depois liga o led 1, espera 1 s, desliga o led 1 e assim por diante até o led 7. Os comandos para ligar e desligar o led e as temporizações devem ser colocadas em uma função chamada pisca_led. Utilize na função pisca_led o comando ldexp (1,i) que é equivalente a 2i. - CIRCUITO ELETRÔNICO: PIC 16F877A RD0 LED 0 RD1 LED 1 Figura 3 RD2 LED 2 RD3 LED 3 RD4 LED 4 RD5 LED 5 RD6 LED 6 RD7 LED 7 Microcontroladores e redes 8.4 - PROGRAMA: int i; // declara a variável i como inteira, void pisca_led () // início da função pisca_led, { portd = ldexp(1,i); // atribui a porta D o valor 2i, delay_ms (1000); // espera 1s, } void main() // início da função principal, { trisd=0; // configura os pinos da porta D como saída, portd =0; // zera os pinos da porta D, for (i=0; i<8;i++) pisca_led (); // chama a função pisca led oito vezes com i variando de 0 a 7, portd = 0; // zera os pinos da porta D. } 8.3-) DECLARAÇÃO DE VARIÁVEIS Foi visto no capítulo 6 que declarar uma variável significa informar ao compilador qual é o tipo da variável (int, char, float, etc.). As variáveis podem ser declaradas no corpo principal do programa ou dentro de uma função. Quando as variáveis são declaradas no corpo principal do programa, ou seja, fora de qualquer função, inclusive da função main (), são denominadas variáveis globais pois podem ser acessadas de qualquer ponto do programa. Quando as variáveis são declaradas dentro de uma função, incluindo a função main (), são denominadas variáveis locais, pois só podem ser acessadas de dentro da função em que foram declaradas. Uma variável local só existe enquanto a função está sendo executada, no momento em que ocorre o retorno da função, as variáveis locais são descartadas. Exemplo 3: Digite e compile o programa abaixo. Observe que não houve nenhuma mensagem de erro, pois as variáveis i e j foram declaradas dentro da função que as acessa. void teste () { int j; for (j=0; j<10; j++); } void main () { int i; for (i=0; i<10; i++); } Declare as duas variáveis dentro de uma mesma função, ou antes da função principal main (), e observe que aparece uma mensagem de erro do tipo “Undeclared identifier () in expression”. Declarando-se as duas variáveis fora das funções e no início do programa não aparece nenhuma mensagem de erro. Figura 4 pisca_led portd = ldexp(1,i) 1000 ms fim início pisca_led sim não portd = 0 fim i = 0; i < 8; i ++ Microcontroladores e redes 8.5 Exemplo 4: Faça um contador progressivo de 0 a 15, utilizando o laço do for na função principal, que apresente o resultado da contagem em binário nos 4 ledsconectados nos pinos de 0 a 3 da porta D mostrados na figura 5. Cada contagem deve ser apresentada nos leds durante 1 segundo. Os comandos para ligar e desligar o(s) led(s) e as temporizações devem ser colocadas em uma função chamada liga_led. - CIRCUITO ELETRÔNICO: - FLUXOGRAMA: - PROGRAMA: int j; // declara a variável j como inteira void liga_led () // início da função liga_led { portd = j; // coloca na porta D o valor da variável de controle j delay_ms (1000); // espera 1 segundo } void main() // início do programa principal { trisd = 0; // configura os pinos da porta D como saída portd = 0; // zera os pinos da porta D for (j = 0; j < 16; j++) // início do laço de for com j variando de 0 a 15 liga_led (); // chama a função liga_led portd = 0; // desliga os leds } Figura 6 não sim início fim j = 0; j < 16; j++ liga_led portd = j 1 s liga_led fim PIC 16F877A RD0 330 Ω LED 0 RD1 LED 1 330 Ω Figura 5 LED 2 330 Ω RD3 330 Ω LED 3 RD2 Microcontroladores e redes 8.6 EXERCÍCIOS 1-) Faça um programa, utilizando uma função pisca_led, para acionar os leds conectados nas saídas da porta D, do circuito da figura 7, de acordo com a seguinte lógica: a-) Pisca 20 vezes os leds 0 e 3 a uma freqüência de 1 Hz. b-) Espera 5 segundos. c-) Pisca 30 vezes os leds 1 e 2 a uma freqüência de 1 Hz. d-) Espera 5 segundos. e-) Retorna para o item “a”. OBS: O laço do for, os comandos para ligar e desligar os leds e as temporizações devem ser colocadas na função pisca_led, ou seja, na função principal devem aparecer apenas os comandos de atribuição de valores das variáveis e as chamadas da função pisca_led. 2-) Faça um programa, utilizando uma função pisca_led, para acionar os leds conectados nas saídas da porta D do circuito da figura 7 de acordo com a seguinte lógica: a-) Pisca 20 vezes o led 0 a uma freqüência de 0,5 Hz. b-) Espera 3 segundos. c-) Pisca 10 vezes o led 1 a uma frequência de 0,5 Hz. d-) Espera 5 segundos. e-) Pisca 15 vezes os led 2 e 3 a uma freqüência de 0,5 Hz. f-) Espera 6 segundos. g-) Retorna para o item “a”. Ver observação do exercício 1. 3-) Faça um programa, utilizando laço do for na função principal (main), para ligar em sequência os leds conectados nos pinos da porta D do circuito da figura 3, um de cada vez, liga o led 7, espera 1 s, desliga o led 7, depois liga o led 6, espera 1 s, desliga o led 6 e assim por diante até o led 0. Os comandos para ligar e desligar o led e as temporizações devem ser colocadas em uma função chamada pisca_led. Utilize na função pisca_led o comando ldexp (1,i) que é equivalente a 2i. 4-) Junte os programas do exemplo 2 e do exercício 3 para fazer ligar o led 0, depois o led 1, .... até o led 7, após liga o led 6, depois o led 5, ... até o led 0. 5-) Faça um contador que conte de 0 a 15 e depois de 14 até 0, utilizando o laço do for na função principal, que apresente o resultado da contagem em binário nos 4 leds conectados nos pinos de 0 a 3 da porta D mostrados na figura 7. Cada contagem deve ser apresentada nos leds durante 1 segundo. Os comandos para ligar e desligar o(s) led(s) e as temporizações devem ser colocadas em uma função chamada liga_led, ou seja, na função principal devem aparecer apenas os laços de for e as chamadas da função liga_led. 6-) Faça um contador de 0 à F (circuito e programa) utilizando um microcontrolador PIC 16F877A e um display de 7 segmentos. Cada algarismo deve ser apresentado no display durante 1 segundo. Utilize o laço do for dentro da função principal e o comando switch dentro de uma função chamada decodificador cuja função é ligar os segmentos do display para mostrar o algarismo correspondente à contagem. A contagem deve ser realizada enquanto o circuito estiver energizado. 7-) Escreva um programa para fazer a contagem de 0 a 99 em decimal e apresentar o resultado da contagem nos displays de leds de 7 segmentos mostrados na figura abaixo. Utilize dois laços de for dentro da função principal, um para contar o algarismo das dezenas e outro para contar o algarismo das unidades e uma função decodificador para ligar os segmentos do display e apresentar o valor das unidades ou das dezenas. Figura 7 PIC 16F877A RD0 330 Ω LED 0 RD1 LED 1 330 Ω RD2 LED 2 330 Ω RD3 330 Ω LED 3 Figura 8 RD0 PIC 16F877A RD1 RD2 RD3 RD4 RD5 RD6 a b c d e f g a b c d e f g dezenas unidades RA4 2,2 KΩ 2,2 KΩ BC 548 BC 548 RA5
Compartilhar