Programação C Para Microcontroladores (Total)
-
Upload
pedro-lucarelli -
Category
Documents
-
view
8 -
download
0
description
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;};};
*