14
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

aulac

Embed Size (px)

Citation preview

Page 1: aulac

Instrumentação Biomédica MicroprocessadaEstudo 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

Page 2: aulac

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

Page 3: aulac

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++) {

3

Page 4: aulac

TH1 = 0xFF; TL1 = 0XFE; TR1 = 1;

while (!TF1) {}

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

4

Page 5: aulac

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 */

5

Page 6: aulac

}/*end of main*/

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

Page 7: aulac

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

7

Page 8: aulac

/* bibliotecas do C */

#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 caracterese para ONDE enviar os dados; incialização e dados sao escritos em locais diferentes */

void NWRITE(char *dados, short ONDE){

8

Page 9: aulac

char i=0;short x;

while (*(dados+i) != '$') {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

Page 10: aulac

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 */

10

Page 11: aulac

extern char incrementa(char);

/* 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 asmMOV A, R7 ;o parâmetro contido em varch é passado em R7 para a funçãoINC AMOV R7,A ;dado retorna desta função para a principal em R7 #pragma endasm}

11