Você está na página 1de 11

Instrumentação Biomédica Microprocessada

Estudo Dirigido - Laboratório

Exemplos de Programas em C para o 8051

Programa Exemplo No 1 - Ilustra programa para a escrita de dados na porta serial

/* HELLO.C */

/* declaracao de bibliotecas utilizadas pelo programa */

#include <reg51.h> /* biblioteca que faz o programa reconhecer os Special Function Registers */
#include <stdio.h> /* biblioteca de funcao de entrada e saida de dados */

/****************/
/* main program */
/****************/

void main (void) {


SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */
TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */
TH1 = 0xf3; /* TH1: reload value for 2400 baud */
TR1 = 1; /* TR1: timer 1 run */
TI = 1; /* TI: set TI to send first char of UART */

printf ("Hello World\n"); /* the 'printf' function call */

while (1) { }; /* loop infinito */


}

1
Programa Exemplo No 2 - Ilustra a utilização de ponteiros

/* HELLO2.C */

#include <reg51.h>
#include <stdio.h>

/****************/
/* main program */
/****************/

void main (void) {


short m;
char *y,tabela[]="Hello";
/*char tabela[]={'a','b','c',’d’,’e’}; outra possibilidade de inicializacao da tabela */

SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */


TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */
TH1 = 0xf3; /* TH1: reload value for 2400 baud */
TR1 = 1; /* TR1: timer 1 run */
TI = 1; /* TI: set TI to send first char of UART */
y = tabela; /* inicializacao do ponteiro */

printf ("Hello World\n"); /* the 'printf' function call */

for (m=0;m< 5;m++) printf("%c\n",*y++);

while (1);

2
Programa Exemplo No 3 - Programa para acender leds conectados à porta 1 e rotacioná-los para direita
ou esquerda conforme nivel de tensão no bit P3.5.

/*

LED.C

*/

/* declaracao de bibliotecas utilizadas pelo programa */

#include <reg51.h> /* special function register declarations */


/* for the intended 8051 derivative */

/* declaracao de funcoes */

void delay (void);

/* variáveis globais */

sbit ch1 = P3 ^ 5;
unsigned char contador;
unsigned char saida;

/****************/
/* main program */
/****************/
void main (void) {

TMOD = 0x10;
TCON = 0;
P1 = 0;
saida = 1;

while (1) {
P1 = saida;
delay();
if(ch1 == 1) {
saida=saida<<1;
if (saida==0) saida=1;
}

else

{
saida = saida >> 1;
if (saida == 0) saida = 128;
}
} /* end of while */

} /* fim do programa principal */

void delay (void) {

for (contador=0; contador < 3; contador++) {


TH1 = 0xFF;
TL1 = 0XFE;

3
TR1 = 1;

while (!TF1) {}

TF1=0;
} /* end of for*/
TR1 = 0;
} /* end of delay */

4
Programa Exemplo No 4 - Ilustra o modo de tratar interrupções na linguagem C, empregando
transmissão e recepção de dados. Conta o número de zeros recebidos em ASCII (0x30) e os
valores não zeros recebidos. Obs: para visualizar os dados de saída, acione VIEW, HARDWARE
e UART. Selecione apenas TRM e ASCII. Digite dados no buffer de entrada e coloque o dado ‘x’
que encerra a transmissão */

/*

INTER.C

*/

/* declaracao de bibliotecas utilizadas pelo programa */

#include <reg51.h> /* special function register declarations */


/* for the intended 8051 derivative */

#include <stdio.h>

/* variáveis globais */

unsigned char rb; /* ilustra declaração de variáveis e sua inicialização */


unsigned char tm = 0x31; /* incializa tm com o ASCII = 1 */

/****************/
/* main program */
/****************/

void main (void) { /* execution starts here after stack init */

SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */


TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */
TH1 = 0xf3; /* TH1: reload value for 2400 baud */
TR1 = 1; /* TR1: timer 1 run */

/* habilita interrupcao serial */

EA = 1;
ES = 1;

TI = 1; /* TI: set TI to send first char of UART */

SBUF = tm;

while (SBUF != 'x'); /* enquanto não le detecta um ‘x’ na porta serial, executa... */
/* lembrar que buffer de saida e de entrada são diferentes embora
tenham mesmo endereco */

ES = 0; /* inibe interrupção pela porta serial */

while (1); /* necessário para evitar travamento do AVSIM */

}/*end of main*/

5
void serial(void) interrupt 4 using 3 { /* especifica interrupção serial (no 4) e banco de registradores (3)
*/
int count1 = 0;
int count0 = 0;

if (RI) { /* testa se dado recebido - buffer de recepção cheio */


rb = SBUF;
RI = 0;

switch (rb) { /* se valor zero, conta */


case 0x30:
count0++;
break;

default:
count1++;
}
}

if (TI) { /* testa se buffer de transmissão pronto para receber novo dado*/

TI=0;
tm++;
SBUF = tm;

}/* end of serial*/

6
Programa Exemplo No 5 - Ilustra o emprego de funções e operadores matemáticos do compilador para
calcular a função coseno de a 2 em passos de 0.1 rad.

/*

COS.C

*/

/* declaração de bibliotecas utilizadas pelo programa */

#include <reg51.h> /* special function register declarations */


/* for the intended 8051 derivative */

#include <stdio.h> /* prototype declarations for I/O functions */


#include <math.h>

/* declaracao de funcoes */

void tcos(float);

/****************/
/* main program */
/****************/
void main (void) { /* execution starts here after stack init */
float x=-0.1;

SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */


TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */
TH1 = 0xf3; /* TH1: reload value for 2400 baud */
TR1 = 1; /* TR1: timer 1 run */
TI = 1; /* TI: set TI to send first char of UART */

while (1) { /* calcula o passo de forma periodica */

if (x< 2 * 3.1414) x+=0.1;


else x=0.0;

tcos(x);

}
}/*end of main*/

void tcos(float u) /* escreve na porta serial o resultado do calculo */


{
float v;

v = cos(u);

printf("cos(%f) = %f\n",u,v);
}

Programa Exemplo No 6 - Rotinas para a escrita de mensagem no display do kit do 8051. Para gerar
arquivo com a extensão HEX ir no menu de opções, selecionar

/* bibliotecas do C */

7
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <reg51.h>
#include <absacc.h>

/* declaração de funções */

void NWRITE (char *,short); /* função que envia caracteres para display */
void INITDP (void); /* função que inicializa o display */

/* definição de labels utilizados nos programas */

#define RSTD 0x38 /* associa RSTD ao byte de reset do display */


#define EIND 0xFF00 /* endereço utilizado na inicialização do display */
#define EESD 0xFF40 /* endereço utilizado na escrita de dados no display */

void main (void)


{
char cadeia[]="testando$"; /* array contendo mensagem */
INITDP(); /* chama rotina de inicializacao dos display */
NWRITE (cadeia,EESD); /* envia caracteres a serem mostrados ou comandos para o display */
while(1); /* necessario para congelar o 8051 */
}

/*funcao para inicializar o display*/


void INITDP(void)
{
char init[]={0x06,0x0c,0x01,'$'}; /* vetor com caracteres de inicializacao do display */
short x;

XBYTE[EIND]=RSTD; /* escreve byte de reset */


for (x=0; x<512; x++); /* introduz atraso */
XBYTE[EIND]=RSTD; /* escreve byte de reset */
for (x=0; x<512; x++); /* introduz atraso */
XBYTE[EIND]=RSTD; /* escreve byte de reset */
for (x=0; x<512; x++); /* introduz atraso */

NWRITE(init,EIND); /* envia demais bytes de inicializacao */


}

/*funcao para escrever conjunto de caracteres ou comandos no display */

/*
como parametros são passados ponteiro para a string de caracteres
e para ONDE enviar os dados; incialização e dados sao escritos em locais
diferentes
*/

void NWRITE(char *dados, short ONDE)


{
char i=0;
short x;

while (*(dados+i) != '$') {

8
for(x=0;x<180;x++); /* introduz atraso para garantir escrita */
XBYTE[ONDE] = *(dados+i); /* escreve dado no display */
i++; /* desloca byte apontado pelo ponteiro */
}
}

9
Programa Exemplo No 7 - Moldura para Interface de C e Assembly para o 8051. Crie os 2 programas
abaixo em arquivos separados. Compile o programa SND.C (Translate). Um arquivo denominado
SND.ASM é criado. Abra um projeto e adicione (Add File) os arquivos SND.ASM e PPAL.C. Utilize
Build All para gerar o programa executável.

a) Programa principal em C (programa ppal.c)

/*includes (acrescentar as bibliotecas necessárias) */

/* prototipo de funcao externa */

extern void nome_da_funcao(void);

void main(void)
{

(código da funcao em C)
}
b) Função secundária em Assembly (programa snd.c)

/* includes */

#pragma src(nome_do_programa(snd).asm)
/* #include reg51.h util para compilador de linha */

/* prototipo de funcao externa */

extern void main(void);

/* codigo da funcao */

void nome_da_funcao(void)
{
#pragma asm
.
..
(codigo em Assembly)
.
.

#pragma endasm
}

Exemplo de linkagem com passagem de parâmetro

A) PROGRAMA PRINCIPAL PPAL.C

/* includes */

#include <reg51.h> /* biblioteca que faz o programa reconhecer os Special Function Registers */
#include <stdio.h> /* biblioteca de funcao de entrada e saida de dados */

/* prototipo de funcao externa */

extern char incrementa(char);

10
/* funcao principal */

void main(void)
{
char teste=0;
char *y,tabela[]={'a','b','c',’d’,’e’}; /* outra possibilidade de inicializacao da tabela */

SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */


TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */
TH1 = 0xf3; /* TH1: reload value for 2400 baud */
TR1 = 1; /* TR1: timer 1 run */
TI = 1; /* TI: set TI to send first char of UART */
y = tabela; /* inicializacao do ponteiro */

for (;teste< 5;) {


teste =incrementa(teste);
printf("%c\n",*y++);
}
while (1);

} /* end of main */

B) PROGRAMA SECUNDÁRIO SND.C

#pragma src(snd.asm) /* nome exemplo. Pode-se adotar qualquer nome */

/* includes */

#include <reg51.h> /* biblioteca que faz o programa reconhecer os Special Function Registers */

/* protótipo de funcao externa */

extern void main(void);

/* codigo da funcao */

char incrementa(char varch)


{
#pragma asm
MOV A, R7 ;o parâmetro contido em varch é passado em R7 para a função
INC A
MOV R7,A ;dado retorna desta função para a principal em R7
#pragma endasm
}

11

Você também pode gostar