Programação C Para Microcontroladores (Total)

download Programação C Para Microcontroladores (Total)

of 81

description

EM power point.

Transcript of Programação C Para Microcontroladores (Total)

  • PROGRAMAO C ANSIPARAMICROCONTROLADORESDr. Ivo Reis [email protected]

    ivo - ANSI American National Standard Institute

  • COMPILADORESCompiladores so programas utilizados para produzir o cdigo executvel para uma determinada CPU a partir do programa fonte escrito em linguagem de programao.Tipos de Compiladores:Direto;Dois passos.Compilador Direto: Produz o cdigo executvel a partir da compilao (.obj) e montagem do cdigo executvel (.hex).Dois Passos: Primeiramente o compilador produz o cdigo assembly (.asm) para depois produzir o cdigo executvel (.obj e .hex).

  • COMPILADORES CHistrico da Linguagem C:Programas que executam tarefas ligadas s funes do sistema operacional ou instrues do microprocessador/microcontrolador normalmente necessitam ser codificados em linguagem de montagem (assembly). A linguagem C foi desenvolvida para resolver este problema de forma menos penosa e mais porttil.A linguagem C considerada de mdio nvel por possuir controle de fluxo e estrutura de dados de forma semelhante s linguagem de alto nvel, e ao mesmo tempo, proporcionar facilidades que s esto disponvel em linguagem de baixo nvel (assembly).O C Ansi foi projetado em 1972 nos laboratrios da Bell por Brian W. Kernighan e Dennis M. Ritchie, para o sistema operacional UNIX..

  • Principais caractersticas da Linguagem C:Alto nvel de portabilidade, pois programas-fonte podem ser transportados para outras CPUs sem maiores dificuldades; de uso geral, sendo eficiente tanto para programao de utilitrios como para sistemas operacionais, processadores de texto, banco de dados e sistemas aplicativos em geral;Gera cdigo executvel compacto e rpido em relao maioria das outras linguagens compiladas, caracterstica desejvel para computadores que tm memria reduzida;Total interao com o sistema operacional, insero de cdigo assembly no programa-fonte, sendo assim, ilimitada por software;Sintaxe de poucos comandos e grande nmero de operadores aritmticos e lgicos;Estruturada e modularPermite estruturas de dados compostos na forma de registros e campos.COMPILADORES C

  • Compiladores C so programas utilizados para produzir o cdigo executvel para uma determinada CPU a partir do programa fonte escrito em linguagem de programao C.Tipos de Compiladores:Direto;Dois passos.Compilador Direto: Produz o cdigo executvel a partir da compilao (.obj) e montagem do cdigo executvel (.hex).Dois Passos: Primeiramente o compilador produz o cdigo assembly (.asm) para depois produzir o cdigo executvel (.obj e .hexCOMPILADORES C

  • PROCESSO DE COMPILAO

  • [][< incluses de arquivos de definies >][< declarao de prottipos de funes >][< declarao de variveis globais >][< tipo >] main([< tipo > varivel ]){

    /*corpo da funo principal main( )...*/[ return(var); ]}[[< tipo >]func([< lista de parmetros >])[< declarao de parmetros >]{/*corpo da funo fun( )...*/}]

    ESTRUTURA DO CDIGO-FONTE

  • Funes de Entrada e SadaAs funes de entrada e sada de dados de um programa C so:getchar() l um caracter (byte) da entrada padroputchar() escreve um caracter (byte na sada padrogets() l uma cadeia de caracteres (bytes) da entrada padroputs() escreve uma cadeia de caracteres (bytes na sada padroscanf() l entrada formatada de dados (usa a funo getchar())printf() escreve sada formatada de dados (usa a funo putchar())Exemplos da Entrada e Sadavar1 = getchar();/* observe que esta funo no necessita de parmetros */putchar(var1);nome = gets();/* nome um vetor do tipo char p.e. char nome[20] */puts(nome);/* nome um apontador (pointer) do tipo char */scanf(Entre com o seu nome: %s, nome);printf(Hello World!.../nHoje completa %d dias que sei programar C/n, dias);ENTRADA E SADA

  • Os valores que so processados por um programa C so guardados em variveis de diversos tipos.A formao dos nomes das variveis, funes e constantes simblicas se d a partir de quatro regras bsicas:Todo nome deve comear com uma letra ou com uma sublinha (_);Os prximos caracteres podem ser letras, sublinhas ou nmeros;O nome pode ser de qualquer tamanho (com significncia limitada a 8 ou mais caracteres, dependendo do compilador).Existem certos identificadores que so palavras-chave (keywords) da linguagem e que por isso no pdem ser usados para nomear variveis e funes:autobreakcasecharcontinuedefaultdodoubleelseentryexternfloatforgotoifintlongregisterreturnshortsizeofstaticstructswitchtypedefunionusignedwhileVARIVEIS E CONSTANTES

  • Cada varivel possui um tipo e em C toda varivel utilizada em um programa deve ser previamente, conforme a sintaxe abaixo.

    ;

    Tipos de variveis em C so:char/* contm um caractere ASCII, ocupa 1 byte da memria de dados */int /* contm valores numricos inteiros positivos ou negativos, ocupa 2 bytes da memria de dados */short/* mesmo que os inteiros porm podem ocupar menor nmero de bytes da memria de dados */long/* contm valores inteiros e maior valor, ocupam 4 bytes da memria de dados */unsigned/* valores inteiros sem representao de sinal */float/* nmeros reais de ponto flutuante, ocupam 4 bytes de memria de dados*/double/* nmeros reais como o float maiores, ocupam 8 bytes da memria de dados */TIPOS DE DADOS

  • - Caracteres

    Constantes caracteres ficam entre plics () e so representados pelo valor ASCII:a, A, *, 2, ?

    Existem caracteres que no so imprimveis (i.e. no possuem um smbolo visvel e que tm funes especficas:

    \0 - nulo corresponde ao cdigo ASCII = 0\n- comando newline de nova linha\t- comando tab de tabulao\b - comando back-space volta uma posio\r - comando de retorno de carro CR\f- comando form-feed comando de nova pgina\\ - barra invertida\ - plicnnn - representao de um byte na base octal, p.e. O33 = caracter scape\xnn- representao de um byte na forma hexadecimalTIPOS DE DADOS CONTINUAO

  • TABELA ASCII

  • TABELA ASCII EXTENDIDA

  • - Cadeia de Caracteres (String)

    Alem dos caracteres isolados podemos representar cadeias de caracteres, que so dispostas entre aspas:

    Nome[ ] = Ivo Reis Fontes\n;

    - Inteiros

    Valores numricos do conjunto dos inteiros (Z) com ou sem sinal podem assumir os valores:

    -32768 x 32767Importante: Os valores negativos so armazenados naforma de complemento de 2.

    TIPOS DE DADOS CONTINUAO

  • - Longos

    Para diferenci-los das constantes do tipo int, os tipos long tm sufixo L

    3241L, 0L, 130000000L

    - Hexadecimal

    Os valores hexadecimais so representados com o prefixo 0x:

    0x41, 0Xffff, 0xa0, 0xC1da, 0xC1FE

    - Ponto Flutuante

    Os nmeros reais possuem ponto decimal e podem ou no ser acompanhados de sinal:

    3.14, 2.71, -5423.7265, 1.TIPOS DE DADOS CONTINUAO

  • - Character (char)

    Cada valor do tipo char armazenado na forma de um byte:

    Exemplos:char c;c = A = 0x41 = 65 = \x41 = \101REPRESENTAO DOS DADOS NA MEMRIA

  • - Inteiro (int)

    Cada valor do tipo int armazenado na forma de 2 bytes:

    Exemplo:int var1 = 1986;

    e var1 = -1986 ter a forma (complemento de 2):REPRESENTAO DOS DADOS NA MEMRIA CONTINUAO

  • Inteiro CONT.A ordem de posicionamento na memria dos dois bytes depende do sistema, que pose ser do tipo:Little Indiam (byte lsb no endereo de memria menos significativa)Big Indiam (byte lsb no endereo de memria mais significativa)Exemplo de programao (prog01.c):main(){int parc_1 = 56,intparc_2 = -47,soma;

    soma = parc_1 + parc_2;printf(%d, soma);}REPRESENTAO DOS DADOS NA MEMRIA CONTINUAO

  • - ponto flutuante (float)

    Cada valor do tipo float armazenado na forma de 1 byte para o expoente e os restantes armazenam a base.O nmero total de bytes depende da arquitetura da CPU do computador.

    REPRESENTAO DOS DADOS NA MEMRIA CONTINUAO

  • Operador de Atribuio Simples

    A operao mais simples atribuio de um valor a uma varivel:

    Exemplo:var = 10;string_1[ ] = Primeira string definida no programa!...;

    Operadores Aritmticos

    Os operadores aritmticos bsicos e que so comuns a todas as linguagens de programao, so:Soma+Subtrao-Multiplicao*Diviso/

    OPERADORES

  • Operadores Aritmticos (especficos da linguagem)

    Os operadores aritmticos especficos da linguagem C so:Diviso modulo 10%Auto incremento++pr-incremento++var;ps-incrementovar++;Auto decremento- - pr-decremento- -var;ps-decrementovar--;Negao

    Exemplo:resto = dividendo % divisor;x = x + 1 = x++ = x +=1

    OPERADORES CONTINUAO

  • Operadores Relacionais

    Os operadores aritmticos especficos da linguagem C so:Se iguais==Se Menor ou Igual=Se no igual!=

    Exemplo:If((x1==x2) && (x1 != x3)){...}

    do{...}while(x3

  • Operadores Lgicos

    Os operadores lgicos da linguagem C so:Se e (AND)&&Se ou (OR)||Se no (NOT)!

    Exemplo:If((x1 && x2)||(x1 && x3)){...}do{...}while(x3 != 10);

    Operadores Tamanho de VarivelOs operadores tamanho em bytes de uma varivel em Cint var1,var2;var2 = sizeof (var1);(var2 = 2)

    OPERADORES CONTINUAO

  • OPERADORES CONTINUAOOperador ?

    O operador ? (atribuio) tem a seguinte sintaxe: ? : Operao: Se a expresso lgica for verdadeira, ento expresso-1 aplicada, do contrrio, a expresso-2 ser aplicada.Exemplo:

    #include Main(){chara,b,z;a = getchar();b = getchar();

    z = (a > b) ? a : b;/* se o teste lgico for verdadeiro z=a, seno z=b */printf(O maior valor = %c,z);}

  • Operador de Converso Automtica

    Da mesma forma que as outras linguagens de programao, possvel converter tipos de dados utilizando-se o operador:()

    Exemplos:floatvalor = 3.1415926535;...valor = (float) ((long) (valor * 100. + 0.5))/100.

    Operao: Arredonda valor com duas casas decimais e aps a execuo da expresso valor ser igual a 3.14.

    int valor = 0x0102;...valor = (int) ((char) valor);

    Operao: Aps a execuo da expresso valor ser igual a 2.

    OPERADORES CONTINUAO

  • OPERADORES CONTINUAOPrecedncia de Operadores

  • CONTROLE DE FLUXOIntroduoC uma linguagem com caractersticas estruturadas, isto , seus comandos para controle de fluxo so baseados em repetio de blocos de comando, possuindo cada bloco apenas uma entrada e uma sada bem definidas.Define-se um comando como uma expresso seguida de um ponto-e-vrgula ( ; ); ou como um bloco de comandos delimitados por { e }; ou como um comando de controle de fluxo.Tomando como base esta afirmativa, so exemplos de comandos:printf(Teste\n);a = 2;{/* comando composto! */a = b;b = c;c = a;}d) while ((a[i] > 0) && (i < 10))i++;

  • CONTROLE DE FLUXO CONTINUAOComandos:- ifIf o comando mais simples que existe em termos de controle de fluxo. Ele seleciona a execuo de um comando se uma expresso lgica for verdadeira (quando avaliada for diferente de zero) ou, opcionalmente, a execuo de um outro comando no caso da expresso lgica ser falsa (quando avaliada for zero).Sintaxe:a) If ()

    b) If () else

    Operao:a) A avaliada. Se for verdadeira o ser executado. Seno, o prximo comando ser executado.b) A avaliada. Se for verdadeira o ser executado. Seno, o ser executado.

  • CONTROLE DE FLUXO CONTINUAOExemplosIf (a < 0) printf(valor negativo);

    b) if (a > 0)z = a;elsez = b;

    If (a == b)z = a + 1;elsez = a +2;

    If (x )printf(x diferente de zero!);

  • CONTROLE DE FLUXO CONTINUAO- switchA linguagem C oferece ao programador este comando que possibilita a tomada de mltiplas decises baseada em uma expresso.Sintaxe:Switch ( ){case :case :...

    case :default:}

  • CONTROLE DE FLUXO CONTINUAOOperaoA avaliada e se houver um case igual a expresso avaliada, a execuo do programa continuar a partir do comando correspondente.Exemploc = getchar( );switch (c){case 1:insere( );break;case 2:retira( );break;case 3:altera( );break;case 4:list_rel( );break;default:impr_erro( );}

  • CONTROLE DE FLUXO CONTINUAO- whileO while utilizado para a execuo de um bloco de comandos enquanto uma condio lgica for verdadeira.Sintaxe:while ()Exemplowhile ((c=getchar( ) != 0){c +=0x40;printf(A letra maiscula digitada : %c,c);};while com a vazia considerado como verdadeiro e representa um loop infinito.Exemplowhile ( );

    equivalente a (SJMP* ) em assembly.

  • CONTROLE DE FLUXO CONTINUAO- forO for um comando de repetio extremamente poderoso e um velho conhecido das linguagens de programao. Em C ele existe em uma forma parecida com a convencional, embora tenha uma filosofia elegante que lhe permite construes bem mais versteis.Sintaxe:for (;
  • CONTROLE DE FLUXO CONTINUAOExemploMaior = -32768;for (i = 0; i < 100; i++)if (val[i] > maior)maior = val[i];- do-whileO do-while mais conhecido em outras linguagens por uma variante com o nome de repeat-until outra forma estruturada para controle de fluxo na execuo repetida de um bloco de comandos enquanto uma expresso tiver valor verdadeiro. A diferena deste comando para o while que a avaliao da expresso feita aps a execuo do comando.Sintaxe:do{...}while( );

  • Exemplodo{ c = getchar( );}while (c < 1 || c > 5);- break - continueAlgumas vezes torna-se necessrio o controle da execuo de uma iterao independentemente do teste lgico efetuado. Com esta finalidade tem-se os comandos break e continue.- goto - rtulosEmbora seja uma linguagem estruturada, o C possui o to controvertido comando de desvio incondicional goto.

    Sintaxe

    goto CONTROLE DE FLUXO CONTINUAO

  • Exemploswhile (
  • Exemploswhile (
  • Exemplos while (
  • USO DE INTERRUPES DO 8051Interrupo o processo atravs do qual a execuo de um programa pode ser interrompida de forma assncrona por um evento interno/externo. Associada ao evento existe uma rotina de servio (ISR) No DE INTERRUES:2 EXTERNAS2 TMRs1 SERIALREGISTROS ASSOCIADOS:IEIPTCON

  • USO DE INTERRUPES DO 8051 CONTINUAO ESQUEMA DE INTERRUPO

  • USO DE PERIFRICOS DO 8051CONTINUAO REGISTROS IE Interrupt EnableEXT1TMR1SERIAL

  • USO DE INTERRUPES DO 8051 CONTINUAO REGISTROS CONT. TCON Timer Control

  • VETOR DE INTERRUPO Cada interrupo atendida por uma ISR (Interrupt Service Routine)apontada para as seguintes posies de memria:RESET00HINT0IE003HTMR0TF00BHINT1IE113HTMR1TF11BHUARTRI+TI23HO + indica OU!USO DE INTERRUPES DO 8051 CONTINUAO

  • A seguir apresentada a sequncia de eventos em ciclos de mquina no atendimento de uma interruo USO DE INTERRUPES DO 8051 EM ASSEMBLY CONTINUAO

  • EXEMPLO DO USO DE INTERRUPO (em Assembly);LED_INT1.ASMDEFSEG PROG, CLASS=CODE, START=0SEG PROG;ORG RESETAJMP INICIO;ORG EXTI1AJMP EXT1;A seguir apresentado um exemplo que faz uso da interruo externa INT1 para acender 4 LEDs ligados aos 4 bits menos significativos da porta P1, sequencialmente.Observao: Considere que uma chave SW est conectada entrada INT1, ou seja, pino P3.3 !USO DE INTERRUPES DO 8051 EM ASSEMBLY CONTINUAO

  • USO DE INTERRUPES DO 8051 EM ASSEMBLY CONTINUAO EXEMPLO DO USO DE INTERRUPO CONT.ORG 50HINICIO: MOV A,#11101110BCLR CMOV P1,ASETB EX1 ;HABILITAR INT. EXT. 1SETB EA ;HABILITAR FLAG GERALSJMP $ ;LOOP INFINITO;;ROTINA PARA ATENDER A INTERRUPCAO EXTERNA 1EXT1: RLC A ;ACENDER LEDS EM SEQUENCIAMOV P1,ALCALLDELAYRETI

    DELAYMOVR0,#0FFHL1:MOVR1,#0FFHL2:DJNZR1,L2DJNZR0,L1RET

  • NO 8051:Temporizadores/Contadores de 16-bits:TIMER 0 (TMR0)TIMER 1 (TMR1)

    Operao:TEMPORIZADOROs registradores (SFR) TL0/TL1 e TH0/TH1 formam os registros de 16-bits, que so incrementados a cada ciclo de mquina (base de tempo a partir do CLOCK, ou seja, FTMR = Fclock/12)CONTADORO registradores de 16-bits so incrementados a cada transio de 1 para 0 () nos pinos P3.4(T0) e P3.5(T1) respectivamente

    USO DE TEMPORIZADORES/CONTADORES DO 8051 CONTINUAO

  • Registros & Temporizadores/ContadoresSFR associados aos TMRs:TMODTCON

    TMODOs bits do registrador TMOD (SFR) definem:Modo de Operaao (M0/M1)Contador/Temporizador (Contador/~Temporizador)Contagem depende do estado de INT0/INT1 e de TR0/TR1 (GATE)TCONOs bits do registrador TCON (SFR) correspondem a:FLAG de OVERFLOW (TF0/TF1)FLAG de Interrupes na transio de INT0/INT1 (IE0/IE1)RUN/STOP TMR0/TMR1 (TR0/TR1)BORDA/NVEL para aceitar pedido de interruo (IT0/IT1)

    USO DE TEMPORIZADORES/CONTADORES DO 8051 CONTINUAO

  • Registros de ControleTMOD:

    USO DE TEMPORIZADORES/CONTADORES DO 8051 CONTINUAO

  • Registros de ControleTCON:

    USO DE TEMPORIZADORES/CONTADORES DO 8051 CONTINUAO

  • MODOSMODOSOs modos de operao de TMR0/TMR1 so ajustado atravs dos bits M0 e M1 em TMODMODO 0USO DE TEMPORIZADORES/CONTADORES DO 8051 CONTINUAO

  • MODOS CONTINUAOMODO 1USO DE TEMPORIZADORES/CONTADORES DO 8051 CONTINUAO

  • MODO 2MODOS CONTINUAOUSO DE TEMPORIZADORES/CONTADORES DO 8051 CONTINUAO

  • MODO 3Neste modo o TMR1 suspende contagem e o TMR0 opera como dois Timers de 8 bitsMODOSUSO DE TEMPORIZADORES/CONTADORES DO 8051 CONTINUAO

  • EXEMPLO 1 (Assembly)No exemplo a seguir acende-se os leds vermelho, amarelo e verde, ligados aos pinos P1.0, P1.1 e P1.2, respectivamente, em seqncia e a uma velocidade de 10 Hz, utilizando a interrupo de TMR0 (MODO=1)com RELOAD apropriado.ATENO: Ser necessrio calcular o valor de recarga para o TMR0USO DE TEMPORIZADORES/CONTADORES DO 8051 CONTINUAO

  • EXEMPLO 1 CONT.;LED_10HZ.ASM;DEFSEG PROG, CLASS=CODE, START=0SEG PROG;DEZ_HZ EQU 8800H;N = 30720 (CLOCK=3,6864 MHz);RELOAD = 34816 (8800H) F = 10 HzORG RESETAJMP INIC;ORG TIMER0AJMP TIM0;ORG 50HCalculo do valor de carga no registros do TIMERUSO DE TEMPORIZADORES/CONTADORES DO 8051 CONTINUAO

  • EXEMPLO 1 CONT.INIC: MOV TL0,#LOW DEZ_HZMOV TH0,#HIGH DEZ_HZMOV TMOD,#61H;TIMER 0 EM MODO 1MOV IE,#82H;#10000010BMOV P1,#0;APAGAR TODOS OS LEDSMOV A,#11011011BCLR CSETB TR0SJMP $;ORG 100HTIM0: MOV TL0,#LOW (DEZ_HZ+2) ;REINICALIZARMOV TH0,#HIGH DEZ_HZ ;O CONTADORRLC AMOV P1,ARETIENDAPSW.CYRLCUSO DE TEMPORIZADORES/CONTADORES DO 8051 CONTINUAOCompilao & Linkedio AVOCET(DIRETRIO ...\AVOCET\ASM51\>)

    Comandos: avmac51 exemplo1.asm avlink51 exemplo1=exemplo1

    011011011

  • No exemplo a seguir acende-se os leds vermelho, amarelo e verde do EXEMPLO 1, em seqncia, a uma velocidade de 1 Hz, utilizando a interrupo de TMR0 com RELOAD apropriado.ATENO: necessrio calcular o valor de recarga para o TMR0!PROBLEMA: No mais possvel utilizar a soluo adotada em EXEMPLO 1! A sada adotar um contador!EXEMPLO 2 (Assembly)USO DE TEMPORIZADORES/CONTADORES DO 8051 CONTINUAO

  • EXEMPLO 2 CONT.;LED_1HZ.ASM;DEFSEG PROG, CLASS=CODE, START=0SEG PROG;N = 307200 (CLOCK=3,6864 MHz);Impossvel!;Adota-se: RELOAD=8800H (10 Hz);e CONTADOR = 10DEZ_HZ EQU 8800HDIVISOR EQU 10;ORG RESETAJMP INIC;ORG TIMER0AJMP TIM0USO DE TEMPORIZADORES/CONTADORES DO 8051 CONTINUAO

  • EXEMPLO 2 CONT.;ORG 50HINIC: MOV TL0,#LOW DEZ_HZMOV TH0,#HIGH DEZ_HZMOV R7,#DIVISOR ;PREPARAR DIVISAO POR 10MOV TMOD,#61H ;TIMER 0 EM MODO 1MOV IE,#82H;HABILITA INTERRUPOMOV P1,#0 ;APAGAR TODOS OS LEDSMOV A,#01001001BCLR CSETB TR0SJMP $;ORG 100HTIM0: MOV TL0,#LOW (DEZ_HZ+2) ;REINICALIZARMOV TH0,#HIGH DEZ_HZ ;O CONTADORUSO DE TEMPORIZADORES/CONTADORES DO 8051 CONTINUAO

  • EXEMPLO 2 CONT.DJNZ R7,FIM ;DECREMENTA DIVISORMOV R7,#DIVISOR;(EQUIV. 10 Hz/10)RLC AMOV P1,AFIM :RETIENDUSO DE TEMPORIZADORES/CONTADORES DO 8051 CONTINUAO

  • EXEMPLO 3 (Assembly)No exemplo a seguir gera um trem de pulsos, conforme mostrado na figura abaixo, utilizando a interrupo do TMR0.USO DE TEMPORIZADORES/CONTADORES DO 8051 CONTINUAO

  • EXEMPLO 3 CONT.SOLUO:Ser necessrio calcular DOIS valores de RELOAD:1) RELOAD para 1 mseg:

    1 mseg = (12 N)/FCLOCK = (12 N)/3,6864 MHzN1mseg = (10-3 seg 3,6842106)/12 = 307,2 307RELOAD1mseg = 65229 = FEC0H 1) RELOAD para 40 seg:

    40 seg = (12 N)/FCLOCK = (12 N)/3,6864 MHzN 40seg = (4010-6 seg 3,6842106)/12 = 12,288 12RELOAD40seg = 65524 = FFF4H USO DE TEMPORIZADORES/CONTADORES DO 8051 CONTINUAO

  • EXEMPLO 3 CONT.;ONDA1.ASMDEFSEG PROG, CLASS=CODE, START=0SEG PROG;SAIDA EQU P1.7R_1MS EQU 0FEC0H ;RETARDO DE 1 MILISEGR_40MICRO EQU 0FFF4H ;RETARDO DE 40 MICROSEG;ORG RESETAJMP INICIO;ORG TIMER0AJMP TIM0;ORG 50HINICIO: MOV TL0,#LOW R_1MSUSO DE TEMPORIZADORES/CONTADORES DO 8051 CONTINUAO

  • EXEMPLO 3 CONT.MOV TH0,#HIGH R_1MSMOV TMOD,#61 ;TIMER 0 EM MODO 1MOV IE,#82H ;EA=1 E ET0=1CLR SAIDASETB TR0 ;PARTIDA DO TIMER 0SJMP $ ;LOOP INFINITO;TIM0: JB SAIDA,LB1 ;2 CICLOSMOV TL0,#LOW (R_40MICRO+4) ;2 CICLOSMOV TH0,#HIGH R_40MICRO ;2 CICLOSSETB SAIDA ;1 CICLORETI ;2 CICLOS

    LB1 :MOV TL0,#LOW (R_1MS+4)MOV TH0,#HIGH R_1MSCLR SAIDARETIEND

    USO DE TEMPORIZADORES/CONTADORES DO 8051 CONTINUAO

  • typedef struct {unsigned B7:1;/* this is the most significant bit */unsigned B6:1;unsigned B5:1;unsigned B4:1;unsigned B3:1;unsigned B2:1;unsigned B1:1;unsigned B0:1;}SFR_BITS;

    static unsigned charP0@ 0x80;static unsigned charTCON@ 0x88;static unsigned charP1@ 0x90;static unsigned charSCON@ 0x98;static unsigned charP2@ 0xA0;static unsigned charIE@ 0xA8;static unsigned charIEN0@ 0xA8;static unsigned charP3@ 0xB0;static unsigned charIP@ 0xB8;static unsigned charIRCON@ 0xC0;static unsigned charT2CON@ 0xC8;static unsigned charADCON@ 0xD8;static unsigned charP5@ 0xF8;DEFINIES PARA O 8051 (8051.H)

  • static SFR_BITSP0_BITS@ 0x80;static SFR_BITSTCON_BITS@ 0x88;static SFR_BITSP1_BITS@ 0x90;static SFR_BITSSCON_BITS@ 0x98;static SFR_BITSP2_BITS@ 0xA0;static SFR_BITSIE_BITS@ 0xA8;static SFR_BITSIEN0_BITS@ 0xA8;static SFR_BITSP3_BITS@ 0xB0;static SFR_BITSIP_BITS@ 0xB8;static SFR_BITSIRCON_BITS@ 0xC0;static SFR_BITST2CON_BITS@ 0xC8;static SFR_BITSADCON_BITS@ 0xD8;static SFR_BITSP5_BITS@ 0xF8;

    static unsigned charSBUF@ 0x99;static unsigned charSP@ 0x81;static unsigned charPCON@ 0x87;static unsigned charTMOD@ 0x89;static unsigned charTH0@ 0x8C;static unsigned charTH1@ 0x8D;static unsigned charTL0@ 0x8A;static unsigned charTL1@ 0x8B;static unsigned charIP1@ 0xB9;

    DEFINIES PARA O 8051 (8051.H)

  • static unsigned charCCEN@ 0xC1;static unsigned charCCL1@ 0xC2;static unsigned charCCH1@ 0xC3;static unsigned charCCL2@ 0xC4;static unsigned charCCH2@ 0xC5;static unsigned charCCL3@ 0xC6;static unsigned charCCH3@ 0xC7;static unsigned charCRCL@ 0xCA;static unsigned charRCAP2L@ 0xCA;static unsigned charRCAP2H@ 0xCB;static unsigned charCRCH@ 0xCB;static unsigned charTL2@ 0xCC;static unsigned charTH2@ 0xCD;static unsigned charADDAT@ 0xD9;static unsigned charDAPR@ 0xDA;

    static bit unsigned charTF1@ 0x8F;static bit unsigned charTR1@ 0x8E;static bit unsigned charTF0@ 0x8D;static bit unsigned charTR0@ 0x8C;static bit unsigned charIE1@ 0x8B;static bit unsigned charIT1@ 0x8A;static bit unsigned charIE0@ 0x89;DEFINIES PARA O 8051 (8051.H)

  • static bit unsigned charIT0@ 0x88;static bit unsigned charSM0@ 0x9F;static bit unsigned charSM1@ 0x9E;static bit unsigned charSM2@ 0x9D;static bit unsigned charREN@ 0x9C;static bit unsigned charTB8@ 0x9B;static bit unsigned charRB8@ 0x9A;static bit unsigned charTI@ 0x99;static bit unsigned charRI@ 0x98;static bit unsigned charEA@ 0xAF;static bit unsigned charES@ 0xAC;static bit unsigned charET1@ 0xAB;static bit unsigned charEX1@ 0xAA;static bit unsigned charET0@ 0xA9;static bit unsigned charEX0@ 0xA8;static bit unsigned charRD@ 0xB7;static bit unsigned charWR@ 0xB6;static bit unsigned charT1@ 0xB5;static bit unsigned charT0@ 0xB4;static bit unsigned charINT1@ 0xB3;static bit unsigned charINT0@ 0xB2;static bit unsigned charTXD@ 0xB1;static bit unsigned charRXD@ 0xB0;DEFINIES PARA O 8051 (8051.H)

  • static bit unsigned charPS@ 0xBC;static bit unsigned charPT1@ 0xBB;static bit unsigned charPX1@ 0xBA;static bit unsigned charPT0@ 0xB9;static bit unsigned charPX0@ 0xB8;

    /*Interrupt vectors */

    #defineRESET0#defineEXTI03#defineTIMER011#defineEXTI119#defineTIMER127#defineSINT35#defineTIMER243DEFINIES PARA O 8051 (8051.H)

  • USO DE INTERRUO EM CInterrupoUma rotina para tratamento de interrupo (ISR) definida atravs dos seguintes procedimentos:

    1 Ajuste dos bits dos SFRs associados interrupo que se deseja usar (int_setup.h).

    2 Definindo a handler ISR:[] interrupt handler ( [] ){[disable();]/* bloqueia pedidos de novas interrupes */...[enable();]/* habilita pedidos de novas interrupes */

    [return();]}

    3 Ajuste da ISR ao vetor de interrupo correspondente:

    set_vec(vec,handler);

  • PROGRAMA FONTE /* Programa: EPD01.C Funcao: Controle de 4 LEDs acionados atravs da porta P1.0 a P1.3 do 8051 Copyright: [email protected]*/ static unsigned char P1 @0x90;

    main(){

    unsigned char x,y;

    P1 = 0xff;

    while(1){ do{ /* Faz enquanto no houver tecla apertada */

    x = P1; /* L porta P1 */ y = x; /* Salva P1 em z */ x >>= 4; /* Desloca y 4 casas para a direita */ }while(x==0x0f);Exemplo de Programa Fonte: EPD01.C

  • x |= 0xf0; /* Restaura os 4 bits mais significativos como entrada */ P1 = x; /* Escreve o resultado na porta P1 */

    do{ /* Faz enquanto a tecla nao for solta */ x = P1; x >>=4; }while(x != 0x0f); };}PROGRAMA FONTE CONTINUAOCompilao e Montagem de EPC01.CComando DOS: .../AVOCET/AVC51/>AVC51 epc01.c

  • PROGRAMA FONTE CONTINUAOExemplo de Programa : EPD02.C/* EPD02: Programa exemplo que calcula a soma de duas variveis e imprime na console!Data: 27/09/2013Copyright: [email protected]*/

    #include #include#include

    bit unsignedustatus;char var1,var2;int var3;

    void init_uart(){TMOD = 0x20;/* timer 1 auto-reload mode */TL1 = -3;TH1 = -3;/* about 9600 baud at 10.695MHz */TR1 = 1;/* enable timer 1 */SCON = 0x52;/* mode 1, receiver enable */

  • ustatus = 1;}

    void putch(char c){if(!ustatus)init_uart();if(c == '\n') {while(!TI)continue;TI = 0;SBUF = '\r';}while(!TI)continue;TI = 0;SBUF = c;}

    /*-----------------------------------------------------------------int kbhit(){PROGRAMA FONTE CONTINUAO

  • if(!ustatus)init_uart();return RI;}

    char getch(){if(!ustatus)init_uart();while(!RI)continue;RI = 0;if(SBUF == '\r' || SBUF == ('\r'|0x80))return '\n';return SBUF & 0x7f;}

    char getche(){ char c; c = getch(); putch(c); return(c);PROGRAMA FONTE CONTINUAO

  • }-----------------------------------------------------------------*/

    main(){

    var1 = 11; printf("Valor de var1 = %d\n",var1); var2 = -1; printf("Valor de var2 = %d\n",var2);

    var3 = (int)(var1 + var2); var3 = var3 * 1000; printf("Valor de var3 = %d\n",var3);

    while(1);}

    PROGRAMA FONTE CONTINUAO

  • PONTEIROS EM CPonteiroQuando declarada com ponteiro a varivel conter o endereo de uma outra varivel do mesmo tipo. (para obter o endereo de uma varivel usamos o operador &)

    Sintaxe: *;

    Exemplos:

    unsigned char var1, var2;unsigned char myname[ ] = {Ivo Reis Fontes!...\n}; /* o nome do vetor, myname, um ponteiro!... */unsigned char *ponteiro; /* cria um apontador! */

    ponteiro = &var1; /* ponteiro conter o endereo da varivel var1 */var2 = *ponteiro; /* varivel var2 conter o valor da varivel var1 */ponteiro = myname; /* ponteiro est apontando para myname */ponteiro +=9; /* ponteiro est apontando para a letra F de myname */var1 = *ponteiro; /* var1 conter o cdigo ASCII do smbolo F */

  • ESTRUTURA E UNIO EM CEstrutura bastante comum a necessidade de se manipularem dados em conjunto, isto , grupos de variveis diferentes que mantm alguma relao em comum. A linguagem C proporciona facilidades para o uso de variveis compostas, que so constituidas de diversas variveis de mesmo tipo ou de tipos diferentes. A seguir segue um exemplo clssico:

    Cadastro de Funcionrios:Nome;Endereo;Nome do Conjuge;Nmero de Dependentes;Cargo;Salrio;Data da Admisso.

  • ESTRUTURA E UNIO EM C CONTINUAOSintaxe:struct funcionario{charnome[30];charendereco[40];chartelefone[8];intidade;chardata_adm[10];}analista;

    Inicializao de uma estrutura:struct funcionario analista;analista ={Jadylson Bomfim,Rua das Flores, 514,2517693,50,07/02/60}

    Acesso idade:var1 = analista.idade;

  • ESTRUTURA E UNIO EM C CONTINUAOUnionH situaes em que uma alocao dinmica de memria se faz necessria, devido ao enorme espao de memria utilizado pelas variveis existentes. Fica, pois, flagrante a necessidade de se usarem ferramentas que permitam um aproveitamento mais econmico da memria disponvel, ou mesmo aplicaes nas quais se necessita de diferentes interpretaes para uma mesma rea de memria.

    O tipo union bastante semelhante s estruturas, nas quais podemos ter variveis contendo valores de mais de um tipo.

    Sintaxe:

    union lh_byte{unsigned int int_16;struct two_byte{unsigned char lbyte;unsigend char hbyte;};};

    *