programação em c 8051 - w3.ualg.ptw3.ualg.pt/~rmarcel/linguagem c.pdf · a função standard do c...
TRANSCRIPT
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
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
}
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