programação em c 8051 - w3.ualg.ptw3.ualg.pt/~rmarcel/linguagem c.pdf · a função standard do c...

22
Programação em C 8051 Aplicações de Microprocessadores 2006/2007

Upload: nguyenanh

Post on 11-Nov-2018

223 views

Category:

Documents


0 download

TRANSCRIPT

Programação em C8051

Aplicações de Microprocessadores 2006/2007

2 2

Linguagem C

Utilizar os mecanismos da linguagem CEstrutura do CControlo de programa – ciclosSintaxe do C

Necessário utilizar livraria especifica para o Microcontrolador que se pretende programar

3 3

Tipos de dados

O compilador C51 usa os mesmos tipos de dados, dos que são usados pelo compiladorespadrão de C.

4 4

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

5 5

Tipos de Dados

6 6

Memória 8051

0x7F

0xFF

0x20

0x2F

7 7

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.

8 8

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 namemória de dados externa.

9 9

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.

10 10

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).

11 11

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

12 12

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.

13 13

Estrutura de Programa em C

As definições de constantes e as variáveis globaisdevem ser inseridas agora, declarando uma variável em cada linha.

sbit botao=0xB2;sbit botao=P3^2;

14 14

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 chartabela[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 caractereif (botao==0) // caso de botao premido{

i++; // incrementa contadorif(i==16) // caso em que chegou ao fim da contagemi=0;

}} // fim ciclo While

}

15 15

Interrupções

16 16

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 globaisunsigned 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 0IT0=1; // para detectar a transição de 1 ->0while(1){

if(i==16)i=0;P1=tabela[i]; // este é o programa principal

}}

17 17

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 LineFeed. 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.

18 18

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");

}

19 19

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!

20 20

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);}}

21 21

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 externaMacro 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

22 22

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 0x41dado=WRITE_IMEM[0x41]; // escreve conteúdo da Memória interna

// 0x41 em dado

WRITE_XMEM[0x8000]=0xff; //escreve 0xff na Memória externa 0x8000dado=WRITE_xMEM[0x8000]; // escreve conteúdo da Memória externa

// 0x8000 em dado