Programação em C 8051 Aplicações de Microprocessadores 2006/2007
Linguagem C Utilizar os mecanismos da linguagem C Estrutura do C Controlo de programa ciclos Sintaxe do C Necessário utilizar livraria especifica para o Microcontrolador que se pretende programar 2 2
Tipos de dados O compilador C51 usa os mesmos tipos de dados, dos que são usados pelo compiladores padrão de C. 3 3
Novos Tipos Dados Os compiladores de C para microcontroladores, definem tipos de dados especificos para esse processador BIT um bit SFR Registo de Funções Especiais (8 bits) SBIT, SFRBIT Bit de Registos SFR (1 bit) A utilização destes tipos de dados é exactamente iguais ao dos outros tipos existentes 4 4
Tipos de Dados 5 5
Memória 8051 0xFF 0x7F 0x20 0x2F 6 6
Memória Interna Dados Podem ser distinguidos 3 tipos de especificadores para a memória de dados interna no C51 data, idata e bdata. data refere-se aos primeiros 128 bytes da memória de dados interna. idata refere-se a todos os 256 bytes da memória de dados interna, implica sempre o modo de endereçamento indirecto independente da localização na memória. bdata refere-se aos 16 bytes de memória (20h a 2Fh) endereçamento bit a bit. 7 7
Memória Externa Dados O compilador C51 permite a utilização de dois tipos diferente de especificadores para a memória de dados externa xdata e pdata. xdata refere-se a qualquer posição de memória de dados externa de 64 Kbytes. pdata refere-se a uma página de 256 bytes na memória de dados externa. 8 8
Modelos de Memória SMALL No C51 podem ser utilizados três tipos de modelos de memória, a saber: SMALL, COMPACT e LARGE. No modelo SMALL todas as variáveis utilizadas são definidas na memória de dados interna do 8051, este modelo de memória gera o código de programa mais pequeno e eficiente e deverá ser utilizado sempre que possível. 9 9
Modelos de Memória COMPACT No modelo de memória COMPACT, todas as variáveis são definidas na memória de dados externo mas restringidas a uma página de memória (256 bytes). 10 10
Modelos de Memória LARGE No modelo de memória LARGE todas as variáveis são alocadas na memória de dados externa (espaço de 0 a 64KB). O modelo LARGE é o que gera um código de memória com maior tamanho 11 11
Estrutura de Programa em C #include <AT89S8252.h> Deve ser colocado um include do ficheiro com a definição de registos. Este ficheiro é fornecido como parte do compilador e inclui as definições dos vários registos e flags do microcontrolador. 12 12
Estrutura de Programa em C As definições de constantes e as variáveis globais devem ser inseridas agora, declarando uma variável em cada linha. sbit botao=0xb2; sbit botao=p3^2; 13 13
Estrutura de Programa em C /* visor.c Incrementa o visor de 0 a F sempre que se prime botao. Botao ligado em P3.2 e visor ligado em P1 */ unsigned char tabela[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0 xa1, 0x86,0x8e}; #include "at898252.h" sbit botao=p3^2; main () { unsigned char i=0; while(1) // ciclo infinito { P1=tabela[i]; // visualiza no porto P1 o caractere if (botao==0) // caso de botao premido { } } } // fim ciclo While i++; // incrementa contador if(i==16) // caso em que chegou ao fim da contagem i=0; 14 14
Interrupções 15 15
Interrupções (cont.) void nome_rotina_isr (void) interrupt num_interrupção [using banco_registos] /* Visualiza os números de 0 a F sequencialmente utilizando a interrupção externa 0 */ // variaveis globais unsigned char tabela[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80, 0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; unsigned char i=0; // variável global #include "at898252.h void ISR_externa0(void) interrupt 0 { i++; } // incrementa variável global i main () { IE=0x81;// para habilitar a in terrupção externa 0 IT0=1; // para detectar a transição de 1 ->0 while(1) { if(i==16) i=0; P1=tabela[i]; // este é o programa principal } } 16 16
Porta Série A função standard do C printf()é utilizada para enviar dados pela porta série e a função getchar() é utilizada para a recepção de caracteres ambas definidas em stdio.h. No programa abaixo após cada transmissão são enviados os caracteres ( \n ) Carriage Return e Line Feed. A utilização da função printf() e getchar() não dispensa a inicialização dos registos do 8051 associados à porta série como é o caso de SCON e TCON. 17 17
Porta Série (cont.) /* Programa para testar a utilização da função printf() Envia a string Microprocessadores II (1200N81) */ #include "at898252.h" #include "stdio.h void inicia_serie() { SCON=0x50; TMOD=0X20; TH1=0XE8; TR1=1; TI=1; } main () { inicia_serie(); while(1) printf("microprocessadores II \n"); } 18 18
Porta Série (cont.) A função printf() é uma função da livraria standard de entrada/saída que é implementada utilizando um elevado número de instruções, o que faz com que um pequeno programa ocupe uma quantidade de memória de programa considerável. O programa da listagem anterior depois de compilado resulta em 3,11Kbytes de código. Para diminuir o tamanho do código podemos escrever a função envia_frase(unsigned char *ch) como está na listagem abaixo o que resulta numa redução de 2 Kbytes! 19 19
Porta Série (cont.) /* Programa para testar a utilização da função printf() Envia a string Microprocessadores II (1200N81) */ #include "at898252.h" #include "stdio.h" void inicia_serie() { SCON=0x50; TMOD=0X20; TH1=0XE8; TR1=1; TI=1;} void envia_frase(unsigned char *ch) { while(*ch!=0) { SBUF=*ch; while (!TI){} TI=0; ch++; } } main () { unsigned char CRLF[]={0x0D,0x0A,0x00}; inicia_serie(); while(1) { envia_frase("microprocessadores II"); envia_frase(crlf);} 20} 20
Acesso à Memória DADOS O acesso à memória de dados Interna ou externa é efectuado por meio de macros. Acesso pode ser entendido como leitura ou escrita. Macro XBYTE, acesso à memória externa Macro DBYTE, acesso à memoria #include <absacc.h> /* absolute addressing modes */ #include "REG51.h" /* DS5000 series 8052 registers */ #define WRITE_XMEM XBYTE // Macro para escrita na memória // interna de dados #define WRITE_IMEM DBYTE // Macro para escrita na memória // interna de dados 21 21
Memória DADOS (cont.) #include <absacc.h> /* absolute addressing modes */ #include "REG51.h" /* DS5000 series 8052 registers */ #define WRITE_XMEM XBYTE // Macro para escrita na memória // interna de dados #define WRITE_IMEM DBYTE // Macro para escrita na memória // interna de dados WRITE_IMEM[0x41]=0xff; // escreve 0xff na Memória interna 0x41 dado=write_imem[0x41]; // escreve conteúdo da Memória interna // 0x41 em dado WRITE_XMEM[0x8000]=0xff; //escreve 0xff na Memória externa 0x8000 dado=write_xmem[0x8000]; // escreve conteúdo da Memória externa // 0x8000 em dado 22 22