Aula 11 - Linguagem C Para o 8051

23
Prof. Rubão LINGUAGEM C PARA O 8051 Disciplina de Microcontroladores

description

8051 C language

Transcript of Aula 11 - Linguagem C Para o 8051

Page 1: Aula 11 - Linguagem C Para o 8051

Prof. Rubão

LINGUAGEM C PARA O 8051

Disciplina de Microcontroladores

Page 2: Aula 11 - Linguagem C Para o 8051

• Char – 8 bits

• Short e int – 16 bits

• Long – 32 bits

• Float – 32 bits

• Unsigned int – 16 bits

• Unsigned long – 32 bits

Obs. cuidado com as palavras reservadas ao definir funções e variáveis

VARIÁVEIS E TIPOS DE DADOS SIMPLES

Page 3: Aula 11 - Linguagem C Para o 8051

ESTRUTURA DE UM PROGRAMA EM C

#include <REG52.H> /* special function register declarations */

/* for the intended 8051 derivative */

main (void){int a;}

Page 4: Aula 11 - Linguagem C Para o 8051

ESCOLHA DA REGIÃO DE ARMAZENAMENTO DE DADOS

• Regiões Interna e Externa para dados

DATA – Região de RAM INTERNA DOS REGISTRADORES ESPECIAIS

IDATA – Região de RAM INTERNA ACESSADA DE FORMA INDIRETA

XDATA – RAM EXTERNA

CODE– Memória de programa

BIT – um único bit reservado do endereço de RAM interna de 20h a 2Fh

Page 5: Aula 11 - Linguagem C Para o 8051

ESCOLHA DA REGIÃO DE ARMAZENAMENTO DE DADOS

idata unsigned int var; variável de nome var que armazenará um dado do tipo int (2 bytes), que terá alcance de 0 a 65535.

data unsigned char var; armazenado na região DATA

xdata unsigned char var;

code unsigned char var; memória de programa

Com espaço em memória reservado

xdata at 0x8000 unsigned char var; variável de nome var, armazenará um dado char, na região xdata e no endereço 8000h

Page 6: Aula 11 - Linguagem C Para o 8051

ESCOLHA DA REGIÃO DE ARMAZENAMENTO DE DADOS

TIPOS DE DADOS COMPOSTOS – MATRIZES

• Grupo de um determinado tipo de dado, que por um nome atribuído, se relaciona aum grupo de variáveis.

Exemplo: #include <REG52.H> #include <stdio.h> void main (void) {char nome_da_variavel [2];nome_da_variavel[0] = 12;nome_da_variavel[1] = 13;}

OU MAIS DE UMA DIMENSÃO

char nome_da_variavel [5] = {12, 13, 14, 15, 16};char display [2] = { “a”, “B”};char display [2] [3] = { “ab”, “AB”}; quando tiver mais de uma variável precisa incluir mais uma dimensão

Page 7: Aula 11 - Linguagem C Para o 8051

PRECEDÊNCIA ENTRE OS OPERADORES

Mantém-se o padrão em linguagem C ANSI

Exemplo: int a=3+7 / 2*10;

a= 33 primeiro a divisão e truncado o valor float

Page 8: Aula 11 - Linguagem C Para o 8051

CONTROLADORES DE DECISÃO

void main( )

{

int a=3;

if (a= =10) {a=1}

else

{a=2};

}

int a,b;a=3;Switch (a){

case 0: b=10; break;case 1: b=20; break;case 3: b=40; break;

default: b=0; break;}

Page 9: Aula 11 - Linguagem C Para o 8051

CONTROLADORES DE LOOPING

void main()

{

int b, a;

for (a=0; a<0xff; a++)

P1=a;

}

Page 10: Aula 11 - Linguagem C Para o 8051

ATENDIMENTO ÀS INTERRUPÇÕES

• as interrupções são vetoradas

• número das interrupções, segundo o compilador.

0 – int0 – 0x0003

1 – timer0 – 0x000B

.

.

.

4 – serial – 0x0023

5 – timer2 – 0x002B

Page 11: Aula 11 - Linguagem C Para o 8051

ATENDIMENTO ÀS INTERRUPÇÕES

# include <reg52.h># include <stdio.h>sbit P1_0=0x90;sbit P1_1=0x91;

void int_0( ) interrupt 0 {P1_1= ~P1_1;}void main(){EA=1;EX0=1;while(1)

{P1_0= ~P1_0;}

}

Page 12: Aula 11 - Linguagem C Para o 8051

EXPERIÊNCIAS PRÁTICAS - TIMER

#include <reg52.h>

void timer (char vezes){ while (vezes){ TMOD=0x01;

TH0= ~(60000/256); //15hTL0=~(60000%256); //9fhTR0=1;while(!TF0);

vezes --;}

}

void main()

{ char vetor;

code char dados [4] = {0x01, 0x04, 0x07, 0x08};

P1=0;

while (1)

{for (vetor=0; vetor<4; vetor ++)

{P1=dados[vetor];

timer (2);//delay de 120 ms

}

}

}

Page 13: Aula 11 - Linguagem C Para o 8051

EXPERIÊNCIAS PRÁTICAS - LCD

#include <reg52.h>sbit P3_5=0xB5; // Enablesbit P3_4=0xB4; // RS

int sequencia[5]={0x38, 0x38, 0x06, 0x0E, 0x01};

void pulso (int x);void timer0 (unsigned char vezes);

void pulso (int x){P3_5=0;timer0(5);P1=x;P3_5=1;}

void inicia_LCD(){int y;P3_4=0; // deixo o RS em zerofor(y=0; y<6; y++)

{(pulso (sequencia[y]));P3_4=1; // volto apenas pra

1}}

void timer0 (unsigned char vezes){TMOD=0x01;while(vezes){

TH0=~(1000/256); //1msTL0=~(1000%256); //1msTR0=1;while(!TF0);vezes --; }}

Page 14: Aula 11 - Linguagem C Para o 8051

USANDO O CONJUNTO KEIL/P51 EM C

É muito similar à do assembly, adicionando-se opções para geração do código a partir do C. O endereço inicial de execução 0x2800foi arbitrado apenas para padronização, podendo-se escolher outro, eventualmente.

• (Essencial) No tabBL51Locate, o campoCodedeve ser preenchido com 0x2000-0x3FFF, ?PR?MAIN?*(0x2800) garantindo que o programa seja alocado em RAM e que a main comece em 0x2800 (facilita depuração ter um endereço fixo pra ela).

Page 15: Aula 11 - Linguagem C Para o 8051

USANDO O CONJUNTO KEIL/P51 EM C

Page 16: Aula 11 - Linguagem C Para o 8051

USANDO O CONJUNTO KEIL/P51 EM C

Page 17: Aula 11 - Linguagem C Para o 8051

USANDO O CONJUNTO KEIL/P51 EM C

• (Essencial) Se forem usadas interrupções, no tabC51deverá estar checado “Interrupt Vector at addresses:” com o campo a seguir preenchido com 0x2000, garantindo que os vetores de interrupção estão deslocados de 0x2000.

• (Opcional) No tabDebug, Initialization File, insira um arquivo textodebug.inique tenha apenas uma linha:$ = 0x2800fazendo com que a depuração inicie automaticamente no endereço2800h.

Page 18: Aula 11 - Linguagem C Para o 8051

USANDO O CONJUNTO KEIL/P51 EM C

Page 19: Aula 11 - Linguagem C Para o 8051

USANDO O CONJUNTO KEIL/P51 EM C

Page 20: Aula 11 - Linguagem C Para o 8051

USANDO O CONJUNTO KEIL/P51 EM C

• (Desnecessário) Escolher corretamente o dispositivo utilizado (se for um qualquer, o Keil não acha o include automaticamente).

• (Desnecessário se não usar variáveisxdataecode) EmTarget, setar os limites das memórias. Se for como no circuito da placa (EPROM (Start 0 Size 0x2000) e RAM (Start 0x2000 Size 0x2000)) dá problema; deve-se considerartodaa memória usada pelo código do programa como EPROM (ex.: Start 0 Size 0x3000) e o restante como RAM(ex.: Start 0x3000 Size 0x1000).

Page 21: Aula 11 - Linguagem C Para o 8051

USANDO O CONJUNTO KEIL/P51 EM C

• Pararetirar o LJMP inicial do programa em C, há duas abordagens possíveis, ambas adicionando o código de startup (crie o projeto como sempre, mas responda SIM à pergunta “adicionar código de startup”; o arquivo Startup.a51 será incluído no projeto e copiado para o folder atual):

Maneira 1: Altere o endereço dele. Para tanto, localize as linhas abaixo em Startup.a51 e mude o endereço de 0000h para o endereço inicial desejado (por exemplo, 2000h se estiver usando o monitor com a P51).

PUBLIC ?C_STARTUP

CSEG AT 0000h ; alterar aqui!?C_STARTUP: LJMP STARTUP1

Page 22: Aula 11 - Linguagem C Para o 8051

USANDO O CONJUNTO KEIL/P51 EM C

Maneira 2: Simplesmente o retire. Localize as linhas acima, comente as últimas e copie o label logo a seguir:

PUBLIC ?C_STARTUP

; CSEG AT 0000h; alterar aqui!

;?C_STARTUP: LJMP STARTUP1

RSEG ?C_C51STARTUP

?C_STARTUP: ; adicionado!STARTUP1:

Page 23: Aula 11 - Linguagem C Para o 8051

• NICOLOSI, linguagem C para o 8051

BIBLIOGRAFIA