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 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
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;};};
*
Top Related